Implement SEP-1319: Decouple Request Payload from RPC Methods (#617)

* feat: implement SEP-1319 Decouple Request Payload from RPC Methods

* test: update tests

* fix: update handler trait methods to use new types

* fix: update examples

* fix: correct deprecation version

* fix: update wrapper macros to use new *Params type names
This commit is contained in:
Dale Seo 2026-01-16 12:16:52 -05:00 • committed by GitHub
commit 9e881a645b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
38 changed files with 913 additions and 278 deletions

View file

@ -28,7 +28,7 @@ pub fn prompt_handler(attr: TokenStream, input: TokenStream) -> syn::Result<Toke
let get_prompt_impl: ImplItem = parse_quote! { let get_prompt_impl: ImplItem = parse_quote! {
async fn get_prompt( async fn get_prompt(
&self, &self,
request: GetPromptRequestParam, request: GetPromptRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> Result<GetPromptResult, rmcp::ErrorData> { ) -> Result<GetPromptResult, rmcp::ErrorData> {
let prompt_context = rmcp::handler::server::prompt::PromptContext::new( let prompt_context = rmcp::handler::server::prompt::PromptContext::new(
@ -51,7 +51,7 @@ pub fn prompt_handler(attr: TokenStream, input: TokenStream) -> syn::Result<Toke
let list_prompts_impl: ImplItem = parse_quote! { let list_prompts_impl: ImplItem = parse_quote! {
async fn list_prompts( async fn list_prompts(
&self, &self,
_request: Option<PaginatedRequestParam>, _request: Option<PaginatedRequestParams>,
_context: RequestContext<RoleServer>, _context: RequestContext<RoleServer>,
) -> Result<ListPromptsResult, rmcp::ErrorData> { ) -> Result<ListPromptsResult, rmcp::ErrorData> {
let prompts = #router_expr.list_all(); let prompts = #router_expr.list_all();

View file

@ -29,7 +29,7 @@ pub fn tool_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
let tool_call_fn = quote! { let tool_call_fn = quote! {
async fn call_tool( async fn call_tool(
&self, &self,
request: rmcp::model::CallToolRequestParam, request: rmcp::model::CallToolRequestParams,
context: rmcp::service::RequestContext<rmcp::RoleServer>, context: rmcp::service::RequestContext<rmcp::RoleServer>,
) -> Result<rmcp::model::CallToolResult, rmcp::ErrorData> { ) -> Result<rmcp::model::CallToolResult, rmcp::ErrorData> {
let tcc = rmcp::handler::server::tool::ToolCallContext::new(self, request, context); 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<TokenS
let tool_list_fn = quote! { let tool_list_fn = quote! {
async fn list_tools( async fn list_tools(
&self, &self,
_request: Option<rmcp::model::PaginatedRequestParam>, _request: Option<rmcp::model::PaginatedRequestParams>,
_context: rmcp::service::RequestContext<rmcp::RoleServer>, _context: rmcp::service::RequestContext<rmcp::RoleServer>,
) -> Result<rmcp::model::ListToolsResult, rmcp::ErrorData> { ) -> Result<rmcp::model::ListToolsResult, rmcp::ErrorData> {
Ok(rmcp::model::ListToolsResult{ Ok(rmcp::model::ListToolsResult{

View file

@ -85,7 +85,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static {
fn create_message( fn create_message(
&self, &self,
params: CreateMessageRequestParam, params: CreateMessageRequestParams,
context: RequestContext<RoleClient>, context: RequestContext<RoleClient>,
) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ {
std::future::ready(Err( std::future::ready(Err(
@ -118,7 +118,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static {
/// Real clients should override this to provide user interaction. /// Real clients should override this to provide user interaction.
fn create_elicitation( fn create_elicitation(
&self, &self,
request: CreateElicitationRequestParam, request: CreateElicitationRequestParams,
context: RequestContext<RoleClient>, context: RequestContext<RoleClient>,
) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ {
// Default implementation declines all requests - real clients should override this // Default implementation declines all requests - real clients should override this
@ -225,7 +225,7 @@ macro_rules! impl_client_handler_for_wrapper {
fn create_message( fn create_message(
&self, &self,
params: CreateMessageRequestParam, params: CreateMessageRequestParams,
context: RequestContext<RoleClient>, context: RequestContext<RoleClient>,
) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ {
(**self).create_message(params, context) (**self).create_message(params, context)
@ -240,7 +240,7 @@ macro_rules! impl_client_handler_for_wrapper {
fn create_elicitation( fn create_elicitation(
&self, &self,
request: CreateElicitationRequestParam, request: CreateElicitationRequestParams,
context: RequestContext<RoleClient>, context: RequestContext<RoleClient>,
) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ {
(**self).create_elicitation(request, context) (**self).create_elicitation(request, context)

View file

@ -137,7 +137,7 @@ impl<H: ServerHandler> Service<RoleServer> for H {
pub trait ServerHandler: Sized + Send + Sync + 'static { pub trait ServerHandler: Sized + Send + Sync + 'static {
fn enqueue_task( fn enqueue_task(
&self, &self,
_request: CallToolRequestParam, _request: CallToolRequestParams,
_context: RequestContext<RoleServer>, _context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ {
std::future::ready(Err(McpError::internal_error( std::future::ready(Err(McpError::internal_error(
@ -154,7 +154,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
// handle requests // handle requests
fn initialize( fn initialize(
&self, &self,
request: InitializeRequestParam, request: InitializeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ {
if context.peer.peer_info().is_none() { if context.peer.peer_info().is_none() {
@ -164,49 +164,49 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
} }
fn complete( fn complete(
&self, &self,
request: CompleteRequestParam, request: CompleteRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ {
std::future::ready(Ok(CompleteResult::default())) std::future::ready(Ok(CompleteResult::default()))
} }
fn set_level( fn set_level(
&self, &self,
request: SetLevelRequestParam, request: SetLevelRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<SetLevelRequestMethod>())) std::future::ready(Err(McpError::method_not_found::<SetLevelRequestMethod>()))
} }
fn get_prompt( fn get_prompt(
&self, &self,
request: GetPromptRequestParam, request: GetPromptRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<GetPromptRequestMethod>())) std::future::ready(Err(McpError::method_not_found::<GetPromptRequestMethod>()))
} }
fn list_prompts( fn list_prompts(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ {
std::future::ready(Ok(ListPromptsResult::default())) std::future::ready(Ok(ListPromptsResult::default()))
} }
fn list_resources( fn list_resources(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ {
std::future::ready(Ok(ListResourcesResult::default())) std::future::ready(Ok(ListResourcesResult::default()))
} }
fn list_resource_templates( fn list_resource_templates(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_ {
std::future::ready(Ok(ListResourceTemplatesResult::default())) std::future::ready(Ok(ListResourceTemplatesResult::default()))
} }
fn read_resource( fn read_resource(
&self, &self,
request: ReadResourceRequestParam, request: ReadResourceRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ {
std::future::ready(Err( std::future::ready(Err(
@ -215,28 +215,28 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
} }
fn subscribe( fn subscribe(
&self, &self,
request: SubscribeRequestParam, request: SubscribeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<SubscribeRequestMethod>())) std::future::ready(Err(McpError::method_not_found::<SubscribeRequestMethod>()))
} }
fn unsubscribe( fn unsubscribe(
&self, &self,
request: UnsubscribeRequestParam, request: UnsubscribeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<UnsubscribeRequestMethod>())) std::future::ready(Err(McpError::method_not_found::<UnsubscribeRequestMethod>()))
} }
fn call_tool( fn call_tool(
&self, &self,
request: CallToolRequestParam, request: CallToolRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<CallToolRequestMethod>())) std::future::ready(Err(McpError::method_not_found::<CallToolRequestMethod>()))
} }
fn list_tools( fn list_tools(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ {
std::future::ready(Ok(ListToolsResult::default())) std::future::ready(Ok(ListToolsResult::default()))
@ -297,7 +297,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
fn list_tasks( fn list_tasks(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<ListTasksMethod>())) std::future::ready(Err(McpError::method_not_found::<ListTasksMethod>()))
@ -305,7 +305,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
fn get_task_info( fn get_task_info(
&self, &self,
request: GetTaskInfoParam, request: GetTaskInfoParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ {
std::future::ready(Err(McpError::method_not_found::<GetTaskInfoMethod>())) std::future::ready(Err(McpError::method_not_found::<GetTaskInfoMethod>()))
@ -313,7 +313,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
fn get_task_result( fn get_task_result(
&self, &self,
request: GetTaskResultParam, request: GetTaskResultParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ {
let _ = (request, context); let _ = (request, context);
@ -322,7 +322,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
fn cancel_task( fn cancel_task(
&self, &self,
request: CancelTaskParam, request: CancelTaskParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
let _ = (request, context); let _ = (request, context);
@ -335,7 +335,7 @@ macro_rules! impl_server_handler_for_wrapper {
impl<T: ServerHandler> ServerHandler for $wrapper<T> { impl<T: ServerHandler> ServerHandler for $wrapper<T> {
fn enqueue_task( fn enqueue_task(
&self, &self,
request: CallToolRequestParam, request: CallToolRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ {
(**self).enqueue_task(request, context) (**self).enqueue_task(request, context)
@ -350,7 +350,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn initialize( fn initialize(
&self, &self,
request: InitializeRequestParam, request: InitializeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ {
(**self).initialize(request, context) (**self).initialize(request, context)
@ -358,7 +358,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn complete( fn complete(
&self, &self,
request: CompleteRequestParam, request: CompleteRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ {
(**self).complete(request, context) (**self).complete(request, context)
@ -366,7 +366,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn set_level( fn set_level(
&self, &self,
request: SetLevelRequestParam, request: SetLevelRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
(**self).set_level(request, context) (**self).set_level(request, context)
@ -374,7 +374,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn get_prompt( fn get_prompt(
&self, &self,
request: GetPromptRequestParam, request: GetPromptRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ {
(**self).get_prompt(request, context) (**self).get_prompt(request, context)
@ -382,7 +382,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn list_prompts( fn list_prompts(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ {
(**self).list_prompts(request, context) (**self).list_prompts(request, context)
@ -390,7 +390,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn list_resources( fn list_resources(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ {
(**self).list_resources(request, context) (**self).list_resources(request, context)
@ -398,7 +398,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn list_resource_templates( fn list_resource_templates(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_ ) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_
{ {
@ -407,7 +407,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn read_resource( fn read_resource(
&self, &self,
request: ReadResourceRequestParam, request: ReadResourceRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ {
(**self).read_resource(request, context) (**self).read_resource(request, context)
@ -415,7 +415,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn subscribe( fn subscribe(
&self, &self,
request: SubscribeRequestParam, request: SubscribeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
(**self).subscribe(request, context) (**self).subscribe(request, context)
@ -423,7 +423,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn unsubscribe( fn unsubscribe(
&self, &self,
request: UnsubscribeRequestParam, request: UnsubscribeRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
(**self).unsubscribe(request, context) (**self).unsubscribe(request, context)
@ -431,7 +431,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn call_tool( fn call_tool(
&self, &self,
request: CallToolRequestParam, request: CallToolRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ {
(**self).call_tool(request, context) (**self).call_tool(request, context)
@ -439,7 +439,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn list_tools( fn list_tools(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ {
(**self).list_tools(request, context) (**self).list_tools(request, context)
@ -497,7 +497,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn list_tasks( fn list_tasks(
&self, &self,
request: Option<PaginatedRequestParam>, request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ {
(**self).list_tasks(request, context) (**self).list_tasks(request, context)
@ -505,7 +505,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn get_task_info( fn get_task_info(
&self, &self,
request: GetTaskInfoParam, request: GetTaskInfoParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ {
(**self).get_task_info(request, context) (**self).get_task_info(request, context)
@ -513,7 +513,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn get_task_result( fn get_task_result(
&self, &self,
request: GetTaskResultParam, request: GetTaskResultParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ { ) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ {
(**self).get_task_result(request, context) (**self).get_task_result(request, context)
@ -521,7 +521,7 @@ macro_rules! impl_server_handler_for_wrapper {
fn cancel_task( fn cancel_task(
&self, &self,
request: CancelTaskParam, request: CancelTaskParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
(**self).cancel_task(request, context) (**self).cancel_task(request, context)

View file

@ -15,7 +15,7 @@ pub use super::{
use crate::{ use crate::{
RoleServer, RoleServer,
handler::server::wrapper::Parameters, handler::server::wrapper::Parameters,
model::{CallToolRequestParam, CallToolResult, IntoContents, JsonObject}, model::{CallToolRequestParams, CallToolResult, IntoContents, JsonObject},
service::RequestContext, service::RequestContext,
}; };
@ -39,11 +39,12 @@ pub struct ToolCallContext<'s, S> {
impl<'s, S> ToolCallContext<'s, S> { impl<'s, S> ToolCallContext<'s, S> {
pub fn new( pub fn new(
service: &'s S, service: &'s S,
CallToolRequestParam { CallToolRequestParams {
meta: _,
name, name,
arguments, arguments,
task, task,
}: CallToolRequestParam, }: CallToolRequestParams,
request_context: RequestContext<RoleServer>, request_context: RequestContext<RoleServer>,
) -> Self { ) -> Self {
Self { Self {

View file

@ -104,7 +104,7 @@
//! //!
//! ```rust //! ```rust
//! use anyhow::Result; //! use anyhow::Result;
//! use rmcp::{model::CallToolRequestParam, service::ServiceExt}; //! use rmcp::{model::CallToolRequestParams, service::ServiceExt};
//! #[cfg(feature = "transport-child-process")] //! #[cfg(feature = "transport-child-process")]
//! #[cfg_attr(docsrs, doc(cfg(feature = "transport-child-process")))] //! #[cfg_attr(docsrs, doc(cfg(feature = "transport-child-process")))]
//! use rmcp::transport::{TokioChildProcess, ConfigureCommandExt}; //! use rmcp::transport::{TokioChildProcess, ConfigureCommandExt};
@ -127,7 +127,8 @@
//! //!
//! // Call tool 'git_status' with arguments = {"repo_path": "."} //! // Call tool 'git_status' with arguments = {"repo_path": "."}
//! let tool_result = service //! let tool_result = service
//! .call_tool(CallToolRequestParam { //! .call_tool(CallToolRequestParams {
//! meta: None,
//! name: "git_status".into(), //! name: "git_status".into(),
//! arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(), //! arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(),
//! task: None, //! task: None,

View file

@ -718,7 +718,7 @@ impl CustomRequest {
const_string!(InitializeResultMethod = "initialize"); const_string!(InitializeResultMethod = "initialize");
/// # Initialization /// # Initialization
/// This request is sent from the client to the server when it first connects, asking it to begin initialization. /// This request is sent from the client to the server when it first connects, asking it to begin initialization.
pub type InitializeRequest = Request<InitializeResultMethod, InitializeRequestParam>; pub type InitializeRequest = Request<InitializeResultMethod, InitializeRequestParams>;
const_string!(InitializedNotificationMethod = "notifications/initialized"); const_string!(InitializedNotificationMethod = "notifications/initialized");
/// This notification is sent from the client to the server after initialization has finished. /// This notification is sent from the client to the server after initialization has finished.
@ -731,7 +731,10 @@ pub type InitializedNotification = NotificationNoParam<InitializedNotificationMe
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct InitializeRequestParam { pub struct InitializeRequestParams {
/// Protocol-level metadata for this request (SEP-1319)
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
pub meta: Option<Meta>,
/// The MCP protocol version this client supports /// The MCP protocol version this client supports
pub protocol_version: ProtocolVersion, pub protocol_version: ProtocolVersion,
/// The capabilities this client supports (sampling, roots, etc.) /// The capabilities this client supports (sampling, roots, etc.)
@ -740,6 +743,19 @@ pub struct InitializeRequestParam {
pub client_info: Implementation, pub client_info: Implementation,
} }
impl RequestParamsMeta for InitializeRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`InitializeRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use InitializeRequestParams instead")]
pub type InitializeRequestParam = InitializeRequestParams;
/// The server's response to an initialization request. /// The server's response to an initialization request.
/// ///
/// Contains the server's protocol version, capabilities, and implementation /// Contains the server's protocol version, capabilities, and implementation
@ -760,7 +776,7 @@ pub struct InitializeResult {
} }
pub type ServerInfo = InitializeResult; pub type ServerInfo = InitializeResult;
pub type ClientInfo = InitializeRequestParam; pub type ClientInfo = InitializeRequestParams;
#[allow(clippy::derivable_impls)] #[allow(clippy::derivable_impls)]
impl Default for ServerInfo { impl Default for ServerInfo {
@ -778,6 +794,7 @@ impl Default for ServerInfo {
impl Default for ClientInfo { impl Default for ClientInfo {
fn default() -> Self { fn default() -> Self {
ClientInfo { ClientInfo {
meta: None,
protocol_version: ProtocolVersion::default(), protocol_version: ProtocolVersion::default(),
capabilities: ClientCapabilities::default(), capabilities: ClientCapabilities::default(),
client_info: Implementation::from_build_env(), client_info: Implementation::from_build_env(),
@ -843,10 +860,26 @@ impl Implementation {
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>, pub cursor: Option<String>,
} }
impl RequestParamsMeta for PaginatedRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`PaginatedRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use PaginatedRequestParams instead")]
pub type PaginatedRequestParam = PaginatedRequestParams;
// ============================================================================= // =============================================================================
// PROGRESS AND PAGINATION // PROGRESS AND PAGINATION
// ============================================================================= // =============================================================================
@ -910,7 +943,7 @@ macro_rules! paginated_result {
const_string!(ListResourcesRequestMethod = "resources/list"); const_string!(ListResourcesRequestMethod = "resources/list");
/// Request to list all available resources from a server /// Request to list all available resources from a server
pub type ListResourcesRequest = pub type ListResourcesRequest =
RequestOptionalParam<ListResourcesRequestMethod, PaginatedRequestParam>; RequestOptionalParam<ListResourcesRequestMethod, PaginatedRequestParams>;
paginated_result!(ListResourcesResult { paginated_result!(ListResourcesResult {
resources: Vec<Resource> resources: Vec<Resource>
@ -919,7 +952,7 @@ paginated_result!(ListResourcesResult {
const_string!(ListResourceTemplatesRequestMethod = "resources/templates/list"); const_string!(ListResourceTemplatesRequestMethod = "resources/templates/list");
/// Request to list all available resource templates from a server /// Request to list all available resource templates from a server
pub type ListResourceTemplatesRequest = pub type ListResourceTemplatesRequest =
RequestOptionalParam<ListResourceTemplatesRequestMethod, PaginatedRequestParam>; RequestOptionalParam<ListResourceTemplatesRequestMethod, PaginatedRequestParams>;
paginated_result!(ListResourceTemplatesResult { paginated_result!(ListResourceTemplatesResult {
resource_templates: Vec<ResourceTemplate> resource_templates: Vec<ResourceTemplate>
@ -930,11 +963,27 @@ const_string!(ReadResourceRequestMethod = "resources/read");
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// The URI of the resource to read /// The URI of the resource to read
pub uri: String, pub uri: String,
} }
impl RequestParamsMeta for ReadResourceRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`ReadResourceRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use ReadResourceRequestParams instead")]
pub type ReadResourceRequestParam = ReadResourceRequestParams;
/// Result containing the contents of a read resource /// Result containing the contents of a read resource
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
@ -944,7 +993,7 @@ pub struct ReadResourceResult {
} }
/// Request to read a specific resource /// Request to read a specific resource
pub type ReadResourceRequest = Request<ReadResourceRequestMethod, ReadResourceRequestParam>; pub type ReadResourceRequest = Request<ReadResourceRequestMethod, ReadResourceRequestParams>;
const_string!(ResourceListChangedNotificationMethod = "notifications/resources/list_changed"); const_string!(ResourceListChangedNotificationMethod = "notifications/resources/list_changed");
/// Notification sent when the list of available resources changes /// Notification sent when the list of available resources changes
@ -956,24 +1005,58 @@ const_string!(SubscribeRequestMethod = "resources/subscribe");
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// The URI of the resource to subscribe to /// The URI of the resource to subscribe to
pub uri: String, pub uri: String,
} }
impl RequestParamsMeta for SubscribeRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`SubscribeRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use SubscribeRequestParams instead")]
pub type SubscribeRequestParam = SubscribeRequestParams;
/// Request to subscribe to resource updates /// Request to subscribe to resource updates
pub type SubscribeRequest = Request<SubscribeRequestMethod, SubscribeRequestParam>; pub type SubscribeRequest = Request<SubscribeRequestMethod, SubscribeRequestParams>;
const_string!(UnsubscribeRequestMethod = "resources/unsubscribe"); const_string!(UnsubscribeRequestMethod = "resources/unsubscribe");
/// Parameters for unsubscribing from resource updates /// Parameters for unsubscribing from resource updates
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// The URI of the resource to unsubscribe from /// The URI of the resource to unsubscribe from
pub uri: String, pub uri: String,
} }
impl RequestParamsMeta for UnsubscribeRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`UnsubscribeRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use UnsubscribeRequestParams instead")]
pub type UnsubscribeRequestParam = UnsubscribeRequestParams;
/// Request to unsubscribe from resource updates /// Request to unsubscribe from resource updates
pub type UnsubscribeRequest = Request<UnsubscribeRequestMethod, UnsubscribeRequestParam>; pub type UnsubscribeRequest = Request<UnsubscribeRequestMethod, UnsubscribeRequestParams>;
const_string!(ResourceUpdatedNotificationMethod = "notifications/resources/updated"); const_string!(ResourceUpdatedNotificationMethod = "notifications/resources/updated");
/// Parameters for a resource update notification /// Parameters for a resource update notification
@ -994,7 +1077,8 @@ pub type ResourceUpdatedNotification =
const_string!(ListPromptsRequestMethod = "prompts/list"); const_string!(ListPromptsRequestMethod = "prompts/list");
/// Request to list all available prompts from a server /// Request to list all available prompts from a server
pub type ListPromptsRequest = RequestOptionalParam<ListPromptsRequestMethod, PaginatedRequestParam>; pub type ListPromptsRequest =
RequestOptionalParam<ListPromptsRequestMethod, PaginatedRequestParams>;
paginated_result!(ListPromptsResult { paginated_result!(ListPromptsResult {
prompts: Vec<Prompt> prompts: Vec<Prompt>
@ -1005,13 +1089,30 @@ const_string!(GetPromptRequestMethod = "prompts/get");
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
pub name: String, pub name: String,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<JsonObject>, pub arguments: Option<JsonObject>,
} }
impl RequestParamsMeta for GetPromptRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`GetPromptRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use GetPromptRequestParams instead")]
pub type GetPromptRequestParam = GetPromptRequestParams;
/// Request to get a specific prompt /// Request to get a specific prompt
pub type GetPromptRequest = Request<GetPromptRequestMethod, GetPromptRequestParam>; pub type GetPromptRequest = Request<GetPromptRequestMethod, GetPromptRequestParams>;
const_string!(PromptListChangedNotificationMethod = "notifications/prompts/list_changed"); const_string!(PromptListChangedNotificationMethod = "notifications/prompts/list_changed");
/// Notification sent when the list of available prompts changes /// Notification sent when the list of available prompts changes
@ -1045,12 +1146,29 @@ const_string!(SetLevelRequestMethod = "logging/setLevel");
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// The desired logging level /// The desired logging level
pub level: LoggingLevel, pub level: LoggingLevel,
} }
impl RequestParamsMeta for SetLevelRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`SetLevelRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use SetLevelRequestParams instead")]
pub type SetLevelRequestParam = SetLevelRequestParams;
/// Request to set the logging level /// Request to set the logging level
pub type SetLevelRequest = Request<SetLevelRequestMethod, SetLevelRequestParam>; pub type SetLevelRequest = Request<SetLevelRequestMethod, SetLevelRequestParams>;
const_string!(LoggingMessageNotificationMethod = "notifications/message"); const_string!(LoggingMessageNotificationMethod = "notifications/message");
/// Parameters for a logging message notification /// Parameters for a logging message notification
@ -1075,7 +1193,7 @@ pub type LoggingMessageNotification =
// ============================================================================= // =============================================================================
const_string!(CreateMessageRequestMethod = "sampling/createMessage"); const_string!(CreateMessageRequestMethod = "sampling/createMessage");
pub type CreateMessageRequest = Request<CreateMessageRequestMethod, CreateMessageRequestParam>; pub type CreateMessageRequest = Request<CreateMessageRequestMethod, CreateMessageRequestParams>;
/// Represents the role of a participant in a conversation or message exchange. /// 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 /// This structure contains all the necessary information for a client to
/// generate an LLM response, including conversation history, model preferences, /// generate an LLM response, including conversation history, model preferences,
/// and generation parameters. /// 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)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// Task metadata for async task management (SEP-1319)
#[serde(skip_serializing_if = "Option::is_none")]
pub task: Option<JsonObject>,
/// The conversation history and current messages /// The conversation history and current messages
pub messages: Vec<SamplingMessage>, pub messages: Vec<SamplingMessage>,
/// Preferences for model selection and behavior /// Preferences for model selection and behavior
@ -1156,6 +1283,28 @@ pub struct CreateMessageRequestParam {
pub metadata: Option<Value>, pub metadata: Option<Value>,
} }
impl RequestParamsMeta for CreateMessageRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
impl TaskAugmentedRequestParamsMeta for CreateMessageRequestParams {
fn task(&self) -> Option<&JsonObject> {
self.task.as_ref()
}
fn task_mut(&mut self) -> &mut Option<JsonObject> {
&mut self.task
}
}
/// Deprecated: Use [`CreateMessageRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use CreateMessageRequestParams instead")]
pub type CreateMessageRequestParam = CreateMessageRequestParams;
/// Preferences for model selection and behavior in sampling requests. /// Preferences for model selection and behavior in sampling requests.
/// ///
/// This allows servers to express their preferences for which model to use /// This allows servers to express their preferences for which model to use
@ -1244,7 +1393,10 @@ impl CompletionContext {
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
pub r#ref: Reference, pub r#ref: Reference,
pub argument: ArgumentInfo, pub argument: ArgumentInfo,
/// Optional context containing previously resolved argument values /// Optional context containing previously resolved argument values
@ -1252,7 +1404,20 @@ pub struct CompleteRequestParam {
pub context: Option<CompletionContext>, pub context: Option<CompletionContext>,
} }
pub type CompleteRequest = Request<CompleteRequestMethod, CompleteRequestParam>; impl RequestParamsMeta for CompleteRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`CompleteRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use CompleteRequestParams instead")]
pub type CompleteRequestParam = CompleteRequestParams;
pub type CompleteRequest = Request<CompleteRequestMethod, CompleteRequestParams>;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -1477,7 +1642,8 @@ pub enum ElicitationAction {
/// ```rust /// ```rust
/// use rmcp::model::*; /// use rmcp::model::*;
/// ///
/// let params = CreateElicitationRequestParam { /// let params = CreateElicitationRequestParams {
/// meta: None,
/// message: "Please provide your email".to_string(), /// message: "Please provide your email".to_string(),
/// requested_schema: ElicitationSchema::builder() /// requested_schema: ElicitationSchema::builder()
/// .required_email("email") /// .required_email("email")
@ -1488,7 +1654,11 @@ pub enum ElicitationAction {
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// Human-readable message explaining what input is needed from the user. /// Human-readable message explaining what input is needed from the user.
/// This should be clear and provide sufficient context for the user to understand /// This should be clear and provide sufficient context for the user to understand
/// what information they need to provide. /// what information they need to provide.
@ -1500,6 +1670,19 @@ pub struct CreateElicitationRequestParam {
pub requested_schema: ElicitationSchema, pub requested_schema: ElicitationSchema,
} }
impl RequestParamsMeta for CreateElicitationRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`CreateElicitationRequestParams`] instead (SEP-1319 compliance).
#[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. /// 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 /// 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 /// Request type for creating an elicitation to gather user input
pub type CreateElicitationRequest = pub type CreateElicitationRequest =
Request<ElicitationCreateRequestMethod, CreateElicitationRequestParam>; Request<ElicitationCreateRequestMethod, CreateElicitationRequestParams>;
// ============================================================================= // =============================================================================
// TOOL EXECUTION RESULTS // TOOL EXECUTION RESULTS
@ -1685,7 +1868,7 @@ impl<'de> Deserialize<'de> for CallToolResult {
const_string!(ListToolsRequestMethod = "tools/list"); const_string!(ListToolsRequestMethod = "tools/list");
/// Request to list all available tools from a server /// Request to list all available tools from a server
pub type ListToolsRequest = RequestOptionalParam<ListToolsRequestMethod, PaginatedRequestParam>; pub type ListToolsRequest = RequestOptionalParam<ListToolsRequestMethod, PaginatedRequestParams>;
paginated_result!( paginated_result!(
ListToolsResult { ListToolsResult {
@ -1698,21 +1881,50 @@ const_string!(CallToolRequestMethod = "tools/call");
/// ///
/// Contains the tool name and optional arguments needed to execute /// Contains the tool name and optional arguments needed to execute
/// the tool operation. /// 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)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
/// The name of the tool to call /// The name of the tool to call
pub name: Cow<'static, str>, pub name: Cow<'static, str>,
/// Arguments to pass to the tool (must match the tool's input schema) /// Arguments to pass to the tool (must match the tool's input schema)
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<JsonObject>, pub arguments: Option<JsonObject>,
/// Task metadata for async task management (SEP-1319)
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub task: Option<JsonObject>, pub task: Option<JsonObject>,
} }
impl RequestParamsMeta for CallToolRequestParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
impl TaskAugmentedRequestParamsMeta for CallToolRequestParams {
fn task(&self) -> Option<&JsonObject> {
self.task.as_ref()
}
fn task_mut(&mut self) -> &mut Option<JsonObject> {
&mut self.task
}
}
/// Deprecated: Use [`CallToolRequestParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use CallToolRequestParams instead")]
pub type CallToolRequestParam = CallToolRequestParams;
/// Request to call a specific tool /// Request to call a specific tool
pub type CallToolRequest = Request<CallToolRequestMethod, CallToolRequestParam>; pub type CallToolRequest = Request<CallToolRequestMethod, CallToolRequestParams>;
/// The result of a sampling/createMessage request containing the generated response. /// The result of a sampling/createMessage request containing the generated response.
/// ///
@ -1752,37 +1964,85 @@ pub struct GetPromptResult {
// ============================================================================= // =============================================================================
const_string!(GetTaskInfoMethod = "tasks/get"); const_string!(GetTaskInfoMethod = "tasks/get");
pub type GetTaskInfoRequest = Request<GetTaskInfoMethod, GetTaskInfoParam>; pub type GetTaskInfoRequest = Request<GetTaskInfoMethod, GetTaskInfoParams>;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
pub task_id: String, pub task_id: String,
} }
impl RequestParamsMeta for GetTaskInfoParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`GetTaskInfoParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use GetTaskInfoParams instead")]
pub type GetTaskInfoParam = GetTaskInfoParams;
const_string!(ListTasksMethod = "tasks/list"); const_string!(ListTasksMethod = "tasks/list");
pub type ListTasksRequest = RequestOptionalParam<ListTasksMethod, PaginatedRequestParam>; pub type ListTasksRequest = RequestOptionalParam<ListTasksMethod, PaginatedRequestParams>;
const_string!(GetTaskResultMethod = "tasks/result"); const_string!(GetTaskResultMethod = "tasks/result");
pub type GetTaskResultRequest = Request<GetTaskResultMethod, GetTaskResultParam>; pub type GetTaskResultRequest = Request<GetTaskResultMethod, GetTaskResultParams>;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
pub task_id: String, pub task_id: String,
} }
impl RequestParamsMeta for GetTaskResultParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`GetTaskResultParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use GetTaskResultParams instead")]
pub type GetTaskResultParam = GetTaskResultParams;
const_string!(CancelTaskMethod = "tasks/cancel"); const_string!(CancelTaskMethod = "tasks/cancel");
pub type CancelTaskRequest = Request<CancelTaskMethod, CancelTaskParam>; pub type CancelTaskRequest = Request<CancelTaskMethod, CancelTaskParams>;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[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<Meta>,
pub task_id: String, pub task_id: String,
} }
impl RequestParamsMeta for CancelTaskParams {
fn meta(&self) -> Option<&Meta> {
self.meta.as_ref()
}
fn meta_mut(&mut self) -> &mut Option<Meta> {
&mut self.meta
}
}
/// Deprecated: Use [`CancelTaskParams`] instead (SEP-1319 compliance).
#[deprecated(since = "0.13.0", note = "Use CancelTaskParams instead")]
pub type CancelTaskParam = CancelTaskParams;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
@ -2201,11 +2461,13 @@ mod tests {
serde_json::from_value(request.clone()).expect("invalid request"); serde_json::from_value(request.clone()).expect("invalid request");
let (request, id) = request.into_request().expect("should be a request"); let (request, id) = request.into_request().expect("should be a request");
assert_eq!(id, RequestId::Number(1)); assert_eq!(id, RequestId::Number(1));
#[allow(deprecated)]
match request { match request {
ClientRequest::InitializeRequest(Request { ClientRequest::InitializeRequest(Request {
method: _, method: _,
params: params:
InitializeRequestParam { InitializeRequestParam {
meta: _,
protocol_version: _, protocol_version: _,
capabilities, capabilities,
client_info, client_info,

View file

@ -18,6 +18,51 @@ pub trait GetExtensions {
fn extensions_mut(&mut self) -> &mut Extensions; fn extensions_mut(&mut self) -> &mut Extensions;
} }
/// Trait for request params that contain the `_meta` field.
///
/// 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<Meta>;
/// 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<ProgressToken> {
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.
///
/// 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<JsonObject>;
/// Set the task field
fn set_task(&mut self, task: JsonObject) {
*self.task_mut() = Some(task);
}
}
impl GetExtensions for CustomNotification { impl GetExtensions for CustomNotification {
fn extensions(&self) -> &Extensions { fn extensions(&self) -> &Extensions {
&self.extensions &self.extensions
@ -156,6 +201,13 @@ impl Meta {
Self(JsonObject::new()) 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 { pub(crate) fn static_empty() -> &'static Self {
static EMPTY: std::sync::OnceLock<Meta> = std::sync::OnceLock::new(); static EMPTY: std::sync::OnceLock<Meta> = std::sync::OnceLock::new();
EMPTY.get_or_init(Default::default) EMPTY.get_or_init(Default::default)

View file

@ -5,18 +5,18 @@ use thiserror::Error;
use super::*; use super::*;
use crate::{ use crate::{
model::{ model::{
ArgumentInfo, CallToolRequest, CallToolRequestParam, CallToolResult, CancelledNotification, ArgumentInfo, CallToolRequest, CallToolRequestParams, CallToolResult,
CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, ClientNotification, CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage,
ClientRequest, ClientResult, CompleteRequest, CompleteRequestParam, CompleteResult, ClientNotification, ClientRequest, ClientResult, CompleteRequest, CompleteRequestParams,
CompletionContext, CompletionInfo, ErrorData, GetPromptRequest, GetPromptRequestParam, CompleteResult, CompletionContext, CompletionInfo, ErrorData, GetPromptRequest,
GetPromptResult, InitializeRequest, InitializedNotification, JsonRpcResponse, GetPromptRequestParams, GetPromptResult, InitializeRequest, InitializedNotification,
ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest, JsonRpcResponse, ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest,
ListResourceTemplatesResult, ListResourcesRequest, ListResourcesResult, ListToolsRequest, ListResourceTemplatesResult, ListResourcesRequest, ListResourcesResult, ListToolsRequest,
ListToolsResult, PaginatedRequestParam, ProgressNotification, ProgressNotificationParam, ListToolsResult, PaginatedRequestParams, ProgressNotification, ProgressNotificationParam,
ReadResourceRequest, ReadResourceRequestParam, ReadResourceResult, Reference, RequestId, ReadResourceRequest, ReadResourceRequestParams, ReadResourceResult, Reference, RequestId,
RootsListChangedNotification, ServerInfo, ServerJsonRpcMessage, ServerNotification, RootsListChangedNotification, ServerInfo, ServerJsonRpcMessage, ServerNotification,
ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParam, SubscribeRequest, ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParams, SubscribeRequest,
SubscribeRequestParam, UnsubscribeRequest, UnsubscribeRequestParam, SubscribeRequestParams, UnsubscribeRequest, UnsubscribeRequestParams,
}, },
transport::DynamicTransportError, transport::DynamicTransportError,
}; };
@ -350,17 +350,17 @@ macro_rules! method {
} }
impl Peer<RoleClient> { impl Peer<RoleClient> {
method!(peer_req complete CompleteRequest(CompleteRequestParam) => CompleteResult); method!(peer_req complete CompleteRequest(CompleteRequestParams) => CompleteResult);
method!(peer_req set_level SetLevelRequest(SetLevelRequestParam)); method!(peer_req set_level SetLevelRequest(SetLevelRequestParams));
method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParam) => GetPromptResult); method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParams) => GetPromptResult);
method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParam)? => ListPromptsResult); method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParams)? => ListPromptsResult);
method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParam)? => ListResourcesResult); method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParams)? => ListResourcesResult);
method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParam)? => ListResourceTemplatesResult); method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParams)? => ListResourceTemplatesResult);
method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParam) => ReadResourceResult); method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParams) => ReadResourceResult);
method!(peer_req subscribe SubscribeRequest(SubscribeRequestParam) ); method!(peer_req subscribe SubscribeRequest(SubscribeRequestParams) );
method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParam)); method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParams));
method!(peer_req call_tool CallToolRequest(CallToolRequestParam) => CallToolResult); method!(peer_req call_tool CallToolRequest(CallToolRequestParams) => CallToolResult);
method!(peer_req list_tools ListToolsRequest(PaginatedRequestParam)? => ListToolsResult); method!(peer_req list_tools ListToolsRequest(PaginatedRequestParams)? => ListToolsResult);
method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam)); method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam));
method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam)); method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam));
@ -377,7 +377,7 @@ impl Peer<RoleClient> {
let mut cursor = None; let mut cursor = None;
loop { loop {
let result = self let result = self
.list_tools(Some(PaginatedRequestParam { cursor })) .list_tools(Some(PaginatedRequestParams { meta: None, cursor }))
.await?; .await?;
tools.extend(result.tools); tools.extend(result.tools);
cursor = result.next_cursor; cursor = result.next_cursor;
@ -396,7 +396,7 @@ impl Peer<RoleClient> {
let mut cursor = None; let mut cursor = None;
loop { loop {
let result = self let result = self
.list_prompts(Some(PaginatedRequestParam { cursor })) .list_prompts(Some(PaginatedRequestParams { meta: None, cursor }))
.await?; .await?;
prompts.extend(result.prompts); prompts.extend(result.prompts);
cursor = result.next_cursor; cursor = result.next_cursor;
@ -415,7 +415,7 @@ impl Peer<RoleClient> {
let mut cursor = None; let mut cursor = None;
loop { loop {
let result = self let result = self
.list_resources(Some(PaginatedRequestParam { cursor })) .list_resources(Some(PaginatedRequestParams { meta: None, cursor }))
.await?; .await?;
resources.extend(result.resources); resources.extend(result.resources);
cursor = result.next_cursor; cursor = result.next_cursor;
@ -436,7 +436,7 @@ impl Peer<RoleClient> {
let mut cursor = None; let mut cursor = None;
loop { loop {
let result = self let result = self
.list_resource_templates(Some(PaginatedRequestParam { cursor })) .list_resource_templates(Some(PaginatedRequestParams { meta: None, cursor }))
.await?; .await?;
resource_templates.extend(result.resource_templates); resource_templates.extend(result.resource_templates);
cursor = result.next_cursor; cursor = result.next_cursor;
@ -464,7 +464,8 @@ impl Peer<RoleClient> {
current_value: impl Into<String>, current_value: impl Into<String>,
context: Option<CompletionContext>, context: Option<CompletionContext>,
) -> Result<CompletionInfo, ServiceError> { ) -> Result<CompletionInfo, ServiceError> {
let request = CompleteRequestParam { let request = CompleteRequestParams {
meta: None,
r#ref: Reference::for_prompt(prompt_name), r#ref: Reference::for_prompt(prompt_name),
argument: ArgumentInfo { argument: ArgumentInfo {
name: argument_name.into(), name: argument_name.into(),
@ -494,7 +495,8 @@ impl Peer<RoleClient> {
current_value: impl Into<String>, current_value: impl Into<String>,
context: Option<CompletionContext>, context: Option<CompletionContext>,
) -> Result<CompletionInfo, ServiceError> { ) -> Result<CompletionInfo, ServiceError> {
let request = CompleteRequestParam { let request = CompleteRequestParams {
meta: None,
r#ref: Reference::for_resource(uri_template), r#ref: Reference::for_resource(uri_template),
argument: ArgumentInfo { argument: ArgumentInfo {
name: argument_name.into(), name: argument_name.into(),

View file

@ -5,13 +5,13 @@ use thiserror::Error;
use super::*; use super::*;
#[cfg(feature = "elicitation")] #[cfg(feature = "elicitation")]
use crate::model::{ use crate::model::{
CreateElicitationRequest, CreateElicitationRequestParam, CreateElicitationResult, CreateElicitationRequest, CreateElicitationRequestParams, CreateElicitationResult,
}; };
use crate::{ use crate::{
model::{ model::{
CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage,
ClientNotification, ClientRequest, ClientResult, CreateMessageRequest, ClientNotification, ClientRequest, ClientResult, CreateMessageRequest,
CreateMessageRequestParam, CreateMessageResult, ErrorData, ListRootsRequest, CreateMessageRequestParams, CreateMessageResult, ErrorData, ListRootsRequest,
ListRootsResult, LoggingMessageNotification, LoggingMessageNotificationParam, ListRootsResult, LoggingMessageNotification, LoggingMessageNotificationParam,
ProgressNotification, ProgressNotificationParam, PromptListChangedNotification, ProgressNotification, ProgressNotificationParam, PromptListChangedNotification,
ProtocolVersion, ResourceListChangedNotification, ResourceUpdatedNotification, ProtocolVersion, ResourceListChangedNotification, ResourceUpdatedNotification,
@ -386,7 +386,7 @@ macro_rules! method {
impl Peer<RoleServer> { impl Peer<RoleServer> {
pub async fn create_message( pub async fn create_message(
&self, &self,
params: CreateMessageRequestParam, params: CreateMessageRequestParams,
) -> Result<CreateMessageResult, ServiceError> { ) -> Result<CreateMessageResult, ServiceError> {
let result = self let result = self
.send_request(ServerRequest::CreateMessageRequest(CreateMessageRequest { .send_request(ServerRequest::CreateMessageRequest(CreateMessageRequest {
@ -402,9 +402,9 @@ impl Peer<RoleServer> {
} }
method!(peer_req list_roots ListRootsRequest() => ListRootsResult); method!(peer_req list_roots ListRootsRequest() => ListRootsResult);
#[cfg(feature = "elicitation")] #[cfg(feature = "elicitation")]
method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParam) => CreateElicitationResult); method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParams) => CreateElicitationResult);
#[cfg(feature = "elicitation")] #[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_cancelled CancelledNotification(CancelledNotificationParam));
method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam)); method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam));
@ -690,7 +690,8 @@ impl Peer<RoleServer> {
let response = self let response = self
.create_elicitation_with_timeout( .create_elicitation_with_timeout(
CreateElicitationRequestParam { CreateElicitationRequestParams {
meta: None,
message: message.into(), message: message.into(),
requested_schema: schema, requested_schema: schema,
}, },

View file

@ -49,7 +49,7 @@ impl TestClientHandler {
impl ClientHandler for TestClientHandler { impl ClientHandler for TestClientHandler {
async fn create_message( async fn create_message(
&self, &self,
params: CreateMessageRequestParam, params: CreateMessageRequestParams,
_context: RequestContext<RoleClient>, _context: RequestContext<RoleClient>,
) -> Result<CreateMessageResult, McpError> { ) -> Result<CreateMessageResult, McpError> {
// First validate that there's at least one User message // First validate that there's at least one User message
@ -117,7 +117,7 @@ impl ServerHandler for TestServer {
fn set_level( fn set_level(
&self, &self,
request: SetLevelRequestParam, request: SetLevelRequestParams,
context: RequestContext<RoleServer>, context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), McpError>> + Send + '_ { ) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
let peer = context.peer; let peer = context.peer;

View file

@ -52,7 +52,8 @@ fn test_complete_request_param_serialization() {
let mut args = HashMap::new(); let mut args = HashMap::new();
args.insert("previous_input".to_string(), "test".to_string()); args.insert("previous_input".to_string(), "test".to_string());
let request = CompleteRequestParam { let request = CompleteRequestParams {
meta: None,
r#ref: Reference::for_prompt("weather_prompt"), r#ref: Reference::for_prompt("weather_prompt"),
argument: ArgumentInfo { argument: ArgumentInfo {
name: "location".to_string(), name: "location".to_string(),
@ -195,7 +196,8 @@ fn test_completion_context_empty() {
#[test] #[test]
fn test_mcp_schema_compliance() { fn test_mcp_schema_compliance() {
// Test that our types serialize correctly according to MCP specification // 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}"), r#ref: Reference::for_resource("file://{path}"),
argument: ArgumentInfo { argument: ArgumentInfo {
name: "path".to_string(), name: "path".to_string(),

View file

@ -36,7 +36,7 @@ async fn test_elicitation_serialization() {
); );
} }
/// Test CreateElicitationRequestParam structure serialization/deserialization /// Test CreateElicitationRequestParams structure serialization/deserialization
#[tokio::test] #[tokio::test]
async fn test_elicitation_request_param_serialization() { async fn test_elicitation_request_param_serialization() {
let schema = ElicitationSchema::builder() let schema = ElicitationSchema::builder()
@ -44,7 +44,8 @@ async fn test_elicitation_request_param_serialization() {
.build() .build()
.unwrap(); .unwrap();
let request_param = CreateElicitationRequestParam { let request_param = CreateElicitationRequestParams {
meta: None,
message: "Please provide your email address".to_string(), message: "Please provide your email address".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
@ -68,7 +69,7 @@ async fn test_elicitation_request_param_serialization() {
assert_eq!(json, expected); assert_eq!(json, expected);
// Test deserialization // 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.message, request_param.message);
assert_eq!( assert_eq!(
deserialized.requested_schema, deserialized.requested_schema,
@ -128,7 +129,8 @@ async fn test_elicitation_json_rpc_protocol() {
id: RequestId::Number(1), id: RequestId::Number(1),
request: CreateElicitationRequest { request: CreateElicitationRequest {
method: ElicitationCreateRequestMethod, method: ElicitationCreateRequestMethod,
params: CreateElicitationRequestParam { params: CreateElicitationRequestParams {
meta: None,
message: "Do you want to continue?".to_string(), message: "Do you want to continue?".to_string(),
requested_schema: schema, requested_schema: schema,
}, },
@ -212,7 +214,8 @@ async fn test_elicitation_spec_compliance() {
#[tokio::test] #[tokio::test]
async fn test_elicitation_error_handling() { async fn test_elicitation_error_handling() {
// Test minimal schema handling (empty properties is technically valid) // 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(), message: "Test message".to_string(),
requested_schema: ElicitationSchema::builder().build().unwrap(), 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(); let _json = serde_json::to_value(&minimal_schema_request).unwrap();
// Test empty message // Test empty message
let empty_message_request = CreateElicitationRequestParam { let empty_message_request = CreateElicitationRequestParams {
meta: None,
message: "".to_string(), message: "".to_string(),
requested_schema: ElicitationSchema::builder() requested_schema: ElicitationSchema::builder()
.property("value", PrimitiveSchema::String(StringSchema::new())) .property("value", PrimitiveSchema::String(StringSchema::new()))
@ -246,7 +250,8 @@ async fn test_elicitation_performance() {
.build() .build()
.unwrap(); .unwrap();
let request = CreateElicitationRequestParam { let request = CreateElicitationRequestParams {
meta: None,
message: "Performance test message".to_string(), message: "Performance test message".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
@ -256,7 +261,7 @@ async fn test_elicitation_performance() {
// Serialize/deserialize 1000 times // Serialize/deserialize 1000 times
for _ in 0..1000 { for _ in 0..1000 {
let json = serde_json::to_value(&request).unwrap(); 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(); let duration = start.elapsed();
@ -369,8 +374,9 @@ async fn test_elicitation_convenience_methods() {
.contains("Option A") .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 = CreateElicitationRequestParam { let confirmation_request = CreateElicitationRequestParams {
meta: None,
message: "Test confirmation".to_string(), message: "Test confirmation".to_string(),
requested_schema: ElicitationSchema::builder() requested_schema: ElicitationSchema::builder()
.property( .property(
@ -412,14 +418,15 @@ async fn test_elicitation_structured_schemas() {
.build() .build()
.unwrap(); .unwrap();
let request = CreateElicitationRequestParam { let request = CreateElicitationRequestParams {
meta: None,
message: "Please provide your user information".to_string(), message: "Please provide your user information".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
// Test that complex schemas serialize/deserialize correctly // Test that complex schemas serialize/deserialize correctly
let json = serde_json::to_value(&request).unwrap(); 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.message, "Please provide your user information");
assert_eq!(deserialized.requested_schema.properties.len(), 5); assert_eq!(deserialized.requested_schema.properties.len(), 5);
@ -654,14 +661,15 @@ async fn test_elicitation_multi_select_enum() {
.build() .build()
.unwrap(); .unwrap();
let request = CreateElicitationRequestParam { let request = CreateElicitationRequestParams {
meta: None,
message: "Please provide your user information".to_string(), message: "Please provide your user information".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
// Test that complex schemas serialize/deserialize correctly // Test that complex schemas serialize/deserialize correctly
let json = serde_json::to_value(&request).unwrap(); 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.message, "Please provide your user information");
assert_eq!(deserialized.requested_schema.properties.len(), 1); assert_eq!(deserialized.requested_schema.properties.len(), 1);
@ -735,14 +743,15 @@ async fn test_elicitation_single_select_enum() {
.build() .build()
.unwrap(); .unwrap();
let request = CreateElicitationRequestParam { let request = CreateElicitationRequestParams {
meta: None,
message: "Please provide your user information".to_string(), message: "Please provide your user information".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
// Test that complex schemas serialize/deserialize correctly // Test that complex schemas serialize/deserialize correctly
let json = serde_json::to_value(&request).unwrap(); 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.message, "Please provide your user information");
assert_eq!(deserialized.requested_schema.properties.len(), 1); assert_eq!(deserialized.requested_schema.properties.len(), 1);
assert!( assert!(
@ -816,7 +825,8 @@ async fn test_elicitation_direction_server_to_client() {
.build() .build()
.unwrap(); .unwrap();
let elicitation_request = CreateElicitationRequestParam { let elicitation_request = CreateElicitationRequestParams {
meta: None,
message: "Please enter your name".to_string(), message: "Please enter your name".to_string(),
requested_schema: schema, requested_schema: schema,
}; };
@ -868,7 +878,8 @@ async fn test_elicitation_json_rpc_direction() {
let server_request = ServerJsonRpcMessage::request( let server_request = ServerJsonRpcMessage::request(
ServerRequest::CreateElicitationRequest(CreateElicitationRequest { ServerRequest::CreateElicitationRequest(CreateElicitationRequest {
method: ElicitationCreateRequestMethod, method: ElicitationCreateRequestMethod,
params: CreateElicitationRequestParam { params: CreateElicitationRequestParams {
meta: None,
message: "Do you want to continue?".to_string(), message: "Do you want to continue?".to_string(),
requested_schema: schema, requested_schema: schema,
}, },
@ -1039,8 +1050,9 @@ async fn test_client_capabilities_with_elicitation() {
/// Test InitializeRequestParam with elicitation capability /// Test InitializeRequestParam with elicitation capability
#[tokio::test] #[tokio::test]
async fn test_initialize_request_with_elicitation() { async fn test_initialize_request_with_elicitation() {
// Test InitializeRequestParam with elicitation capability // Test InitializeRequestParams with elicitation capability
let init_param = InitializeRequestParam { let init_param = InitializeRequestParams {
meta: None,
protocol_version: ProtocolVersion::LATEST, protocol_version: ProtocolVersion::LATEST,
capabilities: ClientCapabilities { capabilities: ClientCapabilities {
elicitation: Some(ElicitationCapability { elicitation: Some(ElicitationCapability {
@ -1084,7 +1096,8 @@ async fn test_capability_checking_logic() {
// Simulate the logic that would be used in supports_elicitation() // Simulate the logic that would be used in supports_elicitation()
// Case 1: Client with elicitation capability // Case 1: Client with elicitation capability
let client_with_capability = InitializeRequestParam { let client_with_capability = InitializeRequestParams {
meta: None,
protocol_version: ProtocolVersion::LATEST, protocol_version: ProtocolVersion::LATEST,
capabilities: ClientCapabilities { capabilities: ClientCapabilities {
elicitation: Some(ElicitationCapability { elicitation: Some(ElicitationCapability {
@ -1106,7 +1119,8 @@ async fn test_capability_checking_logic() {
assert!(supports_elicitation); assert!(supports_elicitation);
// Case 2: Client without elicitation capability // Case 2: Client without elicitation capability
let client_without_capability = InitializeRequestParam { let client_without_capability = InitializeRequestParams {
meta: None,
protocol_version: ProtocolVersion::LATEST, protocol_version: ProtocolVersion::LATEST,
capabilities: ClientCapabilities { capabilities: ClientCapabilities {
elicitation: None, elicitation: None,
@ -1308,7 +1322,8 @@ async fn test_create_elicitation_with_timeout_basic() {
.build() .build()
.unwrap(); .unwrap();
let _params = CreateElicitationRequestParam { let _params = CreateElicitationRequestParams {
meta: None,
message: "Enter your details".to_string(), message: "Enter your details".to_string(),
requested_schema: schema, requested_schema: schema,
}; };

View file

@ -6,7 +6,7 @@ use std::sync::{Arc, Mutex};
use common::handlers::{TestClientHandler, TestServer}; use common::handlers::{TestClientHandler, TestServer};
use rmcp::{ use rmcp::{
ServiceExt, ServiceExt,
model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParam}, model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParams},
}; };
use serde_json::json; use serde_json::json;
use tokio::sync::Notify; use tokio::sync::Notify;
@ -63,7 +63,7 @@ async fn test_logging_spec_compliance() -> anyhow::Result<()> {
] { ] {
client client
.peer() .peer()
.set_level(SetLevelRequestParam { level }) .set_level(SetLevelRequestParams { meta: None, level })
.await?; .await?;
// Wait for each message response // Wait for each message response
@ -121,7 +121,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
// Test 1: Error reporting scenario // Test 1: Error reporting scenario
client client
.peer() .peer()
.set_level(SetLevelRequestParam { .set_level(SetLevelRequestParams {
meta: None,
level: LoggingLevel::Error, level: LoggingLevel::Error,
}) })
.await?; .await?;
@ -147,7 +148,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
// Test 2: Debug scenario // Test 2: Debug scenario
client client
.peer() .peer()
.set_level(SetLevelRequestParam { .set_level(SetLevelRequestParams {
meta: None,
level: LoggingLevel::Debug, level: LoggingLevel::Debug,
}) })
.await?; .await?;
@ -170,7 +172,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
// Test 3: Production monitoring scenario // Test 3: Production monitoring scenario
client client
.peer() .peer()
.set_level(SetLevelRequestParam { .set_level(SetLevelRequestParams {
meta: None,
level: LoggingLevel::Info, level: LoggingLevel::Info,
}) })
.await?; .await?;
@ -256,7 +259,7 @@ async fn test_logging_edge_cases() -> anyhow::Result<()> {
] { ] {
client client
.peer() .peer()
.set_level(SetLevelRequestParam { level }) .set_level(SetLevelRequestParams { meta: None, level })
.await?; .await?;
receive_signal.notified().await; receive_signal.notified().await;
@ -316,7 +319,7 @@ async fn test_logging_optional_fields() -> anyhow::Result<()> {
for level in [LoggingLevel::Info, LoggingLevel::Debug] { for level in [LoggingLevel::Info, LoggingLevel::Debug] {
client client
.peer() .peer()
.set_level(SetLevelRequestParam { level }) .set_level(SetLevelRequestParams { meta: None, level })
.await?; .await?;
// Wait for each message response // Wait for each message response

View file

@ -47,7 +47,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
// Test ThisServer context inclusion // Test ThisServer context inclusion
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -89,7 +91,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
// Test AllServers context inclusion // Test AllServers context inclusion
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -131,7 +135,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
// Test No context inclusion // Test No context inclusion
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -193,7 +199,9 @@ async fn test_context_inclusion_ignored_integration() -> anyhow::Result<()> {
// Test that context requests are ignored // Test that context requests are ignored
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -254,7 +262,9 @@ async fn test_message_sequence_integration() -> anyhow::Result<()> {
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![ messages: vec![
SamplingMessage { SamplingMessage {
role: Role::User, role: Role::User,
@ -325,7 +335,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
// Test valid sequence: User -> Assistant -> User // Test valid sequence: User -> Assistant -> User
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![ messages: vec![
SamplingMessage { SamplingMessage {
role: Role::User, role: Role::User,
@ -369,7 +381,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
// Test invalid: No user message // Test invalid: No user message
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::Assistant, role: Role::Assistant,
content: Content::text("assistant message"), content: Content::text("assistant message"),
@ -422,7 +436,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
// Test ThisServer is honored // Test ThisServer is honored
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -462,7 +478,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
// Test AllServers is ignored // Test AllServers is ignored
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test message"), content: Content::text("test message"),
@ -519,7 +537,9 @@ async fn test_context_inclusion() -> anyhow::Result<()> {
// Test context handling // Test context handling
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest { let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
method: Default::default(), method: Default::default(),
params: CreateMessageRequestParam { params: CreateMessageRequestParams {
meta: None,
task: None,
messages: vec![SamplingMessage { messages: vec![SamplingMessage {
role: Role::User, role: Role::User,
content: Content::text("test"), content: Content::text("test"),

View file

@ -187,10 +187,18 @@
"format": "const", "format": "const",
"const": "tools/call" "const": "tools/call"
}, },
"CallToolRequestParam": { "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"arguments": { "arguments": {
"description": "Arguments to pass to the tool (must match the tool's input schema)", "description": "Arguments to pass to the tool (must match the tool's input schema)",
"type": [ "type": [
@ -204,6 +212,7 @@
"type": "string" "type": "string"
}, },
"task": { "task": {
"description": "Task metadata for async task management (SEP-1319)",
"type": [ "type": [
"object", "object",
"null" "null"
@ -220,9 +229,17 @@
"format": "const", "format": "const",
"const": "tasks/cancel" "const": "tasks/cancel"
}, },
"CancelTaskParam": { "CancelTaskParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -332,9 +349,17 @@
"format": "const", "format": "const",
"const": "completion/complete" "const": "completion/complete"
}, },
"CompleteRequestParam": { "CompleteRequestParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"argument": { "argument": {
"$ref": "#/definitions/ArgumentInfo" "$ref": "#/definitions/ArgumentInfo"
}, },
@ -534,10 +559,18 @@
"format": "const", "format": "const",
"const": "prompts/get" "const": "prompts/get"
}, },
"GetPromptRequestParam": { "GetPromptRequestParams": {
"description": "Parameters for retrieving a specific prompt", "description": "Parameters for retrieving a specific prompt",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"arguments": { "arguments": {
"type": [ "type": [
"object", "object",
@ -558,9 +591,17 @@
"format": "const", "format": "const",
"const": "tasks/get" "const": "tasks/get"
}, },
"GetTaskInfoParam": { "GetTaskInfoParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -574,9 +615,17 @@
"format": "const", "format": "const",
"const": "tasks/result" "const": "tasks/result"
}, },
"GetTaskResultParam": { "GetTaskResultParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -651,10 +700,18 @@
"version" "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"capabilities": { "capabilities": {
"description": "The capabilities this client supports (sampling, roots, etc.)", "description": "The capabilities this client supports (sampling, roots, etc.)",
"allOf": [ "allOf": [
@ -953,9 +1010,17 @@
} }
] ]
}, },
"PaginatedRequestParam": { "PaginatedRequestParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"cursor": { "cursor": {
"type": [ "type": [
"string", "string",
@ -1183,10 +1248,18 @@
"format": "const", "format": "const",
"const": "resources/read" "const": "resources/read"
}, },
"ReadResourceRequestParam": { "ReadResourceRequestParams": {
"description": "Parameters for reading a specific resource", "description": "Parameters for reading a specific resource",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to read", "description": "The URI of the resource to read",
"type": "string" "type": "string"
@ -1242,7 +1315,7 @@
"$ref": "#/definitions/InitializeResultMethod" "$ref": "#/definitions/InitializeResultMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/InitializeRequestParam" "$ref": "#/definitions/InitializeRequestParams"
} }
}, },
"required": [ "required": [
@ -1258,7 +1331,7 @@
"$ref": "#/definitions/GetTaskResultMethod" "$ref": "#/definitions/GetTaskResultMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetTaskResultParam" "$ref": "#/definitions/GetTaskResultParams"
} }
}, },
"required": [ "required": [
@ -1274,7 +1347,7 @@
"$ref": "#/definitions/CancelTaskMethod" "$ref": "#/definitions/CancelTaskMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CancelTaskParam" "$ref": "#/definitions/CancelTaskParams"
} }
}, },
"required": [ "required": [
@ -1290,7 +1363,7 @@
"$ref": "#/definitions/CompleteRequestMethod" "$ref": "#/definitions/CompleteRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CompleteRequestParam" "$ref": "#/definitions/CompleteRequestParams"
} }
}, },
"required": [ "required": [
@ -1306,7 +1379,7 @@
"$ref": "#/definitions/SetLevelRequestMethod" "$ref": "#/definitions/SetLevelRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/SetLevelRequestParam" "$ref": "#/definitions/SetLevelRequestParams"
} }
}, },
"required": [ "required": [
@ -1322,7 +1395,7 @@
"$ref": "#/definitions/GetPromptRequestMethod" "$ref": "#/definitions/GetPromptRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetPromptRequestParam" "$ref": "#/definitions/GetPromptRequestParams"
} }
}, },
"required": [ "required": [
@ -1338,7 +1411,7 @@
"$ref": "#/definitions/ReadResourceRequestMethod" "$ref": "#/definitions/ReadResourceRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/ReadResourceRequestParam" "$ref": "#/definitions/ReadResourceRequestParams"
} }
}, },
"required": [ "required": [
@ -1354,7 +1427,7 @@
"$ref": "#/definitions/SubscribeRequestMethod" "$ref": "#/definitions/SubscribeRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/SubscribeRequestParam" "$ref": "#/definitions/SubscribeRequestParams"
} }
}, },
"required": [ "required": [
@ -1370,7 +1443,7 @@
"$ref": "#/definitions/UnsubscribeRequestMethod" "$ref": "#/definitions/UnsubscribeRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/UnsubscribeRequestParam" "$ref": "#/definitions/UnsubscribeRequestParams"
} }
}, },
"required": [ "required": [
@ -1386,7 +1459,7 @@
"$ref": "#/definitions/CallToolRequestMethod" "$ref": "#/definitions/CallToolRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CallToolRequestParam" "$ref": "#/definitions/CallToolRequestParams"
} }
}, },
"required": [ "required": [
@ -1402,7 +1475,7 @@
"$ref": "#/definitions/GetTaskInfoMethod" "$ref": "#/definitions/GetTaskInfoMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetTaskInfoParam" "$ref": "#/definitions/GetTaskInfoParams"
} }
}, },
"required": [ "required": [
@ -1430,7 +1503,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1451,7 +1524,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1472,7 +1545,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1493,7 +1566,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1514,7 +1587,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1650,10 +1723,18 @@
"format": "const", "format": "const",
"const": "logging/setLevel" "const": "logging/setLevel"
}, },
"SetLevelRequestParam": { "SetLevelRequestParams": {
"description": "Parameters for setting the logging level", "description": "Parameters for setting the logging level",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"level": { "level": {
"description": "The desired logging level", "description": "The desired logging level",
"allOf": [ "allOf": [
@ -1672,10 +1753,18 @@
"format": "const", "format": "const",
"const": "resources/subscribe" "const": "resources/subscribe"
}, },
"SubscribeRequestParam": { "SubscribeRequestParams": {
"description": "Parameters for subscribing to resource updates", "description": "Parameters for subscribing to resource updates",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to subscribe to", "description": "The URI of the resource to subscribe to",
"type": "string" "type": "string"
@ -1720,10 +1809,18 @@
"format": "const", "format": "const",
"const": "resources/unsubscribe" "const": "resources/unsubscribe"
}, },
"UnsubscribeRequestParam": { "UnsubscribeRequestParams": {
"description": "Parameters for unsubscribing from resource updates", "description": "Parameters for unsubscribing from resource updates",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to unsubscribe from", "description": "The URI of the resource to unsubscribe from",
"type": "string" "type": "string"

View file

@ -187,10 +187,18 @@
"format": "const", "format": "const",
"const": "tools/call" "const": "tools/call"
}, },
"CallToolRequestParam": { "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"arguments": { "arguments": {
"description": "Arguments to pass to the tool (must match the tool's input schema)", "description": "Arguments to pass to the tool (must match the tool's input schema)",
"type": [ "type": [
@ -204,6 +212,7 @@
"type": "string" "type": "string"
}, },
"task": { "task": {
"description": "Task metadata for async task management (SEP-1319)",
"type": [ "type": [
"object", "object",
"null" "null"
@ -220,9 +229,17 @@
"format": "const", "format": "const",
"const": "tasks/cancel" "const": "tasks/cancel"
}, },
"CancelTaskParam": { "CancelTaskParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -332,9 +349,17 @@
"format": "const", "format": "const",
"const": "completion/complete" "const": "completion/complete"
}, },
"CompleteRequestParam": { "CompleteRequestParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"argument": { "argument": {
"$ref": "#/definitions/ArgumentInfo" "$ref": "#/definitions/ArgumentInfo"
}, },
@ -534,10 +559,18 @@
"format": "const", "format": "const",
"const": "prompts/get" "const": "prompts/get"
}, },
"GetPromptRequestParam": { "GetPromptRequestParams": {
"description": "Parameters for retrieving a specific prompt", "description": "Parameters for retrieving a specific prompt",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"arguments": { "arguments": {
"type": [ "type": [
"object", "object",
@ -558,9 +591,17 @@
"format": "const", "format": "const",
"const": "tasks/get" "const": "tasks/get"
}, },
"GetTaskInfoParam": { "GetTaskInfoParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -574,9 +615,17 @@
"format": "const", "format": "const",
"const": "tasks/result" "const": "tasks/result"
}, },
"GetTaskResultParam": { "GetTaskResultParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"taskId": { "taskId": {
"type": "string" "type": "string"
} }
@ -651,10 +700,18 @@
"version" "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"capabilities": { "capabilities": {
"description": "The capabilities this client supports (sampling, roots, etc.)", "description": "The capabilities this client supports (sampling, roots, etc.)",
"allOf": [ "allOf": [
@ -953,9 +1010,17 @@
} }
] ]
}, },
"PaginatedRequestParam": { "PaginatedRequestParams": {
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"cursor": { "cursor": {
"type": [ "type": [
"string", "string",
@ -1183,10 +1248,18 @@
"format": "const", "format": "const",
"const": "resources/read" "const": "resources/read"
}, },
"ReadResourceRequestParam": { "ReadResourceRequestParams": {
"description": "Parameters for reading a specific resource", "description": "Parameters for reading a specific resource",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to read", "description": "The URI of the resource to read",
"type": "string" "type": "string"
@ -1242,7 +1315,7 @@
"$ref": "#/definitions/InitializeResultMethod" "$ref": "#/definitions/InitializeResultMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/InitializeRequestParam" "$ref": "#/definitions/InitializeRequestParams"
} }
}, },
"required": [ "required": [
@ -1258,7 +1331,7 @@
"$ref": "#/definitions/GetTaskResultMethod" "$ref": "#/definitions/GetTaskResultMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetTaskResultParam" "$ref": "#/definitions/GetTaskResultParams"
} }
}, },
"required": [ "required": [
@ -1274,7 +1347,7 @@
"$ref": "#/definitions/CancelTaskMethod" "$ref": "#/definitions/CancelTaskMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CancelTaskParam" "$ref": "#/definitions/CancelTaskParams"
} }
}, },
"required": [ "required": [
@ -1290,7 +1363,7 @@
"$ref": "#/definitions/CompleteRequestMethod" "$ref": "#/definitions/CompleteRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CompleteRequestParam" "$ref": "#/definitions/CompleteRequestParams"
} }
}, },
"required": [ "required": [
@ -1306,7 +1379,7 @@
"$ref": "#/definitions/SetLevelRequestMethod" "$ref": "#/definitions/SetLevelRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/SetLevelRequestParam" "$ref": "#/definitions/SetLevelRequestParams"
} }
}, },
"required": [ "required": [
@ -1322,7 +1395,7 @@
"$ref": "#/definitions/GetPromptRequestMethod" "$ref": "#/definitions/GetPromptRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetPromptRequestParam" "$ref": "#/definitions/GetPromptRequestParams"
} }
}, },
"required": [ "required": [
@ -1338,7 +1411,7 @@
"$ref": "#/definitions/ReadResourceRequestMethod" "$ref": "#/definitions/ReadResourceRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/ReadResourceRequestParam" "$ref": "#/definitions/ReadResourceRequestParams"
} }
}, },
"required": [ "required": [
@ -1354,7 +1427,7 @@
"$ref": "#/definitions/SubscribeRequestMethod" "$ref": "#/definitions/SubscribeRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/SubscribeRequestParam" "$ref": "#/definitions/SubscribeRequestParams"
} }
}, },
"required": [ "required": [
@ -1370,7 +1443,7 @@
"$ref": "#/definitions/UnsubscribeRequestMethod" "$ref": "#/definitions/UnsubscribeRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/UnsubscribeRequestParam" "$ref": "#/definitions/UnsubscribeRequestParams"
} }
}, },
"required": [ "required": [
@ -1386,7 +1459,7 @@
"$ref": "#/definitions/CallToolRequestMethod" "$ref": "#/definitions/CallToolRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CallToolRequestParam" "$ref": "#/definitions/CallToolRequestParams"
} }
}, },
"required": [ "required": [
@ -1402,7 +1475,7 @@
"$ref": "#/definitions/GetTaskInfoMethod" "$ref": "#/definitions/GetTaskInfoMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/GetTaskInfoParam" "$ref": "#/definitions/GetTaskInfoParams"
} }
}, },
"required": [ "required": [
@ -1430,7 +1503,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1451,7 +1524,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1472,7 +1545,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1493,7 +1566,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1514,7 +1587,7 @@
"params": { "params": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/PaginatedRequestParam" "$ref": "#/definitions/PaginatedRequestParams"
}, },
{ {
"type": "null" "type": "null"
@ -1650,10 +1723,18 @@
"format": "const", "format": "const",
"const": "logging/setLevel" "const": "logging/setLevel"
}, },
"SetLevelRequestParam": { "SetLevelRequestParams": {
"description": "Parameters for setting the logging level", "description": "Parameters for setting the logging level",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"level": { "level": {
"description": "The desired logging level", "description": "The desired logging level",
"allOf": [ "allOf": [
@ -1672,10 +1753,18 @@
"format": "const", "format": "const",
"const": "resources/subscribe" "const": "resources/subscribe"
}, },
"SubscribeRequestParam": { "SubscribeRequestParams": {
"description": "Parameters for subscribing to resource updates", "description": "Parameters for subscribing to resource updates",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to subscribe to", "description": "The URI of the resource to subscribe to",
"type": "string" "type": "string"
@ -1720,10 +1809,18 @@
"format": "const", "format": "const",
"const": "resources/unsubscribe" "const": "resources/unsubscribe"
}, },
"UnsubscribeRequestParam": { "UnsubscribeRequestParams": {
"description": "Parameters for unsubscribing from resource updates", "description": "Parameters for unsubscribing from resource updates",
"type": "object", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"uri": { "uri": {
"description": "The URI of the resource to unsubscribe from", "description": "The URI of the resource to unsubscribe from",
"type": "string" "type": "string"

View file

@ -504,10 +504,18 @@
} }
] ]
}, },
"CreateElicitationRequestParam": { "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 = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"message": { "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.", "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" "type": "string"
@ -551,10 +559,18 @@
"format": "const", "format": "const",
"const": "sampling/createMessage" "const": "sampling/createMessage"
}, },
"CreateMessageRequestParam": { "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"includeContext": { "includeContext": {
"description": "How much context to include from MCP servers", "description": "How much context to include from MCP servers",
"anyOf": [ "anyOf": [
@ -610,6 +626,14 @@
"null" "null"
] ]
}, },
"task": {
"description": "Task metadata for async task management (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"temperature": { "temperature": {
"description": "Temperature for controlling randomness (0.0 to 1.0)", "description": "Temperature for controlling randomness (0.0 to 1.0)",
"type": [ "type": [
@ -2111,7 +2135,7 @@
"$ref": "#/definitions/CreateMessageRequestMethod" "$ref": "#/definitions/CreateMessageRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CreateMessageRequestParam" "$ref": "#/definitions/CreateMessageRequestParams"
} }
}, },
"required": [ "required": [
@ -2127,7 +2151,7 @@
"$ref": "#/definitions/ElicitationCreateRequestMethod" "$ref": "#/definitions/ElicitationCreateRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CreateElicitationRequestParam" "$ref": "#/definitions/CreateElicitationRequestParams"
} }
}, },
"required": [ "required": [

View file

@ -504,10 +504,18 @@
} }
] ]
}, },
"CreateElicitationRequestParam": { "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 = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"message": { "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.", "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" "type": "string"
@ -551,10 +559,18 @@
"format": "const", "format": "const",
"const": "sampling/createMessage" "const": "sampling/createMessage"
}, },
"CreateMessageRequestParam": { "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.", "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", "type": "object",
"properties": { "properties": {
"_meta": {
"description": "Protocol-level metadata for this request (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"includeContext": { "includeContext": {
"description": "How much context to include from MCP servers", "description": "How much context to include from MCP servers",
"anyOf": [ "anyOf": [
@ -610,6 +626,14 @@
"null" "null"
] ]
}, },
"task": {
"description": "Task metadata for async task management (SEP-1319)",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"temperature": { "temperature": {
"description": "Temperature for controlling randomness (0.0 to 1.0)", "description": "Temperature for controlling randomness (0.0 to 1.0)",
"type": [ "type": [
@ -2111,7 +2135,7 @@
"$ref": "#/definitions/CreateMessageRequestMethod" "$ref": "#/definitions/CreateMessageRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CreateMessageRequestParam" "$ref": "#/definitions/CreateMessageRequestParams"
} }
}, },
"required": [ "required": [
@ -2127,7 +2151,7 @@
"$ref": "#/definitions/ElicitationCreateRequestMethod" "$ref": "#/definitions/ElicitationCreateRequestMethod"
}, },
"params": { "params": {
"$ref": "#/definitions/CreateElicitationRequestParam" "$ref": "#/definitions/CreateElicitationRequestParams"
} }
}, },
"required": [ "required": [

View file

@ -4,7 +4,7 @@ use rmcp::{
ClientHandler, ServerHandler, ServiceExt, ClientHandler, ServerHandler, ServiceExt,
model::{ model::{
ClientNotification, CustomNotification, ResourceUpdatedNotificationParam, ClientNotification, CustomNotification, ResourceUpdatedNotificationParam,
ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParam, ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParams,
}, },
}; };
use serde_json::json; use serde_json::json;
@ -27,7 +27,7 @@ impl ServerHandler for Server {
async fn subscribe( async fn subscribe(
&self, &self,
request: rmcp::model::SubscribeRequestParam, request: rmcp::model::SubscribeRequestParams,
context: rmcp::service::RequestContext<rmcp::RoleServer>, context: rmcp::service::RequestContext<rmcp::RoleServer>,
) -> Result<(), rmcp::ErrorData> { ) -> Result<(), rmcp::ErrorData> {
let uri = request.uri; let uri = request.uri;
@ -87,7 +87,8 @@ async fn test_server_notification() -> anyhow::Result<()> {
.serve(client_transport) .serve(client_transport)
.await?; .await?;
client client
.subscribe(SubscribeRequestParam { .subscribe(SubscribeRequestParams {
meta: None,
uri: "test://test-resource".to_owned(), uri: "test://test-resource".to_owned(),
}) })
.await?; .await?;

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