Fix large MCP streamable HTTP payloads#1434
Draft
threepointone wants to merge 1 commit intomainfrom
Draft
Conversation
Send internal streamable HTTP payloads over the WebSocket data channel so large JSON-RPC requests avoid Worker header limits while preserving Durable Object hibernation behavior. Made-with: Cursor
🦋 Changeset detectedLatest commit: 37d3813 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
agents
@cloudflare/ai-chat
@cloudflare/codemode
hono-agents
@cloudflare/shell
@cloudflare/think
@cloudflare/voice
@cloudflare/worker-bundler
commit: |
Contributor
Author
|
putting into draft till we get a repro |
34 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
cf-mcp-messageupgrade header.StreamableHTTPServerTransportpath.Why
The reported
TLS Alert: record_overflowfailure was caused by large MCP JSON-RPC payloads being base64-encoded intocf-mcp-messageduring the internal Worker-to-Durable Object WebSocket upgrade. That made the request body part of an HTTP header, where it could exceed Cloudflare's per-header limit before the Durable Object ever saw the request.A direct HTTP forwarding path would avoid the header limit too, but it changes the lifecycle story for streamable HTTP: the current bridge uses WebSockets specifically so idle/long-lived streams can hibernate with the Durable Object runtime. This PR keeps that architecture and only moves the large data out of headers and into the WebSocket data channel, which is the smaller behavioral change for a published package bug fix.
Details
cf-mcp-methodremains as the small internal routing signal for POST vs GET upgrade requests.cf-mcp-messageis no longer populated with the serialized payload and is stripped from forwarded request metadata.202; the internal bridge is closed after the DO receives and processes the frame.Test plan
npm run test:workers -- src/tests/mcp/transports/streamable-http.test.tsnpm run typechecknpm run checkMade with Cursor