Upgrade rmcp to 3.0.0 (#36001)

## What changed

- Update the Rust MCP SDK from `3.0.0-beta.3` to `3.0.0` and adapt to its renamed metadata and server discovery types.
- Accept discovery responses without server identity metadata, using the configured server name as a fallback, and rely on the SDK's native support for namespaced server identity metadata.
- Preserve typed OAuth HTTP errors so transport failures, cross-origin redirects, and transient HTTP responses are reported instead of being treated as anonymous access.

## Testing

- Cover modern discovery with namespaced or missing server identity over HTTP, SSE, and stdio.
- Cover OAuth discovery error propagation for transport failures, redirects, and transient status codes.

GitOrigin-RevId: 12c1e45136cca89ce4fb15986c2b5df14608682a
This commit is contained in:
thomas authored and copyberry committed 2026-07-29 17:38:20 +00:00
1 parent df326d31cd
commit a05bcda3db
22 files changed
+274 -155

No files matched your search

@@ -35,7 +35,10 @@ fn discovery_accepts_metadata_namespaced_server_identity() {
let ServerResult::DiscoverResult(result) = response.result else {
panic!("metadata-only identity must not become a completed tool result");
};
assert_eq!(result.server_info.name, "modern-server");
assert_eq!(
result.server_info().map(|server_info| server_info.name),
Some("modern-server".to_owned())
);
assert_eq!(
result.meta.and_then(|meta| meta.get("retained").cloned()),
Some(json!("metadata"))
@@ -93,7 +96,7 @@ fn input_required_discriminator_wins_over_tool_result_metadata() {
}
#[test]
fn sse_discovery_promotes_metadata_namespaced_identity() {
fn sse_discovery_preserves_metadata_namespaced_identity_without_normalization() {
let message = json!({
"jsonrpc": "2.0",
"id": 1,
@@ -111,11 +114,23 @@ fn sse_discovery_promotes_metadata_namespaced_identity() {
},
},
});
let normalized =
normalize_sse_jsonrpc_message(&message.to_string(), /*modern_session*/ true)
.expect("metadata-only SSE discovery must be normalized");
let normalized: serde_json::Value = serde_json::from_str(&normalized).unwrap();
assert_eq!(normalized["result"]["serverInfo"]["name"], "sse-server");
assert_eq!(
normalize_sse_jsonrpc_message(&message.to_string(), /*modern_session*/ true),
None
);
let decoded = deserialize_incoming_jsonrpc_message(&serde_json::to_vec(&message).unwrap())
.expect("rmcp must natively decode metadata-only SSE discovery");
let JsonRpcMessage::Response(response) = decoded else {
panic!("expected a discovery response");
};
let ServerResult::DiscoverResult(result) = response.result else {
panic!("metadata-only identity must decode as discovery without normalization");
};
assert_eq!(
result.server_info().map(|server_info| server_info.name),
Some("sse-server".to_owned())
);
}
#[test]