Merge pull request #1931 from lightpanda-io/fix/mcp-jsonrpc-response

Fix MCP error responses missing jsonrpc field
This commit is contained in:
Adrià Arrufat
2026-03-21 06:23:34 +09:00
committed by GitHub
2 changed files with 8 additions and 8 deletions

View File

@@ -87,7 +87,7 @@ pub fn sendResult(self: *Self, id: std.json.Value, result: anytype) !void {
} }
pub fn sendError(self: *Self, id: std.json.Value, code: protocol.ErrorCode, message: []const u8) !void { pub fn sendError(self: *Self, id: std.json.Value, code: protocol.ErrorCode, message: []const u8) !void {
try self.sendResponse(.{ try self.sendResponse(protocol.Response{
.id = id, .id = id,
.@"error" = protocol.Error{ .@"error" = protocol.Error{
.code = @intFromEnum(code), .code = @intFromEnum(code),
@@ -114,7 +114,7 @@ test "MCP.Server - Integration: synchronous smoke test" {
try router.processRequests(server, &in_reader); try router.processRequests(server, &in_reader);
try testing.expectJson(.{ .id = 1 }, out_alloc.writer.buffered()); try testing.expectJson(.{ .jsonrpc = "2.0", .id = 1 }, out_alloc.writer.buffered());
} }
test "MCP.Server - Integration: ping request returns an empty result" { test "MCP.Server - Integration: ping request returns an empty result" {
@@ -135,5 +135,5 @@ test "MCP.Server - Integration: ping request returns an empty result" {
try router.processRequests(server, &in_reader); try router.processRequests(server, &in_reader);
try testing.expectJson(.{ .id = "ping-1", .result = .{} }, out_alloc.writer.buffered()); try testing.expectJson(.{ .jsonrpc = "2.0", .id = "ping-1", .result = .{} }, out_alloc.writer.buffered());
} }

View File

@@ -120,7 +120,7 @@ test "MCP.router - handleMessage - synchronous unit tests" {
\\{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}}} \\{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}}}
); );
try testing.expectJson( try testing.expectJson(
\\{ "id": 1, "result": { "capabilities": { "tools": {} } } } \\{ "jsonrpc": "2.0", "id": 1, "result": { "capabilities": { "tools": {} } } }
, out_alloc.writer.buffered()); , out_alloc.writer.buffered());
out_alloc.writer.end = 0; out_alloc.writer.end = 0;
@@ -128,14 +128,14 @@ test "MCP.router - handleMessage - synchronous unit tests" {
try handleMessage(server, aa, try handleMessage(server, aa,
\\{"jsonrpc":"2.0","id":2,"method":"ping"} \\{"jsonrpc":"2.0","id":2,"method":"ping"}
); );
try testing.expectJson(.{ .id = 2, .result = .{} }, out_alloc.writer.buffered()); try testing.expectJson(.{ .jsonrpc = "2.0", .id = 2, .result = .{} }, out_alloc.writer.buffered());
out_alloc.writer.end = 0; out_alloc.writer.end = 0;
// 3. Tools list // 3. Tools list
try handleMessage(server, aa, try handleMessage(server, aa,
\\{"jsonrpc":"2.0","id":3,"method":"tools/list"} \\{"jsonrpc":"2.0","id":3,"method":"tools/list"}
); );
try testing.expectJson(.{ .id = 3 }, out_alloc.writer.buffered()); try testing.expectJson(.{ .jsonrpc = "2.0", .id = 3 }, out_alloc.writer.buffered());
try testing.expect(std.mem.indexOf(u8, out_alloc.writer.buffered(), "\"name\":\"goto\"") != null); try testing.expect(std.mem.indexOf(u8, out_alloc.writer.buffered(), "\"name\":\"goto\"") != null);
out_alloc.writer.end = 0; out_alloc.writer.end = 0;
@@ -143,7 +143,7 @@ test "MCP.router - handleMessage - synchronous unit tests" {
try handleMessage(server, aa, try handleMessage(server, aa,
\\{"jsonrpc":"2.0","id":4,"method":"unknown_method"} \\{"jsonrpc":"2.0","id":4,"method":"unknown_method"}
); );
try testing.expectJson(.{ .id = 4, .@"error" = .{ .code = -32601 } }, out_alloc.writer.buffered()); try testing.expectJson(.{ .jsonrpc = "2.0", .id = 4, .@"error" = .{ .code = -32601 } }, out_alloc.writer.buffered());
out_alloc.writer.end = 0; out_alloc.writer.end = 0;
// 5. Parse error // 5. Parse error
@@ -152,6 +152,6 @@ test "MCP.router - handleMessage - synchronous unit tests" {
defer filter.deinit(); defer filter.deinit();
try handleMessage(server, aa, "invalid json"); try handleMessage(server, aa, "invalid json");
try testing.expectJson("{\"id\": null, \"error\": {\"code\": -32700}}", out_alloc.writer.buffered()); try testing.expectJson("{\"jsonrpc\": \"2.0\", \"id\": null, \"error\": {\"code\": -32700}}", out_alloc.writer.buffered());
} }
} }