fix: keep initialize on legacy protocol versions (#1228)

Claude-Session: https://claude.ai/code/session_01EPcBfiUWJJueJn5cve1sjp
This commit is contained in:
Dale Seo 2026-09-01 07:38:57 +09:00 • committed by GitHub
commit ad9832ec21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -6,12 +6,12 @@
#![cfg(feature = "client")]
use rmcp::{
ClientHandler, RoleServer, ServerHandler, ServiceError, ServiceExt,
ClientHandler, RoleClient, RoleServer, ServerHandler, ServiceError,
model::{
ClientInfo, ErrorCode, ErrorData, ProtocolVersion, ReadResourceRequestParams,
ReadResourceResponse,
ReadResourceResponse, ServerInfo,
},
service::RequestContext,
service::{RequestContext, serve_directly},
};
#[derive(Debug, Clone, Default)]
@ -40,24 +40,33 @@ impl ClientHandler for VersionedClient {
}
}
/// Wires the pair up directly on `client_version`. `2026-07-28` removed the
/// `initialize` handshake, so a peer on that revision is reached the way the
/// discover lifecycle leaves one: with the version already agreed.
async fn not_found_code(client_version: ProtocolVersion) -> ErrorCode {
let (server_transport, client_transport) = tokio::io::duplex(4096);
let client_handler = VersionedClient {
protocol_version: client_version.clone(),
};
let mut server_peer_info = ServerInfo::default();
server_peer_info.protocol_version = client_version;
let server = serve_directly::<RoleServer, _, _, _, _>(
ResourceServer,
server_transport,
Some(client_handler.get_info()),
);
let server_handle = tokio::spawn(async move {
ResourceServer
.serve(server_transport)
.await?
.waiting()
.await?;
server.waiting().await?;
anyhow::Ok(())
});
let client = VersionedClient {
protocol_version: client_version,
}
.serve(client_transport)
.await
.expect("client should connect");
let client = serve_directly::<RoleClient, _, _, _, _>(
client_handler,
client_transport,
Some(server_peer_info.into()),
);
let error = client
.read_resource(ReadResourceRequestParams::new("missing://resource"))