Skip to content

fix: exit orphaned stdio MCP servers on parent death - #8

Open
jack-arturo wants to merge 3 commits into
mainfrom
fix/stdio-orphan-exit
Open

fix: exit orphaned stdio MCP servers on parent death#8
jack-arturo wants to merge 3 commits into
mainfrom
fix/stdio-orphan-exit

Conversation

@jack-arturo

Copy link
Copy Markdown
Member

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):

  • exit on stdin end/close (and transport/signal where applicable)
  • parent-liveness watchdog: when ppid changes from the startup parent (POSIX reparent), exit promptly

Test plan

  • Unit tests for watchdog interval parsing + one-shot fire
  • Manual: spawn via wrapper that holds stdin open, kill wrapper, confirm leaf exits within watchdog interval

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).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 049f3574d1

ℹ️ 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".

Comment thread src/lifecycle.ts
Comment thread src/lifecycle.ts
Comment thread src/server.ts
Do not transport.close() or process.exit on stdin end/close — that trips
SDK onclose and breaks one-shot pipe flows. Hard exit only on parent
watchdog reparent and SIGTERM/SIGINT/SIGHUP. Capture parentPid before
any await; unit tests assert stdin EOF alone does not exit.
Match mcp-automem wording: win32 does not reparent orphans, so the ppid probe is a documented no-op there.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant