Skip to content

Read MCP SSE responses incrementally instead of to end-of-stream - #3

Merged
arananet merged 1 commit into
mainfrom
claude/mcp-protocol-update-idbxxw
Aug 10, 2026
Merged

Read MCP SSE responses incrementally instead of to end-of-stream#3
arananet merged 1 commit into
mainfrom
claude/mcp-protocol-update-idbxxw

Conversation

@arananet

Copy link
Copy Markdown
Owner

The legacy Streamable HTTP / HTTP+SSE transports answer a POST on a text/event-stream that the server may hold open — the Azure Functions MCP extension does exactly this, and also mints an Mcp-Session-Id. parseMCPResponse read that body with response.text(), which only resolves when the stream closes, so the scan hung against such servers and reported them as unreachable.

Read the stream via a reader and resolve on the first SSE event carrying a JSON-RPC payload, then cancel the reader to close the connection. Reassemble events split across chunks, skip keepalive/comment frames, and handle CRLF; fall back to buffering when response.body is unavailable.

Add tests covering incremental parsing (including a held-open stream that must not block) and an end-to-end connect against a legacy SSE server with a session id, asserting era detection and that the minted Mcp-Session-Id is echoed on the initialized notification.

Claude-Session: https://claude.ai/code/session_01N4mJKbHLw7YzjnfHJjtWn5

The legacy Streamable HTTP / HTTP+SSE transports answer a POST on a
text/event-stream that the server may hold open — the Azure Functions MCP
extension does exactly this, and also mints an Mcp-Session-Id. parseMCPResponse
read that body with response.text(), which only resolves when the stream
closes, so the scan hung against such servers and reported them as
unreachable.

Read the stream via a reader and resolve on the first SSE event carrying a
JSON-RPC payload, then cancel the reader to close the connection. Reassemble
events split across chunks, skip keepalive/comment frames, and handle CRLF;
fall back to buffering when response.body is unavailable.

Add tests covering incremental parsing (including a held-open stream that must
not block) and an end-to-end connect against a legacy SSE server with a session
id, asserting era detection and that the minted Mcp-Session-Id is echoed on the
initialized notification.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4mJKbHLw7YzjnfHJjtWn5
@arananet
arananet merged commit 1bb60a5 into main Aug 10, 2026
5 of 7 checks passed
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.

2 participants