| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Replaces the has_pending_outbound_request bool on enforce_peer_request_association with PeerRequestAssociation, so a stream-separating transport can report per-request association (modelcontextprotocol#1033). Behavior-preserving: the event loop still passes the coarse signal as Unknown.
…nt (modelcontextprotocol#1033) The worker attaches an InboundStreamOrigin extension to each inbound server request: Unassociated for the standalone GET stream, OutboundRequest(id) for a POST's SSE stream. Mirror of the OriginatingRequestId marker used by the server side.
…origin (modelcontextprotocol#1033) The event loop maps InboundStreamOrigin plus the in-flight responder pool to PeerRequestAssociation: restricted requests arriving on the standalone GET stream are now rejected with -32602 even while unrelated outbound requests are in flight.
…tprotocol#1033) A POST SSE stream resumed via GET + Last-Event-ID (SEP-1699) reconnects beneath execute_sse_stream, so requests replayed after a resume keep their OutboundRequest origin. Pins the layering invariant: hoisting reconnection above the marker attach point would wrongly reject associated requests with -32602.
Detect handler invocation via a channel asserted empty instead of a panic in a spawned task (swallowed, cannot fail the test); surface scripted-server misuse as transport errors rather than panics in the transport task; bound the tail awaits with 5s timeouts. Correct the header comment: a 2026-07-28 server minting a session id is not spec-legal (SEP-2567 removes sessions and the GET endpoint) — the scripted server is deliberately non-conforming, which is the point of receive-side enforcement.
Rebase onto 3.0.0: RoleClient::PeerInfo is now ServerPeerInfo (modelcontextprotocol#1065) and its constructor takes the protocol version directly.
There was a problem hiding this comment.
Thanks for implementing this, @gocamille! I only have a nitpick.
Sorry, something went wrong.
Co-authored-by: Dale Seo <5466341+DaleSeo@users.noreply.github.com>
|
Looks like adding suggestions requires another review, so re-requesting -- thank you again @DaleSeo ! |
Sorry, something went wrong.
Bump to latest stable release https://github.com/modelcontextprotocol/rust-sdk/releases/tag/rmcp-v3.1.0 ``` Added classify authorization-required errors (modelcontextprotocol/rust-sdk#1056) add strict stateless protocol metadata validation (modelcontextprotocol/rust-sdk#1091) SEP-2260 stream-based enforcement of client receive-side request association (modelcontextprotocol/rust-sdk#1055) Fixed (model) decode metadata-bearing input-required results affecting mrtr (modelcontextprotocol/rust-sdk#1097) require metadata for modern HTTP requests (modelcontextprotocol/rust-sdk#1089) honor supported_protocol_versions when negotiating initialize (modelcontextprotocol/rust-sdk#1093) Other document the ping utility with examples (modelcontextprotocol/rust-sdk#1106) complete Tier 1 feature docs and finalize roadmap (modelcontextprotocol/rust-sdk#1101) (conformance) meeting requirements for tier 1 (modelcontextprotocol/rust-sdk#1087) ``` Signed-off-by: Filinto Duran <1373693+filintod@users.noreply.github.com>
| Back | FazBrowse Home | New Git URL |
Implements the stream-based enforcement described in SEP-2260.
Tracking issue: #1033 (follow-up to #873 / #1029)
Motivation and Context
PR #1029 implemented the receive-side SHOULD ("Clients receiving server-to-client requests with no associated outbound request SHOULD respond with a -32602 error") with a coarse check: reject restricted requests (sampling/createMessage, elicitation/create, roots/list; ping exempt) only when the client has no outbound request in flight. It couldn't tell which request a server request belongs to. SEP-2260 defines no wire field, so association is only observable at the transport layer via which HTTP response stream a message arrived on.
This PR closes that gap for streamable HTTP. Now, a restricted request arriving on the GET stream (or on the SSE stream of a POST whose request is no longer in flight) is rejected with-32602 even when unrelated requests are in flight.
How
How Has This Been Tested?
Breaking Changes
None. New public API: PeerRequestAssociation and the ServiceRole::enforce_peer_request_association hook (with a permissive default). Behavior changes only for streamable HTTP clients negotiating 2026-07-28+ against servers that send restricted requests on the wrong stream.
Types of changes
Checklist
I have read the MCP Documentation
My code follows the repository's style guidelines
New and existing tests pass locally
I have added appropriate error handling
I have added or updated documentation as needed
Additional context
Possible follow-up: skip session tracking / the standalone GET stream entirely when the negotiated version is ≥ 2026-07-28, making the unassociated-GET-stream state unreachable.