From 609cdc709b1bf54fbced7a2cb0c8b538f4f38393 Mon Sep 17 00:00:00 2001 From: Carl Peaslee Date: Fri, 30 May 2025 12:35:34 -0700 Subject: [PATCH] Add `Client.listResourceTemplates` method (#125) * adds listResourceTemplates to client for #124 * add pagination to resources/templates/list from @mattt Co-authored-by: Mattt * adds cursor functionality to ListResourceTemplates * updates the client method to use the updated signature --------- Co-authored-by: Mattt --- Sources/MCP/Client/Client.swift | 14 ++++++++++++++ Sources/MCP/Server/Resources.swift | 17 +++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Sources/MCP/Client/Client.swift b/Sources/MCP/Client/Client.swift index 6031835..53d11fd 100644 --- a/Sources/MCP/Client/Client.swift +++ b/Sources/MCP/Client/Client.swift @@ -578,6 +578,20 @@ public actor Client { _ = try await send(request) } + public func listResourceTemplates(cursor: String? = nil) async throws -> ( + templates: [Resource.Template], nextCursor: String? + ) { + try validateServerCapability(\.resources, "Resources") + let request: Request + if let cursor = cursor { + request = ListResourceTemplates.request(.init(cursor: cursor)) + } else { + request = ListResourceTemplates.request(.init()) + } + let result = try await send(request) + return (templates: result.templates, nextCursor: result.nextCursor) + } + // MARK: - Tools public func listTools(cursor: String? = nil) async throws -> ( diff --git a/Sources/MCP/Server/Resources.swift b/Sources/MCP/Server/Resources.swift index 311ff09..12f6733 100644 --- a/Sources/MCP/Server/Resources.swift +++ b/Sources/MCP/Server/Resources.swift @@ -149,17 +149,30 @@ public enum ReadResource: Method { public enum ListResourceTemplates: Method { public static let name: String = "resources/templates/list" - public typealias Parameters = Empty + public struct Parameters: NotRequired, Hashable, Codable, Sendable { + public let cursor: String? + + public init() { + self.cursor = nil + } + + public init(cursor: String) { + self.cursor = cursor + } + } public struct Result: Hashable, Codable, Sendable { public let templates: [Resource.Template] + public let nextCursor: String? - public init(templates: [Resource.Template]) { + public init(templates: [Resource.Template], nextCursor: String? = nil) { self.templates = templates + self.nextCursor = nextCursor } private enum CodingKeys: String, CodingKey { case templates = "resourceTemplates" + case nextCursor } } }