mcp: typed tool handlers lose wrapped JSON-RPC errors

Aperta Adatta ai principianti
#1,529 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

  • #1528 di @ktsoator — chiusa senza merge

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
85/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
go

Direzione di ricerca

Inizia da toolForErr nel pacchetto MCP e dalla gestione degli errori JSON-RPC usata da ClientSession.CallTool; confronta la gestione diretta di *jsonrpc.Error con gli errori incapsulati. Esegui la riproduzione client/server in memoria fornita, poi verifica che errors.As preservi il codice, il messaggio e i dati JSON-RPC e che il risultato non venga erroneamente contrassegnato come errore di esecuzione. Aggiungi o aggiorna test mirati per gli errori di protocollo incapsulati e non incapsulati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Checklist
  • I searched the existing issues, and this has not been reported before.
  • This is a real problem that I ran into myself, using the latest release of the SDK.
  • I ran into it in a production system, not in a toy example, a benchmark, or an automated or AI-driven scan of the code.
  • I (a human) examined the relevant SDK code, and wrote or reviewed every line of this report. It is not unreviewed AI output.
  • This report is brief and concise, and sticks to the facts needed to understand the problem.
What happened?

A typed tool handler returning a wrapped *jsonrpc.Error is treated as a tool execution error. ClientSession.CallTool returns a nil Go error and a result with IsError: true, so the JSON-RPC error code and data are lost. Returning the same protocol error directly works.

toolForErr checks err.(*jsonrpc.Error) instead of searching the error chain. The expected result is a JSON-RPC error with the underlying code, message, and data preserved when wrapped with %w.

How to reproduce

Run this program with github.com/modelcontextprotocol/go-sdk v1.8.0:


package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/modelcontextprotocol/go-sdk/jsonrpc"
	"github.com/modelcontextprotocol/go-sdk/mcp"
)

func main() {
	ctx := context.Background()
	s := mcp.NewServer(&mcp.Implementation{Name: "server", Version: "1"}, nil)
	mcp.AddTool(s, &mcp.Tool{Name: "demo"}, func(context.Context, *mcp.CallToolRequest, map[string]any) (*mcp.CallToolResult, any, error) {
		return nil, nil, fmt.Errorf("backend: %w", &jsonrpc.Error{
			Code:    jsonrpc.CodeInvalidParams,
			Message: "bad input",
		})
	})

	st, ct := mcp.NewInMemoryTransports()
	ss, err := s.Connect(ctx, st, nil)
	if err != nil {
		panic(err)
	}
	defer ss.Close()

	c := mcp.NewClient(&mcp.Implementation{Name: "client", Version: "1"}, nil)
	cs, err := c.Connect(ctx, ct, nil)
	if err != nil {
		panic(err)
	}
	defer cs.Close()

	result, err := cs.CallTool(ctx, &mcp.CallToolParams{Name: "demo"})
	var rpcErr *jsonrpc.Error
	fmt.Printf("protocolError=%v, err=%v\n", errors.As(err, &rpcErr), err)
	if result != nil {
		fmt.Printf("isError=%v\n", result.IsError)
	}
}

Observed:

protocolError=false, err=<nil>
isError=true

Expected: protocolError=true, with JSON-RPC code -32602.

Where did you hit this?

Found during local code inspection and reproduced with an in-memory client and server.

Go MCP SDK version

v1.8.0

Go version

go1.26.10 darwin/arm64, also reproduced on main at 0fa5e8407aa3fda65166e4207156c03d084bfd44.

Proposed fix

Use errors.As and return the underlying protocol error.

Lingua principale
Go
Stelle
5.3k
Fork
614
Merge medio
23h 55m
PR unite (30g)
62

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di modelcontextprotocol/go-sdk

Tutte le issue di modelcontextprotocol/go-sdk

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.