Skip to content

Commit 718b172

Browse files
committed
fix: surface JSON-RPC error responses in mcpcurl
readJSONRPCResponse now checks for an "error" field in responses and returns a descriptive error instead of silently passing it through.
1 parent 5fd92a2 commit 718b172

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

cmd/mcpcurl/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,9 @@ func readJSONRPCResponse(scanner *bufio.Scanner) (string, error) {
503503
return "", fmt.Errorf("failed to parse JSON-RPC message: %w", err)
504504
}
505505
if _, hasID := msg["id"]; hasID {
506+
if errField, hasErr := msg["error"]; hasErr {
507+
return "", fmt.Errorf("server returned error: %s", string(errField))
508+
}
506509
return line, nil
507510
}
508511
// No "id" — this is a notification, skip it

cmd/mcpcurl/main_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,23 @@ func TestReadJSONRPCResponse_InvalidJSON(t *testing.T) {
8888
}
8989
}
9090

91+
func TestReadJSONRPCResponse_ServerError(t *testing.T) {
92+
t.Parallel()
93+
input := `{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"method not found"}}` + "\n"
94+
scanner := bufio.NewScanner(strings.NewReader(input))
95+
96+
_, err := readJSONRPCResponse(scanner)
97+
if err == nil {
98+
t.Fatal("expected error for server error response, got nil")
99+
}
100+
if !strings.Contains(err.Error(), "server returned error") {
101+
t.Fatalf("expected 'server returned error', got: %v", err)
102+
}
103+
if !strings.Contains(err.Error(), "method not found") {
104+
t.Fatalf("expected error to contain server message, got: %v", err)
105+
}
106+
}
107+
91108
func TestBuildInitializeRequest(t *testing.T) {
92109
t.Parallel()
93110
got, err := buildInitializeRequest()

0 commit comments

Comments
 (0)