Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,10 @@ Use [`ClientServiceExt::serve_with_lifecycle`](crates/rmcp/src/service/client.rs
select another lifecycle explicitly:

```rust, ignore
use rmcp::{ClientInfo, ClientLifecycleMode, ClientServiceExt, ProtocolVersion};
use rmcp::{ClientLifecycleMode, ClientServiceExt, InitializeRequestParams, ProtocolVersion};

// Start directly with server/discover and include client metadata on every request.
let client = ClientInfo::default()
let client = InitializeRequestParams::default()
.serve_with_lifecycle(
transport,
ClientLifecycleMode::Discover {
Expand All @@ -113,7 +113,7 @@ let client = ClientInfo::default()

// Or probe the discover lifecycle and fall back when a legacy server reports
// that server/discover is not implemented.
let client = ClientInfo::default()
let client = InitializeRequestParams::default()
.serve_with_lifecycle(
transport,
ClientLifecycleMode::Auto {
Expand Down Expand Up @@ -369,8 +369,8 @@ use serde_json::json;
struct MyServer;

impl ServerHandler for MyServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_resources()
.build(),
Expand Down Expand Up @@ -582,8 +582,8 @@ impl MyServer {

#[prompt_handler]
impl ServerHandler for MyServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(ServerCapabilities::builder().enable_prompts().build())
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_prompts().build())
}
}
```
Expand Down Expand Up @@ -934,8 +934,8 @@ Enable the logging capability, handle level changes from the client, and send lo
use rmcp::{ServerHandler, model::*, service::RequestContext};

impl ServerHandler for MyServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_logging()
.build(),
Expand Down Expand Up @@ -1007,8 +1007,8 @@ Enable the completions capability and implement the `complete()` handler. Use `r
use rmcp::{ErrorData as McpError, ServerHandler, model::*, service::RequestContext, RoleServer};

impl ServerHandler for MyServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_completions()
.enable_prompts()
Expand Down Expand Up @@ -1253,8 +1253,8 @@ use rmcp::{
};

impl ServerHandler for MyServer {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_tools()
.enable_tool_list_changed()
Expand Down Expand Up @@ -1574,7 +1574,7 @@ use rmcp::transport::StreamableHttpClientTransport;

// Defaults are stateless-friendly.
let transport = StreamableHttpClientTransport::from_uri("http://localhost:8000/mcp");
let client = ClientInfo::default().serve(transport).await?;
let client = InitializeRequestParams::default().serve(transport).await?;
```

**Example:** [`examples/servers/src/counter_streamhttp.rs`](examples/servers/src/counter_streamhttp.rs) (server), [`examples/clients/src/streamable_http.rs`](examples/clients/src/streamable_http.rs) (client)
Expand Down Expand Up @@ -1628,7 +1628,7 @@ server example). The client transport connects with a single URI:
use rmcp::transport::StreamableHttpClientTransport;

let transport = StreamableHttpClientTransport::from_uri("http://localhost:8000/mcp");
let client = ClientInfo::default().serve(transport).await?;
let client = InitializeRequestParams::default().serve(transport).await?;
```

#### Server-Sent Events (SSE)
Expand Down Expand Up @@ -1714,10 +1714,10 @@ knows what the other supports. Declare yours with the `ServerCapabilities`
builder in `get_info()`:

```rust,ignore
use rmcp::model::{ServerCapabilities, ServerInfo};
use rmcp::model::{InitializeResult, ServerCapabilities};

fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_tools()
.enable_prompts()
Expand Down
8 changes: 4 additions & 4 deletions conformance/src/bin/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ impl ClientHandler for BasicClientHandler {}
struct ElicitationDefaultsClientHandler;

