Specialize streamable HTTP headers by request type - #3515
daleselaji-dev wants to merge 1 commit into
Conversation
|
This PR has been closed automatically. This repo only keeps pull requests open when they come from a maintainer, or from a contributor a maintainer has assigned to the linked issue, and you aren't currently assigned to #3503. If a maintainer assigns you to #3503, this PR reopens on its own and there's nothing more you need to do here. Assignment is a maintainer call based on capacity; comments that only ask to be assigned don't factor in. What does help is engaging on the issue itself by confirming the repro, explaining why it matters for your use case, or describing the approach you'd take. You're welcome to keep pushing commits here (just avoid force-pushing, since GitHub can't reopen a rewritten branch), but that on its own won't get the PR reviewed or the issue assigned, and realistically most auto-closed PRs stay closed. There's no need to open a new PR either way. CONTRIBUTING.md has the full reasoning, but in short:
Maintainers: reopen, remove |
Problem
StreamableHTTPTransport._prepare_headers()used the POST request shape for every outbound request. The standalone SSE GET, resumption GET, reconnection GET, and bodyless DELETE therefore advertised or sent headers that did not match their request semantics.Root Cause
The transport shared
Accept: application/json, text/event-streamandContent-Type: application/jsonacross POST, SSE GET, and DELETE call sites. SSE responses are consumed astext/event-stream, while bodyless GET/DELETE requests have no JSON body.Solution
Parameterize header preparation while preserving the POST defaults. SSE GET paths now advertise only
text/event-streamand omitContent-Type; DELETE omitsContent-Typewhile retaining the existing session/protocol headers.Changes
acceptandcontent_typeparameters to_prepare_headers().Content-Typefrom session DELETE requests.Testing
uv run --frozen pytest tests/client/test_streamable_http.py -q— 36 passed.uv run --frozen ruff format --checkon changed files — passed.uv run --frozen ruff checkon changed files — passed.uv run --frozen pyright src/mcp/client/streamable_http.py— 0 errors.pre-commitexecutable was not available in the environment; not verified.git diff --check— passed.Compatibility/Risk
POST requests retain the existing
AcceptandContent-Typedefaults. Only transport-internal SSE GET and DELETE headers change; session and negotiated protocol headers remain included.Notes for Reviewer
The new test locks the wire-level contract without requiring a live server. Per-message metadata headers remain layered after the transport defaults, as before.
Linked Issue
Fixes #3503