Skip to content

EINTR errors in file watcher cause MCP initialization timeout #541

@ludocarceles

Description

@ludocarceles

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:

  1. Catch EINTR errors
  2. Retry the watch operation
  3. 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

  1. Create an MCP server with ~50+ tools
  2. Use ClaudeSDKClient in a long-running server process
  3. Send multiple messages over time
  4. Observe Control request timeout: initialize errors in logs

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions