-
Notifications
You must be signed in to change notification settings - Fork 613
Open
Description
Summary
MCP server initialization times out due to unhandled EINTR (interrupted system call) errors in the bundled Node.js CLI's file watcher. This causes sessions to crash and enter a timeout/recovery loop.
Environment
- OS: macOS 15.2 (Darwin 25.2.0)
- Python: 3.13
- SDK version: Latest (installed via pip)
- MCP tools registered: 68 custom tools
Error logs
Exception: Control request timeout: initialize
This error originated either by throwing inside of an async function without a catch block,
or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
Error: EINTR: interrupted system call, watch '/var/folders/h4/.../T/...-IBTOOLD-IN.QnhTSAefXh'
at watch (unknown)
at new FSWatcher (node:fs:29:31)
at watch (node:fs:296:23)
Impact
- Every session eventually hits the 60-second initialization timeout
- Sessions enter an infinite timeout → recovery → timeout loop
- The application becomes unusable for multi-turn conversations
Root cause analysis
The bundled CLI subprocess uses file watchers for IPC. When a system signal interrupts the watch() syscall, Node.js throws an EINTR error. This error is not caught/retried, causing the initialization to hang until it times out.
Expected behavior
EINTR is a standard Unix signal indicating a syscall was interrupted and should be retried. The file watcher should:
- Catch
EINTRerrors - Retry the watch operation
- Not propagate the error up as a fatal failure
Workaround
Setting CLAUDE_CODE_STREAM_CLOSE_TIMEOUT=180000 (3 minutes) gives more time for initialization to eventually succeed, but doesn't fix the underlying issue.
Reproduction
- Create an MCP server with ~50+ tools
- Use
ClaudeSDKClientin a long-running server process - Send multiple messages over time
- Observe
Control request timeout: initializeerrors in logs
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels