MCP tool error or JSON-RPC error: where Sume's failures land
Sume returns tool failures as results with isError true and keeps JSON-RPC errors for protocol faults, per the 2025-11-25 MCP spec. Here is the split.

When a Sume tool call fails, the failure comes back as a normal tool result with isError set to true, so the model can read it and react. JSON-RPC errors are reserved for protocol problems such as an invalid request or an unknown method. This matches the 2025-11-25 MCP specification, which says tool execution errors should be reported in the result so the model can see them, and protocol errors use JSON-RPC error responses.
Which failure is which
| Failure | Shape | Retry? |
|---|---|---|
| Write tool under an mcp:read session | Tool result, isError true, code insufficient_scope, required_scope mcp:write | No, re-consent with Write |
| Misspelled tool name | Tool result, code tool_not_found, with a suggested name when one exists | Yes, with the exact name |
| Host at capacity for a tool call | Tool result, code wait_busy, HTTP status 429 in the payload | Yes, with the same idempotency_key |
| Unsupported MCP-Protocol-Version header | HTTP 400 with JSON-RPC error -32600 | No, change client version |
| Malformed JSON-RPC request | JSON-RPC error -32600 | No, fix the client |
| Unknown method | JSON-RPC error -32601 | No |
| Host budget full on a non-tool method | JSON-RPC error -32000 | Yes, shortly |
Why the split matters to your client
Many clients show a JSON-RPC error to the person but hand a tool result to the model. If a paid call fails with wait_busy, the model sees the message and can retry with the same idempotency_key. If your client turns every isError into an exception, the model never gets the chance, and a human sees a stack trace.
The supported protocol versions on Sume's host are 2025-03-26, 2025-06-18 and 2025-11-25. Older batch requests are limited to 4 messages, and current revisions need one message per request.
What to log
Branch your retry logic on these codes instead of on message text. A wait_busy is worth retrying after a second, while an insufficient_scope will fail identically until the person grants Write.
- The error code field in the tool result, such as insufficient_scope or wait_busy.
- The JSON-RPC code for protocol faults.
- The idempotency_key and job id for write and paid calls, never the credential.
A small classifier
Write one function that takes a response and returns one of four classes: success, retry-same-call, fix-and-retry, and stop. Put wait_busy and read_busy in the first retry class, tool_not_found in fix-and-retry, and insufficient_scope and authorization failures in stop. Every agent loop then handles Sume the same way, and a new error code needs one new line rather than a new branch in each caller.
Log the class and the code, not the full payload. The payload can include job metadata you do not want sitting in shared logs.
Sources
Related posts
More in Integrations
- Perplexity Agent API MCP tool: server_label rules for Sume
Perplexity MCP tool: server_label must match ^[a-zA-Z0-9_-]{1,64}$. A Sume entry that passes, with authorization, headers and allowed_tools.
- Perplexity MCP authorization field with Sume: one-hour token
Perplexity passes the authorization value to the MCP server as an access token. A Sume OAuth token lasts one hour with no refresh, so use an API key unattended.
- Sume MCP read_busy 503: four concurrent reads per owner
read_busy is a retryable 503 from Sume's MCP host. Reads inside tools, including jobs_wait polls, are capped at 4 at once per owner, 512 across the host.
- Voice files from Gemini or ElevenLabs in a Sume timeline: 31 cents
Make the voice elsewhere, import the files into Sume media, join up to 20 parts for $0.01, render 3 minutes for $0.30. Total $0.31 plus your clips.
Written by Sume