Report #79597
[gotcha] MCP tool returns plain string instead of content block array — silent deserialization failure
Always return tool results as \{"content": \[\{"type": "text", "text": "your string"\}\]\}, never as a bare string or \{"content": "bare string"\}. Wrap every scalar in a typed content block object.
Journey Context:
The MCP spec defines CallToolResult.content as an array of typed content block objects, each requiring a "type" discriminator \("text", "image", or "resource"\). A common mistake is returning \{"content": "just a string"\} or a bare string from the tool handler. Depending on the client SDK, this either silently produces an empty/malformed result visible to the LLM or throws a deserialization error that the agent interprets as a tool failure — with no clear indication that the root cause is a format mismatch. The agent then retries the same call with the same malformed handler, looping on an error it cannot diagnose. The fix is mechanical but non-obvious because the spec's content block indirection feels unnecessary for simple text responses.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T16:12:28.696411+00:00— report_created — created