@@ -98,7 +98,7 @@ Tools represent functions that can be called by the client:
98
98
99
99
``` swift
100
100
// List available tools
101
- let tools = try await client.listTools ()
101
+ let ( tools, cursor) = try await client.listTools ()
102
102
print (" Available tools: \( tools.map { $0 .name }.joined (separator : " , " ) ) " )
103
103
104
104
// Call a tool with arguments
@@ -335,15 +335,15 @@ Improve performance by sending multiple requests in a single batch:
335
335
336
336
``` swift
337
337
// Array to hold tool call tasks
338
- var toolTasks: [Task<CallTool.Result, Error >] = []
338
+ var toolTasks: [Task<CallTool.Result, Swift. Error >] = []
339
339
340
340
// Send a batch of requests
341
341
try await client.withBatch { batch in
342
342
// Add multiple tool calls to the batch
343
343
for i in 0 ..< 10 {
344
344
toolTasks.append (
345
345
try await batch.addRequest (
346
- CallTool.request (.init (name : " square" , arguments : [" n" : i ]))
346
+ CallTool.request (.init (name : " square" , arguments : [" n" : Value (i) ]))
347
347
)
348
348
)
349
349
}
@@ -428,7 +428,7 @@ Register tool handlers to respond to client tool calls:
428
428
429
429
``` swift
430
430
// Register a tool list handler
431
- server.withMethodHandler (ListTools.self ) { _ in
431
+ await server.withMethodHandler (ListTools.self ) { _ in
432
432
let tools = [
433
433
Tool (
434
434
name : " weather" ,
@@ -454,7 +454,7 @@ server.withMethodHandler(ListTools.self) { _ in
454
454
}
455
455
456
456
// Register a tool call handler
457
- server.withMethodHandler (CallTool.self ) { params in
457
+ await server.withMethodHandler (CallTool.self ) { params in
458
458
switch params.name {
459
459
case " weather" :
460
460
let location = params.arguments ? [" location" ]? .stringValue ?? " Unknown"
@@ -485,24 +485,24 @@ Implement resource handlers for data access:
485
485
486
486
``` swift
487
487
// Register a resource list handler
488
- server.withMethodHandler (ListResources.self ) { params in
488
+ await server.withMethodHandler (ListResources.self ) { params in
489
489
let resources = [
490
490
Resource (
491
- uri : " resource://knowledge-base/articles" ,
492
491
name : " Knowledge Base Articles" ,
492
+ uri : " resource://knowledge-base/articles" ,
493
493
description : " Collection of support articles and documentation"
494
494
),
495
495
Resource (
496
- uri : " resource://system/status" ,
497
496
name : " System Status" ,
497
+ uri : " resource://system/status" ,
498
498
description : " Current system operational status"
499
499
)
500
500
]
501
501
return .init (resources : resources, nextCursor : nil )
502
502
}
503
503
504
504
// Register a resource read handler
505
- server.withMethodHandler (ReadResource.self ) { params in
505
+ await server.withMethodHandler (ReadResource.self ) { params in
506
506
switch params.uri {
507
507
case " resource://knowledge-base/articles" :
508
508
return .init (contents : [Resource.Content .text (" # Knowledge Base\n\n This is the content of the knowledge base..." , uri : params.uri )])
@@ -528,7 +528,7 @@ server.withMethodHandler(ReadResource.self) { params in
528
528
}
529
529
530
530
// Register a resource subscribe handler
531
- server.withMethodHandler (SubscribeToResource .self ) { params in
531
+ await server.withMethodHandler (ResourceSubscribe .self ) { params in
532
532
// Store subscription for later notifications.
533
533
// Client identity for multi-client scenarios needs to be managed by the server application,
534
534
// potentially using information from the initialize handshake if the server handles one client post-init.
@@ -544,7 +544,7 @@ Implement prompt handlers:
544
544
545
545
``` swift
546
546
// Register a prompt list handler
547
- server.withMethodHandler (ListPrompts.self ) { params in
547
+ await server.withMethodHandler (ListPrompts.self ) { params in
548
548
let prompts = [
549
549
Prompt (
550
550
name : " interview" ,
@@ -568,7 +568,7 @@ server.withMethodHandler(ListPrompts.self) { params in
568
568
}
569
569
570
570
// Register a prompt get handler
571
- server.withMethodHandler (GetPrompt.self ) { params in
571
+ await server.withMethodHandler (GetPrompt.self ) { params in
572
572
switch params.name {
573
573
case " interview" :
574
574
let position = params.arguments ? [" position" ]? .stringValue ?? " Software Engineer"
618
618
.user (" Analyze this data and suggest next steps" )
619
619
],
620
620
systemPrompt : " You are a helpful data analyst" ,
621
- maxTokens : 150 ,
622
- temperature : 0.7
621
+ temperature : 0.7 ,
622
+ maxTokens : 150
623
623
)
624
624
625
625
// Use the LLM completion in your server logic
@@ -649,8 +649,8 @@ try await server.start(transport: transport) { clientInfo, clientCapabilities in
649
649
}
650
650
651
651
// You can also inspect client capabilities
652
- if clientCapabilities.tools == nil {
653
- print (" Client does not support tools " )
652
+ if clientCapabilities.sampling == nil {
653
+ print (" Client does not support sampling " )
654
654
}
655
655
656
656
// Perform any server-side setup based on client info
@@ -720,19 +720,18 @@ let server = Server(
720
720
prompts : .init (listChanged : true ),
721
721
resources : .init (subscribe : true , listChanged : true ),
722
722
tools : .init (listChanged : true )
723
- ),
724
- logger : logger
723
+ )
725
724
)
726
725
727
726
// Add handlers directly to the server
728
- server.withMethodHandler (ListTools.self ) { _ in
727
+ await server.withMethodHandler (ListTools.self ) { _ in
729
728
// Your implementation
730
729
return .init (tools : [
731
730
Tool (name : " example" , description : " An example tool" )
732
731
])
733
732
}
734
733
735
- server.withMethodHandler (CallTool.self ) { params in
734
+ await server.withMethodHandler (CallTool.self ) { params in
736
735
// Your implementation
737
736
return .init (content : [.text (" Tool result" )], isError : false )
738
737
}
@@ -791,13 +790,13 @@ import Foundation
791
790
public actor MyCustomTransport : Transport {
792
791
public nonisolated let logger: Logger
793
792
private var isConnected = false
794
- private let messageStream: AsyncThrowingStream<Data, Error >
795
- private let messageContinuation: AsyncThrowingStream<Data, Error >.Continuation
793
+ private let messageStream: AsyncThrowingStream<Data, any Swift. Error >
794
+ private let messageContinuation: AsyncThrowingStream<Data, any Swift. Error >.Continuation
796
795
797
796
public init (logger : Logger? = nil ) {
798
797
self .logger = logger ?? Logger (label : " my.custom.transport" )
799
798
800
- var continuation: AsyncThrowingStream<Data, Error >.Continuation!
799
+ var continuation: AsyncThrowingStream<Data, any Swift. Error >.Continuation!
801
800
self .messageStream = AsyncThrowingStream { continuation = $0 }
802
801
self .messageContinuation = continuation
803
802
}
@@ -817,7 +816,7 @@ public actor MyCustomTransport: Transport {
817
816
// Implement your message sending logic
818
817
}
819
818
820
- public func receive () -> AsyncThrowingStream<Data, Error > {
819
+ public func receive () -> AsyncThrowingStream<Data, any Swift. Error > {
821
820
return messageStream
822
821
}
823
822
}
@@ -863,7 +862,7 @@ LoggingSystem.bootstrap { label in
863
862
let logger = Logger (label : " com.example.mcp" )
864
863
865
864
// Pass to client/server
866
- let client = Client (name : " MyApp" , version : " 1.0.0" , logger : logger )
865
+ let client = Client (name : " MyApp" , version : " 1.0.0" )
867
866
868
867
// Pass to transport
869
868
let transport = StdioTransport (logger : logger)
0 commit comments