Skip to content

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

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

fix: exit orphaned stdio MCP servers on parent death#67
jack-arturo wants to merge 5 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: 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".

Comment thread node_modules Outdated
Comment thread src/lifecycle.ts
Comment thread src/lifecycle.ts Outdated
Comment thread src/lifecycle.ts
Expose optional parentPid and pin it at the top of main() so the watchdog
matches mcp-automem #137 even if later boot work awaits.
@jack-arturo jack-arturo added the babysit:active Babysit agent is actively working this PR label Jul 29, 2026
@jack-arturo

Copy link
Copy Markdown
Member Author

@codex review

@jack-arturo jack-arturo added babysit:waiting-codex Babysit waiting for Codex review on current head and removed babysit:active Babysit agent is actively working this PR labels Jul 29, 2026

@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: 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".

Comment thread src/lifecycle.ts
Comment thread src/lifecycle.ts Outdated
Comment thread src/index.ts
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.
@jack-arturo jack-arturo added babysit:waiting-ci Babysit waiting for CI checks on current head and removed babysit:waiting-codex Babysit waiting for Codex review on current head labels Jul 29, 2026

@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: 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".

Comment thread src/lifecycle.ts Outdated
@jack-arturo jack-arturo added babysit:blocked Babysit stopped; unresolved blocker needs human and removed babysit:waiting-ci Babysit waiting for CI checks on current head labels Jul 29, 2026
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.
@jack-arturo jack-arturo added babysit:waiting-ci Babysit waiting for CI checks on current head and removed babysit:blocked Babysit stopped; unresolved blocker needs human labels Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

babysit:waiting-ci Babysit waiting for CI checks on current head

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant