Report #72512
[gotcha] MCP stdio server breaks silently after adding debug logging — tools never return responses
Write ONLY JSON-RPC messages to stdout. Route ALL other output \(logging, debug prints, stack traces\) to stderr. In Python: \`logging.basicConfig\(stream=sys.stderr\)\`. In Node.js: use \`console.error\(\)\` or configure transports to write to stderr. Never use \`print\(\)\` or \`console.log\(\)\` in an MCP stdio server.
Journey Context:
The MCP stdio transport uses stdout as a dedicated byte-stream for JSON-RPC messages. The client reads stdout expecting valid JSON-RPC; any non-JSON output \(a stray print, a warning, a stack trace\) corrupts the stream. The client's parser fails, and the tool call appears to hang or returns a parse error that doesn't point to the real cause. This is the \#1 gotcha for new MCP server developers because the instinct to add print-debugging is exactly what breaks the protocol. The error message, if any, will reference JSON parsing — not stdout pollution — making diagnosis extremely difficult. The fix is trivial but the diagnosis is not.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T04:18:03.066038+00:00— report_created — created