fix: exit orphaned stdio MCP servers on parent death - #67
Conversation
Clients can abandon sessions while a wrapper keeps stdin open, so EOF never arrives and leaked servers thrash swap. Exit on stdin close and add a parent-liveness watchdog (same approach as mcp-automem).
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 585ca3a0aa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Expose optional parentPid and pin it at the top of main() so the watchdog matches mcp-automem #137 even if later boot work awaits.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a2c65b5b94
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Hard process.exit on stdin end/close raced the documented `echo … | npm start` tool probe (AGENTS.md) and could kill in-flight handlers before the MCP response was written. Close the transport on EOF and let the event loop drain; parent-watchdog + signals still hard-exit orphans that keep stdin open.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 68e254b28a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Calling transport.close() on stdin end/close still tripped the MCP SDK onclose → process.exit, breaking one-shot `echo … | npm start` flows. Hard exit stays on parent-watchdog reparent and SIGTERM/SIGINT/SIGHUP only.
Summary
Stdio MCP servers can leak forever when a client (Claude Desktop / Cursor / Grok / Codex) abandons a session but an intermediate wrapper (
npx/npm exec/ launcher) keeps the stdin write-end open. No EOF arrives, the process stays in the event loop, and repeated leaks cause multi-GB swap thrashing.This mirrors the fix already shipped in
mcp-automem(#137):end/close(and transport/signal where applicable)ppidchanges from the startup parent (POSIX reparent), exit promptlyTest plan