diff --git a/Sources/MCP/Base/Messages.swift b/Sources/MCP/Base/Messages.swift index 91ecbd7..c0d9649 100644 --- a/Sources/MCP/Base/Messages.swift +++ b/Sources/MCP/Base/Messages.swift @@ -11,6 +11,12 @@ public struct Empty: NotRequired, Hashable, Codable, Sendable { public init() {} } +extension Value: NotRequired { + public init() { + self = .null + } +} + // MARK: - /// A method that can be used to send requests and receive responses. diff --git a/Tests/MCPTests/RequestTests.swift b/Tests/MCPTests/RequestTests.swift index edceb35..86747e2 100644 --- a/Tests/MCPTests/RequestTests.swift +++ b/Tests/MCPTests/RequestTests.swift @@ -260,4 +260,49 @@ struct RequestTests { from: withCursor.data(using: .utf8)!) #expect(decodedWithCursor.params.cursor == "next-page") } + + @Test("AnyRequest parameters request decoding - without params") + func testAnyRequestParametersRequestDecodingWithoutParams() throws { + // Test decoding when params field is missing + let jsonString = """ + {"jsonrpc":"2.0","id":1,"method":"ping"} + """ + let data = jsonString.data(using: .utf8)! + + let decoder = JSONDecoder() + let decoded = try decoder.decode(AnyRequest.self, from: data) + + #expect(decoded.id == 1) + #expect(decoded.method == Ping.name) + } + + @Test("AnyRequest parameters request decoding - with null params") + func testAnyRequestParametersRequestDecodingWithNullParams() throws { + // Test decoding when params field is null + let jsonString = """ + {"jsonrpc":"2.0","id":1,"method":"ping","params":null} + """ + let data = jsonString.data(using: .utf8)! + + let decoder = JSONDecoder() + let decoded = try decoder.decode(Request.self, from: data) + + #expect(decoded.id == 1) + #expect(decoded.method == Ping.name) + } + + @Test("AnyRequest parameters request decoding - with empty params") + func testAnyRequestParametersRequestDecodingWithEmptyParams() throws { + // Test decoding when params field is null + let jsonString = """ + {"jsonrpc":"2.0","id":1,"method":"ping","params":{}} + """ + let data = jsonString.data(using: .utf8)! + + let decoder = JSONDecoder() + let decoded = try decoder.decode(Request.self, from: data) + + #expect(decoded.id == 1) + #expect(decoded.method == Ping.name) + } }