Add support for JSON-RPC batching (#67)

* Update StdioTransport documentation comments to indicate support for JSON-RPC batches

* Add server support for JSON-RPC batching

* Add client support for JSON-RPC batching

* Fix bug that caused error messages to be wrapped unnecessarily
This commit is contained in:
Mattt 2025-04-10 12:13:41 -07:00 • committed by GitHub
commit 82f4fd29b3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -170,25 +170,38 @@ extension MCPError: Codable {
let message = try container.decode(String.self, forKey: .message)
let data = try container.decodeIfPresent([String: Value].self, forKey: .data)
// Helper to extract detail from data, falling back to message if needed
let unwrapDetail: (String?) -> String? = { fallback in
guard let detailValue = data?["detail"] else { return fallback }
if case .string(let str) = detailValue { return str }
return fallback
}
switch code {
case -32700:
self = .parseError(data?["detail"] as? String ?? message)
self = .parseError(unwrapDetail(message))
case -32600:
self = .invalidRequest(data?["detail"] as? String ?? message)
self = .invalidRequest(unwrapDetail(message))
case -32601:
self = .methodNotFound(data?["detail"] as? String ?? message)
self = .methodNotFound(unwrapDetail(message))
case -32602:
self = .invalidParams(data?["detail"] as? String ?? message)
self = .invalidParams(unwrapDetail(message))
case -32603:
self = .internalError(data?["detail"] as? String ?? message)
self = .internalError(unwrapDetail(nil))
case -32000:
self = .connectionClosed
case -32001:
// Extract underlying error string if present
let underlyingErrorString =
data?["error"].flatMap { val -> String? in
if case .string(let str) = val { return str }
return nil
} ?? message
self = .transportError(
NSError(
domain: "org.jsonrpc.error",
code: code,
userInfo: [NSLocalizedDescriptionKey: message]
userInfo: [NSLocalizedDescriptionKey: underlyingErrorString]
)
)
default: