Commit graph

99 commits

Author SHA1 Message Date
Yifan Liu
fb6fffbecd
fix: allow description field to be absent from Tool (#159)
* fix: allow description field to be absent from `Tool`
* description field is not a requried field of Tool

* Apply suggestions from code review

* Update Tests/MCPTests/ToolTests.swift

---------

Co-authored-by: Mattt <mattt@me.com>
2025-09-07 04:30:19 -07:00
Mattt
ac90e679cd
Make Tool.description optional (#160)
* Make Tool.description optional

* Make description parameter in Tool initializer optional
2025-09-07 04:24:38 -07:00
Alexey Ivashko
78d187716e
Adopt strict concurrency for project (#157)
* Adopt strict concurrency for project

* Fix one warning related to that

* Add version-specific manifest for Swift 6.0

---------

Co-authored-by: Alexey Ivashko <a_ivashko@apple.com>
Co-authored-by: Mattt Zmuda <mattt@me.com>
2025-09-07 04:21:15 -07:00
Mattt
f1b50e6de2
Update README to document support for Alpine Linux (#153) 0.10.1 2025-08-14 04:37:46 -07:00
Tobias
e019cb6909
Enable building with the Swift Linux SDK (#151) 2025-08-14 04:30:58 -07:00
Mattt Zmuda
e76d61155b
Bump version to 0.10.0 0.10.0 2025-08-10 06:30:53 -07:00
Mattt
0121dccf7e
Add requestModifier property to HTTPClientTransport (#152)
* Add requestModifier property to HTTPClientTransport

Co-authored-by: Tim Wang <tim.wang@ing.com>

* Add test coverage

---------

Co-authored-by: Tim Wang <tim.wang@ing.com>
2025-08-10 06:28:08 -07:00
Eric Marchand
8a50d896c1
docs: fix code example in README.md (#141) 2025-08-10 06:02:15 -07:00
Mattt
7c58239ff6
Revert "Revert "Remove deprecated MCP.Error typealias (#102)" (#104)" (#105)
This reverts commit bc5360ecce.
2025-08-10 05:59:35 -07:00
Pedro Piñera Buendía
778ab33d23
Replace compile-time directives with target platform conditions (#143)
* Replace compile-time directives with target platform conditions

Use Package.swift target platform conditions instead of compile-time #if directives for EventSource dependency. This leverages Swift Package Manager's native dependency support for platform-specific targets at runtime rather than compile-time.

* Update reference for EventSource package

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mattt <mattt@me.com>
2025-08-10 05:52:50 -07:00
Glacio
e2afccdcaa
Add plumbing to set instructions on Server (#145)
* Add plumbing to set instructions on Server

* Use instructions description from MCP schema

---------

Co-authored-by: Peter Liddle <development.peter@liddle.network>
Co-authored-by: Mattt <mattt@me.com>
2025-08-10 05:52:28 -07:00
Mattt
63fd276dbd
Implement in-memory / passthrough transport (#122)
* Implement in-memory / passthrough transport

* Add InMemoryTransport to README
2025-08-10 05:52:20 -07:00
Sébastien Stormacq
9ad382d397
remove info level logging message and use debug instead (#132) 2025-08-10 05:40:56 -07:00
Mattt
f3b9ba4a59
Make Tool.inputSchema nonoptional (#123) 2025-08-10 05:34:47 -07:00
Carl Peaslee
c95d0c0354
Remove Loopwork copyright from license (#148) 2025-07-24 13:54:45 -07:00
Mattt
494b5b55d3
Add configuration for maximum receive buffer size to NetworkTransport (#146) 2025-07-08 14:48:29 -07:00
Mattt
36865fb056
Update inputSchema example usage (#136)
* Update Tool inputSchema in README example usage

* Update inputSchema usage in Tool tests
2025-06-12 02:57:04 -07:00
Mattt
7a76001187
Adjust logging level for frequent / low-level events (#130) 2025-06-05 05:36:37 -07:00
Carl Peaslee
609cdc709b
Add Client.listResourceTemplates method (#125)
* adds listResourceTemplates to client for #124

* add pagination to resources/templates/list

from @mattt

Co-authored-by: Mattt <mattt@loopwork.com>

* adds cursor functionality to ListResourceTemplates

* updates the client method to use the updated signature

---------

Co-authored-by: Mattt <mattt@loopwork.com>
2025-05-30 12:35:34 -07:00
Mattt
14fddc44c4
Move Sampling from Server to Client directory (#121) 2025-05-26 06:36:23 -07:00
Mattt Zmuda
9742933d2f
Bump version to 0.9.0 0.9.0 2025-05-26 06:07:28 -07:00
Mattt
a59b50bf5a
Update Client.connect(transport:) to automatically send initialize request (#100)
* Update Client to automatically call initialize in connect

* Make Client.connect(transport:) return value discardable

* Fix example usage in README

* Update example code in transports to remove initialize call

* Deprecate initialize method

* Update tests

* Update README

* Fix sampling tests

* Fix race condition tests
2025-05-26 06:04:38 -07:00
Mattt
3b505ee575
Improve ergonomics of prompt and sampling message initialization (#120)
* Improve ergonomics of prompt and sampling message initialization

* Deprecate previous / existing Message initializers
2025-05-26 05:25:02 -07:00
Mattt
fac4df6b1a
Add support for sampling (#119)
* Add UnitInterval type

* Add test coverage for UnitInterval

* Add support for sampling

* Add integration tests for sampling
2025-05-26 04:57:24 -07:00
Mattt
ddde66dc08
Add test coverage for base64 data helper methods (#114) 2025-05-26 04:36:13 -07:00
Mattt
fec680a243
Prevent double continuation resumption in client (#113)
* Prevent double continuation resumption in client

Consolidate request removal and continuation resumption logic to ensure each request's continuation is resumed exactly once, preventing "SWIFT TASK CONTINUATION MISUSE" errors during network failures.

* Fix race condition test
2025-05-26 04:36:01 -07:00
Mattt
87f33d022a
Improve NetworkTransport and add test coverage (#108)
* Improve NetworkTransport and add test coverage

* Remove the weakTransport check since actors have special memory management rules

* Use Task.sleep(for:) consistently

* Always start connection in connect

* Run NetworkTransportTests serially
2025-05-07 10:36:54 -07:00
Mattt Zmuda
266c02d2d1
Bump version to 0.8.2 0.8.2 2025-05-07 05:59:20 -07:00
Mattt
720a8102e9
Implement client protocol version negotiation in server initialization (#107)
* Implement client version negotiation in server initialization

* Add test coverage for version negotiation

* Make Version.supported and Version.negotiate() APIs internal to not create new surface area
2025-05-07 05:58:11 -07:00
Mattt Zmuda
3690509fa0
Bump version to 0.8.1 0.8.1 2025-05-07 03:26:31 -07:00
Mattt
bc5360ecce
Revert "Remove deprecated MCP.Error typealias (#102)" (#104)
This reverts commit d3f061dacd.
2025-05-07 03:26:07 -07:00
Mattt
800131fb9c
Don't throw error if there's a protocol mismatch between client and server (#103) 2025-05-06 11:53:02 -07:00
Mattt
d3f061dacd
Remove deprecated MCP.Error typealias (#102) 2025-05-06 11:23:04 -07:00
Mattt Zmuda
305cf7e13f
Bump version to 0.8.0 0.8.0 2025-05-06 09:30:43 -07:00
Mattt
23cb19268a
Set latest version to 2025-03-26 (#80)
* Set latest version to 2025-03-26

* Specify support for 2025-03-26 (latest) version
2025-05-06 09:30:21 -07:00
Mattt
32cf6cb7e6
Expand README with more information about client and server usage (#99)
* Expand README with more information about client and server usage

* Add discussion of initialize hook for server

* Add section about request batching

* Trim trailing whitespace

* Rename section to Request Batching
2025-05-06 09:24:20 -07:00
Mattt
daef492821
Improve documentation comments for transport types (#98)
* Add example usage to HTTPClientTransport documentation comments

* Add documentation comments to NetworkTransport

* Improve documentation comments for StdioTransport
2025-05-06 06:56:24 -07:00
Mattt
bdaa2585c5
Delay SSE GET connection until after session ID is established (#97)
* Delay SSE GET connection until after session ID is established

- Add a signaling mechanism to ensure the SSE streaming task waits for the initial session ID to be set before attempting the GET connection.
- Use a TaskGroup to race between session ID signal and a 10-second timeout, logging the outcome.
- Trigger the signal when a session ID is received for the first time from any response.
- Add detailed logging for all code paths to aid debugging and clarify connection timing.
- Clean up signal resources on disconnect to prevent leaks.

This addresses the initialization timing issue where the SSE GET could be attempted before the session was established, as discussed in MCP PR #91.

* Update tests for SSE timing

* Use configurable timeout for acquiring session ID

* Remove Actor protocol conformance for HTTPClientTransport

* Configure shorter session ID timeout for tests

* Add documentation comments to HTTPClientTransport

* Rename sessionIDWaitTimeout to sseInitializationTimeout
2025-05-06 06:49:48 -07:00
Mattt
3ff1085e01
Use EventSource for SSE implementation (#96)
* Add package dependency for github.com/loopwork-ai/EventSource

* Use EventSource for SSE implementation

* Refactor response stream and content type handling

Co-authored-by: Stephen Tallent <stallent@mercury.io>

* Conditionalize use of streaming for supported platforms

* Refactor conditional platform handling

* Conditionalize code and package dependency on Linux

---------

Co-authored-by: Stephen Tallent <stallent@mercury.io>
2025-05-06 05:45:40 -07:00
Mattt
2b67a1233f
Resume with EOF instead of throwing error when no data is received (#94) 2025-05-02 14:24:37 -07:00
Mattt
48c19c282b
Document Client usage with HTTPClientTransport (#77)
* Add test coverage for Client with HTTPClientTransport

* Configure HTTP client transport to stream by default

* Add example usage of streaming HTTP transport to README

* Explicitly set streaming to false in test
2025-04-27 09:29:24 -07:00
Stephen Tallent
ccb070f2f0
support 405 response from servers that don’t support streaming (#90)
* support 405 response from servers that don’t support streaming

* Rephrase comment

---------

Co-authored-by: Stephen Tallent <stallent@mercury.io>
Co-authored-by: Mattt Zmuda <mattt@loopwork.com>
2025-04-27 07:27:14 -07:00
Ayal Spitz
f6e401aa97
Fix event stream line parsing to handle CRLF and empty lines correctly (#89)
* Optimized code in `connectToEventStream` to use `.lines` computed value of `AsyncSequence` to produce a `AsyncLineSequence` instead of building a lines manually.

* - Reverter use of `lines` (it swallows newlines)
- Fiexed original issue I experienced with line 229 `while let newlineIndex = buffer.firstIndex(of: "\n") {` not handling "\r\n" properly
- Added unit test to test for "\r\n" scenario
- Simplified `end of event` test - `line` creation trims newline, added code trims carriage return. Only thing that should be left is an empty line
2025-04-27 06:50:08 -07:00
Stephen Tallent
99517b0564
Update AnyNotification to include notification params (#86)
* Update AnyNotification to not wipe out params that come with a notification

* Add test coverage for notification with params

* Allow params to be omitted when empty

---------

Co-authored-by: Stephen Tallent <stallent@mercury.io>
Co-authored-by: Mattt Zmuda <mattt@loopwork.com>
2025-04-27 06:47:38 -07:00
Mattt
25dee3bb4c
Send initialized notification from client instead of server (#85) 2025-04-21 14:43:33 -07:00
Mattt
29aa74d137
Simplify receive implementation for transports (#78) 2025-04-18 02:37:31 -07:00
Mattt
046fa3ee96
Update README with information about transports and platform availability (#76)
* Update README with information about transports and platform availability

* Add footnote about WIP Alpine Linux and Windows support

* Move discussion of platform availability to separate section

* Add link from requirements to platform availability section
2025-04-15 10:26:26 -07:00
Mattt
d583151871
Add streamable HTTP transport for clients (#70)
* Rename file to Transport.swift

* Rename file to StdioTransportTests.swift

* Add .index-build/ to .gitignore

* Implement HTTP client transport

* Add test coverage for streamable HTTP client transport

* Conditionally import FoundationNetworking

* Conditionalize streaming for unsupported platforms

* Import FoundationNetworking in tests

* Add 5 minute timeout to CI jobs

* Remove debug logging

* Formatting

* Skip SSE tests on platforms that don't support streaming
2025-04-15 09:06:29 -07:00
Mattt
4143f35b41
Implement Tool.Annotations (#47) 2025-04-15 05:42:44 -07:00
Mattt
c748bc1549
Add support for audio content in prompts and tool results (#73) 2025-04-15 05:41:28 -07:00