Handle 202 Accepted response in HTTP client#323
Draft
atesgoral wants to merge 2 commits intomodelcontextprotocol:mainfrom
Draft
Handle 202 Accepted response in HTTP client#323atesgoral wants to merge 2 commits intomodelcontextprotocol:mainfrom
atesgoral wants to merge 2 commits intomodelcontextprotocol:mainfrom
Conversation
The Streamable HTTP spec allows servers to respond with either `application/json` or `text/event-stream`. The client previously rejected the latter. Add SSE parsing via the optional `event_stream_parser` gem (users add it to their Gemfile when their server uses SSE), dispatch on the response Content-Type, and scan the event stream for the first JSON-RPC response message. No other Streamable HTTP features (202 handling, session IDs, `connect`, DELETE termination) are included here; those will land in follow-up PRs. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Streamable HTTP spec allows a server to respond 202 Accepted when
it has received the request but will deliver the response later via an
SSE stream. The client previously errored on 202 because the response
has no parseable Content-Type. Return `{ "accepted" => true }` so the
caller can decide how to proceed.
Actually picking up the deferred response requires listening on an SSE
stream (GET-for-SSE), which is not yet implemented. This PR only
prevents the hard error on a valid server response.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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
Second slice of #321 (Streamable HTTP client support), stacked on #322. Until #322 merges, this PR's diff will include the SSE parsing changes; after #322 merges, the diff will reduce to just the 202 branch + test.
The Streamable HTTP spec allows a server to respond
202 Acceptedwhen it has received the request but will deliver the response later via an SSE stream. The client currently errors on 202 because the response has no parseableContent-Type. Return{ "accepted" => true }so callers can proceed rather than hard-fail on a valid server response.Actually picking up the deferred response requires listening on an SSE stream (GET-for-SSE), which is a TODO in the main PR and out of scope here. This change is just the graceful-no-hard-error part.
Changes
lib/mcp/client/http.rb: addelsif response.status == 202branch toparse_response_bodyreturning{ "accepted" => true }test/mcp/client/http_test.rb: test for 202 response with empty bodyTest plan
rake testpasses (738 runs, 1848 assertions)rake rubocopno new offenses on changed filesStack
connect, session-ID tracking,close/DELETE🤖 Generated with Claude Code