You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Stamp the server implementation identity into the final result produced when a subscriptions/listen handler completes gracefully.
Motivation and Context
The MCP 2026-07-28 specification says servers SHOULD include io.modelcontextprotocol/serverInfo in every result's _meta. ServerHandler::listen returns Result<(), McpError>, and rmcp constructs the
final SubscriptionsListenResult only after the handler returns. Applications
therefore cannot add this metadata themselves.
This PR intentionally covers only the graceful subscriptions/listen result
synthesized by rmcp after the application handler returns. SDK-wide stamping of
application-produced results is a separate concern.
How Has This Been Tested?
Added a stdio regression test that asserts the graceful final result contains
the server implementation identity.
Added the same assertion to the real Streamable HTTP/SSE graceful-close test.
Ran the full repository test recipe, including the all-features and
non-local-feature passes.
Ran cargo clippy --all-targets --all-features -- -D warnings.
Ran cargo +nightly fmt --all -- --check.
Breaking Changes
None. This adds missing response metadata without changing the handler API.
Types of changes
Bug fix (non-breaking change which fixes an issue)
New feature (non-breaking change which adds functionality)
Breaking change (fix or feature that would cause existing functionality to change)
The request path captures ServerInfo once before establishing the
subscription, so capability filtering and the eventual server identity come
from the same snapshot. Cancellation, abrupt transport closure, and handler
errors keep their existing behavior.
Just for context, I initially implemented the shape documented in SEP-2575 in #1000. However, the final spec added a graceful result for subscriptions/listen and made serverInfo optional in the result metadata. Since the SEP page was not updated, those changes were easy to miss, so I opened modelcontextprotocol/modelcontextprotocol#3159 to document these post-final SEP changes for future implementers.
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
T-configConfiguration file changesT-coreCore library changesT-handlerHandler implementation changesT-testTesting related changes
2 participants
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.
Stamp the server implementation identity into the final result produced when a
subscriptions/listenhandler completes gracefully.Motivation and Context
The MCP 2026-07-28 specification says servers SHOULD include
io.modelcontextprotocol/serverInfoin every result's_meta.ServerHandler::listenreturnsResult<(), McpError>, and rmcp constructs thefinal
SubscriptionsListenResultonly after the handler returns. Applicationstherefore cannot add this metadata themselves.
This PR intentionally covers only the graceful
subscriptions/listenresultsynthesized by rmcp after the application handler returns. SDK-wide stamping of
application-produced results is a separate concern.
How Has This Been Tested?
the server implementation identity.
non-local-feature passes.
cargo clippy --all-targets --all-features -- -D warnings.cargo +nightly fmt --all -- --check.Breaking Changes
None. This adds missing response metadata without changing the handler API.
Types of changes
Checklist
Additional context
The request path captures
ServerInfoonce before establishing thesubscription, so capability filtering and the eventual server identity come
from the same snapshot. Cancellation, abrupt transport closure, and handler
errors keep their existing behavior.