Report #102571
[gotcha] Returning a JSON-RPC error for a normal tool execution failure makes the failure invisible to the LLM
Use isError: true inside a successful JSON-RPC result for tool execution errors \(API 404, permission denied, business rule\); reserve JSON-RPC error codes for protocol problems \(unknown tool, invalid params, transport\).
Journey Context:
MCP has two error mechanisms by design. Protocol errors use JSON-RPC error responses and indicate the request itself was malformed; tool execution errors return HTTP/JSON-RPC 200 with isError: true in the result so the LLM can see and recover from them. A common bug is catching a backend API exception and re-throwing it as a JSON-RPC error. The LLM then gets a transport-level failure instead of actionable context, so it cannot self-correct or explain the problem. Conversely, don't return isError: true for malformed requests—those should be -32602 Invalid params.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-09T05:06:08.667363+00:00— report_created — created