impl ClientHandler for ElicitationDefaultsClientHandler {
fn get_info(&self) -> ClientInfo {
let mut info = ClientInfo::default();
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
info.capabilities.elicitation = Some(
ElicitationCapability::new()
.with_form(FormElicitationCapability::new().with_schema_validation(true)),
Expand Down Expand Up @@ -144,8 +144,8 @@ impl ClientHandler for ElicitationDefaultsClientHandler {
struct FullClientHandler;

impl ClientHandler for FullClientHandler {
fn get_info(&self) -> ClientInfo {
let mut info = ClientInfo::default();
fn get_info(&self) -> InitializeRequestParams {
let mut info = InitializeRequestParams::default();
info.capabilities.elicitation = Some(
ElicitationCapability::new()
.with_form(FormElicitationCapability::new().with_schema_validation(true)),
Expand Down
4 changes: 2 additions & 2 deletions conformance/src/bin/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -700,8 +700,8 @@ impl ServerHandler for ConformanceServer {
(name == "test_custom_header").then(custom_header_tool)
}

fn get_info(&self) -> ServerInfo {
ServerInfo::new(
fn get_info(&self) -> InitializeResult {
InitializeResult::new(
ServerCapabilities::builder()
.enable_prompts()
.enable_prompts_list_changed()
Expand Down
4 changes: 2 additions & 2 deletions crates/rmcp-macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,8 @@ pub fn tool_router(attr: TokenStream, input: TokenStream) -> TokenStream {
/// ```rust,ignore
/// #[tool_handler]
/// impl ServerHandler for MyToolHandler {
/// fn get_info(&self) -> ServerInfo {
/// ServerInfo::new(ServerCapabilities::builder().enable_tools().build())
/// fn get_info(&self) -> InitializeResult {
/// InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
/// }
/// }
/// ```
Expand Down
6 changes: 3 additions & 3 deletions crates/rmcp-macros/src/tool_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ pub(crate) enum CallerCapability {
Prompts,
}

/// Build a `get_info()` method that returns `ServerInfo` with the appropriate capabilities.
/// Build a `get_info()` method that returns `InitializeResult` with the appropriate capabilities.
///
/// The caller declares its own capability via `caller`. Sibling handler attributes
/// (`prompt_handler`, `tool_handler`) are detected automatically
Expand Down Expand Up @@ -157,8 +157,8 @@ pub(crate) fn build_get_info(
}

syn::parse2::<ImplItem>(quote! {
fn get_info(&self) -> rmcp::model::ServerInfo {
rmcp::model::ServerInfo::new(
fn get_info(&self) -> rmcp::model::InitializeResult {
rmcp::model::InitializeResult::new(
rmcp::model::ServerCapabilities::builder()
#(#capability_calls)*
.build()
Expand Down
2 changes: 1 addition & 1 deletion crates/rmcp/src/handler/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ macro_rules! client_handler_methods {
}

fn get_info(&self) -> ClientInfo {
ClientInfo::default()
InitializeRequestParams::default()
}
};
}
Expand Down
2 changes: 1 addition & 1 deletion crates/rmcp/src/handler/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ macro_rules! server_handler_methods {
}

fn get_info(&self) -> ServerInfo {
ServerInfo::default()
InitializeResult::default()
}

/// SEP-2663 `tasks/get`: return the current [`DetailedTask`] state.
Expand Down
29 changes: 24 additions & 5 deletions crates/rmcp/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,26 @@ impl InitializeResult {
}
}

/// Full server initialize payload (`InitializeResult`).
///
/// Prefer [`InitializeResult`]. The name collides with the protocol's
/// `serverInfo` field, which is only the [`Implementation`] identity (#1082).
//
// The signatures this crate publishes (`ServerHandler::get_info`,
// `DiscoverResult::from_server_info`, and the `ClientInfo` equivalents below)
// keep spelling the alias. It resolves to the same type, so the spelling makes
// no difference to callers, but rustdoc records the name as written and the
// public API check treats a respelling as a changed item. Moving those
// signatures onto the canonical names is a documented API change and belongs in
// the next major release.
#[deprecated(note = "use `InitializeResult` instead")]
pub type ServerInfo = InitializeResult;

/// Full client initialize params (`InitializeRequestParams`).
///
/// Prefer [`InitializeRequestParams`]. The name collides with the protocol's
/// `clientInfo` field, which is only the [`Implementation`] identity (#1082).
#[deprecated(note = "use `InitializeRequestParams` instead")]
pub type ClientInfo = InitializeRequestParams;

/// Information negotiated about a server peer.
Expand Down Expand Up @@ -1247,7 +1266,7 @@ impl DiscoverResult {
supported_versions: Vec<ProtocolVersion>,
server_info: ServerInfo,
) -> Self {
let ServerInfo {
let InitializeResult {
capabilities,
server_info,
instructions,
Expand Down Expand Up @@ -1295,9 +1314,9 @@ impl ServerPeerInfo {
}

#[allow(clippy::derivable_impls)]
impl Default for ServerInfo {
impl Default for InitializeResult {
fn default() -> Self {
ServerInfo {
InitializeResult {
protocol_version: ProtocolVersion::default(),
capabilities: ServerCapabilities::default(),
server_info: Implementation::from_build_env(),
Expand All @@ -1308,9 +1327,9 @@ impl Default for ServerInfo {
}

#[allow(clippy::derivable_impls)]
impl Default for ClientInfo {
impl Default for InitializeRequestParams {
fn default() -> Self {
ClientInfo {
InitializeRequestParams {
meta: None,
protocol_version: ProtocolVersion::default(),
capabilities: ClientCapabilities::default(),
Expand Down
18 changes: 9 additions & 9 deletions crates/rmcp/src/service/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ use crate::{
model::{
ArgumentInfo, CacheScope, CallToolRequest, CallToolRequestParams, CallToolResponse,
CallToolResult, CancelTaskParams, CancelTaskRequest, CancelledNotification,
CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, ClientNotification,
ClientRequest, ClientResult, CompleteRequest, CompleteRequestParams, CompleteResult,
CompletionContext, CompletionInfo, DEFAULT_MRTR_MAX_ROUNDS, DiscoverRequest,
DiscoverRequestParams, DiscoverResult, ErrorData, GetExtensions, GetMeta, GetPromptRequest,
CancelledNotificationParam, ClientJsonRpcMessage, ClientNotification, ClientRequest,
ClientResult, CompleteRequest, CompleteRequestParams, CompleteResult, CompletionContext,
CompletionInfo, DEFAULT_MRTR_MAX_ROUNDS, DiscoverRequest, DiscoverRequestParams,
DiscoverResult, ErrorData, GetExtensions, GetMeta, GetPromptRequest,
GetPromptRequestParams, GetPromptResponse, GetPromptResult, GetTaskParams, GetTaskRequest,
GetTaskResult, InitializeRequest, InitializedNotification, InputRequest,
InputRequiredResult, InputResponses, JsonRpcResponse, ListPromptsRequest,
GetTaskResult, InitializeRequest, InitializeRequestParams, InitializedNotification,
InputRequest, InputRequiredResult, InputResponses, JsonRpcResponse, ListPromptsRequest,
ListPromptsResult, ListResourceTemplatesRequest, ListResourceTemplatesResult,
ListResourcesRequest, ListResourcesResult, ListToolsRequest, ListToolsResult,
NumberOrString, PaginatedRequestParams, ProgressNotification, ProgressNotificationParam,
Expand Down Expand Up @@ -223,7 +223,7 @@ impl ServiceRole for RoleClient {
type PeerReq = ServerRequest;
type PeerResp = ServerResult;
type PeerNot = ServerNotification;
type Info = ClientInfo;
type Info = InitializeRequestParams;
type PeerInfo = ServerPeerInfo;
type InitializeError = ClientInitializeError;
const IS_CLIENT: bool = true;
Expand Down Expand Up @@ -761,7 +761,7 @@ async fn legacy_startup<S, T>(
transport: &mut T,
id_provider: &Arc<AtomicU32RequestIdProvider>,
peer: &Peer<RoleClient>,
client_info: ClientInfo,
client_info: InitializeRequestParams,
) -> Result<(), ClientInitializeError>
where
S: Service<RoleClient>,
Expand Down Expand Up @@ -817,7 +817,7 @@ async fn discover_startup<S, T>(
transport: &mut T,
id_provider: &Arc<AtomicU32RequestIdProvider>,
peer: &Peer<RoleClient>,
client_info: &ClientInfo,
client_info: &InitializeRequestParams,
preferred_versions: Vec<ProtocolVersion>,
) -> Result<(), ClientInitializeError>
where
Expand Down
19 changes: 10 additions & 9 deletions crates/rmcp/src/service/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ use super::*;
use crate::model::{ElicitRequest, ElicitRequestParams, ElicitResult, ElicitationAction};
use crate::{
model::{
CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage,
CancelledNotification, CancelledNotificationParam, ClientJsonRpcMessage,
ClientNotification, ClientRequest, ClientResult, CreateMessageRequest,
CreateMessageRequestParams, CreateMessageResult, EmptyResult, ErrorData, ListRootsRequest,
ListRootsResult, LoggingMessageNotification, LoggingMessageNotificationParam,
ProgressNotification, ProgressNotificationParam, PromptListChangedNotification,
ProtocolVersion, ResourceListChangedNotification, ResourceUpdatedNotification,
ResourceUpdatedNotificationParam, ServerInfo, ServerNotification, ServerRequest,
ServerResult, SubscriptionFilter, SubscriptionsAcknowledgedNotification,
CreateMessageRequestParams, CreateMessageResult, EmptyResult, ErrorData,
InitializeRequestParams, InitializeResult, ListRootsRequest, ListRootsResult,
LoggingMessageNotification, LoggingMessageNotificationParam, ProgressNotification,
ProgressNotificationParam, PromptListChangedNotification, ProtocolVersion,
ResourceListChangedNotification, ResourceUpdatedNotification,
ResourceUpdatedNotificationParam, ServerNotification, ServerRequest, ServerResult,
SubscriptionFilter, SubscriptionsAcknowledgedNotification,
SubscriptionsAcknowledgedNotificationParams, ToolListChangedNotification,
},
transport::DynamicTransportError,
Expand All @@ -37,8 +38,8 @@ impl ServiceRole for RoleServer {
type PeerReq = ClientRequest;
type PeerResp = ClientResult;
type PeerNot = ClientNotification;
type Info = ServerInfo;
type PeerInfo = ClientInfo;
type Info = InitializeResult;
type PeerInfo = InitializeRequestParams;

type InitializeError = ServerInitializeError;
const IS_CLIENT: bool = false;
Expand Down
8 changes: 4 additions & 4 deletions crates/rmcp/src/transport/streamable_http_server/tower.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ use crate::{
model::{
ClientCapabilities, ClientJsonRpcMessage, ClientNotification, ClientRequest, ErrorCode,
ErrorData, GetExtensions, GetMeta, Implementation, InitializeRequest,
InitializeRequestParams, InitializedNotification, JsonObject, JsonRpcError,
ProtocolVersion, RequestId, ServerInfo, ServerJsonRpcMessage, ServerResult,
InitializeRequestParams, InitializeResult, InitializedNotification, JsonObject,
JsonRpcError, ProtocolVersion, RequestId, ServerJsonRpcMessage, ServerResult,
},
serve_server,
service::{
Expand Down Expand Up @@ -340,7 +340,7 @@ impl<S: Service<RoleServer>> Service<RoleServer> for NegotiatingStatelessHttpSer
self.0.handle_notification(notification, context).await
}

fn get_info(&self) -> ServerInfo {
fn get_info(&self) -> InitializeResult {
self.0.get_info()
}

Expand Down Expand Up @@ -2075,7 +2075,7 @@ where
Ok(accepted_response())
}

/// Build a `ClientInfo` (peer_info) for a stateless request so that
/// Build a `InitializeRequestParams` (peer_info) for a stateless request so that
/// `context.protocol_version()` returns the correct value inside handlers.
///
/// `serve_directly` skips the MCP handshake and accepts `peer_info = None`,
Expand Down
6 changes: 3 additions & 3 deletions crates/rmcp/tests/common/calculator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
use rmcp::{
ServerHandler,
handler::server::{router::tool::ToolRouter, wrapper::Parameters},
model::{ServerCapabilities, ServerInfo},
model::{InitializeResult, ServerCapabilities},
schemars, tool, tool_router,
};
#[derive(Debug, serde::Deserialize, schemars::JsonSchema)]
Expand Down Expand Up @@ -52,8 +52,8 @@ impl Calculator {
}

impl ServerHandler for Calculator {
fn get_info(&self) -> ServerInfo {
ServerInfo::new(ServerCapabilities::builder().enable_tools().build())
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_tools().build())
.with_instructions("A simple calculator")
}
}
4 changes: 2 additions & 2 deletions crates/rmcp/tests/common/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ impl TestServer {

impl ServerHandler for TestServer {
#[allow(deprecated)]
fn get_info(&self) -> ServerInfo {
ServerInfo::new(ServerCapabilities::builder().enable_logging().build())
fn get_info(&self) -> InitializeResult {
InitializeResult::new(ServerCapabilities::builder().enable_logging().build())
}

#[allow(deprecated)]
Expand Down
Loading