Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Sources/MCP/Base/Messages.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
45 changes: 45 additions & 0 deletions Tests/MCPTests/RequestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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<Ping>.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<Ping>.self, from: data)

#expect(decoded.id == 1)
#expect(decoded.method == Ping.name)
}
}