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:
-
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.
-
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
When a client sends a
tools/callrequest whereargumentsisnull(rather than omitted or{}), the SDK returns-32603 InternalErrorwith 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:
nullrejected for an optional field.CallToolRequestParamsSchemauses.optional()which acceptsundefinedbut notnull. The MCP spec says arguments is optional;nullshould be treated as absent.Wrong error code. The error is
-32603(InternalError) instead of-32602(InvalidParams). The protocol handler usesschema.parse()which throws a ZodError on failure. ZodError has no numericcodeproperty, so the error handler atprotocol.ts:672falls back toProtocolErrorCode.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 asnullwill hit this on every server built with the TypeScript SDK.Versions
@modelcontextprotocol/sdkmain branch (also confirmed on published npm package)