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 } } }