Skip to content

fix(server): prevent SSE disconnect from crashing inspector proxy#1523

Open
syf2211 wants to merge 1 commit into
modelcontextprotocol:mainfrom
syf2211:fix/1014-sse-disconnected-send-crash
Open

fix(server): prevent SSE disconnect from crashing inspector proxy#1523
syf2211 wants to merge 1 commit into
modelcontextprotocol:mainfrom
syf2211:fix/1014-sse-disconnected-send-crash

Conversation

@syf2211

@syf2211 syf2211 commented Jun 25, 2026

Copy link
Copy Markdown

Summary

Prevent the inspector proxy from crashing with an unhandled Not connected error when an SSE client disconnects or is replaced (e.g. browser refresh, multiple tabs, or rapid reconnects).

Motivation

Fixes #1014. When the browser closes an SSE session, SSEServerTransport.send() throws if the stream is already torn down. The stdio stderr forwarder and mcpProxy could still call send() on in-flight server messages, producing an unhandled rejection that crashes the inspector process.

Unlike Streamable HTTP, the legacy /stdio and /sse routes also never removed stale entries from the proxy session maps on client disconnect.

Changes

  • Add sessionRegistry helpers:
    • sendToClientSafe() — catches disconnected SSE sends instead of crashing
    • removeSession() — clears proxy session maps
    • chainOnClose() — runs cleanup before existing mcpProxy teardown
  • /stdio: use safe sends for stderr notifications; remove stderr listener and session maps on client close
  • /sse: remove session maps on client close
  • mcpProxy: route client-bound sends through sendToClientSafe
  • Add unit tests for the new helpers

Tests

  • cd server && npm run build — pass
  • cd server && npm test — 3/3 pass
  • npm run prettier-check — pass

Notes

  • The fix is intentionally minimal and scoped to V1 proxy session lifecycle.
  • Error matching uses the SDK's "Not connected" message, consistent with other MCP transports.

When the browser closes or replaces an SSE session, stderr forwarding and
mcpProxy could still call SSEServerTransport.send() after the stream was
torn down, throwing an unhandled 'Not connected' error.

- Add safe client send helper that ignores disconnected SSE sessions
- Remove proxy session maps and stdio stderr listeners on client close
- Chain cleanup after mcpProxy onclose for /stdio and /sse routes

Fixes modelcontextprotocol#1014
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.

SSE transport crashes with "Not connected" error when multiple connections occur

2 participants