Skip to content

Commit 4656930

Browse files
committed
mcp: avoid "null" when tools fail to return content
For some reason, this was a regression from v0.3.1, for some of our examples. Fix it and address the existing TODO.
1 parent 46e767e commit 4656930

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

mcp/server.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -496,9 +496,13 @@ func (s *Server) callTool(ctx context.Context, req *CallToolRequest) (*CallToolR
496496
Message: fmt.Sprintf("unknown tool %q", req.Params.Name),
497497
}
498498
}
499-
// TODO: if handler returns nil content, it will serialize as null.
500-
// Add a test and fix.
501-
return st.handler(ctx, req)
499+
res, err := st.handler(ctx, req)
500+
if err == nil && res != nil && res.Content == nil {
501+
res2 := *res
502+
res2.Content = []Content{} // avoid "null"
503+
res = &res2
504+
}
505+
return res, err
502506
}
503507

504508
func (s *Server) listResources(_ context.Context, req *ListResourcesRequest) (*ListResourcesResult, error) {

mcp/streamable_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ func TestStreamableServerTransport(t *testing.T) {
520520
method: "POST",
521521
messages: []jsonrpc.Message{req(2, "tools/call", &CallToolParams{Name: "tool"})},
522522
wantStatusCode: http.StatusOK,
523-
wantMessages: []jsonrpc.Message{resp(2, &CallToolResult{}, nil)},
523+
wantMessages: []jsonrpc.Message{resp(2, &CallToolResult{Content: []Content{}}, nil)},
524524
},
525525
},
526526
},
@@ -547,14 +547,14 @@ func TestStreamableServerTransport(t *testing.T) {
547547
headers: http.Header{"Accept": {"text/plain", "*/*"}},
548548
messages: []jsonrpc.Message{req(4, "tools/call", &CallToolParams{Name: "tool"})},
549549
wantStatusCode: http.StatusOK,
550-
wantMessages: []jsonrpc.Message{resp(4, &CallToolResult{}, nil)},
550+
wantMessages: []jsonrpc.Message{resp(4, &CallToolResult{Content: []Content{}}, nil)},
551551
},
552552
{
553553
method: "POST",
554554
headers: http.Header{"Accept": {"text/*, application/*"}},
555555
messages: []jsonrpc.Message{req(4, "tools/call", &CallToolParams{Name: "tool"})},
556556
wantStatusCode: http.StatusOK,
557-
wantMessages: []jsonrpc.Message{resp(4, &CallToolResult{}, nil)},
557+
wantMessages: []jsonrpc.Message{resp(4, &CallToolResult{Content: []Content{}}, nil)},
558558
},
559559
},
560560
},
@@ -592,7 +592,7 @@ func TestStreamableServerTransport(t *testing.T) {
592592
wantStatusCode: http.StatusOK,
593593
wantMessages: []jsonrpc.Message{
594594
req(0, "notifications/progress", &ProgressNotificationParams{}),
595-
resp(2, &CallToolResult{}, nil),
595+
resp(2, &CallToolResult{Content: []Content{}}, nil),
596596
},
597597
},
598598
},
@@ -624,7 +624,7 @@ func TestStreamableServerTransport(t *testing.T) {
624624
wantStatusCode: http.StatusOK,
625625
wantMessages: []jsonrpc.Message{
626626
req(1, "roots/list", &ListRootsParams{}),
627-
resp(2, &CallToolResult{}, nil),
627+
resp(2, &CallToolResult{Content: []Content{}}, nil),
628628
},
629629
},
630630
},
@@ -674,7 +674,7 @@ func TestStreamableServerTransport(t *testing.T) {
674674
},
675675
wantStatusCode: http.StatusOK,
676676
wantMessages: []jsonrpc.Message{
677-
resp(2, &CallToolResult{}, nil),
677+
resp(2, &CallToolResult{Content: []Content{}}, nil),
678678
},
679679
},
680680
{

0 commit comments

Comments
 (0)