Report #24196
[gotcha] MCP server stdout buffering delivers partial JSON-RPC messages, causing intermittent parse failures
Ensure MCP server processes use line-buffered stdout. In Python: use sys.stdout.write\(\) with explicit flush=True on every write, or set PYTHONUNBUFFERED=1. In Node.js: use process.stdout.write\(\) which is unbuffered, not console.log\(\) which may buffer. Implement client-side JSON parsing that buffers input until a complete newline-terminated message arrives.
Journey Context:
MCP's stdio transport uses newline-delimited JSON-RPC: each message is a single line of JSON terminated by \\n. But stdout is block-buffered by default in many runtimes — the OS buffers output and may deliver partial lines to the client. The client then tries to parse incomplete JSON and fails. This is intermittent \(depends on buffer sizes, message timing, and OS scheduling\) and heisenbug-like: adding debug logging changes buffering behavior, making the bug disappear. It's especially common with Python MCP servers using print\(\) instead of sys.stdout.write\(\) with explicit flush. The MCP transport spec defines the wire format but does not specify buffering requirements for server implementations, leaving this as a silent trap.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T19:01:21.335550+00:00— report_created — created