feat(model): add ServerConfig and ClientConfig (#1266)

This commit is contained in:
Dale Seo 2026-09-14 15:30:41 -04:00 • committed by GitHub
commit 165ff92df1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 331 additions and 303 deletions

View file

@ -2,7 +2,7 @@
use rmcp::{
ServerHandler,
handler::server::{router::tool::ToolRouter, wrapper::Parameters},
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
schemars, tool, tool_router,
};
#[derive(Debug, serde::Deserialize, schemars::JsonSchema)]
@ -52,8 +52,8 @@ impl Calculator {
}
impl ServerHandler for Calculator {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
.with_instructions("A simple calculator")
}
}

View file

@ -115,8 +115,8 @@ impl TestServer {
impl ServerHandler for TestServer {
#[allow(deprecated)]
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_logging().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_logging().build())
}
#[allow(deprecated)]

View file

@ -8,8 +8,8 @@ use std::{collections::BTreeSet, process::Stdio, time::Duration};
use rmcp::{
ErrorData as McpError, RoleServer, ServerHandler, ServiceExt,
model::{
CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, InitializeResult,
ServerCapabilities,
CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ServerCapabilities,
ServerConfig,
},
service::RequestContext,
};
@ -91,8 +91,8 @@ async fn cancelled_request_receives_no_response() -> anyhow::Result<()> {
struct WaitForCancelServer;
impl ServerHandler for WaitForCancelServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
}
async fn call_tool(

View file

@ -719,7 +719,7 @@ async fn test_server_rejects_unsupported_protocol_version() {
use http_body_util::Full;
use rmcp::{
handler::server::ServerHandler,
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -730,8 +730,8 @@ async fn test_server_rejects_unsupported_protocol_version() {
struct TestHandler;
impl ServerHandler for TestHandler {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
}
}
@ -892,7 +892,7 @@ async fn test_server_validates_host_when_origin_validation_is_disabled_by_defaul
use http_body_util::Full;
use rmcp::{
handler::server::ServerHandler,
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -903,8 +903,8 @@ async fn test_server_validates_host_when_origin_validation_is_disabled_by_defaul
struct TestHandler;
impl ServerHandler for TestHandler {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
}
}
@ -975,7 +975,7 @@ async fn test_server_validates_host_header_port_for_dns_rebinding_protection() {
use http_body_util::Full;
use rmcp::{
handler::server::ServerHandler,
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -986,8 +986,8 @@ async fn test_server_validates_host_header_port_for_dns_rebinding_protection() {
struct TestHandler;
impl ServerHandler for TestHandler {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
}
}
@ -1046,7 +1046,7 @@ async fn test_server_falls_back_to_uri_authority_when_host_header_missing() {
use http_body_util::Full;
use rmcp::{
handler::server::ServerHandler,
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -1057,8 +1057,8 @@ async fn test_server_falls_back_to_uri_authority_when_host_header_missing() {
struct TestHandler;
impl ServerHandler for TestHandler {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
}
}
@ -1132,7 +1132,7 @@ mod origin_validation {
use http_body_util::Full;
use rmcp::{
handler::server::ServerHandler,
model::{InitializeResult, ServerCapabilities},
model::{ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -1143,8 +1143,8 @@ mod origin_validation {
struct TestHandler;
impl ServerHandler for TestHandler {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
}
}

View file

@ -16,7 +16,7 @@ use axum::{
};
use rmcp::{
ClientLifecycleMode, ClientServiceExt, ServerHandler,
model::{DiscoverResult, ErrorCode, ErrorData, InitializeRequestParams, ProtocolVersion},
model::{ClientConfig, DiscoverResult, ErrorCode, ErrorData, ProtocolVersion},
service::{MaybeSendFuture, RequestContext, RoleServer},
transport::{
StreamableHttpClientTransport,
@ -132,7 +132,7 @@ async fn discover_http_client_bootstraps_headers_without_initialize() {
let transport = StreamableHttpClientTransport::from_config(
StreamableHttpClientTransportConfig::with_uri(format!("http://{address}/mcp")),
);
let client = InitializeRequestParams::default()
let client = ClientConfig::default()
.serve_with_lifecycle(
transport,
ClientLifecycleMode::Discover {
@ -176,7 +176,7 @@ async fn auto_http_client_falls_back_to_stateful_legacy_startup() {
let transport = StreamableHttpClientTransport::from_config(
StreamableHttpClientTransportConfig::with_uri(format!("http://{address}/mcp")),
);
let client = InitializeRequestParams::default()
let client = ClientConfig::default()
.serve_with_lifecycle(
transport,
ClientLifecycleMode::Auto {
@ -217,7 +217,7 @@ async fn auto_http_client_falls_back_after_plain_text_4xx_rejection() {
let transport = StreamableHttpClientTransport::from_config(
StreamableHttpClientTransportConfig::with_uri(format!("http://{address}/mcp")),
);
let client = InitializeRequestParams::default()
let client = ClientConfig::default()
.serve_with_lifecycle(
transport,
ClientLifecycleMode::Auto {

View file

@ -5,7 +5,7 @@ use rmcp::{
ClientHandler, RoleClient, RoleServer, ServerHandler,
handler::server::router::{prompt::PromptRouter, tool::ToolRouter},
model::{
CacheScope, InitializeRequestParams, InitializeResult, ListPromptsResult, ListToolsResult,
CacheScope, ClientConfig, InitializeResult, ListPromptsResult, ListToolsResult,
ProtocolVersion,
},
prompt_handler,
@ -38,8 +38,8 @@ struct VersionedClient {
}
impl ClientHandler for VersionedClient {
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
fn get_info(&self) -> ClientConfig {
let mut info = ClientConfig::default();
info.protocol_version = self.protocol_version.clone();
info
}

View file

@ -14,7 +14,7 @@ use std::{
use rmcp::{
ServerHandler, ServiceExt,
handler::server::{router::tool::ToolRouter, wrapper::Parameters},
model::{CallToolRequestParams, InitializeRequestParams, InitializeResult, ServerCapabilities},
model::{CallToolRequestParams, ClientConfig, ServerCapabilities, ServerConfig},
service::QuitReason,
tool, tool_handler, tool_router,
};
@ -55,8 +55,8 @@ impl SlowToolServer {
#[tool_handler]
impl ServerHandler for SlowToolServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
}
}
@ -64,8 +64,8 @@ impl ServerHandler for SlowToolServer {
struct DummyClientHandler;
impl rmcp::ClientHandler for DummyClientHandler {
fn get_info(&self) -> InitializeRequestParams {
InitializeRequestParams::default()
fn get_info(&self) -> ClientConfig {
ClientConfig::default()
}
}

View file

@ -114,8 +114,8 @@ impl MacroMrtrServer {
#[tool_handler]
impl ServerHandler for MacroMrtrServer {
fn get_info(&self) -> InitializeResult {
let mut info = InitializeResult::new(ServerCapabilities::builder().enable_tools().build());
fn get_info(&self) -> ServerConfig {
let mut info = ServerConfig::new(ServerCapabilities::builder().enable_tools().build());
info.protocol_version = ProtocolVersion::V_2026_07_28;
info
}
@ -221,8 +221,8 @@ impl MrtrServer {
}
impl ServerHandler for MrtrServer {
fn get_info(&self) -> InitializeResult {
let mut info = InitializeResult::new(
fn get_info(&self) -> ServerConfig {
let mut info = ServerConfig::new(
ServerCapabilities::builder()
.enable_tools()
.enable_prompts()
@ -609,9 +609,8 @@ async fn request_state_codec_seals_and_verifies_through_the_loop() -> anyhow::Re
struct SealingServer;
impl ServerHandler for SealingServer {
fn get_info(&self) -> InitializeResult {
let mut info =
InitializeResult::new(ServerCapabilities::builder().enable_tools().build());
fn get_info(&self) -> ServerConfig {
let mut info = ServerConfig::new(ServerCapabilities::builder().enable_tools().build());
info.protocol_version = ProtocolVersion::V_2026_07_28;
info
}

View file

@ -5,8 +5,8 @@ use std::sync::Arc;
use rmcp::{
ClientHandler, ServerHandler, ServiceExt,
model::{
ClientNotification, CustomNotification, InitializeResult, ResourceUpdatedNotificationParam,
ServerCapabilities, ServerNotification, SubscribeRequestParams,
ClientNotification, CustomNotification, ResourceUpdatedNotificationParam,
ServerCapabilities, ServerConfig, ServerNotification, SubscribeRequestParams,
},
};
use serde_json::json;
@ -16,8 +16,8 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
struct Server {}
impl ServerHandler for Server {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
fn get_info(&self) -> ServerConfig {
ServerConfig::new(
ServerCapabilities::builder()
.enable_resources()
.enable_resources_subscribe()

View file

@ -7,8 +7,7 @@ use rmcp::{
ClientHandler, ServerHandler, ServiceExt,
handler::server::{router::prompt::PromptRouter, wrapper::Parameters},
model::{
ContentBlock, GetPromptRequestParams, GetPromptResult, InitializeRequestParams,
PromptMessage, Role,
ClientConfig, ContentBlock, GetPromptRequestParams, GetPromptResult, PromptMessage, Role,
},
prompt, prompt_handler, prompt_router,
};
@ -298,8 +297,8 @@ fn test_optional_field_schema_generation_via_macro() {
struct DummyClientHandler {}
impl ClientHandler for DummyClientHandler {
fn get_info(&self) -> InitializeRequestParams {
InitializeRequestParams::default()
fn get_info(&self) -> ClientConfig {
ClientConfig::default()
}
}

View file

@ -16,8 +16,8 @@ use std::{
use rmcp::{
ClientHandler, ErrorData, RoleServer, ServerHandler, ServiceExt,
model::{
ClientCapabilities, ErrorCode, Implementation, InitializeRequestParams, InitializeResult,
ProtocolVersion,
ClientCapabilities, ClientConfig, ErrorCode, Implementation, InitializeRequestParams,
InitializeResult, ProtocolVersion, ServerConfig,
},
service::{ClientInitializeError, RequestContext},
};
@ -26,8 +26,8 @@ use rmcp::{
struct EchoServer;
impl ServerHandler for EchoServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::default()
fn get_info(&self) -> ServerConfig {
ServerConfig::default()
}
}
@ -45,8 +45,8 @@ const HANDSHAKE_VERSIONS: &[ProtocolVersion] = &[
struct NarrowedServer;
impl ServerHandler for NarrowedServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::default()
fn get_info(&self) -> ServerConfig {
ServerConfig::default()
}
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]> {
@ -61,8 +61,8 @@ struct ModernOnlyServer;
const MODERN_ONLY_VERSIONS: &[ProtocolVersion] = &[ProtocolVersion::V_2026_07_28];
impl ServerHandler for ModernOnlyServer {
fn get_info(&self) -> InitializeResult {
let mut info = InitializeResult::default();
fn get_info(&self) -> ServerConfig {
let mut info = ServerConfig::default();
info.protocol_version = ProtocolVersion::V_2026_07_28;
info
}
@ -79,8 +79,8 @@ impl ServerHandler for ModernOnlyServer {
struct NarrowedOverridingServer;
impl ServerHandler for NarrowedOverridingServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::default()
fn get_info(&self) -> ServerConfig {
ServerConfig::default()
}
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]> {
@ -102,8 +102,8 @@ struct VersionedClient {
}
impl ClientHandler for VersionedClient {
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
fn get_info(&self) -> ClientConfig {
let mut info = ClientConfig::default();
info.protocol_version = self.protocol_version.clone();
info
}
@ -247,8 +247,8 @@ struct DelegatingServer {
}
impl ServerHandler for DelegatingServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::default()
fn get_info(&self) -> ServerConfig {
ServerConfig::default()
}
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]> {

View file

@ -8,7 +8,7 @@
use rmcp::{
ClientHandler, RoleClient, RoleServer, ServerHandler, ServiceError,
model::{
ErrorCode, ErrorData, InitializeRequestParams, InitializeResult, ProtocolVersion,
ClientConfig, ErrorCode, ErrorData, InitializeResult, ProtocolVersion,
ReadResourceRequestParams, ReadResourceResponse,
},
service::{RequestContext, serve_directly},
@ -33,8 +33,8 @@ struct VersionedClient {
}
impl ClientHandler for VersionedClient {
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
fn get_info(&self) -> ClientConfig {
let mut info = ClientConfig::default();
info.protocol_version = self.protocol_version.clone();
info
}

View file

@ -8,8 +8,8 @@
use rmcp::{
ClientHandler, RoleClient, RoleServer, ServerHandler,
model::{
CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ErrorData,
InitializeRequestParams, InitializeResult, ProtocolVersion, ResultType,
CallToolRequestParams, CallToolResponse, CallToolResult, ClientConfig, ContentBlock,
ErrorData, InitializeResult, ProtocolVersion, ResultType,
},
service::{RequestContext, serve_directly},
};
@ -33,8 +33,8 @@ struct VersionedClient {
}
impl ClientHandler for VersionedClient {
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
fn get_info(&self) -> ClientConfig {
let mut info = ClientConfig::default();
info.protocol_version = self.protocol_version.clone();
info
}

View file

@ -9,10 +9,9 @@ use std::sync::{Arc, Mutex};
use rmcp::{
ClientHandler, RoleClient, RoleServer, ServerHandler, ServiceError, ServiceExt,
model::{
CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock,
CreateMessageRequest, CreateMessageRequestParams, CreateMessageResult,
InitializeRequestParams, InitializeResult, ProtocolVersion, SamplingMessage,
ServerCapabilities, ServerRequest,
CallToolRequestParams, CallToolResponse, CallToolResult, ClientConfig, ContentBlock,
CreateMessageRequest, CreateMessageRequestParams, CreateMessageResult, ProtocolVersion,
SamplingMessage, ServerCapabilities, ServerConfig, ServerRequest,
},
service::{RequestContext, RunningService, serve_directly},
};
@ -30,8 +29,8 @@ struct SamplingServer {
}
impl ServerHandler for SamplingServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
}
async fn call_tool(
@ -94,8 +93,8 @@ impl ClientHandler for SamplingClient {
.with_stop_reason(CreateMessageResult::STOP_REASON_END_TURN))
}
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
fn get_info(&self) -> ClientConfig {
let mut info = ClientConfig::default();
info.protocol_version = ProtocolVersion::V_2026_07_28;
info
}

View file

@ -26,9 +26,8 @@ use http::{HeaderName, HeaderValue};
use rmcp::{
ClientHandler,
model::{
ClientJsonRpcMessage, CreateMessageRequestParams, CreateMessageResult,
InitializeRequestParams, InitializeResult, ProtocolVersion, SamplingMessage,
ServerCapabilities, ServerJsonRpcMessage,
ClientConfig, ClientJsonRpcMessage, CreateMessageRequestParams, CreateMessageResult,
ProtocolVersion, SamplingMessage, ServerCapabilities, ServerConfig, ServerJsonRpcMessage,
},
service::{ClientLifecycleMode, RequestContext, RoleClient, serve_client_with_lifecycle},
transport::streamable_http_client::{
@ -81,7 +80,7 @@ impl StreamableHttpClient for ScriptedServer {
// Receiver drop is normal at test teardown; never panic in the transport task.
let _ = self.posted.send(value.clone());
if value["method"] == "initialize" {
let mut info = InitializeResult::new(ServerCapabilities::default());
let mut info = ServerConfig::new(ServerCapabilities::default());
info.protocol_version = ProtocolVersion::V_2026_07_28;
let response = ServerJsonRpcMessage::response(
rmcp::model::ServerResult::InitializeResult(info),
@ -153,8 +152,8 @@ impl ClientHandler for SamplingClient {
))
}
fn get_info(&self) -> InitializeRequestParams {
InitializeRequestParams::default()
fn get_info(&self) -> ClientConfig {
ClientConfig::default()
}
}

View file

@ -9,7 +9,7 @@ use rmcp::{
ErrorData as McpError, RoleServer, ServerHandler,
model::{
CallToolRequestParams, CallToolResponse, CallToolResult, ContentBlock, ElicitRequestParams,
ElicitationSchema, InitializeResult, ServerCapabilities,
ElicitationSchema, ServerCapabilities, ServerConfig,
},
service::RequestContext,
transport::streamable_http_server::{
@ -23,8 +23,8 @@ use tokio_util::sync::CancellationToken;
struct ElicitingServer;
impl ServerHandler for ElicitingServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
}
async fn call_tool(

View file

@ -3,8 +3,8 @@
use rmcp::{
ClientHandler, ServerHandler, ServiceExt,
model::{
ClientCapabilities, Implementation, InitializeResult, ProtocolVersion, RequestMetaObject,
ServerCapabilities,
ClientCapabilities, Implementation, ProtocolVersion, RequestMetaObject, ServerCapabilities,
ServerConfig,
},
select_protocol_version,
};
@ -13,8 +13,8 @@ use rmcp::{
struct DiscoveryServer;
impl ServerHandler for DiscoveryServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
.with_server_info(Implementation::new("discovery-server", "1.0.0"))
}
}

View file

@ -8,7 +8,7 @@ use std::borrow::Cow;
use rmcp::{
ServerHandler,
model::{Implementation, InitializeResult, ProtocolVersion, ServerCapabilities},
model::{Implementation, ProtocolVersion, ServerCapabilities, ServerConfig},
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
},
@ -20,8 +20,8 @@ use tokio_util::sync::CancellationToken;
struct DiscoveryServer;
impl ServerHandler for DiscoveryServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().enable_tools().build())
.with_server_info(Implementation::new("discovery-server", "1.0.0"))
.with_instructions("Use the tools carefully")
}

View file

@ -6,7 +6,7 @@ use common::handlers::TestServer;
use rmcp::{
ServerHandler, ServiceExt,
model::{
ClientJsonRpcMessage, InitializeResult, ProtocolVersion, ServerCapabilities,
ClientJsonRpcMessage, ProtocolVersion, ServerCapabilities, ServerConfig,
ServerJsonRpcMessage, ServerResult,
},
transport::{IntoTransport, Transport},
@ -281,8 +281,8 @@ async fn server_falls_back_when_client_protocol_version_unknown() {
struct PinnedServer;
impl ServerHandler for PinnedServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().build())
fn get_info(&self) -> ServerConfig {
ServerConfig::new(ServerCapabilities::builder().build())
.with_protocol_version(ProtocolVersion::V_2025_06_18)
}
}

View file

@ -18,7 +18,7 @@ use std::time::Duration;
use futures::StreamExt;
use rmcp::{
RoleServer, ServerHandler,
model::{Implementation, InitializeResult, ServerCapabilities, ToolsCapability},
model::{Implementation, ServerCapabilities, ServerConfig, ToolsCapability},
service::NotificationContext,
transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
@ -45,8 +45,8 @@ impl TestServer {
}
impl ServerHandler for TestServer {
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
fn get_info(&self) -> ServerConfig {
ServerConfig::new(
ServerCapabilities::builder()
.enable_tools_with({
let mut tools = ToolsCapability::default();

Some files were not shown because too many files have changed in this diff Show more