From ff8fbd322b40b2f439f7c557149b3dfb7cddc1e4 Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Mon, 12 Jan 2026 22:36:01 -0500 Subject: [PATCH 1/6] feat: implement SEP-1319 Decouple Request Payload from RPC Methods --- crates/rmcp-macros/src/prompt_handler.rs | 4 +- crates/rmcp/src/handler/server/tool.rs | 2 + crates/rmcp/src/lib.rs | 5 +- crates/rmcp/src/model.rs | 330 ++++++++++++++++++++--- crates/rmcp/src/model/meta.rs | 63 +++++ crates/rmcp/src/service/client.rs | 56 ++-- crates/rmcp/src/service/server.rs | 13 +- 7 files changed, 402 insertions(+), 71 deletions(-) diff --git a/crates/rmcp-macros/src/prompt_handler.rs b/crates/rmcp-macros/src/prompt_handler.rs index c37f1eab..7e534f92 100644 --- a/crates/rmcp-macros/src/prompt_handler.rs +++ b/crates/rmcp-macros/src/prompt_handler.rs @@ -28,7 +28,7 @@ pub fn prompt_handler(attr: TokenStream, input: TokenStream) -> syn::Result, ) -> Result { let prompt_context = rmcp::handler::server::prompt::PromptContext::new( @@ -51,7 +51,7 @@ pub fn prompt_handler(attr: TokenStream, input: TokenStream) -> syn::Result, + _request: Option, _context: RequestContext, ) -> Result { let prompts = #router_expr.list_all(); diff --git a/crates/rmcp/src/handler/server/tool.rs b/crates/rmcp/src/handler/server/tool.rs index 16435e42..7fd57f59 100644 --- a/crates/rmcp/src/handler/server/tool.rs +++ b/crates/rmcp/src/handler/server/tool.rs @@ -37,9 +37,11 @@ pub struct ToolCallContext<'s, S> { } impl<'s, S> ToolCallContext<'s, S> { + #[allow(deprecated)] pub fn new( service: &'s S, CallToolRequestParam { + meta: _, name, arguments, task, diff --git a/crates/rmcp/src/lib.rs b/crates/rmcp/src/lib.rs index f1f1e406..5f543d27 100644 --- a/crates/rmcp/src/lib.rs +++ b/crates/rmcp/src/lib.rs @@ -104,7 +104,7 @@ //! //! ```rust //! use anyhow::Result; -//! use rmcp::{model::CallToolRequestParam, service::ServiceExt}; +//! use rmcp::{model::CallToolRequestParams, service::ServiceExt}; //! #[cfg(feature = "transport-child-process")] //! #[cfg_attr(docsrs, doc(cfg(feature = "transport-child-process")))] //! use rmcp::transport::{TokioChildProcess, ConfigureCommandExt}; @@ -127,7 +127,8 @@ //! //! // Call tool 'git_status' with arguments = {"repo_path": "."} //! let tool_result = service -//! .call_tool(CallToolRequestParam { +//! .call_tool(CallToolRequestParams { +//! meta: None, //! name: "git_status".into(), //! arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(), //! task: None, diff --git a/crates/rmcp/src/model.rs b/crates/rmcp/src/model.rs index 36cd8fb9..2bdcc4b3 100644 --- a/crates/rmcp/src/model.rs +++ b/crates/rmcp/src/model.rs @@ -718,7 +718,7 @@ impl CustomRequest { const_string!(InitializeResultMethod = "initialize"); /// # Initialization /// This request is sent from the client to the server when it first connects, asking it to begin initialization. -pub type InitializeRequest = Request; +pub type InitializeRequest = Request; const_string!(InitializedNotificationMethod = "notifications/initialized"); /// This notification is sent from the client to the server after initialization has finished. @@ -731,7 +731,10 @@ pub type InitializedNotification = NotificationNoParam, /// The MCP protocol version this client supports pub protocol_version: ProtocolVersion, /// The capabilities this client supports (sampling, roots, etc.) @@ -740,6 +743,19 @@ pub struct InitializeRequestParam { pub client_info: Implementation, } +impl RequestParamsMeta for InitializeRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`InitializeRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use InitializeRequestParams instead")] +pub type InitializeRequestParam = InitializeRequestParams; + /// The server's response to an initialization request. /// /// Contains the server's protocol version, capabilities, and implementation @@ -760,7 +776,7 @@ pub struct InitializeResult { } pub type ServerInfo = InitializeResult; -pub type ClientInfo = InitializeRequestParam; +pub type ClientInfo = InitializeRequestParams; #[allow(clippy::derivable_impls)] impl Default for ServerInfo { @@ -778,6 +794,7 @@ impl Default for ServerInfo { impl Default for ClientInfo { fn default() -> Self { ClientInfo { + meta: None, protocol_version: ProtocolVersion::default(), capabilities: ClientCapabilities::default(), client_info: Implementation::from_build_env(), @@ -843,10 +860,26 @@ impl Implementation { #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct PaginatedRequestParam { +pub struct PaginatedRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, #[serde(skip_serializing_if = "Option::is_none")] pub cursor: Option, } + +impl RequestParamsMeta for PaginatedRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`PaginatedRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use PaginatedRequestParams instead")] +pub type PaginatedRequestParam = PaginatedRequestParams; // ============================================================================= // PROGRESS AND PAGINATION // ============================================================================= @@ -910,7 +943,7 @@ macro_rules! paginated_result { const_string!(ListResourcesRequestMethod = "resources/list"); /// Request to list all available resources from a server pub type ListResourcesRequest = - RequestOptionalParam; + RequestOptionalParam; paginated_result!(ListResourcesResult { resources: Vec @@ -919,7 +952,7 @@ paginated_result!(ListResourcesResult { const_string!(ListResourceTemplatesRequestMethod = "resources/templates/list"); /// Request to list all available resource templates from a server pub type ListResourceTemplatesRequest = - RequestOptionalParam; + RequestOptionalParam; paginated_result!(ListResourceTemplatesResult { resource_templates: Vec @@ -930,11 +963,27 @@ const_string!(ReadResourceRequestMethod = "resources/read"); #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct ReadResourceRequestParam { +pub struct ReadResourceRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, /// The URI of the resource to read pub uri: String, } +impl RequestParamsMeta for ReadResourceRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`ReadResourceRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use ReadResourceRequestParams instead")] +pub type ReadResourceRequestParam = ReadResourceRequestParams; + /// Result containing the contents of a read resource #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] @@ -944,7 +993,7 @@ pub struct ReadResourceResult { } /// Request to read a specific resource -pub type ReadResourceRequest = Request; +pub type ReadResourceRequest = Request; const_string!(ResourceListChangedNotificationMethod = "notifications/resources/list_changed"); /// Notification sent when the list of available resources changes @@ -956,24 +1005,58 @@ const_string!(SubscribeRequestMethod = "resources/subscribe"); #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct SubscribeRequestParam { +pub struct SubscribeRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, /// The URI of the resource to subscribe to pub uri: String, } + +impl RequestParamsMeta for SubscribeRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`SubscribeRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use SubscribeRequestParams instead")] +pub type SubscribeRequestParam = SubscribeRequestParams; + /// Request to subscribe to resource updates -pub type SubscribeRequest = Request; +pub type SubscribeRequest = Request; const_string!(UnsubscribeRequestMethod = "resources/unsubscribe"); /// Parameters for unsubscribing from resource updates #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct UnsubscribeRequestParam { +pub struct UnsubscribeRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, /// The URI of the resource to unsubscribe from pub uri: String, } + +impl RequestParamsMeta for UnsubscribeRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`UnsubscribeRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use UnsubscribeRequestParams instead")] +pub type UnsubscribeRequestParam = UnsubscribeRequestParams; + /// Request to unsubscribe from resource updates -pub type UnsubscribeRequest = Request; +pub type UnsubscribeRequest = Request; const_string!(ResourceUpdatedNotificationMethod = "notifications/resources/updated"); /// Parameters for a resource update notification @@ -994,7 +1077,8 @@ pub type ResourceUpdatedNotification = const_string!(ListPromptsRequestMethod = "prompts/list"); /// Request to list all available prompts from a server -pub type ListPromptsRequest = RequestOptionalParam; +pub type ListPromptsRequest = + RequestOptionalParam; paginated_result!(ListPromptsResult { prompts: Vec @@ -1005,13 +1089,30 @@ const_string!(GetPromptRequestMethod = "prompts/get"); #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct GetPromptRequestParam { +pub struct GetPromptRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub arguments: Option, } + +impl RequestParamsMeta for GetPromptRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`GetPromptRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use GetPromptRequestParams instead")] +pub type GetPromptRequestParam = GetPromptRequestParams; + /// Request to get a specific prompt -pub type GetPromptRequest = Request; +pub type GetPromptRequest = Request; const_string!(PromptListChangedNotificationMethod = "notifications/prompts/list_changed"); /// Notification sent when the list of available prompts changes @@ -1045,12 +1146,29 @@ const_string!(SetLevelRequestMethod = "logging/setLevel"); #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct SetLevelRequestParam { +pub struct SetLevelRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, /// The desired logging level pub level: LoggingLevel, } + +impl RequestParamsMeta for SetLevelRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`SetLevelRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use SetLevelRequestParams instead")] +pub type SetLevelRequestParam = SetLevelRequestParams; + /// Request to set the logging level -pub type SetLevelRequest = Request; +pub type SetLevelRequest = Request; const_string!(LoggingMessageNotificationMethod = "notifications/message"); /// Parameters for a logging message notification @@ -1075,7 +1193,7 @@ pub type LoggingMessageNotification = // ============================================================================= const_string!(CreateMessageRequestMethod = "sampling/createMessage"); -pub type CreateMessageRequest = Request; +pub type CreateMessageRequest = Request; /// Represents the role of a participant in a conversation or message exchange. /// @@ -1128,10 +1246,19 @@ pub enum ContextInclusion { /// This structure contains all the necessary information for a client to /// generate an LLM response, including conversation history, model preferences, /// and generation parameters. +/// +/// This implements `TaskAugmentedRequestParamsMeta` as sampling requests can be +/// long-running and may benefit from task-based execution. #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct CreateMessageRequestParam { +pub struct CreateMessageRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, + /// Task metadata for async task management (SEP-1319) + #[serde(skip_serializing_if = "Option::is_none")] + pub task: Option, /// The conversation history and current messages pub messages: Vec, /// Preferences for model selection and behavior @@ -1156,6 +1283,28 @@ pub struct CreateMessageRequestParam { pub metadata: Option, } +impl RequestParamsMeta for CreateMessageRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +impl TaskAugmentedRequestParamsMeta for CreateMessageRequestParams { + fn task(&self) -> Option<&JsonObject> { + self.task.as_ref() + } + fn task_mut(&mut self) -> &mut Option { + &mut self.task + } +} + +/// Deprecated: Use [`CreateMessageRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use CreateMessageRequestParams instead")] +pub type CreateMessageRequestParam = CreateMessageRequestParams; + /// Preferences for model selection and behavior in sampling requests. /// /// This allows servers to express their preferences for which model to use @@ -1244,7 +1393,10 @@ impl CompletionContext { #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct CompleteRequestParam { +pub struct CompleteRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, pub r#ref: Reference, pub argument: ArgumentInfo, /// Optional context containing previously resolved argument values @@ -1252,7 +1404,20 @@ pub struct CompleteRequestParam { pub context: Option, } -pub type CompleteRequest = Request; +impl RequestParamsMeta for CompleteRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`CompleteRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use CompleteRequestParams instead")] +pub type CompleteRequestParam = CompleteRequestParams; + +pub type CompleteRequest = Request; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] #[serde(rename_all = "camelCase")] @@ -1477,7 +1642,8 @@ pub enum ElicitationAction { /// ```rust /// use rmcp::model::*; /// -/// let params = CreateElicitationRequestParam { +/// let params = CreateElicitationRequestParams { +/// meta: None, /// message: "Please provide your email".to_string(), /// requested_schema: ElicitationSchema::builder() /// .required_email("email") @@ -1488,7 +1654,11 @@ pub enum ElicitationAction { #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct CreateElicitationRequestParam { +pub struct CreateElicitationRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, + /// Human-readable message explaining what input is needed from the user. /// This should be clear and provide sufficient context for the user to understand /// what information they need to provide. @@ -1500,6 +1670,19 @@ pub struct CreateElicitationRequestParam { pub requested_schema: ElicitationSchema, } +impl RequestParamsMeta for CreateElicitationRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`CreateElicitationRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use CreateElicitationRequestParams instead")] +pub type CreateElicitationRequestParam = CreateElicitationRequestParams; + /// The result returned by a client in response to an elicitation request. /// /// Contains the user's decision (accept/decline/cancel) and optionally their input data @@ -1520,7 +1703,7 @@ pub struct CreateElicitationResult { /// Request type for creating an elicitation to gather user input pub type CreateElicitationRequest = - Request; + Request; // ============================================================================= // TOOL EXECUTION RESULTS @@ -1685,7 +1868,7 @@ impl<'de> Deserialize<'de> for CallToolResult { const_string!(ListToolsRequestMethod = "tools/list"); /// Request to list all available tools from a server -pub type ListToolsRequest = RequestOptionalParam; +pub type ListToolsRequest = RequestOptionalParam; paginated_result!( ListToolsResult { @@ -1698,21 +1881,50 @@ const_string!(CallToolRequestMethod = "tools/call"); /// /// Contains the tool name and optional arguments needed to execute /// the tool operation. +/// +/// This implements `TaskAugmentedRequestParamsMeta` as tool calls can be +/// long-running and may benefit from task-based execution. #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct CallToolRequestParam { +pub struct CallToolRequestParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, /// The name of the tool to call pub name: Cow<'static, str>, /// Arguments to pass to the tool (must match the tool's input schema) #[serde(skip_serializing_if = "Option::is_none")] pub arguments: Option, + /// Task metadata for async task management (SEP-1319) #[serde(skip_serializing_if = "Option::is_none")] pub task: Option, } +impl RequestParamsMeta for CallToolRequestParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +impl TaskAugmentedRequestParamsMeta for CallToolRequestParams { + fn task(&self) -> Option<&JsonObject> { + self.task.as_ref() + } + fn task_mut(&mut self) -> &mut Option { + &mut self.task + } +} + +/// Deprecated: Use [`CallToolRequestParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use CallToolRequestParams instead")] +pub type CallToolRequestParam = CallToolRequestParams; + /// Request to call a specific tool -pub type CallToolRequest = Request; +pub type CallToolRequest = Request; /// The result of a sampling/createMessage request containing the generated response. /// @@ -1752,37 +1964,85 @@ pub struct GetPromptResult { // ============================================================================= const_string!(GetTaskInfoMethod = "tasks/get"); -pub type GetTaskInfoRequest = Request; +pub type GetTaskInfoRequest = Request; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct GetTaskInfoParam { +pub struct GetTaskInfoParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, pub task_id: String, } +impl RequestParamsMeta for GetTaskInfoParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`GetTaskInfoParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use GetTaskInfoParams instead")] +pub type GetTaskInfoParam = GetTaskInfoParams; + const_string!(ListTasksMethod = "tasks/list"); -pub type ListTasksRequest = RequestOptionalParam; +pub type ListTasksRequest = RequestOptionalParam; const_string!(GetTaskResultMethod = "tasks/result"); -pub type GetTaskResultRequest = Request; +pub type GetTaskResultRequest = Request; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct GetTaskResultParam { +pub struct GetTaskResultParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, pub task_id: String, } +impl RequestParamsMeta for GetTaskResultParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`GetTaskResultParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use GetTaskResultParams instead")] +pub type GetTaskResultParam = GetTaskResultParams; + const_string!(CancelTaskMethod = "tasks/cancel"); -pub type CancelTaskRequest = Request; +pub type CancelTaskRequest = Request; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct CancelTaskParam { +pub struct CancelTaskParams { + /// Protocol-level metadata for this request (SEP-1319) + #[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")] + pub meta: Option, pub task_id: String, } + +impl RequestParamsMeta for CancelTaskParams { + fn meta(&self) -> Option<&Meta> { + self.meta.as_ref() + } + fn meta_mut(&mut self) -> &mut Option { + &mut self.meta + } +} + +/// Deprecated: Use [`CancelTaskParams`] instead (SEP-1319 compliance). +#[deprecated(since = "0.2.0", note = "Use CancelTaskParams instead")] +pub type CancelTaskParam = CancelTaskParams; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] @@ -2201,11 +2461,13 @@ mod tests { serde_json::from_value(request.clone()).expect("invalid request"); let (request, id) = request.into_request().expect("should be a request"); assert_eq!(id, RequestId::Number(1)); + #[allow(deprecated)] match request { ClientRequest::InitializeRequest(Request { method: _, params: InitializeRequestParam { + meta: _, protocol_version: _, capabilities, client_info, diff --git a/crates/rmcp/src/model/meta.rs b/crates/rmcp/src/model/meta.rs index acda3900..dbf8dbc4 100644 --- a/crates/rmcp/src/model/meta.rs +++ b/crates/rmcp/src/model/meta.rs @@ -18,6 +18,62 @@ pub trait GetExtensions { fn extensions_mut(&mut self) -> &mut Extensions; } +// ============================================================================= +// SEP-1319: Request Params Traits +// ============================================================================= + +/// Trait for request params that contain the `_meta` field. +/// +/// This trait is part of SEP-1319 compliance, enabling request params to carry +/// protocol-level metadata directly in the params structure (not just in Extensions). +/// +/// Per the MCP 2025-11-25 spec, all request params should have an optional `_meta` +/// field that can contain a `progressToken` for tracking long-running operations. +pub trait RequestParamsMeta { + /// Get a reference to the meta field + fn meta(&self) -> Option<&Meta>; + /// Get a mutable reference to the meta field + fn meta_mut(&mut self) -> &mut Option; + /// Set the meta field + fn set_meta(&mut self, meta: Meta) { + *self.meta_mut() = Some(meta); + } + /// Get the progress token from meta, if present + fn progress_token(&self) -> Option { + self.meta().and_then(|m| m.get_progress_token()) + } + /// Set a progress token in meta + fn set_progress_token(&mut self, token: ProgressToken) { + match self.meta_mut() { + Some(meta) => meta.set_progress_token(token), + none => { + let mut meta = Meta::new(); + meta.set_progress_token(token); + *none = Some(meta); + } + } + } +} + +/// Trait for task-augmented request params that contain both `_meta` and `task` fields. +/// +/// This extends `RequestParamsMeta` to add support for the `task` field, which is used +/// for long-running operations that should be handled asynchronously through the +/// MCP task system. +/// +/// Per the MCP 2025-11-25 spec, certain requests (like `tools/call` and `sampling/createMessage`) +/// can include a `task` field to signal that the caller wants task-augmented execution. +pub trait TaskAugmentedRequestParamsMeta: RequestParamsMeta { + /// Get a reference to the task field + fn task(&self) -> Option<&JsonObject>; + /// Get a mutable reference to the task field + fn task_mut(&mut self) -> &mut Option; + /// Set the task field + fn set_task(&mut self, task: JsonObject) { + *self.task_mut() = Some(task); + } +} + impl GetExtensions for CustomNotification { fn extensions(&self) -> &Extensions { &self.extensions @@ -156,6 +212,13 @@ impl Meta { Self(JsonObject::new()) } + /// Create a new Meta with a progress token set + pub fn with_progress_token(token: ProgressToken) -> Self { + let mut meta = Self::new(); + meta.set_progress_token(token); + meta + } + pub(crate) fn static_empty() -> &'static Self { static EMPTY: std::sync::OnceLock = std::sync::OnceLock::new(); EMPTY.get_or_init(Default::default) diff --git a/crates/rmcp/src/service/client.rs b/crates/rmcp/src/service/client.rs index e6991f38..837fafef 100644 --- a/crates/rmcp/src/service/client.rs +++ b/crates/rmcp/src/service/client.rs @@ -5,18 +5,18 @@ use thiserror::Error; use super::*; use crate::{ model::{ - ArgumentInfo, CallToolRequest, CallToolRequestParam, CallToolResult, CancelledNotification, - CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, ClientNotification, - ClientRequest, ClientResult, CompleteRequest, CompleteRequestParam, CompleteResult, - CompletionContext, CompletionInfo, ErrorData, GetPromptRequest, GetPromptRequestParam, - GetPromptResult, InitializeRequest, InitializedNotification, JsonRpcResponse, - ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest, + ArgumentInfo, CallToolRequest, CallToolRequestParams, CallToolResult, + CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, + ClientNotification, ClientRequest, ClientResult, CompleteRequest, CompleteRequestParams, + CompleteResult, CompletionContext, CompletionInfo, ErrorData, GetPromptRequest, + GetPromptRequestParams, GetPromptResult, InitializeRequest, InitializedNotification, + JsonRpcResponse, ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest, ListResourceTemplatesResult, ListResourcesRequest, ListResourcesResult, ListToolsRequest, - ListToolsResult, PaginatedRequestParam, ProgressNotification, ProgressNotificationParam, - ReadResourceRequest, ReadResourceRequestParam, ReadResourceResult, Reference, RequestId, + ListToolsResult, PaginatedRequestParams, ProgressNotification, ProgressNotificationParam, + ReadResourceRequest, ReadResourceRequestParams, ReadResourceResult, Reference, RequestId, RootsListChangedNotification, ServerInfo, ServerJsonRpcMessage, ServerNotification, - ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParam, SubscribeRequest, - SubscribeRequestParam, UnsubscribeRequest, UnsubscribeRequestParam, + ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParams, SubscribeRequest, + SubscribeRequestParams, UnsubscribeRequest, UnsubscribeRequestParams, }, transport::DynamicTransportError, }; @@ -350,17 +350,17 @@ macro_rules! method { } impl Peer { - method!(peer_req complete CompleteRequest(CompleteRequestParam) => CompleteResult); - method!(peer_req set_level SetLevelRequest(SetLevelRequestParam)); - method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParam) => GetPromptResult); - method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParam)? => ListPromptsResult); - method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParam)? => ListResourcesResult); - method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParam)? => ListResourceTemplatesResult); - method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParam) => ReadResourceResult); - method!(peer_req subscribe SubscribeRequest(SubscribeRequestParam) ); - method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParam)); - method!(peer_req call_tool CallToolRequest(CallToolRequestParam) => CallToolResult); - method!(peer_req list_tools ListToolsRequest(PaginatedRequestParam)? => ListToolsResult); + method!(peer_req complete CompleteRequest(CompleteRequestParams) => CompleteResult); + method!(peer_req set_level SetLevelRequest(SetLevelRequestParams)); + method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParams) => GetPromptResult); + method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParams)? => ListPromptsResult); + method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParams)? => ListResourcesResult); + method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParams)? => ListResourceTemplatesResult); + method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParams) => ReadResourceResult); + method!(peer_req subscribe SubscribeRequest(SubscribeRequestParams) ); + method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParams)); + method!(peer_req call_tool CallToolRequest(CallToolRequestParams) => CallToolResult); + method!(peer_req list_tools ListToolsRequest(PaginatedRequestParams)? => ListToolsResult); method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam)); method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam)); @@ -377,7 +377,7 @@ impl Peer { let mut cursor = None; loop { let result = self - .list_tools(Some(PaginatedRequestParam { cursor })) + .list_tools(Some(PaginatedRequestParams { meta: None, cursor })) .await?; tools.extend(result.tools); cursor = result.next_cursor; @@ -396,7 +396,7 @@ impl Peer { let mut cursor = None; loop { let result = self - .list_prompts(Some(PaginatedRequestParam { cursor })) + .list_prompts(Some(PaginatedRequestParams { meta: None, cursor })) .await?; prompts.extend(result.prompts); cursor = result.next_cursor; @@ -415,7 +415,7 @@ impl Peer { let mut cursor = None; loop { let result = self - .list_resources(Some(PaginatedRequestParam { cursor })) + .list_resources(Some(PaginatedRequestParams { meta: None, cursor })) .await?; resources.extend(result.resources); cursor = result.next_cursor; @@ -436,7 +436,7 @@ impl Peer { let mut cursor = None; loop { let result = self - .list_resource_templates(Some(PaginatedRequestParam { cursor })) + .list_resource_templates(Some(PaginatedRequestParams { meta: None, cursor })) .await?; resource_templates.extend(result.resource_templates); cursor = result.next_cursor; @@ -464,7 +464,8 @@ impl Peer { current_value: impl Into, context: Option, ) -> Result { - let request = CompleteRequestParam { + let request = CompleteRequestParams { + meta: None, r#ref: Reference::for_prompt(prompt_name), argument: ArgumentInfo { name: argument_name.into(), @@ -494,7 +495,8 @@ impl Peer { current_value: impl Into, context: Option, ) -> Result { - let request = CompleteRequestParam { + let request = CompleteRequestParams { + meta: None, r#ref: Reference::for_resource(uri_template), argument: ArgumentInfo { name: argument_name.into(), diff --git a/crates/rmcp/src/service/server.rs b/crates/rmcp/src/service/server.rs index 82a7e7d8..1ba578b7 100644 --- a/crates/rmcp/src/service/server.rs +++ b/crates/rmcp/src/service/server.rs @@ -5,13 +5,13 @@ use thiserror::Error; use super::*; #[cfg(feature = "elicitation")] use crate::model::{ - CreateElicitationRequest, CreateElicitationRequestParam, CreateElicitationResult, + CreateElicitationRequest, CreateElicitationRequestParams, CreateElicitationResult, }; use crate::{ model::{ CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, ClientNotification, ClientRequest, ClientResult, CreateMessageRequest, - CreateMessageRequestParam, CreateMessageResult, ErrorData, ListRootsRequest, + CreateMessageRequestParams, CreateMessageResult, ErrorData, ListRootsRequest, ListRootsResult, LoggingMessageNotification, LoggingMessageNotificationParam, ProgressNotification, ProgressNotificationParam, PromptListChangedNotification, ProtocolVersion, ResourceListChangedNotification, ResourceUpdatedNotification, @@ -386,7 +386,7 @@ macro_rules! method { impl Peer { pub async fn create_message( &self, - params: CreateMessageRequestParam, + params: CreateMessageRequestParams, ) -> Result { let result = self .send_request(ServerRequest::CreateMessageRequest(CreateMessageRequest { @@ -402,9 +402,9 @@ impl Peer { } method!(peer_req list_roots ListRootsRequest() => ListRootsResult); #[cfg(feature = "elicitation")] - method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParam) => CreateElicitationResult); + method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParams) => CreateElicitationResult); #[cfg(feature = "elicitation")] - method!(peer_req_with_timeout create_elicitation_with_timeout CreateElicitationRequest(CreateElicitationRequestParam) => CreateElicitationResult); + method!(peer_req_with_timeout create_elicitation_with_timeout CreateElicitationRequest(CreateElicitationRequestParams) => CreateElicitationResult); method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam)); method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam)); @@ -690,7 +690,8 @@ impl Peer { let response = self .create_elicitation_with_timeout( - CreateElicitationRequestParam { + CreateElicitationRequestParams { + meta: None, message: message.into(), requested_schema: schema, }, From ff941645a2c668f9c61bd96e6bb1ce07a593dcc1 Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Mon, 12 Jan 2026 22:52:42 -0500 Subject: [PATCH 2/6] test: update tests --- crates/rmcp/tests/test_completion.rs | 6 +- crates/rmcp/tests/test_elicitation.rs | 47 ++++-- crates/rmcp/tests/test_logging.rs | 17 +- crates/rmcp/tests/test_message_protocol.rs | 40 +++-- .../client_json_rpc_message_schema.json | 155 ++++++++++++++---- ...lient_json_rpc_message_schema_current.json | 155 ++++++++++++++---- .../server_json_rpc_message_schema.json | 36 +++- ...erver_json_rpc_message_schema_current.json | 36 +++- crates/rmcp/tests/test_notification.rs | 5 +- crates/rmcp/tests/test_progress_subscriber.rs | 5 +- crates/rmcp/tests/test_prompt_handler.rs | 2 +- crates/rmcp/tests/test_prompt_macros.rs | 10 +- crates/rmcp/tests/test_sampling.rs | 16 +- crates/rmcp/tests/test_tool_macros.rs | 8 +- 14 files changed, 417 insertions(+), 121 deletions(-) diff --git a/crates/rmcp/tests/test_completion.rs b/crates/rmcp/tests/test_completion.rs index ea9f632f..bd563cad 100644 --- a/crates/rmcp/tests/test_completion.rs +++ b/crates/rmcp/tests/test_completion.rs @@ -52,7 +52,8 @@ fn test_complete_request_param_serialization() { let mut args = HashMap::new(); args.insert("previous_input".to_string(), "test".to_string()); - let request = CompleteRequestParam { + let request = CompleteRequestParams { + meta: None, r#ref: Reference::for_prompt("weather_prompt"), argument: ArgumentInfo { name: "location".to_string(), @@ -195,7 +196,8 @@ fn test_completion_context_empty() { #[test] fn test_mcp_schema_compliance() { // Test that our types serialize correctly according to MCP specification - let request = CompleteRequestParam { + let request = CompleteRequestParams { + meta: None, r#ref: Reference::for_resource("file://{path}"), argument: ArgumentInfo { name: "path".to_string(), diff --git a/crates/rmcp/tests/test_elicitation.rs b/crates/rmcp/tests/test_elicitation.rs index 87c6706c..4b485155 100644 --- a/crates/rmcp/tests/test_elicitation.rs +++ b/crates/rmcp/tests/test_elicitation.rs @@ -44,7 +44,8 @@ async fn test_elicitation_request_param_serialization() { .build() .unwrap(); - let request_param = CreateElicitationRequestParam { + let request_param = CreateElicitationRequestParams { + meta: None, message: "Please provide your email address".to_string(), requested_schema: schema, }; @@ -128,7 +129,8 @@ async fn test_elicitation_json_rpc_protocol() { id: RequestId::Number(1), request: CreateElicitationRequest { method: ElicitationCreateRequestMethod, - params: CreateElicitationRequestParam { + params: CreateElicitationRequestParams { + meta: None, message: "Do you want to continue?".to_string(), requested_schema: schema, }, @@ -212,7 +214,8 @@ async fn test_elicitation_spec_compliance() { #[tokio::test] async fn test_elicitation_error_handling() { // Test minimal schema handling (empty properties is technically valid) - let minimal_schema_request = CreateElicitationRequestParam { + let minimal_schema_request = CreateElicitationRequestParams { + meta: None, message: "Test message".to_string(), requested_schema: ElicitationSchema::builder().build().unwrap(), }; @@ -221,7 +224,8 @@ async fn test_elicitation_error_handling() { let _json = serde_json::to_value(&minimal_schema_request).unwrap(); // Test empty message - let empty_message_request = CreateElicitationRequestParam { + let empty_message_request = CreateElicitationRequestParams { + meta: None, message: "".to_string(), requested_schema: ElicitationSchema::builder() .property("value", PrimitiveSchema::String(StringSchema::new())) @@ -246,7 +250,8 @@ async fn test_elicitation_performance() { .build() .unwrap(); - let request = CreateElicitationRequestParam { + let request = CreateElicitationRequestParams { + meta: None, message: "Performance test message".to_string(), requested_schema: schema, }; @@ -370,7 +375,8 @@ async fn test_elicitation_convenience_methods() { ); // Test that CreateElicitationRequestParam can be created with type-safe schemas - let confirmation_request = CreateElicitationRequestParam { + let confirmation_request = CreateElicitationRequestParams { + meta: None, message: "Test confirmation".to_string(), requested_schema: ElicitationSchema::builder() .property( @@ -412,7 +418,8 @@ async fn test_elicitation_structured_schemas() { .build() .unwrap(); - let request = CreateElicitationRequestParam { + let request = CreateElicitationRequestParams { + meta: None, message: "Please provide your user information".to_string(), requested_schema: schema, }; @@ -654,7 +661,8 @@ async fn test_elicitation_multi_select_enum() { .build() .unwrap(); - let request = CreateElicitationRequestParam { + let request = CreateElicitationRequestParams { + meta: None, message: "Please provide your user information".to_string(), requested_schema: schema, }; @@ -735,7 +743,8 @@ async fn test_elicitation_single_select_enum() { .build() .unwrap(); - let request = CreateElicitationRequestParam { + let request = CreateElicitationRequestParams { + meta: None, message: "Please provide your user information".to_string(), requested_schema: schema, }; @@ -816,7 +825,8 @@ async fn test_elicitation_direction_server_to_client() { .build() .unwrap(); - let elicitation_request = CreateElicitationRequestParam { + let elicitation_request = CreateElicitationRequestParams { + meta: None, message: "Please enter your name".to_string(), requested_schema: schema, }; @@ -868,7 +878,8 @@ async fn test_elicitation_json_rpc_direction() { let server_request = ServerJsonRpcMessage::request( ServerRequest::CreateElicitationRequest(CreateElicitationRequest { method: ElicitationCreateRequestMethod, - params: CreateElicitationRequestParam { + params: CreateElicitationRequestParams { + meta: None, message: "Do you want to continue?".to_string(), requested_schema: schema, }, @@ -1039,8 +1050,9 @@ async fn test_client_capabilities_with_elicitation() { /// Test InitializeRequestParam with elicitation capability #[tokio::test] async fn test_initialize_request_with_elicitation() { - // Test InitializeRequestParam with elicitation capability - let init_param = InitializeRequestParam { + // Test InitializeRequestParams with elicitation capability + let init_param = InitializeRequestParams { + meta: None, protocol_version: ProtocolVersion::LATEST, capabilities: ClientCapabilities { elicitation: Some(ElicitationCapability { @@ -1084,7 +1096,8 @@ async fn test_capability_checking_logic() { // Simulate the logic that would be used in supports_elicitation() // Case 1: Client with elicitation capability - let client_with_capability = InitializeRequestParam { + let client_with_capability = InitializeRequestParams { + meta: None, protocol_version: ProtocolVersion::LATEST, capabilities: ClientCapabilities { elicitation: Some(ElicitationCapability { @@ -1106,7 +1119,8 @@ async fn test_capability_checking_logic() { assert!(supports_elicitation); // Case 2: Client without elicitation capability - let client_without_capability = InitializeRequestParam { + let client_without_capability = InitializeRequestParams { + meta: None, protocol_version: ProtocolVersion::LATEST, capabilities: ClientCapabilities { elicitation: None, @@ -1308,7 +1322,8 @@ async fn test_create_elicitation_with_timeout_basic() { .build() .unwrap(); - let _params = CreateElicitationRequestParam { + let _params = CreateElicitationRequestParams { + meta: None, message: "Enter your details".to_string(), requested_schema: schema, }; diff --git a/crates/rmcp/tests/test_logging.rs b/crates/rmcp/tests/test_logging.rs index eb63773f..be63b24f 100644 --- a/crates/rmcp/tests/test_logging.rs +++ b/crates/rmcp/tests/test_logging.rs @@ -6,7 +6,7 @@ use std::sync::{Arc, Mutex}; use common::handlers::{TestClientHandler, TestServer}; use rmcp::{ ServiceExt, - model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParam}, + model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParams}, }; use serde_json::json; use tokio::sync::Notify; @@ -63,7 +63,7 @@ async fn test_logging_spec_compliance() -> anyhow::Result<()> { ] { client .peer() - .set_level(SetLevelRequestParam { level }) + .set_level(SetLevelRequestParams { meta: None, level }) .await?; // Wait for each message response @@ -121,7 +121,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> { // Test 1: Error reporting scenario client .peer() - .set_level(SetLevelRequestParam { + .set_level(SetLevelRequestParams { + meta: None, level: LoggingLevel::Error, }) .await?; @@ -147,7 +148,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> { // Test 2: Debug scenario client .peer() - .set_level(SetLevelRequestParam { + .set_level(SetLevelRequestParams { + meta: None, level: LoggingLevel::Debug, }) .await?; @@ -170,7 +172,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> { // Test 3: Production monitoring scenario client .peer() - .set_level(SetLevelRequestParam { + .set_level(SetLevelRequestParams { + meta: None, level: LoggingLevel::Info, }) .await?; @@ -256,7 +259,7 @@ async fn test_logging_edge_cases() -> anyhow::Result<()> { ] { client .peer() - .set_level(SetLevelRequestParam { level }) + .set_level(SetLevelRequestParams { meta: None, level }) .await?; receive_signal.notified().await; @@ -316,7 +319,7 @@ async fn test_logging_optional_fields() -> anyhow::Result<()> { for level in [LoggingLevel::Info, LoggingLevel::Debug] { client .peer() - .set_level(SetLevelRequestParam { level }) + .set_level(SetLevelRequestParams { meta: None, level }) .await?; // Wait for each message response diff --git a/crates/rmcp/tests/test_message_protocol.rs b/crates/rmcp/tests/test_message_protocol.rs index 602f93da..b2851b5a 100644 --- a/crates/rmcp/tests/test_message_protocol.rs +++ b/crates/rmcp/tests/test_message_protocol.rs @@ -47,7 +47,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> { // Test ThisServer context inclusion let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -89,7 +91,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> { // Test AllServers context inclusion let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -131,7 +135,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> { // Test No context inclusion let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -193,7 +199,9 @@ async fn test_context_inclusion_ignored_integration() -> anyhow::Result<()> { // Test that context requests are ignored let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -254,7 +262,9 @@ async fn test_message_sequence_integration() -> anyhow::Result<()> { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![ SamplingMessage { role: Role::User, @@ -325,7 +335,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> { // Test valid sequence: User -> Assistant -> User let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![ SamplingMessage { role: Role::User, @@ -369,7 +381,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> { // Test invalid: No user message let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::Assistant, content: Content::text("assistant message"), @@ -422,7 +436,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> { // Test ThisServer is honored let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -462,7 +478,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> { // Test AllServers is ignored let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test message"), @@ -519,7 +537,9 @@ async fn test_context_inclusion() -> anyhow::Result<()> { // Test context handling let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("test"), diff --git a/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema.json b/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema.json index 5ae242a3..85b2a5fb 100644 --- a/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema.json +++ b/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema.json @@ -187,10 +187,18 @@ "format": "const", "const": "tools/call" }, - "CallToolRequestParam": { - "description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.", + "CallToolRequestParams": { + "description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.\n\nThis implements `TaskAugmentedRequestParamsMeta` as tool calls can be\nlong-running and may benefit from task-based execution.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "arguments": { "description": "Arguments to pass to the tool (must match the tool's input schema)", "type": [ @@ -204,6 +212,7 @@ "type": "string" }, "task": { + "description": "Task metadata for async task management (SEP-1319)", "type": [ "object", "null" @@ -220,9 +229,17 @@ "format": "const", "const": "tasks/cancel" }, - "CancelTaskParam": { + "CancelTaskParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -332,9 +349,17 @@ "format": "const", "const": "completion/complete" }, - "CompleteRequestParam": { + "CompleteRequestParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "argument": { "$ref": "#/definitions/ArgumentInfo" }, @@ -534,10 +559,18 @@ "format": "const", "const": "prompts/get" }, - "GetPromptRequestParam": { + "GetPromptRequestParams": { "description": "Parameters for retrieving a specific prompt", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "arguments": { "type": [ "object", @@ -558,9 +591,17 @@ "format": "const", "const": "tasks/get" }, - "GetTaskInfoParam": { + "GetTaskInfoParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -574,9 +615,17 @@ "format": "const", "const": "tasks/result" }, - "GetTaskResultParam": { + "GetTaskResultParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -651,10 +700,18 @@ "version" ] }, - "InitializeRequestParam": { + "InitializeRequestParams": { "description": "Parameters sent by a client when initializing a connection to an MCP server.\n\nThis contains the client's protocol version, capabilities, and implementation\ninformation, allowing the server to understand what the client supports.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "capabilities": { "description": "The capabilities this client supports (sampling, roots, etc.)", "allOf": [ @@ -953,9 +1010,17 @@ } ] }, - "PaginatedRequestParam": { + "PaginatedRequestParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "cursor": { "type": [ "string", @@ -1183,10 +1248,18 @@ "format": "const", "const": "resources/read" }, - "ReadResourceRequestParam": { + "ReadResourceRequestParams": { "description": "Parameters for reading a specific resource", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to read", "type": "string" @@ -1242,7 +1315,7 @@ "$ref": "#/definitions/InitializeResultMethod" }, "params": { - "$ref": "#/definitions/InitializeRequestParam" + "$ref": "#/definitions/InitializeRequestParams" } }, "required": [ @@ -1258,7 +1331,7 @@ "$ref": "#/definitions/GetTaskResultMethod" }, "params": { - "$ref": "#/definitions/GetTaskResultParam" + "$ref": "#/definitions/GetTaskResultParams" } }, "required": [ @@ -1274,7 +1347,7 @@ "$ref": "#/definitions/CancelTaskMethod" }, "params": { - "$ref": "#/definitions/CancelTaskParam" + "$ref": "#/definitions/CancelTaskParams" } }, "required": [ @@ -1290,7 +1363,7 @@ "$ref": "#/definitions/CompleteRequestMethod" }, "params": { - "$ref": "#/definitions/CompleteRequestParam" + "$ref": "#/definitions/CompleteRequestParams" } }, "required": [ @@ -1306,7 +1379,7 @@ "$ref": "#/definitions/SetLevelRequestMethod" }, "params": { - "$ref": "#/definitions/SetLevelRequestParam" + "$ref": "#/definitions/SetLevelRequestParams" } }, "required": [ @@ -1322,7 +1395,7 @@ "$ref": "#/definitions/GetPromptRequestMethod" }, "params": { - "$ref": "#/definitions/GetPromptRequestParam" + "$ref": "#/definitions/GetPromptRequestParams" } }, "required": [ @@ -1338,7 +1411,7 @@ "$ref": "#/definitions/ReadResourceRequestMethod" }, "params": { - "$ref": "#/definitions/ReadResourceRequestParam" + "$ref": "#/definitions/ReadResourceRequestParams" } }, "required": [ @@ -1354,7 +1427,7 @@ "$ref": "#/definitions/SubscribeRequestMethod" }, "params": { - "$ref": "#/definitions/SubscribeRequestParam" + "$ref": "#/definitions/SubscribeRequestParams" } }, "required": [ @@ -1370,7 +1443,7 @@ "$ref": "#/definitions/UnsubscribeRequestMethod" }, "params": { - "$ref": "#/definitions/UnsubscribeRequestParam" + "$ref": "#/definitions/UnsubscribeRequestParams" } }, "required": [ @@ -1386,7 +1459,7 @@ "$ref": "#/definitions/CallToolRequestMethod" }, "params": { - "$ref": "#/definitions/CallToolRequestParam" + "$ref": "#/definitions/CallToolRequestParams" } }, "required": [ @@ -1402,7 +1475,7 @@ "$ref": "#/definitions/GetTaskInfoMethod" }, "params": { - "$ref": "#/definitions/GetTaskInfoParam" + "$ref": "#/definitions/GetTaskInfoParams" } }, "required": [ @@ -1430,7 +1503,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1451,7 +1524,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1472,7 +1545,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1493,7 +1566,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1514,7 +1587,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1650,10 +1723,18 @@ "format": "const", "const": "logging/setLevel" }, - "SetLevelRequestParam": { + "SetLevelRequestParams": { "description": "Parameters for setting the logging level", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "level": { "description": "The desired logging level", "allOf": [ @@ -1672,10 +1753,18 @@ "format": "const", "const": "resources/subscribe" }, - "SubscribeRequestParam": { + "SubscribeRequestParams": { "description": "Parameters for subscribing to resource updates", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to subscribe to", "type": "string" @@ -1720,10 +1809,18 @@ "format": "const", "const": "resources/unsubscribe" }, - "UnsubscribeRequestParam": { + "UnsubscribeRequestParams": { "description": "Parameters for unsubscribing from resource updates", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to unsubscribe from", "type": "string" diff --git a/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema_current.json b/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema_current.json index 5ae242a3..85b2a5fb 100644 --- a/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema_current.json +++ b/crates/rmcp/tests/test_message_schema/client_json_rpc_message_schema_current.json @@ -187,10 +187,18 @@ "format": "const", "const": "tools/call" }, - "CallToolRequestParam": { - "description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.", + "CallToolRequestParams": { + "description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.\n\nThis implements `TaskAugmentedRequestParamsMeta` as tool calls can be\nlong-running and may benefit from task-based execution.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "arguments": { "description": "Arguments to pass to the tool (must match the tool's input schema)", "type": [ @@ -204,6 +212,7 @@ "type": "string" }, "task": { + "description": "Task metadata for async task management (SEP-1319)", "type": [ "object", "null" @@ -220,9 +229,17 @@ "format": "const", "const": "tasks/cancel" }, - "CancelTaskParam": { + "CancelTaskParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -332,9 +349,17 @@ "format": "const", "const": "completion/complete" }, - "CompleteRequestParam": { + "CompleteRequestParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "argument": { "$ref": "#/definitions/ArgumentInfo" }, @@ -534,10 +559,18 @@ "format": "const", "const": "prompts/get" }, - "GetPromptRequestParam": { + "GetPromptRequestParams": { "description": "Parameters for retrieving a specific prompt", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "arguments": { "type": [ "object", @@ -558,9 +591,17 @@ "format": "const", "const": "tasks/get" }, - "GetTaskInfoParam": { + "GetTaskInfoParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -574,9 +615,17 @@ "format": "const", "const": "tasks/result" }, - "GetTaskResultParam": { + "GetTaskResultParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "taskId": { "type": "string" } @@ -651,10 +700,18 @@ "version" ] }, - "InitializeRequestParam": { + "InitializeRequestParams": { "description": "Parameters sent by a client when initializing a connection to an MCP server.\n\nThis contains the client's protocol version, capabilities, and implementation\ninformation, allowing the server to understand what the client supports.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "capabilities": { "description": "The capabilities this client supports (sampling, roots, etc.)", "allOf": [ @@ -953,9 +1010,17 @@ } ] }, - "PaginatedRequestParam": { + "PaginatedRequestParams": { "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "cursor": { "type": [ "string", @@ -1183,10 +1248,18 @@ "format": "const", "const": "resources/read" }, - "ReadResourceRequestParam": { + "ReadResourceRequestParams": { "description": "Parameters for reading a specific resource", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to read", "type": "string" @@ -1242,7 +1315,7 @@ "$ref": "#/definitions/InitializeResultMethod" }, "params": { - "$ref": "#/definitions/InitializeRequestParam" + "$ref": "#/definitions/InitializeRequestParams" } }, "required": [ @@ -1258,7 +1331,7 @@ "$ref": "#/definitions/GetTaskResultMethod" }, "params": { - "$ref": "#/definitions/GetTaskResultParam" + "$ref": "#/definitions/GetTaskResultParams" } }, "required": [ @@ -1274,7 +1347,7 @@ "$ref": "#/definitions/CancelTaskMethod" }, "params": { - "$ref": "#/definitions/CancelTaskParam" + "$ref": "#/definitions/CancelTaskParams" } }, "required": [ @@ -1290,7 +1363,7 @@ "$ref": "#/definitions/CompleteRequestMethod" }, "params": { - "$ref": "#/definitions/CompleteRequestParam" + "$ref": "#/definitions/CompleteRequestParams" } }, "required": [ @@ -1306,7 +1379,7 @@ "$ref": "#/definitions/SetLevelRequestMethod" }, "params": { - "$ref": "#/definitions/SetLevelRequestParam" + "$ref": "#/definitions/SetLevelRequestParams" } }, "required": [ @@ -1322,7 +1395,7 @@ "$ref": "#/definitions/GetPromptRequestMethod" }, "params": { - "$ref": "#/definitions/GetPromptRequestParam" + "$ref": "#/definitions/GetPromptRequestParams" } }, "required": [ @@ -1338,7 +1411,7 @@ "$ref": "#/definitions/ReadResourceRequestMethod" }, "params": { - "$ref": "#/definitions/ReadResourceRequestParam" + "$ref": "#/definitions/ReadResourceRequestParams" } }, "required": [ @@ -1354,7 +1427,7 @@ "$ref": "#/definitions/SubscribeRequestMethod" }, "params": { - "$ref": "#/definitions/SubscribeRequestParam" + "$ref": "#/definitions/SubscribeRequestParams" } }, "required": [ @@ -1370,7 +1443,7 @@ "$ref": "#/definitions/UnsubscribeRequestMethod" }, "params": { - "$ref": "#/definitions/UnsubscribeRequestParam" + "$ref": "#/definitions/UnsubscribeRequestParams" } }, "required": [ @@ -1386,7 +1459,7 @@ "$ref": "#/definitions/CallToolRequestMethod" }, "params": { - "$ref": "#/definitions/CallToolRequestParam" + "$ref": "#/definitions/CallToolRequestParams" } }, "required": [ @@ -1402,7 +1475,7 @@ "$ref": "#/definitions/GetTaskInfoMethod" }, "params": { - "$ref": "#/definitions/GetTaskInfoParam" + "$ref": "#/definitions/GetTaskInfoParams" } }, "required": [ @@ -1430,7 +1503,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1451,7 +1524,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1472,7 +1545,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1493,7 +1566,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1514,7 +1587,7 @@ "params": { "anyOf": [ { - "$ref": "#/definitions/PaginatedRequestParam" + "$ref": "#/definitions/PaginatedRequestParams" }, { "type": "null" @@ -1650,10 +1723,18 @@ "format": "const", "const": "logging/setLevel" }, - "SetLevelRequestParam": { + "SetLevelRequestParams": { "description": "Parameters for setting the logging level", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "level": { "description": "The desired logging level", "allOf": [ @@ -1672,10 +1753,18 @@ "format": "const", "const": "resources/subscribe" }, - "SubscribeRequestParam": { + "SubscribeRequestParams": { "description": "Parameters for subscribing to resource updates", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to subscribe to", "type": "string" @@ -1720,10 +1809,18 @@ "format": "const", "const": "resources/unsubscribe" }, - "UnsubscribeRequestParam": { + "UnsubscribeRequestParams": { "description": "Parameters for unsubscribing from resource updates", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "uri": { "description": "The URI of the resource to unsubscribe from", "type": "string" diff --git a/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json b/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json index 1816e1cb..e23eae12 100644 --- a/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json +++ b/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.json @@ -504,10 +504,18 @@ } ] }, - "CreateElicitationRequestParam": { - "description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", + "CreateElicitationRequestParams": { + "description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParams {\n meta: None,\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "message": { "description": "Human-readable message explaining what input is needed from the user.\nThis should be clear and provide sufficient context for the user to understand\nwhat information they need to provide.", "type": "string" @@ -551,10 +559,18 @@ "format": "const", "const": "sampling/createMessage" }, - "CreateMessageRequestParam": { - "description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.", + "CreateMessageRequestParams": { + "description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.\n\nThis implements `TaskAugmentedRequestParamsMeta` as sampling requests can be\nlong-running and may benefit from task-based execution.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "includeContext": { "description": "How much context to include from MCP servers", "anyOf": [ @@ -610,6 +626,14 @@ "null" ] }, + "task": { + "description": "Task metadata for async task management (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "temperature": { "description": "Temperature for controlling randomness (0.0 to 1.0)", "type": [ @@ -2111,7 +2135,7 @@ "$ref": "#/definitions/CreateMessageRequestMethod" }, "params": { - "$ref": "#/definitions/CreateMessageRequestParam" + "$ref": "#/definitions/CreateMessageRequestParams" } }, "required": [ @@ -2127,7 +2151,7 @@ "$ref": "#/definitions/ElicitationCreateRequestMethod" }, "params": { - "$ref": "#/definitions/CreateElicitationRequestParam" + "$ref": "#/definitions/CreateElicitationRequestParams" } }, "required": [ diff --git a/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.json b/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.json index 1816e1cb..e23eae12 100644 --- a/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.json +++ b/crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema_current.json @@ -504,10 +504,18 @@ } ] }, - "CreateElicitationRequestParam": { - "description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", + "CreateElicitationRequestParams": { + "description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParams {\n meta: None,\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "message": { "description": "Human-readable message explaining what input is needed from the user.\nThis should be clear and provide sufficient context for the user to understand\nwhat information they need to provide.", "type": "string" @@ -551,10 +559,18 @@ "format": "const", "const": "sampling/createMessage" }, - "CreateMessageRequestParam": { - "description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.", + "CreateMessageRequestParams": { + "description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.\n\nThis implements `TaskAugmentedRequestParamsMeta` as sampling requests can be\nlong-running and may benefit from task-based execution.", "type": "object", "properties": { + "_meta": { + "description": "Protocol-level metadata for this request (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "includeContext": { "description": "How much context to include from MCP servers", "anyOf": [ @@ -610,6 +626,14 @@ "null" ] }, + "task": { + "description": "Task metadata for async task management (SEP-1319)", + "type": [ + "object", + "null" + ], + "additionalProperties": true + }, "temperature": { "description": "Temperature for controlling randomness (0.0 to 1.0)", "type": [ @@ -2111,7 +2135,7 @@ "$ref": "#/definitions/CreateMessageRequestMethod" }, "params": { - "$ref": "#/definitions/CreateMessageRequestParam" + "$ref": "#/definitions/CreateMessageRequestParams" } }, "required": [ @@ -2127,7 +2151,7 @@ "$ref": "#/definitions/ElicitationCreateRequestMethod" }, "params": { - "$ref": "#/definitions/CreateElicitationRequestParam" + "$ref": "#/definitions/CreateElicitationRequestParams" } }, "required": [ diff --git a/crates/rmcp/tests/test_notification.rs b/crates/rmcp/tests/test_notification.rs index cce04364..77ea4f3b 100644 --- a/crates/rmcp/tests/test_notification.rs +++ b/crates/rmcp/tests/test_notification.rs @@ -4,7 +4,7 @@ use rmcp::{ ClientHandler, ServerHandler, ServiceExt, model::{ ClientNotification, CustomNotification, ResourceUpdatedNotificationParam, - ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParam, + ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParams, }, }; use serde_json::json; @@ -87,7 +87,8 @@ async fn test_server_notification() -> anyhow::Result<()> { .serve(client_transport) .await?; client - .subscribe(SubscribeRequestParam { + .subscribe(SubscribeRequestParams { + meta: None, uri: "test://test-resource".to_owned(), }) .await?; diff --git a/crates/rmcp/tests/test_progress_subscriber.rs b/crates/rmcp/tests/test_progress_subscriber.rs index b5d185ab..521219a3 100644 --- a/crates/rmcp/tests/test_progress_subscriber.rs +++ b/crates/rmcp/tests/test_progress_subscriber.rs @@ -2,7 +2,7 @@ use futures::StreamExt; use rmcp::{ ClientHandler, Peer, RoleServer, ServerHandler, ServiceExt, handler::{client::progress::ProgressDispatcher, server::tool::ToolRouter}, - model::{CallToolRequestParam, ClientRequest, Meta, ProgressNotificationParam, Request}, + model::{CallToolRequestParams, ClientRequest, Meta, ProgressNotificationParam, Request}, service::PeerRequestOptions, tool, tool_handler, tool_router, }; @@ -107,7 +107,8 @@ async fn test_progress_subscriber() -> anyhow::Result<()> { let client_service = client.serve(transport_client).await?; let handle = client_service .send_cancellable_request( - ClientRequest::CallToolRequest(Request::new(CallToolRequestParam { + ClientRequest::CallToolRequest(Request::new(CallToolRequestParams { + meta: None, name: "some_progress".into(), arguments: None, task: None, diff --git a/crates/rmcp/tests/test_prompt_handler.rs b/crates/rmcp/tests/test_prompt_handler.rs index 86f20434..ca4418bc 100644 --- a/crates/rmcp/tests/test_prompt_handler.rs +++ b/crates/rmcp/tests/test_prompt_handler.rs @@ -6,7 +6,7 @@ use rmcp::{ RoleServer, ServerHandler, handler::server::router::prompt::PromptRouter, - model::{GetPromptRequestParam, GetPromptResult, ListPromptsResult, PaginatedRequestParam}, + model::{GetPromptRequestParams, GetPromptResult, ListPromptsResult, PaginatedRequestParams}, prompt_handler, service::RequestContext, }; diff --git a/crates/rmcp/tests/test_prompt_macros.rs b/crates/rmcp/tests/test_prompt_macros.rs index 5d5ece8c..2407571d 100644 --- a/crates/rmcp/tests/test_prompt_macros.rs +++ b/crates/rmcp/tests/test_prompt_macros.rs @@ -6,8 +6,8 @@ use rmcp::{ ClientHandler, RoleServer, ServerHandler, ServiceExt, handler::server::{router::prompt::PromptRouter, wrapper::Parameters}, model::{ - ClientInfo, GetPromptRequestParam, GetPromptResult, ListPromptsResult, - PaginatedRequestParam, PromptMessage, PromptMessageRole, + ClientInfo, GetPromptRequestParams, GetPromptResult, ListPromptsResult, + PaginatedRequestParams, PromptMessage, PromptMessageRole, }, prompt, prompt_handler, prompt_router, service::RequestContext, @@ -327,7 +327,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> { // Test null case let result = client - .get_prompt(GetPromptRequestParam { + .get_prompt(GetPromptRequestParams { + meta: None, name: "test_optional_i64".into(), arguments: Some( serde_json::json!({ @@ -353,7 +354,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> { // Test Some case let some_result = client - .get_prompt(GetPromptRequestParam { + .get_prompt(GetPromptRequestParams { + meta: None, name: "test_optional_i64".into(), arguments: Some( serde_json::json!({ diff --git a/crates/rmcp/tests/test_sampling.rs b/crates/rmcp/tests/test_sampling.rs index b760796f..694f1570 100644 --- a/crates/rmcp/tests/test_sampling.rs +++ b/crates/rmcp/tests/test_sampling.rs @@ -31,7 +31,9 @@ async fn test_basic_sampling_message_creation() -> Result<()> { #[tokio::test] async fn test_sampling_request_params() -> Result<()> { // Test sampling request parameters structure - let params = CreateMessageRequestParam { + let params = CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("Hello, world!"), @@ -134,7 +136,9 @@ async fn test_sampling_integration_with_test_handlers() -> Result<()> { // Test sampling with context inclusion let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("What is the capital of France?"), @@ -214,7 +218,9 @@ async fn test_sampling_no_context_inclusion() -> Result<()> { // Test sampling without context inclusion let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text("Hello"), @@ -283,7 +289,9 @@ async fn test_sampling_error_invalid_message_sequence() -> Result<()> { // Test sampling with no user messages (should fail) let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { method: Default::default(), - params: CreateMessageRequestParam { + params: CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::Assistant, content: Content::text("I'm an assistant message without a user message"), diff --git a/crates/rmcp/tests/test_tool_macros.rs b/crates/rmcp/tests/test_tool_macros.rs index 763c4f43..a7609eec 100644 --- a/crates/rmcp/tests/test_tool_macros.rs +++ b/crates/rmcp/tests/test_tool_macros.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use rmcp::{ ClientHandler, ServerHandler, ServiceExt, handler::server::{router::tool::ToolRouter, wrapper::Parameters}, - model::{CallToolRequestParam, ClientInfo}, + model::{CallToolRequestParams, ClientInfo}, tool, tool_handler, tool_router, }; use schemars::JsonSchema; @@ -309,7 +309,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> { // Test null case let result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "test_optional_i64".into(), arguments: Some( serde_json::json!({ @@ -338,7 +339,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> { // Test Some case let some_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "test_optional_i64".into(), arguments: Some( serde_json::json!({ From 7bc9d5593083733590b86b7b47a33b427a3e7679 Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Tue, 13 Jan 2026 07:15:07 -0500 Subject: [PATCH 3/6] fix: update handler trait methods to use new types --- crates/rmcp/src/handler/client.rs | 4 +-- crates/rmcp/src/handler/server.rs | 34 +++++++++++++------------- crates/rmcp/src/handler/server/tool.rs | 7 +++--- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/crates/rmcp/src/handler/client.rs b/crates/rmcp/src/handler/client.rs index cd238310..8eca9c9f 100644 --- a/crates/rmcp/src/handler/client.rs +++ b/crates/rmcp/src/handler/client.rs @@ -85,7 +85,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static { fn create_message( &self, - params: CreateMessageRequestParam, + params: CreateMessageRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err( @@ -118,7 +118,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static { /// Real clients should override this to provide user interaction. fn create_elicitation( &self, - request: CreateElicitationRequestParam, + request: CreateElicitationRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { // Default implementation declines all requests - real clients should override this diff --git a/crates/rmcp/src/handler/server.rs b/crates/rmcp/src/handler/server.rs index 073ee108..e2feb42d 100644 --- a/crates/rmcp/src/handler/server.rs +++ b/crates/rmcp/src/handler/server.rs @@ -137,7 +137,7 @@ impl Service for H { pub trait ServerHandler: Sized + Send + Sync + 'static { fn enqueue_task( &self, - _request: CallToolRequestParam, + _request: CallToolRequestParams, _context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::internal_error( @@ -154,7 +154,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { // handle requests fn initialize( &self, - request: InitializeRequestParam, + request: InitializeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { if context.peer.peer_info().is_none() { @@ -164,49 +164,49 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { } fn complete( &self, - request: CompleteRequestParam, + request: CompleteRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(CompleteResult::default())) } fn set_level( &self, - request: SetLevelRequestParam, + request: SetLevelRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn get_prompt( &self, - request: GetPromptRequestParam, + request: GetPromptRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn list_prompts( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListPromptsResult::default())) } fn list_resources( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListResourcesResult::default())) } fn list_resource_templates( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListResourceTemplatesResult::default())) } fn read_resource( &self, - request: ReadResourceRequestParam, + request: ReadResourceRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err( @@ -215,28 +215,28 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { } fn subscribe( &self, - request: SubscribeRequestParam, + request: SubscribeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn unsubscribe( &self, - request: UnsubscribeRequestParam, + request: UnsubscribeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn list_tools( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListToolsResult::default())) @@ -297,7 +297,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { fn list_tasks( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) @@ -305,7 +305,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { fn get_task_info( &self, - request: GetTaskInfoParam, + request: GetTaskInfoParams, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) @@ -313,7 +313,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { fn get_task_result( &self, - request: GetTaskResultParam, + request: GetTaskResultParams, context: RequestContext, ) -> impl Future> + Send + '_ { let _ = (request, context); @@ -322,7 +322,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static { fn cancel_task( &self, - request: CancelTaskParam, + request: CancelTaskParams, context: RequestContext, ) -> impl Future> + Send + '_ { let _ = (request, context); diff --git a/crates/rmcp/src/handler/server/tool.rs b/crates/rmcp/src/handler/server/tool.rs index 7fd57f59..c98aef0d 100644 --- a/crates/rmcp/src/handler/server/tool.rs +++ b/crates/rmcp/src/handler/server/tool.rs @@ -15,7 +15,7 @@ pub use super::{ use crate::{ RoleServer, handler::server::wrapper::Parameters, - model::{CallToolRequestParam, CallToolResult, IntoContents, JsonObject}, + model::{CallToolRequestParams, CallToolResult, IntoContents, JsonObject}, service::RequestContext, }; @@ -37,15 +37,14 @@ pub struct ToolCallContext<'s, S> { } impl<'s, S> ToolCallContext<'s, S> { - #[allow(deprecated)] pub fn new( service: &'s S, - CallToolRequestParam { + CallToolRequestParams { meta: _, name, arguments, task, - }: CallToolRequestParam, + }: CallToolRequestParams, request_context: RequestContext, ) -> Self { Self { From 397658e58ad7ef5a799a5537bcd73e367a12de7d Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Tue, 13 Jan 2026 19:31:00 -0500 Subject: [PATCH 4/6] fix: update examples --- crates/rmcp-macros/src/tool_handler.rs | 4 ++-- crates/rmcp/src/model/meta.rs | 11 ----------- crates/rmcp/tests/common/handlers.rs | 4 ++-- crates/rmcp/tests/test_elicitation.rs | 14 +++++++------- crates/rmcp/tests/test_notification.rs | 2 +- crates/rmcp/tests/test_sampling.rs | 2 +- examples/clients/src/collection.rs | 5 +++-- examples/clients/src/everything_stdio.rs | 17 +++++++++++------ examples/clients/src/git_stdio.rs | 5 +++-- examples/clients/src/progress_client.rs | 9 ++++++--- examples/clients/src/sampling_stdio.rs | 5 +++-- examples/clients/src/streamable_http.rs | 6 ++++-- examples/rig-integration/src/mcp_adaptor.rs | 5 +++-- examples/servers/src/common/counter.rs | 11 ++++++----- examples/servers/src/completion_stdio.rs | 2 +- examples/servers/src/sampling_stdio.rs | 8 +++++--- examples/simple-chat-client/src/tool.rs | 5 +++-- examples/transport/src/named-pipe.rs | 3 ++- examples/transport/src/unix_socket.rs | 3 ++- 19 files changed, 65 insertions(+), 56 deletions(-) diff --git a/crates/rmcp-macros/src/tool_handler.rs b/crates/rmcp-macros/src/tool_handler.rs index b1b53c42..e37fa88e 100644 --- a/crates/rmcp-macros/src/tool_handler.rs +++ b/crates/rmcp-macros/src/tool_handler.rs @@ -29,7 +29,7 @@ pub fn tool_handler(attr: TokenStream, input: TokenStream) -> syn::Result, ) -> Result { let tcc = rmcp::handler::server::tool::ToolCallContext::new(self, request, context); @@ -46,7 +46,7 @@ pub fn tool_handler(attr: TokenStream, input: TokenStream) -> syn::Result, + _request: Option, _context: rmcp::service::RequestContext, ) -> Result { Ok(rmcp::model::ListToolsResult{ diff --git a/crates/rmcp/src/model/meta.rs b/crates/rmcp/src/model/meta.rs index dbf8dbc4..c979318d 100644 --- a/crates/rmcp/src/model/meta.rs +++ b/crates/rmcp/src/model/meta.rs @@ -18,15 +18,8 @@ pub trait GetExtensions { fn extensions_mut(&mut self) -> &mut Extensions; } -// ============================================================================= -// SEP-1319: Request Params Traits -// ============================================================================= - /// Trait for request params that contain the `_meta` field. /// -/// This trait is part of SEP-1319 compliance, enabling request params to carry -/// protocol-level metadata directly in the params structure (not just in Extensions). -/// /// Per the MCP 2025-11-25 spec, all request params should have an optional `_meta` /// field that can contain a `progressToken` for tracking long-running operations. pub trait RequestParamsMeta { @@ -57,10 +50,6 @@ pub trait RequestParamsMeta { /// Trait for task-augmented request params that contain both `_meta` and `task` fields. /// -/// This extends `RequestParamsMeta` to add support for the `task` field, which is used -/// for long-running operations that should be handled asynchronously through the -/// MCP task system. -/// /// Per the MCP 2025-11-25 spec, certain requests (like `tools/call` and `sampling/createMessage`) /// can include a `task` field to signal that the caller wants task-augmented execution. pub trait TaskAugmentedRequestParamsMeta: RequestParamsMeta { diff --git a/crates/rmcp/tests/common/handlers.rs b/crates/rmcp/tests/common/handlers.rs index db82d471..373d278c 100644 --- a/crates/rmcp/tests/common/handlers.rs +++ b/crates/rmcp/tests/common/handlers.rs @@ -49,7 +49,7 @@ impl TestClientHandler { impl ClientHandler for TestClientHandler { async fn create_message( &self, - params: CreateMessageRequestParam, + params: CreateMessageRequestParams, _context: RequestContext, ) -> Result { // First validate that there's at least one User message @@ -117,7 +117,7 @@ impl ServerHandler for TestServer { fn set_level( &self, - request: SetLevelRequestParam, + request: SetLevelRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { let peer = context.peer; diff --git a/crates/rmcp/tests/test_elicitation.rs b/crates/rmcp/tests/test_elicitation.rs index 4b485155..65f21e23 100644 --- a/crates/rmcp/tests/test_elicitation.rs +++ b/crates/rmcp/tests/test_elicitation.rs @@ -36,7 +36,7 @@ async fn test_elicitation_serialization() { ); } -/// Test CreateElicitationRequestParam structure serialization/deserialization +/// Test CreateElicitationRequestParams structure serialization/deserialization #[tokio::test] async fn test_elicitation_request_param_serialization() { let schema = ElicitationSchema::builder() @@ -69,7 +69,7 @@ async fn test_elicitation_request_param_serialization() { assert_eq!(json, expected); // Test deserialization - let deserialized: CreateElicitationRequestParam = serde_json::from_value(expected).unwrap(); + let deserialized: CreateElicitationRequestParams = serde_json::from_value(expected).unwrap(); assert_eq!(deserialized.message, request_param.message); assert_eq!( deserialized.requested_schema, @@ -261,7 +261,7 @@ async fn test_elicitation_performance() { // Serialize/deserialize 1000 times for _ in 0..1000 { let json = serde_json::to_value(&request).unwrap(); - let _deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap(); + let _deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap(); } let duration = start.elapsed(); @@ -374,7 +374,7 @@ async fn test_elicitation_convenience_methods() { .contains("Option A") ); - // Test that CreateElicitationRequestParam can be created with type-safe schemas + // Test that CreateElicitationRequestParams can be created with type-safe schemas let confirmation_request = CreateElicitationRequestParams { meta: None, message: "Test confirmation".to_string(), @@ -426,7 +426,7 @@ async fn test_elicitation_structured_schemas() { // Test that complex schemas serialize/deserialize correctly let json = serde_json::to_value(&request).unwrap(); - let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap(); + let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap(); assert_eq!(deserialized.message, "Please provide your user information"); assert_eq!(deserialized.requested_schema.properties.len(), 5); @@ -669,7 +669,7 @@ async fn test_elicitation_multi_select_enum() { // Test that complex schemas serialize/deserialize correctly let json = serde_json::to_value(&request).unwrap(); - let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap(); + let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap(); assert_eq!(deserialized.message, "Please provide your user information"); assert_eq!(deserialized.requested_schema.properties.len(), 1); @@ -751,7 +751,7 @@ async fn test_elicitation_single_select_enum() { // Test that complex schemas serialize/deserialize correctly let json = serde_json::to_value(&request).unwrap(); - let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap(); + let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap(); assert_eq!(deserialized.message, "Please provide your user information"); assert_eq!(deserialized.requested_schema.properties.len(), 1); assert!( diff --git a/crates/rmcp/tests/test_notification.rs b/crates/rmcp/tests/test_notification.rs index 77ea4f3b..01837421 100644 --- a/crates/rmcp/tests/test_notification.rs +++ b/crates/rmcp/tests/test_notification.rs @@ -27,7 +27,7 @@ impl ServerHandler for Server { async fn subscribe( &self, - request: rmcp::model::SubscribeRequestParam, + request: rmcp::model::SubscribeRequestParams, context: rmcp::service::RequestContext, ) -> Result<(), rmcp::ErrorData> { let uri = request.uri; diff --git a/crates/rmcp/tests/test_sampling.rs b/crates/rmcp/tests/test_sampling.rs index 694f1570..83a4325c 100644 --- a/crates/rmcp/tests/test_sampling.rs +++ b/crates/rmcp/tests/test_sampling.rs @@ -56,7 +56,7 @@ async fn test_sampling_request_params() -> Result<()> { // Verify serialization/deserialization let json = serde_json::to_string(¶ms)?; - let deserialized: CreateMessageRequestParam = serde_json::from_str(&json)?; + let deserialized: CreateMessageRequestParams = serde_json::from_str(&json)?; assert_eq!(params, deserialized); // Verify specific fields diff --git a/examples/clients/src/collection.rs b/examples/clients/src/collection.rs index c714da54..a4c73482 100644 --- a/examples/clients/src/collection.rs +++ b/examples/clients/src/collection.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; use anyhow::Result; use rmcp::{ - model::CallToolRequestParam, + model::CallToolRequestParams, service::ServiceExt, transport::{ConfigureCommandExt, TokioChildProcess}, }; @@ -46,7 +46,8 @@ async fn main() -> Result<()> { // Call tool 'git_status' with arguments = {"repo_path": "."} let _tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "git_status".into(), arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(), task: None, diff --git a/examples/clients/src/everything_stdio.rs b/examples/clients/src/everything_stdio.rs index f1cbcae5..763a880a 100644 --- a/examples/clients/src/everything_stdio.rs +++ b/examples/clients/src/everything_stdio.rs @@ -1,7 +1,7 @@ use anyhow::Result; use rmcp::{ ServiceExt, - model::{CallToolRequestParam, GetPromptRequestParam, ReadResourceRequestParam}, + model::{CallToolRequestParams, GetPromptRequestParams, ReadResourceRequestParams}, object, transport::{ConfigureCommandExt, TokioChildProcess}, }; @@ -37,7 +37,8 @@ async fn main() -> Result<()> { // Call tool echo let tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "echo".into(), arguments: Some(object!({ "message": "hi from rmcp" })), task: None, @@ -47,7 +48,8 @@ async fn main() -> Result<()> { // Call tool longRunningOperation let tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "longRunningOperation".into(), arguments: Some(object!({ "duration": 3, "steps": 1 })), task: None, @@ -61,7 +63,8 @@ async fn main() -> Result<()> { // Read resource let resource = client - .read_resource(ReadResourceRequestParam { + .read_resource(ReadResourceRequestParams { + meta: None, uri: "test://static/resource/3".into(), }) .await?; @@ -73,7 +76,8 @@ async fn main() -> Result<()> { // Get simple prompt let prompt = client - .get_prompt(GetPromptRequestParam { + .get_prompt(GetPromptRequestParams { + meta: None, name: "simple_prompt".into(), arguments: None, }) @@ -82,7 +86,8 @@ async fn main() -> Result<()> { // Get complex prompt (returns text & image) let prompt = client - .get_prompt(GetPromptRequestParam { + .get_prompt(GetPromptRequestParams { + meta: None, name: "complex_prompt".into(), arguments: Some(object!({ "temperature": "0.5", "style": "formal" })), }) diff --git a/examples/clients/src/git_stdio.rs b/examples/clients/src/git_stdio.rs index 7b516f38..9960c16b 100644 --- a/examples/clients/src/git_stdio.rs +++ b/examples/clients/src/git_stdio.rs @@ -1,6 +1,6 @@ use rmcp::{ RmcpError, - model::CallToolRequestParam, + model::CallToolRequestParams, service::ServiceExt, transport::{ConfigureCommandExt, TokioChildProcess}, }; @@ -39,7 +39,8 @@ async fn main() -> Result<(), RmcpError> { // Call tool 'git_status' with arguments = {"repo_path": "."} let tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "git_status".into(), arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(), task: None, diff --git a/examples/clients/src/progress_client.rs b/examples/clients/src/progress_client.rs index c795ce22..8abba834 100644 --- a/examples/clients/src/progress_client.rs +++ b/examples/clients/src/progress_client.rs @@ -8,7 +8,7 @@ use clap::{Parser, ValueEnum}; use rmcp::{ ClientHandler, ServiceExt, model::{ - CallToolRequestParam, ClientCapabilities, ClientInfo, Implementation, + CallToolRequestParams, ClientCapabilities, ClientInfo, Implementation, ProgressNotificationParam, }, service::{NotificationContext, RoleClient}, @@ -123,6 +123,7 @@ impl ClientHandler for ProgressAwareClient { fn get_info(&self) -> ClientInfo { ClientInfo { + meta: None, protocol_version: Default::default(), capabilities: ClientCapabilities::default(), client_info: Implementation { @@ -181,7 +182,8 @@ async fn test_stdio_transport(records: u32) -> Result<()> { // Call stream processor tool tracing::info!("Starting to process {} records...", records); let tool_result = service - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "stream_processor".into(), arguments: None, task: None, @@ -236,7 +238,8 @@ async fn test_http_transport(http_url: &str, records: u32) -> Result<()> { // Call stream processor tool tracing::info!("Starting to process {} records...", records); let tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "stream_processor".into(), arguments: None, task: None, diff --git a/examples/clients/src/sampling_stdio.rs b/examples/clients/src/sampling_stdio.rs index b30a3c26..b3ca0be3 100644 --- a/examples/clients/src/sampling_stdio.rs +++ b/examples/clients/src/sampling_stdio.rs @@ -31,7 +31,7 @@ impl SamplingDemoClient { impl ClientHandler for SamplingDemoClient { async fn create_message( &self, - params: CreateMessageRequestParam, + params: CreateMessageRequestParams, _context: RequestContext, ) -> Result { tracing::info!("Received sampling request with {:?}", params); @@ -101,7 +101,8 @@ async fn main() -> Result<()> { // Test the ask_llm tool tracing::info!("Testing ask_llm tool..."); match client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "ask_llm".into(), arguments: Some(object!({ "question": "Hello world" diff --git a/examples/clients/src/streamable_http.rs b/examples/clients/src/streamable_http.rs index cd4b73c4..7af9b5bc 100644 --- a/examples/clients/src/streamable_http.rs +++ b/examples/clients/src/streamable_http.rs @@ -1,7 +1,7 @@ use anyhow::Result; use rmcp::{ ServiceExt, - model::{CallToolRequestParam, ClientCapabilities, ClientInfo, Implementation}, + model::{CallToolRequestParams, ClientCapabilities, ClientInfo, Implementation}, transport::StreamableHttpClientTransport, }; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; @@ -18,6 +18,7 @@ async fn main() -> Result<()> { .init(); let transport = StreamableHttpClientTransport::from_uri("http://localhost:8000/mcp"); let client_info = ClientInfo { + meta: None, protocol_version: Default::default(), capabilities: ClientCapabilities::default(), client_info: Implementation { @@ -41,7 +42,8 @@ async fn main() -> Result<()> { tracing::info!("Available tools: {tools:#?}"); let tool_result = client - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: "increment".into(), arguments: serde_json::json!({}).as_object().cloned(), task: None, diff --git a/examples/rig-integration/src/mcp_adaptor.rs b/examples/rig-integration/src/mcp_adaptor.rs index f5397c63..af57935e 100644 --- a/examples/rig-integration/src/mcp_adaptor.rs +++ b/examples/rig-integration/src/mcp_adaptor.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use rig::tool::{ToolDyn as RigTool, ToolEmbeddingDyn, ToolSet}; use rmcp::{ RoleClient, - model::{CallToolRequestParam, CallToolResult, Tool as McpTool}, + model::{CallToolRequestParams, CallToolResult, Tool as McpTool}, service::{RunningService, ServerSink}, }; @@ -41,7 +41,8 @@ impl RigTool for McpToolAdaptor { let server = self.server.clone(); Box::pin(async move { let call_mcp_tool_result = server - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: self.tool.name.clone(), arguments: serde_json::from_str(&args) .map_err(rig::tool::ToolError::JsonError)?, diff --git a/examples/servers/src/common/counter.rs b/examples/servers/src/common/counter.rs index ac271cba..9ca043f8 100644 --- a/examples/servers/src/common/counter.rs +++ b/examples/servers/src/common/counter.rs @@ -214,7 +214,7 @@ impl ServerHandler for Counter { async fn list_resources( &self, - _request: Option, + _request: Option, _: RequestContext, ) -> Result { Ok(ListResourcesResult { @@ -229,7 +229,7 @@ impl ServerHandler for Counter { async fn read_resource( &self, - ReadResourceRequestParam { uri }: ReadResourceRequestParam, + ReadResourceRequestParams { meta: _, uri }: ReadResourceRequestParams, _: RequestContext, ) -> Result { match uri.as_str() { @@ -256,7 +256,7 @@ impl ServerHandler for Counter { async fn list_resource_templates( &self, - _request: Option, + _request: Option, _: RequestContext, ) -> Result { Ok(ListResourceTemplatesResult { @@ -268,7 +268,7 @@ impl ServerHandler for Counter { async fn initialize( &self, - _request: InitializeRequestParam, + _request: InitializeRequestParams, context: RequestContext, ) -> Result { if let Some(http_request_part) = context.extensions.get::() { @@ -347,7 +347,8 @@ mod tests { "source".into(), serde_json::Value::String("integration-test".into()), ); - let params = CallToolRequestParam { + let params = CallToolRequestParams { + meta: None, name: "long_task".into(), arguments: None, task: Some(task_meta), diff --git a/examples/servers/src/completion_stdio.rs b/examples/servers/src/completion_stdio.rs index 7beb1e1e..e4365cad 100644 --- a/examples/servers/src/completion_stdio.rs +++ b/examples/servers/src/completion_stdio.rs @@ -337,7 +337,7 @@ impl ServerHandler for SqlQueryServer { async fn complete( &self, - request: CompleteRequestParam, + request: CompleteRequestParams, _context: RequestContext, ) -> Result { let candidates = match &request.r#ref { diff --git a/examples/servers/src/sampling_stdio.rs b/examples/servers/src/sampling_stdio.rs index 307ab682..34bebd55 100644 --- a/examples/servers/src/sampling_stdio.rs +++ b/examples/servers/src/sampling_stdio.rs @@ -33,7 +33,7 @@ impl ServerHandler for SamplingDemoServer { async fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, context: RequestContext, ) -> Result { match request.name.as_ref() { @@ -48,7 +48,9 @@ impl ServerHandler for SamplingDemoServer { let response = context .peer - .create_message(CreateMessageRequestParam { + .create_message(CreateMessageRequestParams { + meta: None, + task: None, messages: vec![SamplingMessage { role: Role::User, content: Content::text(question), @@ -99,7 +101,7 @@ impl ServerHandler for SamplingDemoServer { async fn list_tools( &self, - _request: Option, + _request: Option, _context: RequestContext, ) -> Result { Ok(ListToolsResult { diff --git a/examples/simple-chat-client/src/tool.rs b/examples/simple-chat-client/src/tool.rs index 174f4274..14f073a2 100644 --- a/examples/simple-chat-client/src/tool.rs +++ b/examples/simple-chat-client/src/tool.rs @@ -4,7 +4,7 @@ use anyhow::Result; use async_trait::async_trait; use rmcp::{ RoleClient, - model::{CallToolRequestParam, CallToolResult, Tool as McpTool}, + model::{CallToolRequestParams, CallToolResult, Tool as McpTool}, service::{RunningService, ServerSink}, }; use serde_json::Value; @@ -59,7 +59,8 @@ impl Tool for McpToolAdapter { println!("arguments: {:?}", arguments); let call_result = self .server - .call_tool(CallToolRequestParam { + .call_tool(CallToolRequestParams { + meta: None, name: self.tool.name.clone(), arguments, task: None, diff --git a/examples/transport/src/named-pipe.rs b/examples/transport/src/named-pipe.rs index b070d02b..1231059b 100644 --- a/examples/transport/src/named-pipe.rs +++ b/examples/transport/src/named-pipe.rs @@ -48,7 +48,8 @@ async fn main() -> anyhow::Result<()> { println!("Calling sum tool: {}", sum_tool.name); let result = client .peer() - .call_tool(rmcp::model::CallToolRequestParam { + .call_tool(rmcp::model::CallToolRequestParams { + meta: None, name: sum_tool.name.clone(), arguments: Some(rmcp::object!({ "a": 10, diff --git a/examples/transport/src/unix_socket.rs b/examples/transport/src/unix_socket.rs index 0d91dfee..666a61f3 100644 --- a/examples/transport/src/unix_socket.rs +++ b/examples/transport/src/unix_socket.rs @@ -46,7 +46,8 @@ async fn main() -> anyhow::Result<()> { println!("Calling sum tool: {}", sum_tool.name); let result = client .peer() - .call_tool(rmcp::model::CallToolRequestParam { + .call_tool(rmcp::model::CallToolRequestParams { + meta: None, name: sum_tool.name.clone(), arguments: Some(rmcp::object!({ "a": 10, From dbaab654adbc2a4bbfc1e7dbcf7c885e6c43e996 Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Tue, 13 Jan 2026 21:22:59 -0500 Subject: [PATCH 5/6] fix: correct deprecation version --- crates/rmcp/src/model.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/rmcp/src/model.rs b/crates/rmcp/src/model.rs index 2bdcc4b3..ae6bdb06 100644 --- a/crates/rmcp/src/model.rs +++ b/crates/rmcp/src/model.rs @@ -753,7 +753,7 @@ impl RequestParamsMeta for InitializeRequestParams { } /// Deprecated: Use [`InitializeRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use InitializeRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use InitializeRequestParams instead")] pub type InitializeRequestParam = InitializeRequestParams; /// The server's response to an initialization request. @@ -878,7 +878,7 @@ impl RequestParamsMeta for PaginatedRequestParams { } /// Deprecated: Use [`PaginatedRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use PaginatedRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use PaginatedRequestParams instead")] pub type PaginatedRequestParam = PaginatedRequestParams; // ============================================================================= // PROGRESS AND PAGINATION @@ -981,7 +981,7 @@ impl RequestParamsMeta for ReadResourceRequestParams { } /// Deprecated: Use [`ReadResourceRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use ReadResourceRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use ReadResourceRequestParams instead")] pub type ReadResourceRequestParam = ReadResourceRequestParams; /// Result containing the contents of a read resource @@ -1023,7 +1023,7 @@ impl RequestParamsMeta for SubscribeRequestParams { } /// Deprecated: Use [`SubscribeRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use SubscribeRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use SubscribeRequestParams instead")] pub type SubscribeRequestParam = SubscribeRequestParams; /// Request to subscribe to resource updates @@ -1052,7 +1052,7 @@ impl RequestParamsMeta for UnsubscribeRequestParams { } /// Deprecated: Use [`UnsubscribeRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use UnsubscribeRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use UnsubscribeRequestParams instead")] pub type UnsubscribeRequestParam = UnsubscribeRequestParams; /// Request to unsubscribe from resource updates @@ -1108,7 +1108,7 @@ impl RequestParamsMeta for GetPromptRequestParams { } /// Deprecated: Use [`GetPromptRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use GetPromptRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use GetPromptRequestParams instead")] pub type GetPromptRequestParam = GetPromptRequestParams; /// Request to get a specific prompt @@ -1164,7 +1164,7 @@ impl RequestParamsMeta for SetLevelRequestParams { } /// Deprecated: Use [`SetLevelRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use SetLevelRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use SetLevelRequestParams instead")] pub type SetLevelRequestParam = SetLevelRequestParams; /// Request to set the logging level @@ -1302,7 +1302,7 @@ impl TaskAugmentedRequestParamsMeta for CreateMessageRequestParams { } /// Deprecated: Use [`CreateMessageRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use CreateMessageRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use CreateMessageRequestParams instead")] pub type CreateMessageRequestParam = CreateMessageRequestParams; /// Preferences for model selection and behavior in sampling requests. @@ -1414,7 +1414,7 @@ impl RequestParamsMeta for CompleteRequestParams { } /// Deprecated: Use [`CompleteRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use CompleteRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use CompleteRequestParams instead")] pub type CompleteRequestParam = CompleteRequestParams; pub type CompleteRequest = Request; @@ -1680,7 +1680,7 @@ impl RequestParamsMeta for CreateElicitationRequestParams { } /// Deprecated: Use [`CreateElicitationRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use CreateElicitationRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use CreateElicitationRequestParams instead")] pub type CreateElicitationRequestParam = CreateElicitationRequestParams; /// The result returned by a client in response to an elicitation request. @@ -1920,7 +1920,7 @@ impl TaskAugmentedRequestParamsMeta for CallToolRequestParams { } /// Deprecated: Use [`CallToolRequestParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use CallToolRequestParams instead")] +#[deprecated(since = "0.13.0", note = "Use CallToolRequestParams instead")] pub type CallToolRequestParam = CallToolRequestParams; /// Request to call a specific tool @@ -1986,7 +1986,7 @@ impl RequestParamsMeta for GetTaskInfoParams { } /// Deprecated: Use [`GetTaskInfoParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use GetTaskInfoParams instead")] +#[deprecated(since = "0.13.0", note = "Use GetTaskInfoParams instead")] pub type GetTaskInfoParam = GetTaskInfoParams; const_string!(ListTasksMethod = "tasks/list"); @@ -2015,7 +2015,7 @@ impl RequestParamsMeta for GetTaskResultParams { } /// Deprecated: Use [`GetTaskResultParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use GetTaskResultParams instead")] +#[deprecated(since = "0.13.0", note = "Use GetTaskResultParams instead")] pub type GetTaskResultParam = GetTaskResultParams; const_string!(CancelTaskMethod = "tasks/cancel"); @@ -2041,7 +2041,7 @@ impl RequestParamsMeta for CancelTaskParams { } /// Deprecated: Use [`CancelTaskParams`] instead (SEP-1319 compliance). -#[deprecated(since = "0.2.0", note = "Use CancelTaskParams instead")] +#[deprecated(since = "0.13.0", note = "Use CancelTaskParams instead")] pub type CancelTaskParam = CancelTaskParams; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "camelCase")] From bd8e6b733955099f8bb8fd397301bdd22634295d Mon Sep 17 00:00:00 2001 From: Dale Seo Date: Wed, 14 Jan 2026 11:25:58 -0500 Subject: [PATCH 6/6] fix: update wrapper macros to use new *Params type names --- crates/rmcp/src/handler/client.rs | 4 ++-- crates/rmcp/src/handler/server.rs | 34 +++++++++++++++---------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/crates/rmcp/src/handler/client.rs b/crates/rmcp/src/handler/client.rs index 8eca9c9f..86539b87 100644 --- a/crates/rmcp/src/handler/client.rs +++ b/crates/rmcp/src/handler/client.rs @@ -225,7 +225,7 @@ macro_rules! impl_client_handler_for_wrapper { fn create_message( &self, - params: CreateMessageRequestParam, + params: CreateMessageRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).create_message(params, context) @@ -240,7 +240,7 @@ macro_rules! impl_client_handler_for_wrapper { fn create_elicitation( &self, - request: CreateElicitationRequestParam, + request: CreateElicitationRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).create_elicitation(request, context) diff --git a/crates/rmcp/src/handler/server.rs b/crates/rmcp/src/handler/server.rs index e2feb42d..ee744b77 100644 --- a/crates/rmcp/src/handler/server.rs +++ b/crates/rmcp/src/handler/server.rs @@ -335,7 +335,7 @@ macro_rules! impl_server_handler_for_wrapper { impl ServerHandler for $wrapper { fn enqueue_task( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).enqueue_task(request, context) @@ -350,7 +350,7 @@ macro_rules! impl_server_handler_for_wrapper { fn initialize( &self, - request: InitializeRequestParam, + request: InitializeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).initialize(request, context) @@ -358,7 +358,7 @@ macro_rules! impl_server_handler_for_wrapper { fn complete( &self, - request: CompleteRequestParam, + request: CompleteRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).complete(request, context) @@ -366,7 +366,7 @@ macro_rules! impl_server_handler_for_wrapper { fn set_level( &self, - request: SetLevelRequestParam, + request: SetLevelRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).set_level(request, context) @@ -374,7 +374,7 @@ macro_rules! impl_server_handler_for_wrapper { fn get_prompt( &self, - request: GetPromptRequestParam, + request: GetPromptRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).get_prompt(request, context) @@ -382,7 +382,7 @@ macro_rules! impl_server_handler_for_wrapper { fn list_prompts( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).list_prompts(request, context) @@ -390,7 +390,7 @@ macro_rules! impl_server_handler_for_wrapper { fn list_resources( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).list_resources(request, context) @@ -398,7 +398,7 @@ macro_rules! impl_server_handler_for_wrapper { fn list_resource_templates( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { @@ -407,7 +407,7 @@ macro_rules! impl_server_handler_for_wrapper { fn read_resource( &self, - request: ReadResourceRequestParam, + request: ReadResourceRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).read_resource(request, context) @@ -415,7 +415,7 @@ macro_rules! impl_server_handler_for_wrapper { fn subscribe( &self, - request: SubscribeRequestParam, + request: SubscribeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).subscribe(request, context) @@ -423,7 +423,7 @@ macro_rules! impl_server_handler_for_wrapper { fn unsubscribe( &self, - request: UnsubscribeRequestParam, + request: UnsubscribeRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).unsubscribe(request, context) @@ -431,7 +431,7 @@ macro_rules! impl_server_handler_for_wrapper { fn call_tool( &self, - request: CallToolRequestParam, + request: CallToolRequestParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).call_tool(request, context) @@ -439,7 +439,7 @@ macro_rules! impl_server_handler_for_wrapper { fn list_tools( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).list_tools(request, context) @@ -497,7 +497,7 @@ macro_rules! impl_server_handler_for_wrapper { fn list_tasks( &self, - request: Option, + request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).list_tasks(request, context) @@ -505,7 +505,7 @@ macro_rules! impl_server_handler_for_wrapper { fn get_task_info( &self, - request: GetTaskInfoParam, + request: GetTaskInfoParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).get_task_info(request, context) @@ -513,7 +513,7 @@ macro_rules! impl_server_handler_for_wrapper { fn get_task_result( &self, - request: GetTaskResultParam, + request: GetTaskResultParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).get_task_result(request, context) @@ -521,7 +521,7 @@ macro_rules! impl_server_handler_for_wrapper { fn cancel_task( &self, - request: CancelTaskParam, + request: CancelTaskParams, context: RequestContext, ) -> impl Future> + Send + '_ { (**self).cancel_task(request, context)