Report #15733
[tooling] Zombie MCP server processes remaining after client disconnects on stdio transport
Implement a stdin watchdog that exits the server process when EOF is detected on stdin \(or within 5 seconds of connection loss\), or migrate to HTTP with SSE which has explicit connection lifecycle management via TCP timeouts.
Journey Context:
When using stdio transport, the MCP client spawns the server as a child process. If the client crashes or disconnects abruptly \(kill -9, network timeout for wrapped stdio\), the server process often remains alive as a zombie because it never receives an EOF on stdin \(the pipe breaks but the process doesn't detect it on all OSes\). This leaks resources and can cause port/file locks. Most developers don't handle this because testing usually involves graceful shutdowns. The fix is to treat stdio as a heartbeat: if no data arrives within a timeout, or if select\(\) shows stdin closed, exit immediately. HTTP\+SSE avoids this by using standard HTTP connection management.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T00:51:54.422837+00:00— report_created — created