MCP error codes: what -32601, -32602, and -32001 mean

MCP error codes are JSON-RPC codes. What -32700 to -32603 mean, why -32001 is a client-side timeout, and how a failed tool call differs from both.

5 min readSume
All posts

MCP error codes are JSON-RPC 2.0 error codes. The standard ones are -32700 (parse error), -32600 (invalid request), -32601 (method not found), -32602 (invalid params), and -32603 (internal error). In the MCP TypeScript SDK, -32000 and -32001, as in MCP error -32001: Request timed out, are client-side codes: the connection closed, or no answer arrived within the request timeout, 60 seconds by default. A tool that runs and fails is different: it returns a normal result with isError: true.

The codes come from the JSON-RPC 2.0 specification, the MCP 2025-11-25 tools page, the 2026-07-28 changelog, and the TypeScript SDK's v1.x types and protocol source, all read on 2026-09-28. The Sume examples describe the current code of Sume's hosted MCP server, which the basics page says still works but is not part of the primary path today.

What does each MCP error code mean?

JSON-RPC reserves -32768 to -32000 for predefined errors and sets aside -32000 to -32099 for implementation-defined server errors. That is why a number in that last range can mean one thing in an SDK and another on a server.

From the JSON-RPC 2.0 specification, the MCP tools page, and the SDK's types.ts and protocol.ts, read 2026-09-28.
CodeNameRaised byMeaning
-32700Parse errorServerInvalid JSON was received by the server
-32600Invalid RequestServerThe JSON sent is not a valid Request object
-32601Method not foundServerThe method does not exist or is not available
-32602Invalid paramsServerInvalid method parameters; the MCP spec's example uses it for an unknown tool
-32603Internal errorServerInternal JSON-RPC error
-32000ConnectionClosedTypeScript SDK, client sideThe connection closed while the request was still waiting
-32001RequestTimeoutTypeScript SDK, client sideNo response arrived within the request timeout, 60,000 ms by default

Why do I get MCP error -32001: Request timed out?

Because the client stopped waiting, not because the server sent an error. In the TypeScript SDK, every request starts a timer. If no response arrives within timeout milliseconds, the request fails with RequestTimeout and the message Request timed out, and the SDK's error class prints that as MCP error -32001: Request timed out. The default, DEFAULT_REQUEST_TIMEOUT_MSEC, is 60,000 ms.

  • Raise the request timeout if your client lets you. In the SDK, resetTimeoutOnProgress (default false) lets progress notifications restart the timer, and maxTotalTimeout caps the total wait.
  • The 60-second default belongs to the TypeScript SDK. A client built another way can use another value, so check its own docs.
  • Make long work return early and wait in slices. On Sume's server, generation tools answer with a job id in current code, and one jobs_wait call holds at most 55 seconds. MCP tool call timeouts on long-running video jobs covers that loop.
  • Its neighbor, -32000 Connection closed, means the transport closed while requests were waiting: the SDK fails each of them with that code.

Is a failed tool call an MCP error code?

No. The MCP spec uses two mechanisms. Protocol errors are standard JSON-RPC errors, for unknown tools, malformed requests, and server errors. Tool execution errors, such as API failures, input validation errors, and business logic errors, come back as a normal result with isError: true. Clients SHOULD provide tool execution errors to the model so it can self-correct; protocol errors are less likely to lead to recovery. The spec's two examples:

// Protocol error: a JSON-RPC error object
{ "jsonrpc": "2.0", "id": 3,
  "error": { "code": -32602, "message": "Unknown tool: invalid_tool_name" } }

// Tool execution error: a normal result with isError
{ "jsonrpc": "2.0", "id": 4,
  "result": {
    "content": [{ "type": "text",
      "text": "Invalid departure date: must be in the future. Current date is 08/08/2025." }],
    "isError": true } }

What do the codes mean on Sume's MCP server?

At https://mcp.sume.com/mcp, the server's current code answers like this:

  • -32600 for a message without jsonrpc: "2.0" or a string method. With HTTP 400 and Unsupported MCP protocol version., it also answers an MCP-Protocol-Version header other than 2025-03-26, 2025-06-18, or 2025-11-25.
  • -32601, MCP method is not supported: …, for a request whose method isn't initialize, ping, tools/list, or tools/call. The server declares only the tools capability, so resources/list lands here.
  • -32602 for other request failures, such as a tools/call with no tool name.
  • -32000, MCP work budget is full; retry shortly., with HTTP 429, when the caller's MCP work budget is full and the message is not a tool call.
  • Tool failures are isError: true results whose text is JSON with a code and a message. An OAuth session without mcp:write gets insufficient_scope on a write tool (how to fix it). An unknown tool name gets tool_not_found as a tool result, where the spec's own example uses -32602.

Did the 2026-07-28 revision change the codes?

It set a policy for the server-error range: -32000 to -32019 stays implementation-defined, with existing SDK usage grandfathered, and -32020 to -32099 is reserved for the MCP specification. It moved three codes introduced in that draft to -32020 (HeaderMismatch), -32021 (MissingRequiredClientCapability), and -32022 (UnsupportedProtocolVersion), and changed resource not found from -32002 to -32602. Sume's error.code tokens outside MCP are a different system, indexed in Sume API error codes by surface.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume