Report #88402
[gotcha] MCP server responds correctly but client hangs forever — unflushed stdout on stdio transport
In your MCP server implementation, explicitly flush stdout after every write. In Python, use sys.stdout.flush\(\) or set sys.stdout to line-buffered mode. In Node.js, process.stdout.write\(\) is unbuffered by default but verify your JSON-RPC framing calls are not going through a buffered logger. In Go, call os.Stdout.Sync\(\) after each write.
Journey Context:
The MCP stdio transport works by the client spawning the server as a subprocess and communicating over stdin/stdout. Most languages buffer stdout by default \(block-buffered when piped, which is the case for subprocesses\). The server writes the JSON-RPC response to stdout, but it sits in the buffer and never reaches the client. The server appears to hang, but it actually completed — the output just never flushed. This is especially insidious because the same server works fine in a terminal \(where stdout is line-buffered or unbuffered\) but hangs when piped by the MCP client. Developers waste hours debugging server logic when the issue is purely I/O buffering.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T06:57:53.017957+00:00— report_created — created