modelcontextprotocol / modelcontextprotocol/typescript-sdk

tools/call with null arguments returns -32603 (InternalError) instead of being accepted

Ouverte
#2,012 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug fix proposed P2 ready for work
Langage dominant
TypeScript
Étoiles
13.4k
Forks
2.2k
Merge moyen
3 j 15 h
PR mergées (30 j)
4

Description

When a client sends a tools/call request where arguments is null (rather than omitted or {}), the SDK returns -32603 InternalError with a raw Zod validation message instead of accepting the request.

This affects every server built on the TypeScript SDK. Clients that serialize missing/empty fields as null (common in Go, Java, and C# JSON libraries) cannot call tools without arguments.

Reproduce

Send this over stdio to any server built with @modelcontextprotocol/sdk:

{"jsonrpc":"2.0","method":"initialize","id":1,"params":{"clientInfo":{"name":"test","version":"1.0"},"protocolVersion":"2025-11-25","capabilities":{}}}
{"jsonrpc":"2.0","method":"tools/call","id":2,"params":{"name":"echo","arguments":null}}

Expected

Request accepted (arguments treated as empty/undefined).

Actual

{
  "jsonrpc": "2.0",
  "id": 2,
  "error": {
    "code": -32603,
    "message": "[\n  {\n    \"expected\": \"record\",\n    \"code\": \"invalid_type\",\n    \"path\": [\"params\", \"arguments\"],\n    \"message\": \"Invalid input: expected record, received null\"\n  }\n]"
  }
}

Two problems:

  1. null rejected for an optional field. CallToolRequestParamsSchema uses .optional() which accepts undefined but not null. The MCP spec says arguments is optional; null should be treated as absent.

  2. Wrong error code. The error is -32603 (InternalError) instead of -32602 (InvalidParams). The protocol handler uses schema.parse() which throws a ZodError on failure. ZodError has no numeric code property, so the error handler at protocol.ts:672 falls back to ProtocolErrorCode.InternalError.

Impact

Tested against @modelcontextprotocol/server-everything: all 13 tools fail with this error when called with null arguments. Any Go, Java, or C# client that serializes missing fields as null will hit this on every server built with the TypeScript SDK.

Versions

  • @modelcontextprotocol/sdk main branch (also confirmed on published npm package)
  • Node.js v25.8.2

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par CallToolRequestParamsSchema et le gestionnaire du protocole autour de protocol.ts:672, puis reproduisez la requête via stdio à l’aide du JSON affiché. C’est terminé lorsque tools/call accepte les arguments null comme absents et que des données de requête invalides produisent l’erreur InvalidParams du protocole au lieu de InternalError.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
api, backend
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Calme
Clarté
Clairement spécifiée
Accessibilité débutants
66/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.