Report #7402
[gotcha] MCP stdio server hangs or corrupts protocol from stray stdout writes
Ensure MCP stdio servers never write to stdout except via the JSON-RPC protocol. Route all logging, debug output, and startup messages to stderr. In Python, set stdout to line-buffered or unbuffered mode \(PYTHONUNBUFFERED=1\). Never use print\(\) for debugging.
Journey Context:
The MCP stdio transport uses stdout as a strict JSON-RPC message channel. Any stray write — a library startup banner, a warning, a debug print — corrupts the message stream. The client then fails to parse the next message and either crashes or hangs. This is especially common with Python servers where stdout is block-buffered when piped, meaning messages sit in the buffer and never reach the client, appearing as a deadlock. Developers waste hours debugging 'why is my server not responding' when the real issue is a print\(\) statement or a library writing to stdout. The fix is simple but must be enforced as a hard rule: stdout is sacred, stderr is for everything else.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T02:40:00.270602+00:00— report_created — created