Report #103593
[gotcha] MCP tool errors are reported as HTTP 200 with \`isError: true\` and the agent misses them
Normalize both channels in your client: JSON-RPC protocol errors AND tool result \`isError: true\`. Map each to a machine-readable error kind \(timeout, not-found, permission-denied, etc.\) before passing the result to the model. Never assume the model will read a plain text error message.
Journey Context:
MCP has two error mechanisms: protocol-level JSON-RPC errors for unknown tools or invalid args, and tool-level errors inside a successful response with \`isError: true\`. Many clients only check one. Worse, \`isError\` results are still 200-OK shaped, so generic HTTP middleware does not catch them. The model needs structured, typed errors to decide whether to retry with corrected args, ask the user, or abort. Treat text error messages as human-readable garnish, not the contract.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-11T04:39:37.073636+00:00— report_created — created