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:
parent
48e989b711
commit
9e881a645b
38 changed files with 913 additions and 278 deletions
|
|
@ -28,7 +28,7 @@ pub fn prompt_handler(attr: TokenStream, input: TokenStream) -> syn::Result<Toke
|
|||
let get_prompt_impl: ImplItem = parse_quote! {
|
||||
async fn get_prompt(
|
||||
&self,
|
||||
request: GetPromptRequestParam,
|
||||
request: GetPromptRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> Result<GetPromptResult, rmcp::ErrorData> {
|
||||
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! {
|
||||
async fn list_prompts(
|
||||
&self,
|
||||
_request: Option<PaginatedRequestParam>,
|
||||
_request: Option<PaginatedRequestParams>,
|
||||
_context: RequestContext<RoleServer>,
|
||||
) -> Result<ListPromptsResult, rmcp::ErrorData> {
|
||||
let prompts = #router_expr.list_all();
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ pub fn tool_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
|
|||
let tool_call_fn = quote! {
|
||||
async fn call_tool(
|
||||
&self,
|
||||
request: rmcp::model::CallToolRequestParam,
|
||||
request: rmcp::model::CallToolRequestParams,
|
||||
context: rmcp::service::RequestContext<rmcp::RoleServer>,
|
||||
) -> Result<rmcp::model::CallToolResult, rmcp::ErrorData> {
|
||||
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! {
|
||||
async fn list_tools(
|
||||
&self,
|
||||
_request: Option<rmcp::model::PaginatedRequestParam>,
|
||||
_request: Option<rmcp::model::PaginatedRequestParams>,
|
||||
_context: rmcp::service::RequestContext<rmcp::RoleServer>,
|
||||
) -> Result<rmcp::model::ListToolsResult, rmcp::ErrorData> {
|
||||
Ok(rmcp::model::ListToolsResult{
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static {
|
|||
|
||||
fn create_message(
|
||||
&self,
|
||||
params: CreateMessageRequestParam,
|
||||
params: CreateMessageRequestParams,
|
||||
context: RequestContext<RoleClient>,
|
||||
) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(
|
||||
|
|
@ -118,7 +118,7 @@ pub trait ClientHandler: Sized + Send + Sync + 'static {
|
|||
/// Real clients should override this to provide user interaction.
|
||||
fn create_elicitation(
|
||||
&self,
|
||||
request: CreateElicitationRequestParam,
|
||||
request: CreateElicitationRequestParams,
|
||||
context: RequestContext<RoleClient>,
|
||||
) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ {
|
||||
// Default implementation declines all requests - real clients should override this
|
||||
|
|
@ -225,7 +225,7 @@ macro_rules! impl_client_handler_for_wrapper {
|
|||
|
||||
fn create_message(
|
||||
&self,
|
||||
params: CreateMessageRequestParam,
|
||||
params: CreateMessageRequestParams,
|
||||
context: RequestContext<RoleClient>,
|
||||
) -> impl Future<Output = Result<CreateMessageResult, McpError>> + Send + '_ {
|
||||
(**self).create_message(params, context)
|
||||
|
|
@ -240,7 +240,7 @@ macro_rules! impl_client_handler_for_wrapper {
|
|||
|
||||
fn create_elicitation(
|
||||
&self,
|
||||
request: CreateElicitationRequestParam,
|
||||
request: CreateElicitationRequestParams,
|
||||
context: RequestContext<RoleClient>,
|
||||
) -> impl Future<Output = Result<CreateElicitationResult, McpError>> + Send + '_ {
|
||||
(**self).create_elicitation(request, context)
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ impl<H: ServerHandler> Service<RoleServer> for H {
|
|||
pub trait ServerHandler: Sized + Send + Sync + 'static {
|
||||
fn enqueue_task(
|
||||
&self,
|
||||
_request: CallToolRequestParam,
|
||||
_request: CallToolRequestParams,
|
||||
_context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::internal_error(
|
||||
|
|
@ -154,7 +154,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
// handle requests
|
||||
fn initialize(
|
||||
&self,
|
||||
request: InitializeRequestParam,
|
||||
request: InitializeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ {
|
||||
if context.peer.peer_info().is_none() {
|
||||
|
|
@ -164,49 +164,49 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
}
|
||||
fn complete(
|
||||
&self,
|
||||
request: CompleteRequestParam,
|
||||
request: CompleteRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Ok(CompleteResult::default()))
|
||||
}
|
||||
fn set_level(
|
||||
&self,
|
||||
request: SetLevelRequestParam,
|
||||
request: SetLevelRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<SetLevelRequestMethod>()))
|
||||
}
|
||||
fn get_prompt(
|
||||
&self,
|
||||
request: GetPromptRequestParam,
|
||||
request: GetPromptRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<GetPromptRequestMethod>()))
|
||||
}
|
||||
fn list_prompts(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Ok(ListPromptsResult::default()))
|
||||
}
|
||||
fn list_resources(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Ok(ListResourcesResult::default()))
|
||||
}
|
||||
fn list_resource_templates(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Ok(ListResourceTemplatesResult::default()))
|
||||
}
|
||||
fn read_resource(
|
||||
&self,
|
||||
request: ReadResourceRequestParam,
|
||||
request: ReadResourceRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(
|
||||
|
|
@ -215,28 +215,28 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
}
|
||||
fn subscribe(
|
||||
&self,
|
||||
request: SubscribeRequestParam,
|
||||
request: SubscribeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<SubscribeRequestMethod>()))
|
||||
}
|
||||
fn unsubscribe(
|
||||
&self,
|
||||
request: UnsubscribeRequestParam,
|
||||
request: UnsubscribeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<UnsubscribeRequestMethod>()))
|
||||
}
|
||||
fn call_tool(
|
||||
&self,
|
||||
request: CallToolRequestParam,
|
||||
request: CallToolRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<CallToolRequestMethod>()))
|
||||
}
|
||||
fn list_tools(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Ok(ListToolsResult::default()))
|
||||
|
|
@ -297,7 +297,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
|
||||
fn list_tasks(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<ListTasksMethod>()))
|
||||
|
|
@ -305,7 +305,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
|
||||
fn get_task_info(
|
||||
&self,
|
||||
request: GetTaskInfoParam,
|
||||
request: GetTaskInfoParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ {
|
||||
std::future::ready(Err(McpError::method_not_found::<GetTaskInfoMethod>()))
|
||||
|
|
@ -313,7 +313,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
|
||||
fn get_task_result(
|
||||
&self,
|
||||
request: GetTaskResultParam,
|
||||
request: GetTaskResultParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ {
|
||||
let _ = (request, context);
|
||||
|
|
@ -322,7 +322,7 @@ pub trait ServerHandler: Sized + Send + Sync + 'static {
|
|||
|
||||
fn cancel_task(
|
||||
&self,
|
||||
request: CancelTaskParam,
|
||||
request: CancelTaskParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
let _ = (request, context);
|
||||
|
|
@ -335,7 +335,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
impl<T: ServerHandler> ServerHandler for $wrapper<T> {
|
||||
fn enqueue_task(
|
||||
&self,
|
||||
request: CallToolRequestParam,
|
||||
request: CallToolRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CreateTaskResult, McpError>> + Send + '_ {
|
||||
(**self).enqueue_task(request, context)
|
||||
|
|
@ -350,7 +350,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn initialize(
|
||||
&self,
|
||||
request: InitializeRequestParam,
|
||||
request: InitializeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<InitializeResult, McpError>> + Send + '_ {
|
||||
(**self).initialize(request, context)
|
||||
|
|
@ -358,7 +358,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn complete(
|
||||
&self,
|
||||
request: CompleteRequestParam,
|
||||
request: CompleteRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CompleteResult, McpError>> + Send + '_ {
|
||||
(**self).complete(request, context)
|
||||
|
|
@ -366,7 +366,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn set_level(
|
||||
&self,
|
||||
request: SetLevelRequestParam,
|
||||
request: SetLevelRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
(**self).set_level(request, context)
|
||||
|
|
@ -374,7 +374,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn get_prompt(
|
||||
&self,
|
||||
request: GetPromptRequestParam,
|
||||
request: GetPromptRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<GetPromptResult, McpError>> + Send + '_ {
|
||||
(**self).get_prompt(request, context)
|
||||
|
|
@ -382,7 +382,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn list_prompts(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListPromptsResult, McpError>> + Send + '_ {
|
||||
(**self).list_prompts(request, context)
|
||||
|
|
@ -390,7 +390,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn list_resources(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListResourcesResult, McpError>> + Send + '_ {
|
||||
(**self).list_resources(request, context)
|
||||
|
|
@ -398,7 +398,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn list_resource_templates(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListResourceTemplatesResult, McpError>> + Send + '_
|
||||
{
|
||||
|
|
@ -407,7 +407,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn read_resource(
|
||||
&self,
|
||||
request: ReadResourceRequestParam,
|
||||
request: ReadResourceRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ReadResourceResult, McpError>> + Send + '_ {
|
||||
(**self).read_resource(request, context)
|
||||
|
|
@ -415,7 +415,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn subscribe(
|
||||
&self,
|
||||
request: SubscribeRequestParam,
|
||||
request: SubscribeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
(**self).subscribe(request, context)
|
||||
|
|
@ -423,7 +423,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn unsubscribe(
|
||||
&self,
|
||||
request: UnsubscribeRequestParam,
|
||||
request: UnsubscribeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
(**self).unsubscribe(request, context)
|
||||
|
|
@ -431,7 +431,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn call_tool(
|
||||
&self,
|
||||
request: CallToolRequestParam,
|
||||
request: CallToolRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<CallToolResult, McpError>> + Send + '_ {
|
||||
(**self).call_tool(request, context)
|
||||
|
|
@ -439,7 +439,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn list_tools(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListToolsResult, McpError>> + Send + '_ {
|
||||
(**self).list_tools(request, context)
|
||||
|
|
@ -497,7 +497,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn list_tasks(
|
||||
&self,
|
||||
request: Option<PaginatedRequestParam>,
|
||||
request: Option<PaginatedRequestParams>,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<ListTasksResult, McpError>> + Send + '_ {
|
||||
(**self).list_tasks(request, context)
|
||||
|
|
@ -505,7 +505,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn get_task_info(
|
||||
&self,
|
||||
request: GetTaskInfoParam,
|
||||
request: GetTaskInfoParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<GetTaskInfoResult, McpError>> + Send + '_ {
|
||||
(**self).get_task_info(request, context)
|
||||
|
|
@ -513,7 +513,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn get_task_result(
|
||||
&self,
|
||||
request: GetTaskResultParam,
|
||||
request: GetTaskResultParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<TaskResult, McpError>> + Send + '_ {
|
||||
(**self).get_task_result(request, context)
|
||||
|
|
@ -521,7 +521,7 @@ macro_rules! impl_server_handler_for_wrapper {
|
|||
|
||||
fn cancel_task(
|
||||
&self,
|
||||
request: CancelTaskParam,
|
||||
request: CancelTaskParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
(**self).cancel_task(request, context)
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ pub use super::{
|
|||
use crate::{
|
||||
RoleServer,
|
||||
handler::server::wrapper::Parameters,
|
||||
model::{CallToolRequestParam, CallToolResult, IntoContents, JsonObject},
|
||||
model::{CallToolRequestParams, CallToolResult, IntoContents, JsonObject},
|
||||
service::RequestContext,
|
||||
};
|
||||
|
||||
|
|
@ -39,11 +39,12 @@ pub struct ToolCallContext<'s, S> {
|
|||
impl<'s, S> ToolCallContext<'s, S> {
|
||||
pub fn new(
|
||||
service: &'s S,
|
||||
CallToolRequestParam {
|
||||
CallToolRequestParams {
|
||||
meta: _,
|
||||
name,
|
||||
arguments,
|
||||
task,
|
||||
}: CallToolRequestParam,
|
||||
}: CallToolRequestParams,
|
||||
request_context: RequestContext<RoleServer>,
|
||||
) -> Self {
|
||||
Self {
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
//!
|
||||
//! ```rust
|
||||
//! use anyhow::Result;
|
||||
//! use rmcp::{model::CallToolRequestParam, service::ServiceExt};
|
||||
//! use rmcp::{model::CallToolRequestParams, service::ServiceExt};
|
||||
//! #[cfg(feature = "transport-child-process")]
|
||||
//! #[cfg_attr(docsrs, doc(cfg(feature = "transport-child-process")))]
|
||||
//! use rmcp::transport::{TokioChildProcess, ConfigureCommandExt};
|
||||
|
|
@ -127,7 +127,8 @@
|
|||
//!
|
||||
//! // Call tool 'git_status' with arguments = {"repo_path": "."}
|
||||
//! let tool_result = service
|
||||
//! .call_tool(CallToolRequestParam {
|
||||
//! .call_tool(CallToolRequestParams {
|
||||
//! meta: None,
|
||||
//! name: "git_status".into(),
|
||||
//! arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(),
|
||||
//! task: None,
|
||||
|
|
|
|||
|
|
@ -718,7 +718,7 @@ impl CustomRequest {
|
|||
const_string!(InitializeResultMethod = "initialize");
|
||||
/// # Initialization
|
||||
/// This request is sent from the client to the server when it first connects, asking it to begin initialization.
|
||||
pub type InitializeRequest = Request<InitializeResultMethod, InitializeRequestParam>;
|
||||
pub type InitializeRequest = Request<InitializeResultMethod, InitializeRequestParams>;
|
||||
|
||||
const_string!(InitializedNotificationMethod = "notifications/initialized");
|
||||
/// This notification is sent from the client to the server after initialization has finished.
|
||||
|
|
@ -731,7 +731,10 @@ pub type InitializedNotification = NotificationNoParam<InitializedNotificationMe
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[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
|
||||
pub protocol_version: ProtocolVersion,
|
||||
/// The capabilities this client supports (sampling, roots, etc.)
|
||||
|
|
@ -740,6 +743,19 @@ pub struct InitializeRequestParam {
|
|||
pub client_info: Implementation,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for InitializeRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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.
|
||||
///
|
||||
/// Contains the server's protocol version, capabilities, and implementation
|
||||
|
|
@ -760,7 +776,7 @@ pub struct InitializeResult {
|
|||
}
|
||||
|
||||
pub type ServerInfo = InitializeResult;
|
||||
pub type ClientInfo = InitializeRequestParam;
|
||||
pub type ClientInfo = InitializeRequestParams;
|
||||
|
||||
#[allow(clippy::derivable_impls)]
|
||||
impl Default for ServerInfo {
|
||||
|
|
@ -778,6 +794,7 @@ impl Default for ServerInfo {
|
|||
impl Default for ClientInfo {
|
||||
fn default() -> Self {
|
||||
ClientInfo {
|
||||
meta: None,
|
||||
protocol_version: ProtocolVersion::default(),
|
||||
capabilities: ClientCapabilities::default(),
|
||||
client_info: Implementation::from_build_env(),
|
||||
|
|
@ -843,10 +860,26 @@ impl Implementation {
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct PaginatedRequestParam {
|
||||
pub struct PaginatedRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
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
|
||||
// =============================================================================
|
||||
|
|
@ -910,7 +943,7 @@ macro_rules! paginated_result {
|
|||
const_string!(ListResourcesRequestMethod = "resources/list");
|
||||
/// Request to list all available resources from a server
|
||||
pub type ListResourcesRequest =
|
||||
RequestOptionalParam<ListResourcesRequestMethod, PaginatedRequestParam>;
|
||||
RequestOptionalParam<ListResourcesRequestMethod, PaginatedRequestParams>;
|
||||
|
||||
paginated_result!(ListResourcesResult {
|
||||
resources: Vec<Resource>
|
||||
|
|
@ -919,7 +952,7 @@ paginated_result!(ListResourcesResult {
|
|||
const_string!(ListResourceTemplatesRequestMethod = "resources/templates/list");
|
||||
/// Request to list all available resource templates from a server
|
||||
pub type ListResourceTemplatesRequest =
|
||||
RequestOptionalParam<ListResourceTemplatesRequestMethod, PaginatedRequestParam>;
|
||||
RequestOptionalParam<ListResourceTemplatesRequestMethod, PaginatedRequestParams>;
|
||||
|
||||
paginated_result!(ListResourceTemplatesResult {
|
||||
resource_templates: Vec<ResourceTemplate>
|
||||
|
|
@ -930,11 +963,27 @@ const_string!(ReadResourceRequestMethod = "resources/read");
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct ReadResourceRequestParam {
|
||||
pub struct ReadResourceRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
/// The URI of the resource to read
|
||||
pub uri: String,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for ReadResourceRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
|
|
@ -944,7 +993,7 @@ pub struct ReadResourceResult {
|
|||
}
|
||||
|
||||
/// Request to read a specific resource
|
||||
pub type ReadResourceRequest = Request<ReadResourceRequestMethod, ReadResourceRequestParam>;
|
||||
pub type ReadResourceRequest = Request<ReadResourceRequestMethod, ReadResourceRequestParams>;
|
||||
|
||||
const_string!(ResourceListChangedNotificationMethod = "notifications/resources/list_changed");
|
||||
/// Notification sent when the list of available resources changes
|
||||
|
|
@ -956,24 +1005,58 @@ const_string!(SubscribeRequestMethod = "resources/subscribe");
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct SubscribeRequestParam {
|
||||
pub struct SubscribeRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
/// The URI of the resource to subscribe to
|
||||
pub uri: String,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for SubscribeRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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
|
||||
pub type SubscribeRequest = Request<SubscribeRequestMethod, SubscribeRequestParam>;
|
||||
pub type SubscribeRequest = Request<SubscribeRequestMethod, SubscribeRequestParams>;
|
||||
|
||||
const_string!(UnsubscribeRequestMethod = "resources/unsubscribe");
|
||||
/// Parameters for unsubscribing from resource updates
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct UnsubscribeRequestParam {
|
||||
pub struct UnsubscribeRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
/// The URI of the resource to unsubscribe from
|
||||
pub uri: String,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for UnsubscribeRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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
|
||||
pub type UnsubscribeRequest = Request<UnsubscribeRequestMethod, UnsubscribeRequestParam>;
|
||||
pub type UnsubscribeRequest = Request<UnsubscribeRequestMethod, UnsubscribeRequestParams>;
|
||||
|
||||
const_string!(ResourceUpdatedNotificationMethod = "notifications/resources/updated");
|
||||
/// Parameters for a resource update notification
|
||||
|
|
@ -994,7 +1077,8 @@ pub type ResourceUpdatedNotification =
|
|||
|
||||
const_string!(ListPromptsRequestMethod = "prompts/list");
|
||||
/// Request to list all available prompts from a server
|
||||
pub type ListPromptsRequest = RequestOptionalParam<ListPromptsRequestMethod, PaginatedRequestParam>;
|
||||
pub type ListPromptsRequest =
|
||||
RequestOptionalParam<ListPromptsRequestMethod, PaginatedRequestParams>;
|
||||
|
||||
paginated_result!(ListPromptsResult {
|
||||
prompts: Vec<Prompt>
|
||||
|
|
@ -1005,13 +1089,30 @@ const_string!(GetPromptRequestMethod = "prompts/get");
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct GetPromptRequestParam {
|
||||
pub struct GetPromptRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
pub name: String,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
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
|
||||
pub type GetPromptRequest = Request<GetPromptRequestMethod, GetPromptRequestParam>;
|
||||
pub type GetPromptRequest = Request<GetPromptRequestMethod, GetPromptRequestParams>;
|
||||
|
||||
const_string!(PromptListChangedNotificationMethod = "notifications/prompts/list_changed");
|
||||
/// Notification sent when the list of available prompts changes
|
||||
|
|
@ -1045,12 +1146,29 @@ const_string!(SetLevelRequestMethod = "logging/setLevel");
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct SetLevelRequestParam {
|
||||
pub struct SetLevelRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
/// The desired logging level
|
||||
pub level: LoggingLevel,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for SetLevelRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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
|
||||
pub type SetLevelRequest = Request<SetLevelRequestMethod, SetLevelRequestParam>;
|
||||
pub type SetLevelRequest = Request<SetLevelRequestMethod, SetLevelRequestParams>;
|
||||
|
||||
const_string!(LoggingMessageNotificationMethod = "notifications/message");
|
||||
/// Parameters for a logging message notification
|
||||
|
|
@ -1075,7 +1193,7 @@ pub type LoggingMessageNotification =
|
|||
// =============================================================================
|
||||
|
||||
const_string!(CreateMessageRequestMethod = "sampling/createMessage");
|
||||
pub type CreateMessageRequest = Request<CreateMessageRequestMethod, CreateMessageRequestParam>;
|
||||
pub type CreateMessageRequest = Request<CreateMessageRequestMethod, CreateMessageRequestParams>;
|
||||
|
||||
/// Represents the role of a participant in a conversation or message exchange.
|
||||
///
|
||||
|
|
@ -1128,10 +1246,19 @@ pub enum ContextInclusion {
|
|||
/// This structure contains all the necessary information for a client to
|
||||
/// generate an LLM response, including conversation history, model preferences,
|
||||
/// and generation parameters.
|
||||
///
|
||||
/// This implements `TaskAugmentedRequestParamsMeta` as sampling requests can be
|
||||
/// long-running and may benefit from task-based execution.
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct CreateMessageRequestParam {
|
||||
pub struct CreateMessageRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<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
|
||||
pub messages: Vec<SamplingMessage>,
|
||||
/// Preferences for model selection and behavior
|
||||
|
|
@ -1156,6 +1283,28 @@ pub struct CreateMessageRequestParam {
|
|||
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.
|
||||
///
|
||||
/// This allows servers to express their preferences for which model to use
|
||||
|
|
@ -1244,7 +1393,10 @@ impl CompletionContext {
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct CompleteRequestParam {
|
||||
pub struct CompleteRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
pub r#ref: Reference,
|
||||
pub argument: ArgumentInfo,
|
||||
/// Optional context containing previously resolved argument values
|
||||
|
|
@ -1252,7 +1404,20 @@ pub struct CompleteRequestParam {
|
|||
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)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
|
|
@ -1477,7 +1642,8 @@ pub enum ElicitationAction {
|
|||
/// ```rust
|
||||
/// use rmcp::model::*;
|
||||
///
|
||||
/// let params = CreateElicitationRequestParam {
|
||||
/// let params = CreateElicitationRequestParams {
|
||||
/// meta: None,
|
||||
/// message: "Please provide your email".to_string(),
|
||||
/// requested_schema: ElicitationSchema::builder()
|
||||
/// .required_email("email")
|
||||
|
|
@ -1488,7 +1654,11 @@ pub enum ElicitationAction {
|
|||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct CreateElicitationRequestParam {
|
||||
pub struct CreateElicitationRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
|
||||
/// Human-readable message explaining what input is needed from the user.
|
||||
/// This should be clear and provide sufficient context for the user to understand
|
||||
/// what information they need to provide.
|
||||
|
|
@ -1500,6 +1670,19 @@ pub struct CreateElicitationRequestParam {
|
|||
pub requested_schema: ElicitationSchema,
|
||||
}
|
||||
|
||||
impl RequestParamsMeta for CreateElicitationRequestParams {
|
||||
fn meta(&self) -> Option<&Meta> {
|
||||
self.meta.as_ref()
|
||||
}
|
||||
fn meta_mut(&mut self) -> &mut Option<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.
|
||||
///
|
||||
/// Contains the user's decision (accept/decline/cancel) and optionally their input data
|
||||
|
|
@ -1520,7 +1703,7 @@ pub struct CreateElicitationResult {
|
|||
|
||||
/// Request type for creating an elicitation to gather user input
|
||||
pub type CreateElicitationRequest =
|
||||
Request<ElicitationCreateRequestMethod, CreateElicitationRequestParam>;
|
||||
Request<ElicitationCreateRequestMethod, CreateElicitationRequestParams>;
|
||||
|
||||
// =============================================================================
|
||||
// TOOL EXECUTION RESULTS
|
||||
|
|
@ -1685,7 +1868,7 @@ impl<'de> Deserialize<'de> for CallToolResult {
|
|||
|
||||
const_string!(ListToolsRequestMethod = "tools/list");
|
||||
/// Request to list all available tools from a server
|
||||
pub type ListToolsRequest = RequestOptionalParam<ListToolsRequestMethod, PaginatedRequestParam>;
|
||||
pub type ListToolsRequest = RequestOptionalParam<ListToolsRequestMethod, PaginatedRequestParams>;
|
||||
|
||||
paginated_result!(
|
||||
ListToolsResult {
|
||||
|
|
@ -1698,21 +1881,50 @@ const_string!(CallToolRequestMethod = "tools/call");
|
|||
///
|
||||
/// Contains the tool name and optional arguments needed to execute
|
||||
/// the tool operation.
|
||||
///
|
||||
/// This implements `TaskAugmentedRequestParamsMeta` as tool calls can be
|
||||
/// long-running and may benefit from task-based execution.
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct CallToolRequestParam {
|
||||
pub struct CallToolRequestParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
/// The name of the tool to call
|
||||
pub name: Cow<'static, str>,
|
||||
/// Arguments to pass to the tool (must match the tool's input schema)
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub arguments: Option<JsonObject>,
|
||||
/// Task metadata for async task management (SEP-1319)
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
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
|
||||
pub type CallToolRequest = Request<CallToolRequestMethod, CallToolRequestParam>;
|
||||
pub type CallToolRequest = Request<CallToolRequestMethod, CallToolRequestParams>;
|
||||
|
||||
/// The result of a sampling/createMessage request containing the generated response.
|
||||
///
|
||||
|
|
@ -1752,37 +1964,85 @@ pub struct GetPromptResult {
|
|||
// =============================================================================
|
||||
|
||||
const_string!(GetTaskInfoMethod = "tasks/get");
|
||||
pub type GetTaskInfoRequest = Request<GetTaskInfoMethod, GetTaskInfoParam>;
|
||||
pub type GetTaskInfoRequest = Request<GetTaskInfoMethod, GetTaskInfoParams>;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct GetTaskInfoParam {
|
||||
pub struct GetTaskInfoParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
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");
|
||||
pub type ListTasksRequest = RequestOptionalParam<ListTasksMethod, PaginatedRequestParam>;
|
||||
pub type ListTasksRequest = RequestOptionalParam<ListTasksMethod, PaginatedRequestParams>;
|
||||
|
||||
const_string!(GetTaskResultMethod = "tasks/result");
|
||||
pub type GetTaskResultRequest = Request<GetTaskResultMethod, GetTaskResultParam>;
|
||||
pub type GetTaskResultRequest = Request<GetTaskResultMethod, GetTaskResultParams>;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct GetTaskResultParam {
|
||||
pub struct GetTaskResultParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
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");
|
||||
pub type CancelTaskRequest = Request<CancelTaskMethod, CancelTaskParam>;
|
||||
pub type CancelTaskRequest = Request<CancelTaskMethod, CancelTaskParams>;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
pub struct CancelTaskParam {
|
||||
pub struct CancelTaskParams {
|
||||
/// Protocol-level metadata for this request (SEP-1319)
|
||||
#[serde(rename = "_meta", default, skip_serializing_if = "Option::is_none")]
|
||||
pub meta: Option<Meta>,
|
||||
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)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||
|
|
@ -2201,11 +2461,13 @@ mod tests {
|
|||
serde_json::from_value(request.clone()).expect("invalid request");
|
||||
let (request, id) = request.into_request().expect("should be a request");
|
||||
assert_eq!(id, RequestId::Number(1));
|
||||
#[allow(deprecated)]
|
||||
match request {
|
||||
ClientRequest::InitializeRequest(Request {
|
||||
method: _,
|
||||
params:
|
||||
InitializeRequestParam {
|
||||
meta: _,
|
||||
protocol_version: _,
|
||||
capabilities,
|
||||
client_info,
|
||||
|
|
|
|||
|
|
@ -18,6 +18,51 @@ pub trait GetExtensions {
|
|||
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 {
|
||||
fn extensions(&self) -> &Extensions {
|
||||
&self.extensions
|
||||
|
|
@ -156,6 +201,13 @@ impl Meta {
|
|||
Self(JsonObject::new())
|
||||
}
|
||||
|
||||
/// Create a new Meta with a progress token set
|
||||
pub fn with_progress_token(token: ProgressToken) -> Self {
|
||||
let mut meta = Self::new();
|
||||
meta.set_progress_token(token);
|
||||
meta
|
||||
}
|
||||
|
||||
pub(crate) fn static_empty() -> &'static Self {
|
||||
static EMPTY: std::sync::OnceLock<Meta> = std::sync::OnceLock::new();
|
||||
EMPTY.get_or_init(Default::default)
|
||||
|
|
|
|||
|
|
@ -5,18 +5,18 @@ use thiserror::Error;
|
|||
use super::*;
|
||||
use crate::{
|
||||
model::{
|
||||
ArgumentInfo, CallToolRequest, CallToolRequestParam, CallToolResult, CancelledNotification,
|
||||
CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage, ClientNotification,
|
||||
ClientRequest, ClientResult, CompleteRequest, CompleteRequestParam, CompleteResult,
|
||||
CompletionContext, CompletionInfo, ErrorData, GetPromptRequest, GetPromptRequestParam,
|
||||
GetPromptResult, InitializeRequest, InitializedNotification, JsonRpcResponse,
|
||||
ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest,
|
||||
ArgumentInfo, CallToolRequest, CallToolRequestParams, CallToolResult,
|
||||
CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage,
|
||||
ClientNotification, ClientRequest, ClientResult, CompleteRequest, CompleteRequestParams,
|
||||
CompleteResult, CompletionContext, CompletionInfo, ErrorData, GetPromptRequest,
|
||||
GetPromptRequestParams, GetPromptResult, InitializeRequest, InitializedNotification,
|
||||
JsonRpcResponse, ListPromptsRequest, ListPromptsResult, ListResourceTemplatesRequest,
|
||||
ListResourceTemplatesResult, ListResourcesRequest, ListResourcesResult, ListToolsRequest,
|
||||
ListToolsResult, PaginatedRequestParam, ProgressNotification, ProgressNotificationParam,
|
||||
ReadResourceRequest, ReadResourceRequestParam, ReadResourceResult, Reference, RequestId,
|
||||
ListToolsResult, PaginatedRequestParams, ProgressNotification, ProgressNotificationParam,
|
||||
ReadResourceRequest, ReadResourceRequestParams, ReadResourceResult, Reference, RequestId,
|
||||
RootsListChangedNotification, ServerInfo, ServerJsonRpcMessage, ServerNotification,
|
||||
ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParam, SubscribeRequest,
|
||||
SubscribeRequestParam, UnsubscribeRequest, UnsubscribeRequestParam,
|
||||
ServerRequest, ServerResult, SetLevelRequest, SetLevelRequestParams, SubscribeRequest,
|
||||
SubscribeRequestParams, UnsubscribeRequest, UnsubscribeRequestParams,
|
||||
},
|
||||
transport::DynamicTransportError,
|
||||
};
|
||||
|
|
@ -350,17 +350,17 @@ macro_rules! method {
|
|||
}
|
||||
|
||||
impl Peer<RoleClient> {
|
||||
method!(peer_req complete CompleteRequest(CompleteRequestParam) => CompleteResult);
|
||||
method!(peer_req set_level SetLevelRequest(SetLevelRequestParam));
|
||||
method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParam) => GetPromptResult);
|
||||
method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParam)? => ListPromptsResult);
|
||||
method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParam)? => ListResourcesResult);
|
||||
method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParam)? => ListResourceTemplatesResult);
|
||||
method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParam) => ReadResourceResult);
|
||||
method!(peer_req subscribe SubscribeRequest(SubscribeRequestParam) );
|
||||
method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParam));
|
||||
method!(peer_req call_tool CallToolRequest(CallToolRequestParam) => CallToolResult);
|
||||
method!(peer_req list_tools ListToolsRequest(PaginatedRequestParam)? => ListToolsResult);
|
||||
method!(peer_req complete CompleteRequest(CompleteRequestParams) => CompleteResult);
|
||||
method!(peer_req set_level SetLevelRequest(SetLevelRequestParams));
|
||||
method!(peer_req get_prompt GetPromptRequest(GetPromptRequestParams) => GetPromptResult);
|
||||
method!(peer_req list_prompts ListPromptsRequest(PaginatedRequestParams)? => ListPromptsResult);
|
||||
method!(peer_req list_resources ListResourcesRequest(PaginatedRequestParams)? => ListResourcesResult);
|
||||
method!(peer_req list_resource_templates ListResourceTemplatesRequest(PaginatedRequestParams)? => ListResourceTemplatesResult);
|
||||
method!(peer_req read_resource ReadResourceRequest(ReadResourceRequestParams) => ReadResourceResult);
|
||||
method!(peer_req subscribe SubscribeRequest(SubscribeRequestParams) );
|
||||
method!(peer_req unsubscribe UnsubscribeRequest(UnsubscribeRequestParams));
|
||||
method!(peer_req call_tool CallToolRequest(CallToolRequestParams) => CallToolResult);
|
||||
method!(peer_req list_tools ListToolsRequest(PaginatedRequestParams)? => ListToolsResult);
|
||||
|
||||
method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam));
|
||||
method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam));
|
||||
|
|
@ -377,7 +377,7 @@ impl Peer<RoleClient> {
|
|||
let mut cursor = None;
|
||||
loop {
|
||||
let result = self
|
||||
.list_tools(Some(PaginatedRequestParam { cursor }))
|
||||
.list_tools(Some(PaginatedRequestParams { meta: None, cursor }))
|
||||
.await?;
|
||||
tools.extend(result.tools);
|
||||
cursor = result.next_cursor;
|
||||
|
|
@ -396,7 +396,7 @@ impl Peer<RoleClient> {
|
|||
let mut cursor = None;
|
||||
loop {
|
||||
let result = self
|
||||
.list_prompts(Some(PaginatedRequestParam { cursor }))
|
||||
.list_prompts(Some(PaginatedRequestParams { meta: None, cursor }))
|
||||
.await?;
|
||||
prompts.extend(result.prompts);
|
||||
cursor = result.next_cursor;
|
||||
|
|
@ -415,7 +415,7 @@ impl Peer<RoleClient> {
|
|||
let mut cursor = None;
|
||||
loop {
|
||||
let result = self
|
||||
.list_resources(Some(PaginatedRequestParam { cursor }))
|
||||
.list_resources(Some(PaginatedRequestParams { meta: None, cursor }))
|
||||
.await?;
|
||||
resources.extend(result.resources);
|
||||
cursor = result.next_cursor;
|
||||
|
|
@ -436,7 +436,7 @@ impl Peer<RoleClient> {
|
|||
let mut cursor = None;
|
||||
loop {
|
||||
let result = self
|
||||
.list_resource_templates(Some(PaginatedRequestParam { cursor }))
|
||||
.list_resource_templates(Some(PaginatedRequestParams { meta: None, cursor }))
|
||||
.await?;
|
||||
resource_templates.extend(result.resource_templates);
|
||||
cursor = result.next_cursor;
|
||||
|
|
@ -464,7 +464,8 @@ impl Peer<RoleClient> {
|
|||
current_value: impl Into<String>,
|
||||
context: Option<CompletionContext>,
|
||||
) -> Result<CompletionInfo, ServiceError> {
|
||||
let request = CompleteRequestParam {
|
||||
let request = CompleteRequestParams {
|
||||
meta: None,
|
||||
r#ref: Reference::for_prompt(prompt_name),
|
||||
argument: ArgumentInfo {
|
||||
name: argument_name.into(),
|
||||
|
|
@ -494,7 +495,8 @@ impl Peer<RoleClient> {
|
|||
current_value: impl Into<String>,
|
||||
context: Option<CompletionContext>,
|
||||
) -> Result<CompletionInfo, ServiceError> {
|
||||
let request = CompleteRequestParam {
|
||||
let request = CompleteRequestParams {
|
||||
meta: None,
|
||||
r#ref: Reference::for_resource(uri_template),
|
||||
argument: ArgumentInfo {
|
||||
name: argument_name.into(),
|
||||
|
|
|
|||
|
|
@ -5,13 +5,13 @@ use thiserror::Error;
|
|||
use super::*;
|
||||
#[cfg(feature = "elicitation")]
|
||||
use crate::model::{
|
||||
CreateElicitationRequest, CreateElicitationRequestParam, CreateElicitationResult,
|
||||
CreateElicitationRequest, CreateElicitationRequestParams, CreateElicitationResult,
|
||||
};
|
||||
use crate::{
|
||||
model::{
|
||||
CancelledNotification, CancelledNotificationParam, ClientInfo, ClientJsonRpcMessage,
|
||||
ClientNotification, ClientRequest, ClientResult, CreateMessageRequest,
|
||||
CreateMessageRequestParam, CreateMessageResult, ErrorData, ListRootsRequest,
|
||||
CreateMessageRequestParams, CreateMessageResult, ErrorData, ListRootsRequest,
|
||||
ListRootsResult, LoggingMessageNotification, LoggingMessageNotificationParam,
|
||||
ProgressNotification, ProgressNotificationParam, PromptListChangedNotification,
|
||||
ProtocolVersion, ResourceListChangedNotification, ResourceUpdatedNotification,
|
||||
|
|
@ -386,7 +386,7 @@ macro_rules! method {
|
|||
impl Peer<RoleServer> {
|
||||
pub async fn create_message(
|
||||
&self,
|
||||
params: CreateMessageRequestParam,
|
||||
params: CreateMessageRequestParams,
|
||||
) -> Result<CreateMessageResult, ServiceError> {
|
||||
let result = self
|
||||
.send_request(ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
|
|
@ -402,9 +402,9 @@ impl Peer<RoleServer> {
|
|||
}
|
||||
method!(peer_req list_roots ListRootsRequest() => ListRootsResult);
|
||||
#[cfg(feature = "elicitation")]
|
||||
method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParam) => CreateElicitationResult);
|
||||
method!(peer_req create_elicitation CreateElicitationRequest(CreateElicitationRequestParams) => CreateElicitationResult);
|
||||
#[cfg(feature = "elicitation")]
|
||||
method!(peer_req_with_timeout create_elicitation_with_timeout CreateElicitationRequest(CreateElicitationRequestParam) => CreateElicitationResult);
|
||||
method!(peer_req_with_timeout create_elicitation_with_timeout CreateElicitationRequest(CreateElicitationRequestParams) => CreateElicitationResult);
|
||||
|
||||
method!(peer_not notify_cancelled CancelledNotification(CancelledNotificationParam));
|
||||
method!(peer_not notify_progress ProgressNotification(ProgressNotificationParam));
|
||||
|
|
@ -690,7 +690,8 @@ impl Peer<RoleServer> {
|
|||
|
||||
let response = self
|
||||
.create_elicitation_with_timeout(
|
||||
CreateElicitationRequestParam {
|
||||
CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: message.into(),
|
||||
requested_schema: schema,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ impl TestClientHandler {
|
|||
impl ClientHandler for TestClientHandler {
|
||||
async fn create_message(
|
||||
&self,
|
||||
params: CreateMessageRequestParam,
|
||||
params: CreateMessageRequestParams,
|
||||
_context: RequestContext<RoleClient>,
|
||||
) -> Result<CreateMessageResult, McpError> {
|
||||
// First validate that there's at least one User message
|
||||
|
|
@ -117,7 +117,7 @@ impl ServerHandler for TestServer {
|
|||
|
||||
fn set_level(
|
||||
&self,
|
||||
request: SetLevelRequestParam,
|
||||
request: SetLevelRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> impl Future<Output = Result<(), McpError>> + Send + '_ {
|
||||
let peer = context.peer;
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ fn test_complete_request_param_serialization() {
|
|||
let mut args = HashMap::new();
|
||||
args.insert("previous_input".to_string(), "test".to_string());
|
||||
|
||||
let request = CompleteRequestParam {
|
||||
let request = CompleteRequestParams {
|
||||
meta: None,
|
||||
r#ref: Reference::for_prompt("weather_prompt"),
|
||||
argument: ArgumentInfo {
|
||||
name: "location".to_string(),
|
||||
|
|
@ -195,7 +196,8 @@ fn test_completion_context_empty() {
|
|||
#[test]
|
||||
fn test_mcp_schema_compliance() {
|
||||
// Test that our types serialize correctly according to MCP specification
|
||||
let request = CompleteRequestParam {
|
||||
let request = CompleteRequestParams {
|
||||
meta: None,
|
||||
r#ref: Reference::for_resource("file://{path}"),
|
||||
argument: ArgumentInfo {
|
||||
name: "path".to_string(),
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ async fn test_elicitation_serialization() {
|
|||
);
|
||||
}
|
||||
|
||||
/// Test CreateElicitationRequestParam structure serialization/deserialization
|
||||
/// Test CreateElicitationRequestParams structure serialization/deserialization
|
||||
#[tokio::test]
|
||||
async fn test_elicitation_request_param_serialization() {
|
||||
let schema = ElicitationSchema::builder()
|
||||
|
|
@ -44,7 +44,8 @@ async fn test_elicitation_request_param_serialization() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let request_param = CreateElicitationRequestParam {
|
||||
let request_param = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Please provide your email address".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
|
@ -68,7 +69,7 @@ async fn test_elicitation_request_param_serialization() {
|
|||
assert_eq!(json, expected);
|
||||
|
||||
// Test deserialization
|
||||
let deserialized: CreateElicitationRequestParam = serde_json::from_value(expected).unwrap();
|
||||
let deserialized: CreateElicitationRequestParams = serde_json::from_value(expected).unwrap();
|
||||
assert_eq!(deserialized.message, request_param.message);
|
||||
assert_eq!(
|
||||
deserialized.requested_schema,
|
||||
|
|
@ -128,7 +129,8 @@ async fn test_elicitation_json_rpc_protocol() {
|
|||
id: RequestId::Number(1),
|
||||
request: CreateElicitationRequest {
|
||||
method: ElicitationCreateRequestMethod,
|
||||
params: CreateElicitationRequestParam {
|
||||
params: CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Do you want to continue?".to_string(),
|
||||
requested_schema: schema,
|
||||
},
|
||||
|
|
@ -212,7 +214,8 @@ async fn test_elicitation_spec_compliance() {
|
|||
#[tokio::test]
|
||||
async fn test_elicitation_error_handling() {
|
||||
// Test minimal schema handling (empty properties is technically valid)
|
||||
let minimal_schema_request = CreateElicitationRequestParam {
|
||||
let minimal_schema_request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Test message".to_string(),
|
||||
requested_schema: ElicitationSchema::builder().build().unwrap(),
|
||||
};
|
||||
|
|
@ -221,7 +224,8 @@ async fn test_elicitation_error_handling() {
|
|||
let _json = serde_json::to_value(&minimal_schema_request).unwrap();
|
||||
|
||||
// Test empty message
|
||||
let empty_message_request = CreateElicitationRequestParam {
|
||||
let empty_message_request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "".to_string(),
|
||||
requested_schema: ElicitationSchema::builder()
|
||||
.property("value", PrimitiveSchema::String(StringSchema::new()))
|
||||
|
|
@ -246,7 +250,8 @@ async fn test_elicitation_performance() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let request = CreateElicitationRequestParam {
|
||||
let request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Performance test message".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
|
@ -256,7 +261,7 @@ async fn test_elicitation_performance() {
|
|||
// Serialize/deserialize 1000 times
|
||||
for _ in 0..1000 {
|
||||
let json = serde_json::to_value(&request).unwrap();
|
||||
let _deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap();
|
||||
let _deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap();
|
||||
}
|
||||
|
||||
let duration = start.elapsed();
|
||||
|
|
@ -369,8 +374,9 @@ async fn test_elicitation_convenience_methods() {
|
|||
.contains("Option A")
|
||||
);
|
||||
|
||||
// Test that CreateElicitationRequestParam can be created with type-safe schemas
|
||||
let confirmation_request = CreateElicitationRequestParam {
|
||||
// Test that CreateElicitationRequestParams can be created with type-safe schemas
|
||||
let confirmation_request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Test confirmation".to_string(),
|
||||
requested_schema: ElicitationSchema::builder()
|
||||
.property(
|
||||
|
|
@ -412,14 +418,15 @@ async fn test_elicitation_structured_schemas() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let request = CreateElicitationRequestParam {
|
||||
let request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Please provide your user information".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
||||
// Test that complex schemas serialize/deserialize correctly
|
||||
let json = serde_json::to_value(&request).unwrap();
|
||||
let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap();
|
||||
let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap();
|
||||
|
||||
assert_eq!(deserialized.message, "Please provide your user information");
|
||||
assert_eq!(deserialized.requested_schema.properties.len(), 5);
|
||||
|
|
@ -654,14 +661,15 @@ async fn test_elicitation_multi_select_enum() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let request = CreateElicitationRequestParam {
|
||||
let request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Please provide your user information".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
||||
// Test that complex schemas serialize/deserialize correctly
|
||||
let json = serde_json::to_value(&request).unwrap();
|
||||
let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap();
|
||||
let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap();
|
||||
|
||||
assert_eq!(deserialized.message, "Please provide your user information");
|
||||
assert_eq!(deserialized.requested_schema.properties.len(), 1);
|
||||
|
|
@ -735,14 +743,15 @@ async fn test_elicitation_single_select_enum() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let request = CreateElicitationRequestParam {
|
||||
let request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Please provide your user information".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
||||
// Test that complex schemas serialize/deserialize correctly
|
||||
let json = serde_json::to_value(&request).unwrap();
|
||||
let deserialized: CreateElicitationRequestParam = serde_json::from_value(json).unwrap();
|
||||
let deserialized: CreateElicitationRequestParams = serde_json::from_value(json).unwrap();
|
||||
assert_eq!(deserialized.message, "Please provide your user information");
|
||||
assert_eq!(deserialized.requested_schema.properties.len(), 1);
|
||||
assert!(
|
||||
|
|
@ -816,7 +825,8 @@ async fn test_elicitation_direction_server_to_client() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let elicitation_request = CreateElicitationRequestParam {
|
||||
let elicitation_request = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Please enter your name".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
|
@ -868,7 +878,8 @@ async fn test_elicitation_json_rpc_direction() {
|
|||
let server_request = ServerJsonRpcMessage::request(
|
||||
ServerRequest::CreateElicitationRequest(CreateElicitationRequest {
|
||||
method: ElicitationCreateRequestMethod,
|
||||
params: CreateElicitationRequestParam {
|
||||
params: CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Do you want to continue?".to_string(),
|
||||
requested_schema: schema,
|
||||
},
|
||||
|
|
@ -1039,8 +1050,9 @@ async fn test_client_capabilities_with_elicitation() {
|
|||
/// Test InitializeRequestParam with elicitation capability
|
||||
#[tokio::test]
|
||||
async fn test_initialize_request_with_elicitation() {
|
||||
// Test InitializeRequestParam with elicitation capability
|
||||
let init_param = InitializeRequestParam {
|
||||
// Test InitializeRequestParams with elicitation capability
|
||||
let init_param = InitializeRequestParams {
|
||||
meta: None,
|
||||
protocol_version: ProtocolVersion::LATEST,
|
||||
capabilities: ClientCapabilities {
|
||||
elicitation: Some(ElicitationCapability {
|
||||
|
|
@ -1084,7 +1096,8 @@ async fn test_capability_checking_logic() {
|
|||
// Simulate the logic that would be used in supports_elicitation()
|
||||
|
||||
// Case 1: Client with elicitation capability
|
||||
let client_with_capability = InitializeRequestParam {
|
||||
let client_with_capability = InitializeRequestParams {
|
||||
meta: None,
|
||||
protocol_version: ProtocolVersion::LATEST,
|
||||
capabilities: ClientCapabilities {
|
||||
elicitation: Some(ElicitationCapability {
|
||||
|
|
@ -1106,7 +1119,8 @@ async fn test_capability_checking_logic() {
|
|||
assert!(supports_elicitation);
|
||||
|
||||
// Case 2: Client without elicitation capability
|
||||
let client_without_capability = InitializeRequestParam {
|
||||
let client_without_capability = InitializeRequestParams {
|
||||
meta: None,
|
||||
protocol_version: ProtocolVersion::LATEST,
|
||||
capabilities: ClientCapabilities {
|
||||
elicitation: None,
|
||||
|
|
@ -1308,7 +1322,8 @@ async fn test_create_elicitation_with_timeout_basic() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
let _params = CreateElicitationRequestParam {
|
||||
let _params = CreateElicitationRequestParams {
|
||||
meta: None,
|
||||
message: "Enter your details".to_string(),
|
||||
requested_schema: schema,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ use std::sync::{Arc, Mutex};
|
|||
use common::handlers::{TestClientHandler, TestServer};
|
||||
use rmcp::{
|
||||
ServiceExt,
|
||||
model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParam},
|
||||
model::{LoggingLevel, LoggingMessageNotificationParam, SetLevelRequestParams},
|
||||
};
|
||||
use serde_json::json;
|
||||
use tokio::sync::Notify;
|
||||
|
|
@ -63,7 +63,7 @@ async fn test_logging_spec_compliance() -> anyhow::Result<()> {
|
|||
] {
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam { level })
|
||||
.set_level(SetLevelRequestParams { meta: None, level })
|
||||
.await?;
|
||||
|
||||
// Wait for each message response
|
||||
|
|
@ -121,7 +121,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
|
|||
// Test 1: Error reporting scenario
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam {
|
||||
.set_level(SetLevelRequestParams {
|
||||
meta: None,
|
||||
level: LoggingLevel::Error,
|
||||
})
|
||||
.await?;
|
||||
|
|
@ -147,7 +148,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
|
|||
// Test 2: Debug scenario
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam {
|
||||
.set_level(SetLevelRequestParams {
|
||||
meta: None,
|
||||
level: LoggingLevel::Debug,
|
||||
})
|
||||
.await?;
|
||||
|
|
@ -170,7 +172,8 @@ async fn test_logging_user_scenarios() -> anyhow::Result<()> {
|
|||
// Test 3: Production monitoring scenario
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam {
|
||||
.set_level(SetLevelRequestParams {
|
||||
meta: None,
|
||||
level: LoggingLevel::Info,
|
||||
})
|
||||
.await?;
|
||||
|
|
@ -256,7 +259,7 @@ async fn test_logging_edge_cases() -> anyhow::Result<()> {
|
|||
] {
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam { level })
|
||||
.set_level(SetLevelRequestParams { meta: None, level })
|
||||
.await?;
|
||||
receive_signal.notified().await;
|
||||
|
||||
|
|
@ -316,7 +319,7 @@ async fn test_logging_optional_fields() -> anyhow::Result<()> {
|
|||
for level in [LoggingLevel::Info, LoggingLevel::Debug] {
|
||||
client
|
||||
.peer()
|
||||
.set_level(SetLevelRequestParam { level })
|
||||
.set_level(SetLevelRequestParams { meta: None, level })
|
||||
.await?;
|
||||
|
||||
// Wait for each message response
|
||||
|
|
|
|||
|
|
@ -47,7 +47,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
|
|||
// Test ThisServer context inclusion
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -89,7 +91,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
|
|||
// Test AllServers context inclusion
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -131,7 +135,9 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
|
|||
// Test No context inclusion
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -193,7 +199,9 @@ async fn test_context_inclusion_ignored_integration() -> anyhow::Result<()> {
|
|||
// Test that context requests are ignored
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -254,7 +262,9 @@ async fn test_message_sequence_integration() -> anyhow::Result<()> {
|
|||
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![
|
||||
SamplingMessage {
|
||||
role: Role::User,
|
||||
|
|
@ -325,7 +335,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
|
|||
// Test valid sequence: User -> Assistant -> User
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![
|
||||
SamplingMessage {
|
||||
role: Role::User,
|
||||
|
|
@ -369,7 +381,9 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
|
|||
// Test invalid: No user message
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::Assistant,
|
||||
content: Content::text("assistant message"),
|
||||
|
|
@ -422,7 +436,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
|
|||
// Test ThisServer is honored
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -462,7 +478,9 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
|
|||
// Test AllServers is ignored
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test message"),
|
||||
|
|
@ -519,7 +537,9 @@ async fn test_context_inclusion() -> anyhow::Result<()> {
|
|||
// Test context handling
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("test"),
|
||||
|
|
|
|||
|
|
@ -187,10 +187,18 @@
|
|||
"format": "const",
|
||||
"const": "tools/call"
|
||||
},
|
||||
"CallToolRequestParam": {
|
||||
"description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.",
|
||||
"CallToolRequestParams": {
|
||||
"description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.\n\nThis implements `TaskAugmentedRequestParamsMeta` as tool calls can be\nlong-running and may benefit from task-based execution.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"arguments": {
|
||||
"description": "Arguments to pass to the tool (must match the tool's input schema)",
|
||||
"type": [
|
||||
|
|
@ -204,6 +212,7 @@
|
|||
"type": "string"
|
||||
},
|
||||
"task": {
|
||||
"description": "Task metadata for async task management (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
|
|
@ -220,9 +229,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/cancel"
|
||||
},
|
||||
"CancelTaskParam": {
|
||||
"CancelTaskParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -332,9 +349,17 @@
|
|||
"format": "const",
|
||||
"const": "completion/complete"
|
||||
},
|
||||
"CompleteRequestParam": {
|
||||
"CompleteRequestParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"argument": {
|
||||
"$ref": "#/definitions/ArgumentInfo"
|
||||
},
|
||||
|
|
@ -534,10 +559,18 @@
|
|||
"format": "const",
|
||||
"const": "prompts/get"
|
||||
},
|
||||
"GetPromptRequestParam": {
|
||||
"GetPromptRequestParams": {
|
||||
"description": "Parameters for retrieving a specific prompt",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"arguments": {
|
||||
"type": [
|
||||
"object",
|
||||
|
|
@ -558,9 +591,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/get"
|
||||
},
|
||||
"GetTaskInfoParam": {
|
||||
"GetTaskInfoParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -574,9 +615,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/result"
|
||||
},
|
||||
"GetTaskResultParam": {
|
||||
"GetTaskResultParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -651,10 +700,18 @@
|
|||
"version"
|
||||
]
|
||||
},
|
||||
"InitializeRequestParam": {
|
||||
"InitializeRequestParams": {
|
||||
"description": "Parameters sent by a client when initializing a connection to an MCP server.\n\nThis contains the client's protocol version, capabilities, and implementation\ninformation, allowing the server to understand what the client supports.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"capabilities": {
|
||||
"description": "The capabilities this client supports (sampling, roots, etc.)",
|
||||
"allOf": [
|
||||
|
|
@ -953,9 +1010,17 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"PaginatedRequestParam": {
|
||||
"PaginatedRequestParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"cursor": {
|
||||
"type": [
|
||||
"string",
|
||||
|
|
@ -1183,10 +1248,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/read"
|
||||
},
|
||||
"ReadResourceRequestParam": {
|
||||
"ReadResourceRequestParams": {
|
||||
"description": "Parameters for reading a specific resource",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to read",
|
||||
"type": "string"
|
||||
|
|
@ -1242,7 +1315,7 @@
|
|||
"$ref": "#/definitions/InitializeResultMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/InitializeRequestParam"
|
||||
"$ref": "#/definitions/InitializeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1258,7 +1331,7 @@
|
|||
"$ref": "#/definitions/GetTaskResultMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetTaskResultParam"
|
||||
"$ref": "#/definitions/GetTaskResultParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1274,7 +1347,7 @@
|
|||
"$ref": "#/definitions/CancelTaskMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CancelTaskParam"
|
||||
"$ref": "#/definitions/CancelTaskParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1290,7 +1363,7 @@
|
|||
"$ref": "#/definitions/CompleteRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CompleteRequestParam"
|
||||
"$ref": "#/definitions/CompleteRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1306,7 +1379,7 @@
|
|||
"$ref": "#/definitions/SetLevelRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/SetLevelRequestParam"
|
||||
"$ref": "#/definitions/SetLevelRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1322,7 +1395,7 @@
|
|||
"$ref": "#/definitions/GetPromptRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetPromptRequestParam"
|
||||
"$ref": "#/definitions/GetPromptRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1338,7 +1411,7 @@
|
|||
"$ref": "#/definitions/ReadResourceRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/ReadResourceRequestParam"
|
||||
"$ref": "#/definitions/ReadResourceRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1354,7 +1427,7 @@
|
|||
"$ref": "#/definitions/SubscribeRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/SubscribeRequestParam"
|
||||
"$ref": "#/definitions/SubscribeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1370,7 +1443,7 @@
|
|||
"$ref": "#/definitions/UnsubscribeRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/UnsubscribeRequestParam"
|
||||
"$ref": "#/definitions/UnsubscribeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1386,7 +1459,7 @@
|
|||
"$ref": "#/definitions/CallToolRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CallToolRequestParam"
|
||||
"$ref": "#/definitions/CallToolRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1402,7 +1475,7 @@
|
|||
"$ref": "#/definitions/GetTaskInfoMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetTaskInfoParam"
|
||||
"$ref": "#/definitions/GetTaskInfoParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1430,7 +1503,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1451,7 +1524,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1472,7 +1545,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1493,7 +1566,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1514,7 +1587,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1650,10 +1723,18 @@
|
|||
"format": "const",
|
||||
"const": "logging/setLevel"
|
||||
},
|
||||
"SetLevelRequestParam": {
|
||||
"SetLevelRequestParams": {
|
||||
"description": "Parameters for setting the logging level",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"level": {
|
||||
"description": "The desired logging level",
|
||||
"allOf": [
|
||||
|
|
@ -1672,10 +1753,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/subscribe"
|
||||
},
|
||||
"SubscribeRequestParam": {
|
||||
"SubscribeRequestParams": {
|
||||
"description": "Parameters for subscribing to resource updates",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to subscribe to",
|
||||
"type": "string"
|
||||
|
|
@ -1720,10 +1809,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/unsubscribe"
|
||||
},
|
||||
"UnsubscribeRequestParam": {
|
||||
"UnsubscribeRequestParams": {
|
||||
"description": "Parameters for unsubscribing from resource updates",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to unsubscribe from",
|
||||
"type": "string"
|
||||
|
|
|
|||
|
|
@ -187,10 +187,18 @@
|
|||
"format": "const",
|
||||
"const": "tools/call"
|
||||
},
|
||||
"CallToolRequestParam": {
|
||||
"description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.",
|
||||
"CallToolRequestParams": {
|
||||
"description": "Parameters for calling a tool provided by an MCP server.\n\nContains the tool name and optional arguments needed to execute\nthe tool operation.\n\nThis implements `TaskAugmentedRequestParamsMeta` as tool calls can be\nlong-running and may benefit from task-based execution.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"arguments": {
|
||||
"description": "Arguments to pass to the tool (must match the tool's input schema)",
|
||||
"type": [
|
||||
|
|
@ -204,6 +212,7 @@
|
|||
"type": "string"
|
||||
},
|
||||
"task": {
|
||||
"description": "Task metadata for async task management (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
|
|
@ -220,9 +229,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/cancel"
|
||||
},
|
||||
"CancelTaskParam": {
|
||||
"CancelTaskParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -332,9 +349,17 @@
|
|||
"format": "const",
|
||||
"const": "completion/complete"
|
||||
},
|
||||
"CompleteRequestParam": {
|
||||
"CompleteRequestParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"argument": {
|
||||
"$ref": "#/definitions/ArgumentInfo"
|
||||
},
|
||||
|
|
@ -534,10 +559,18 @@
|
|||
"format": "const",
|
||||
"const": "prompts/get"
|
||||
},
|
||||
"GetPromptRequestParam": {
|
||||
"GetPromptRequestParams": {
|
||||
"description": "Parameters for retrieving a specific prompt",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"arguments": {
|
||||
"type": [
|
||||
"object",
|
||||
|
|
@ -558,9 +591,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/get"
|
||||
},
|
||||
"GetTaskInfoParam": {
|
||||
"GetTaskInfoParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -574,9 +615,17 @@
|
|||
"format": "const",
|
||||
"const": "tasks/result"
|
||||
},
|
||||
"GetTaskResultParam": {
|
||||
"GetTaskResultParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"taskId": {
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -651,10 +700,18 @@
|
|||
"version"
|
||||
]
|
||||
},
|
||||
"InitializeRequestParam": {
|
||||
"InitializeRequestParams": {
|
||||
"description": "Parameters sent by a client when initializing a connection to an MCP server.\n\nThis contains the client's protocol version, capabilities, and implementation\ninformation, allowing the server to understand what the client supports.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"capabilities": {
|
||||
"description": "The capabilities this client supports (sampling, roots, etc.)",
|
||||
"allOf": [
|
||||
|
|
@ -953,9 +1010,17 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"PaginatedRequestParam": {
|
||||
"PaginatedRequestParams": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"cursor": {
|
||||
"type": [
|
||||
"string",
|
||||
|
|
@ -1183,10 +1248,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/read"
|
||||
},
|
||||
"ReadResourceRequestParam": {
|
||||
"ReadResourceRequestParams": {
|
||||
"description": "Parameters for reading a specific resource",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to read",
|
||||
"type": "string"
|
||||
|
|
@ -1242,7 +1315,7 @@
|
|||
"$ref": "#/definitions/InitializeResultMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/InitializeRequestParam"
|
||||
"$ref": "#/definitions/InitializeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1258,7 +1331,7 @@
|
|||
"$ref": "#/definitions/GetTaskResultMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetTaskResultParam"
|
||||
"$ref": "#/definitions/GetTaskResultParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1274,7 +1347,7 @@
|
|||
"$ref": "#/definitions/CancelTaskMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CancelTaskParam"
|
||||
"$ref": "#/definitions/CancelTaskParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1290,7 +1363,7 @@
|
|||
"$ref": "#/definitions/CompleteRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CompleteRequestParam"
|
||||
"$ref": "#/definitions/CompleteRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1306,7 +1379,7 @@
|
|||
"$ref": "#/definitions/SetLevelRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/SetLevelRequestParam"
|
||||
"$ref": "#/definitions/SetLevelRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1322,7 +1395,7 @@
|
|||
"$ref": "#/definitions/GetPromptRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetPromptRequestParam"
|
||||
"$ref": "#/definitions/GetPromptRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1338,7 +1411,7 @@
|
|||
"$ref": "#/definitions/ReadResourceRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/ReadResourceRequestParam"
|
||||
"$ref": "#/definitions/ReadResourceRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1354,7 +1427,7 @@
|
|||
"$ref": "#/definitions/SubscribeRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/SubscribeRequestParam"
|
||||
"$ref": "#/definitions/SubscribeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1370,7 +1443,7 @@
|
|||
"$ref": "#/definitions/UnsubscribeRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/UnsubscribeRequestParam"
|
||||
"$ref": "#/definitions/UnsubscribeRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1386,7 +1459,7 @@
|
|||
"$ref": "#/definitions/CallToolRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CallToolRequestParam"
|
||||
"$ref": "#/definitions/CallToolRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1402,7 +1475,7 @@
|
|||
"$ref": "#/definitions/GetTaskInfoMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/GetTaskInfoParam"
|
||||
"$ref": "#/definitions/GetTaskInfoParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -1430,7 +1503,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1451,7 +1524,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1472,7 +1545,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1493,7 +1566,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1514,7 +1587,7 @@
|
|||
"params": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/PaginatedRequestParam"
|
||||
"$ref": "#/definitions/PaginatedRequestParams"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
|
|
@ -1650,10 +1723,18 @@
|
|||
"format": "const",
|
||||
"const": "logging/setLevel"
|
||||
},
|
||||
"SetLevelRequestParam": {
|
||||
"SetLevelRequestParams": {
|
||||
"description": "Parameters for setting the logging level",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"level": {
|
||||
"description": "The desired logging level",
|
||||
"allOf": [
|
||||
|
|
@ -1672,10 +1753,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/subscribe"
|
||||
},
|
||||
"SubscribeRequestParam": {
|
||||
"SubscribeRequestParams": {
|
||||
"description": "Parameters for subscribing to resource updates",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to subscribe to",
|
||||
"type": "string"
|
||||
|
|
@ -1720,10 +1809,18 @@
|
|||
"format": "const",
|
||||
"const": "resources/unsubscribe"
|
||||
},
|
||||
"UnsubscribeRequestParam": {
|
||||
"UnsubscribeRequestParams": {
|
||||
"description": "Parameters for unsubscribing from resource updates",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"uri": {
|
||||
"description": "The URI of the resource to unsubscribe from",
|
||||
"type": "string"
|
||||
|
|
|
|||
|
|
@ -504,10 +504,18 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"CreateElicitationRequestParam": {
|
||||
"description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```",
|
||||
"CreateElicitationRequestParams": {
|
||||
"description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParams {\n meta: None,\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"message": {
|
||||
"description": "Human-readable message explaining what input is needed from the user.\nThis should be clear and provide sufficient context for the user to understand\nwhat information they need to provide.",
|
||||
"type": "string"
|
||||
|
|
@ -551,10 +559,18 @@
|
|||
"format": "const",
|
||||
"const": "sampling/createMessage"
|
||||
},
|
||||
"CreateMessageRequestParam": {
|
||||
"description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.",
|
||||
"CreateMessageRequestParams": {
|
||||
"description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.\n\nThis implements `TaskAugmentedRequestParamsMeta` as sampling requests can be\nlong-running and may benefit from task-based execution.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"includeContext": {
|
||||
"description": "How much context to include from MCP servers",
|
||||
"anyOf": [
|
||||
|
|
@ -610,6 +626,14 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"task": {
|
||||
"description": "Task metadata for async task management (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"temperature": {
|
||||
"description": "Temperature for controlling randomness (0.0 to 1.0)",
|
||||
"type": [
|
||||
|
|
@ -2111,7 +2135,7 @@
|
|||
"$ref": "#/definitions/CreateMessageRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CreateMessageRequestParam"
|
||||
"$ref": "#/definitions/CreateMessageRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -2127,7 +2151,7 @@
|
|||
"$ref": "#/definitions/ElicitationCreateRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CreateElicitationRequestParam"
|
||||
"$ref": "#/definitions/CreateElicitationRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
|
|||
|
|
@ -504,10 +504,18 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"CreateElicitationRequestParam": {
|
||||
"description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParam {\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```",
|
||||
"CreateElicitationRequestParams": {
|
||||
"description": "Parameters for creating an elicitation request to gather user input.\n\nThis structure contains everything needed to request interactive input from a user:\n- A human-readable message explaining what information is needed\n- A type-safe schema defining the expected structure of the response\n\n# Example\n\n```rust\nuse rmcp::model::*;\n\nlet params = CreateElicitationRequestParams {\n meta: None,\n message: \"Please provide your email\".to_string(),\n requested_schema: ElicitationSchema::builder()\n .required_email(\"email\")\n .build()\n .unwrap(),\n};\n```",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"message": {
|
||||
"description": "Human-readable message explaining what input is needed from the user.\nThis should be clear and provide sufficient context for the user to understand\nwhat information they need to provide.",
|
||||
"type": "string"
|
||||
|
|
@ -551,10 +559,18 @@
|
|||
"format": "const",
|
||||
"const": "sampling/createMessage"
|
||||
},
|
||||
"CreateMessageRequestParam": {
|
||||
"description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.",
|
||||
"CreateMessageRequestParams": {
|
||||
"description": "Parameters for creating a message through LLM sampling.\n\nThis structure contains all the necessary information for a client to\ngenerate an LLM response, including conversation history, model preferences,\nand generation parameters.\n\nThis implements `TaskAugmentedRequestParamsMeta` as sampling requests can be\nlong-running and may benefit from task-based execution.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"_meta": {
|
||||
"description": "Protocol-level metadata for this request (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"includeContext": {
|
||||
"description": "How much context to include from MCP servers",
|
||||
"anyOf": [
|
||||
|
|
@ -610,6 +626,14 @@
|
|||
"null"
|
||||
]
|
||||
},
|
||||
"task": {
|
||||
"description": "Task metadata for async task management (SEP-1319)",
|
||||
"type": [
|
||||
"object",
|
||||
"null"
|
||||
],
|
||||
"additionalProperties": true
|
||||
},
|
||||
"temperature": {
|
||||
"description": "Temperature for controlling randomness (0.0 to 1.0)",
|
||||
"type": [
|
||||
|
|
@ -2111,7 +2135,7 @@
|
|||
"$ref": "#/definitions/CreateMessageRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CreateMessageRequestParam"
|
||||
"$ref": "#/definitions/CreateMessageRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -2127,7 +2151,7 @@
|
|||
"$ref": "#/definitions/ElicitationCreateRequestMethod"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/CreateElicitationRequestParam"
|
||||
"$ref": "#/definitions/CreateElicitationRequestParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use rmcp::{
|
|||
ClientHandler, ServerHandler, ServiceExt,
|
||||
model::{
|
||||
ClientNotification, CustomNotification, ResourceUpdatedNotificationParam,
|
||||
ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParam,
|
||||
ServerCapabilities, ServerInfo, ServerNotification, SubscribeRequestParams,
|
||||
},
|
||||
};
|
||||
use serde_json::json;
|
||||
|
|
@ -27,7 +27,7 @@ impl ServerHandler for Server {
|
|||
|
||||
async fn subscribe(
|
||||
&self,
|
||||
request: rmcp::model::SubscribeRequestParam,
|
||||
request: rmcp::model::SubscribeRequestParams,
|
||||
context: rmcp::service::RequestContext<rmcp::RoleServer>,
|
||||
) -> Result<(), rmcp::ErrorData> {
|
||||
let uri = request.uri;
|
||||
|
|
@ -87,7 +87,8 @@ async fn test_server_notification() -> anyhow::Result<()> {
|
|||
.serve(client_transport)
|
||||
.await?;
|
||||
client
|
||||
.subscribe(SubscribeRequestParam {
|
||||
.subscribe(SubscribeRequestParams {
|
||||
meta: None,
|
||||
uri: "test://test-resource".to_owned(),
|
||||
})
|
||||
.await?;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use futures::StreamExt;
|
|||
use rmcp::{
|
||||
ClientHandler, Peer, RoleServer, ServerHandler, ServiceExt,
|
||||
handler::{client::progress::ProgressDispatcher, server::tool::ToolRouter},
|
||||
model::{CallToolRequestParam, ClientRequest, Meta, ProgressNotificationParam, Request},
|
||||
model::{CallToolRequestParams, ClientRequest, Meta, ProgressNotificationParam, Request},
|
||||
service::PeerRequestOptions,
|
||||
tool, tool_handler, tool_router,
|
||||
};
|
||||
|
|
@ -107,7 +107,8 @@ async fn test_progress_subscriber() -> anyhow::Result<()> {
|
|||
let client_service = client.serve(transport_client).await?;
|
||||
let handle = client_service
|
||||
.send_cancellable_request(
|
||||
ClientRequest::CallToolRequest(Request::new(CallToolRequestParam {
|
||||
ClientRequest::CallToolRequest(Request::new(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "some_progress".into(),
|
||||
arguments: None,
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
use rmcp::{
|
||||
RoleServer, ServerHandler,
|
||||
handler::server::router::prompt::PromptRouter,
|
||||
model::{GetPromptRequestParam, GetPromptResult, ListPromptsResult, PaginatedRequestParam},
|
||||
model::{GetPromptRequestParams, GetPromptResult, ListPromptsResult, PaginatedRequestParams},
|
||||
prompt_handler,
|
||||
service::RequestContext,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ use rmcp::{
|
|||
ClientHandler, RoleServer, ServerHandler, ServiceExt,
|
||||
handler::server::{router::prompt::PromptRouter, wrapper::Parameters},
|
||||
model::{
|
||||
ClientInfo, GetPromptRequestParam, GetPromptResult, ListPromptsResult,
|
||||
PaginatedRequestParam, PromptMessage, PromptMessageRole,
|
||||
ClientInfo, GetPromptRequestParams, GetPromptResult, ListPromptsResult,
|
||||
PaginatedRequestParams, PromptMessage, PromptMessageRole,
|
||||
},
|
||||
prompt, prompt_handler, prompt_router,
|
||||
service::RequestContext,
|
||||
|
|
@ -327,7 +327,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> {
|
|||
|
||||
// Test null case
|
||||
let result = client
|
||||
.get_prompt(GetPromptRequestParam {
|
||||
.get_prompt(GetPromptRequestParams {
|
||||
meta: None,
|
||||
name: "test_optional_i64".into(),
|
||||
arguments: Some(
|
||||
serde_json::json!({
|
||||
|
|
@ -353,7 +354,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> {
|
|||
|
||||
// Test Some case
|
||||
let some_result = client
|
||||
.get_prompt(GetPromptRequestParam {
|
||||
.get_prompt(GetPromptRequestParams {
|
||||
meta: None,
|
||||
name: "test_optional_i64".into(),
|
||||
arguments: Some(
|
||||
serde_json::json!({
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@ async fn test_basic_sampling_message_creation() -> Result<()> {
|
|||
#[tokio::test]
|
||||
async fn test_sampling_request_params() -> Result<()> {
|
||||
// Test sampling request parameters structure
|
||||
let params = CreateMessageRequestParam {
|
||||
let params = CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("Hello, world!"),
|
||||
|
|
@ -54,7 +56,7 @@ async fn test_sampling_request_params() -> Result<()> {
|
|||
|
||||
// Verify serialization/deserialization
|
||||
let json = serde_json::to_string(¶ms)?;
|
||||
let deserialized: CreateMessageRequestParam = serde_json::from_str(&json)?;
|
||||
let deserialized: CreateMessageRequestParams = serde_json::from_str(&json)?;
|
||||
assert_eq!(params, deserialized);
|
||||
|
||||
// Verify specific fields
|
||||
|
|
@ -134,7 +136,9 @@ async fn test_sampling_integration_with_test_handlers() -> Result<()> {
|
|||
// Test sampling with context inclusion
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("What is the capital of France?"),
|
||||
|
|
@ -214,7 +218,9 @@ async fn test_sampling_no_context_inclusion() -> Result<()> {
|
|||
// Test sampling without context inclusion
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text("Hello"),
|
||||
|
|
@ -283,7 +289,9 @@ async fn test_sampling_error_invalid_message_sequence() -> Result<()> {
|
|||
// Test sampling with no user messages (should fail)
|
||||
let request = ServerRequest::CreateMessageRequest(CreateMessageRequest {
|
||||
method: Default::default(),
|
||||
params: CreateMessageRequestParam {
|
||||
params: CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::Assistant,
|
||||
content: Content::text("I'm an assistant message without a user message"),
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ use std::sync::Arc;
|
|||
use rmcp::{
|
||||
ClientHandler, ServerHandler, ServiceExt,
|
||||
handler::server::{router::tool::ToolRouter, wrapper::Parameters},
|
||||
model::{CallToolRequestParam, ClientInfo},
|
||||
model::{CallToolRequestParams, ClientInfo},
|
||||
tool, tool_handler, tool_router,
|
||||
};
|
||||
use schemars::JsonSchema;
|
||||
|
|
@ -309,7 +309,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> {
|
|||
|
||||
// Test null case
|
||||
let result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "test_optional_i64".into(),
|
||||
arguments: Some(
|
||||
serde_json::json!({
|
||||
|
|
@ -338,7 +339,8 @@ async fn test_optional_i64_field_with_null_input() -> anyhow::Result<()> {
|
|||
|
||||
// Test Some case
|
||||
let some_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "test_optional_i64".into(),
|
||||
arguments: Some(
|
||||
serde_json::json!({
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ use std::collections::HashMap;
|
|||
|
||||
use anyhow::Result;
|
||||
use rmcp::{
|
||||
model::CallToolRequestParam,
|
||||
model::CallToolRequestParams,
|
||||
service::ServiceExt,
|
||||
transport::{ConfigureCommandExt, TokioChildProcess},
|
||||
};
|
||||
|
|
@ -46,7 +46,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Call tool 'git_status' with arguments = {"repo_path": "."}
|
||||
let _tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "git_status".into(),
|
||||
arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(),
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use anyhow::Result;
|
||||
use rmcp::{
|
||||
ServiceExt,
|
||||
model::{CallToolRequestParam, GetPromptRequestParam, ReadResourceRequestParam},
|
||||
model::{CallToolRequestParams, GetPromptRequestParams, ReadResourceRequestParams},
|
||||
object,
|
||||
transport::{ConfigureCommandExt, TokioChildProcess},
|
||||
};
|
||||
|
|
@ -37,7 +37,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Call tool echo
|
||||
let tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "echo".into(),
|
||||
arguments: Some(object!({ "message": "hi from rmcp" })),
|
||||
task: None,
|
||||
|
|
@ -47,7 +48,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Call tool longRunningOperation
|
||||
let tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "longRunningOperation".into(),
|
||||
arguments: Some(object!({ "duration": 3, "steps": 1 })),
|
||||
task: None,
|
||||
|
|
@ -61,7 +63,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Read resource
|
||||
let resource = client
|
||||
.read_resource(ReadResourceRequestParam {
|
||||
.read_resource(ReadResourceRequestParams {
|
||||
meta: None,
|
||||
uri: "test://static/resource/3".into(),
|
||||
})
|
||||
.await?;
|
||||
|
|
@ -73,7 +76,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Get simple prompt
|
||||
let prompt = client
|
||||
.get_prompt(GetPromptRequestParam {
|
||||
.get_prompt(GetPromptRequestParams {
|
||||
meta: None,
|
||||
name: "simple_prompt".into(),
|
||||
arguments: None,
|
||||
})
|
||||
|
|
@ -82,7 +86,8 @@ async fn main() -> Result<()> {
|
|||
|
||||
// Get complex prompt (returns text & image)
|
||||
let prompt = client
|
||||
.get_prompt(GetPromptRequestParam {
|
||||
.get_prompt(GetPromptRequestParams {
|
||||
meta: None,
|
||||
name: "complex_prompt".into(),
|
||||
arguments: Some(object!({ "temperature": "0.5", "style": "formal" })),
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use rmcp::{
|
||||
RmcpError,
|
||||
model::CallToolRequestParam,
|
||||
model::CallToolRequestParams,
|
||||
service::ServiceExt,
|
||||
transport::{ConfigureCommandExt, TokioChildProcess},
|
||||
};
|
||||
|
|
@ -39,7 +39,8 @@ async fn main() -> Result<(), RmcpError> {
|
|||
|
||||
// Call tool 'git_status' with arguments = {"repo_path": "."}
|
||||
let tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "git_status".into(),
|
||||
arguments: serde_json::json!({ "repo_path": "." }).as_object().cloned(),
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use clap::{Parser, ValueEnum};
|
|||
use rmcp::{
|
||||
ClientHandler, ServiceExt,
|
||||
model::{
|
||||
CallToolRequestParam, ClientCapabilities, ClientInfo, Implementation,
|
||||
CallToolRequestParams, ClientCapabilities, ClientInfo, Implementation,
|
||||
ProgressNotificationParam,
|
||||
},
|
||||
service::{NotificationContext, RoleClient},
|
||||
|
|
@ -123,6 +123,7 @@ impl ClientHandler for ProgressAwareClient {
|
|||
|
||||
fn get_info(&self) -> ClientInfo {
|
||||
ClientInfo {
|
||||
meta: None,
|
||||
protocol_version: Default::default(),
|
||||
capabilities: ClientCapabilities::default(),
|
||||
client_info: Implementation {
|
||||
|
|
@ -181,7 +182,8 @@ async fn test_stdio_transport(records: u32) -> Result<()> {
|
|||
// Call stream processor tool
|
||||
tracing::info!("Starting to process {} records...", records);
|
||||
let tool_result = service
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "stream_processor".into(),
|
||||
arguments: None,
|
||||
task: None,
|
||||
|
|
@ -236,7 +238,8 @@ async fn test_http_transport(http_url: &str, records: u32) -> Result<()> {
|
|||
// Call stream processor tool
|
||||
tracing::info!("Starting to process {} records...", records);
|
||||
let tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "stream_processor".into(),
|
||||
arguments: None,
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ impl SamplingDemoClient {
|
|||
impl ClientHandler for SamplingDemoClient {
|
||||
async fn create_message(
|
||||
&self,
|
||||
params: CreateMessageRequestParam,
|
||||
params: CreateMessageRequestParams,
|
||||
_context: RequestContext<RoleClient>,
|
||||
) -> Result<CreateMessageResult, ErrorData> {
|
||||
tracing::info!("Received sampling request with {:?}", params);
|
||||
|
|
@ -101,7 +101,8 @@ async fn main() -> Result<()> {
|
|||
// Test the ask_llm tool
|
||||
tracing::info!("Testing ask_llm tool...");
|
||||
match client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "ask_llm".into(),
|
||||
arguments: Some(object!({
|
||||
"question": "Hello world"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use anyhow::Result;
|
||||
use rmcp::{
|
||||
ServiceExt,
|
||||
model::{CallToolRequestParam, ClientCapabilities, ClientInfo, Implementation},
|
||||
model::{CallToolRequestParams, ClientCapabilities, ClientInfo, Implementation},
|
||||
transport::StreamableHttpClientTransport,
|
||||
};
|
||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
||||
|
|
@ -18,6 +18,7 @@ async fn main() -> Result<()> {
|
|||
.init();
|
||||
let transport = StreamableHttpClientTransport::from_uri("http://localhost:8000/mcp");
|
||||
let client_info = ClientInfo {
|
||||
meta: None,
|
||||
protocol_version: Default::default(),
|
||||
capabilities: ClientCapabilities::default(),
|
||||
client_info: Implementation {
|
||||
|
|
@ -41,7 +42,8 @@ async fn main() -> Result<()> {
|
|||
tracing::info!("Available tools: {tools:#?}");
|
||||
|
||||
let tool_result = client
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "increment".into(),
|
||||
arguments: serde_json::json!({}).as_object().cloned(),
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ use std::collections::HashMap;
|
|||
use rig::tool::{ToolDyn as RigTool, ToolEmbeddingDyn, ToolSet};
|
||||
use rmcp::{
|
||||
RoleClient,
|
||||
model::{CallToolRequestParam, CallToolResult, Tool as McpTool},
|
||||
model::{CallToolRequestParams, CallToolResult, Tool as McpTool},
|
||||
service::{RunningService, ServerSink},
|
||||
};
|
||||
|
||||
|
|
@ -41,7 +41,8 @@ impl RigTool for McpToolAdaptor {
|
|||
let server = self.server.clone();
|
||||
Box::pin(async move {
|
||||
let call_mcp_tool_result = server
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: self.tool.name.clone(),
|
||||
arguments: serde_json::from_str(&args)
|
||||
.map_err(rig::tool::ToolError::JsonError)?,
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ impl ServerHandler for Counter {
|
|||
|
||||
async fn list_resources(
|
||||
&self,
|
||||
_request: Option<PaginatedRequestParam>,
|
||||
_request: Option<PaginatedRequestParams>,
|
||||
_: RequestContext<RoleServer>,
|
||||
) -> Result<ListResourcesResult, McpError> {
|
||||
Ok(ListResourcesResult {
|
||||
|
|
@ -229,7 +229,7 @@ impl ServerHandler for Counter {
|
|||
|
||||
async fn read_resource(
|
||||
&self,
|
||||
ReadResourceRequestParam { uri }: ReadResourceRequestParam,
|
||||
ReadResourceRequestParams { meta: _, uri }: ReadResourceRequestParams,
|
||||
_: RequestContext<RoleServer>,
|
||||
) -> Result<ReadResourceResult, McpError> {
|
||||
match uri.as_str() {
|
||||
|
|
@ -256,7 +256,7 @@ impl ServerHandler for Counter {
|
|||
|
||||
async fn list_resource_templates(
|
||||
&self,
|
||||
_request: Option<PaginatedRequestParam>,
|
||||
_request: Option<PaginatedRequestParams>,
|
||||
_: RequestContext<RoleServer>,
|
||||
) -> Result<ListResourceTemplatesResult, McpError> {
|
||||
Ok(ListResourceTemplatesResult {
|
||||
|
|
@ -268,7 +268,7 @@ impl ServerHandler for Counter {
|
|||
|
||||
async fn initialize(
|
||||
&self,
|
||||
_request: InitializeRequestParam,
|
||||
_request: InitializeRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> Result<InitializeResult, McpError> {
|
||||
if let Some(http_request_part) = context.extensions.get::<axum::http::request::Parts>() {
|
||||
|
|
@ -347,7 +347,8 @@ mod tests {
|
|||
"source".into(),
|
||||
serde_json::Value::String("integration-test".into()),
|
||||
);
|
||||
let params = CallToolRequestParam {
|
||||
let params = CallToolRequestParams {
|
||||
meta: None,
|
||||
name: "long_task".into(),
|
||||
arguments: None,
|
||||
task: Some(task_meta),
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ impl ServerHandler for SqlQueryServer {
|
|||
|
||||
async fn complete(
|
||||
&self,
|
||||
request: CompleteRequestParam,
|
||||
request: CompleteRequestParams,
|
||||
_context: RequestContext<RoleServer>,
|
||||
) -> Result<CompleteResult, McpError> {
|
||||
let candidates = match &request.r#ref {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ impl ServerHandler for SamplingDemoServer {
|
|||
|
||||
async fn call_tool(
|
||||
&self,
|
||||
request: CallToolRequestParam,
|
||||
request: CallToolRequestParams,
|
||||
context: RequestContext<RoleServer>,
|
||||
) -> Result<CallToolResult, ErrorData> {
|
||||
match request.name.as_ref() {
|
||||
|
|
@ -48,7 +48,9 @@ impl ServerHandler for SamplingDemoServer {
|
|||
|
||||
let response = context
|
||||
.peer
|
||||
.create_message(CreateMessageRequestParam {
|
||||
.create_message(CreateMessageRequestParams {
|
||||
meta: None,
|
||||
task: None,
|
||||
messages: vec![SamplingMessage {
|
||||
role: Role::User,
|
||||
content: Content::text(question),
|
||||
|
|
@ -99,7 +101,7 @@ impl ServerHandler for SamplingDemoServer {
|
|||
|
||||
async fn list_tools(
|
||||
&self,
|
||||
_request: Option<PaginatedRequestParam>,
|
||||
_request: Option<PaginatedRequestParams>,
|
||||
_context: RequestContext<RoleServer>,
|
||||
) -> Result<ListToolsResult, ErrorData> {
|
||||
Ok(ListToolsResult {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use anyhow::Result;
|
|||
use async_trait::async_trait;
|
||||
use rmcp::{
|
||||
RoleClient,
|
||||
model::{CallToolRequestParam, CallToolResult, Tool as McpTool},
|
||||
model::{CallToolRequestParams, CallToolResult, Tool as McpTool},
|
||||
service::{RunningService, ServerSink},
|
||||
};
|
||||
use serde_json::Value;
|
||||
|
|
@ -59,7 +59,8 @@ impl Tool for McpToolAdapter {
|
|||
println!("arguments: {:?}", arguments);
|
||||
let call_result = self
|
||||
.server
|
||||
.call_tool(CallToolRequestParam {
|
||||
.call_tool(CallToolRequestParams {
|
||||
meta: None,
|
||||
name: self.tool.name.clone(),
|
||||
arguments,
|
||||
task: None,
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@ async fn main() -> anyhow::Result<()> {
|
|||
println!("Calling sum tool: {}", sum_tool.name);
|
||||
let result = client
|
||||
.peer()
|
||||
.call_tool(rmcp::model::CallToolRequestParam {
|
||||
.call_tool(rmcp::model::CallToolRequestParams {
|
||||
meta: None,
|
||||
name: sum_tool.name.clone(),
|
||||
arguments: Some(rmcp::object!({
|
||||
"a": 10,
|
||||
|
|
|
|||
|
|
@ -46,7 +46,8 @@ async fn main() -> anyhow::Result<()> {
|
|||
println!("Calling sum tool: {}", sum_tool.name);
|
||||
let result = client
|
||||
.peer()
|
||||
.call_tool(rmcp::model::CallToolRequestParam {
|
||||
.call_tool(rmcp::model::CallToolRequestParams {
|
||||
meta: None,
|
||||
name: sum_tool.name.clone(),
|
||||
arguments: Some(rmcp::object!({
|
||||
"a": 10,
|
||||
|
|
|
|||
Loading…
Reference in a new issue