use crate::{ error::ErrorData as McpError, model::*, service::{NotificationContext, RequestContext, RoleServer, Service, ServiceRole}, }; pub mod common; pub mod prompt; mod resource; pub mod router; pub mod tool; pub mod tool_name_validation; pub mod wrapper; impl Service for H { async fn handle_request( &self, request: ::PeerReq, context: RequestContext, ) -> Result<::Resp, McpError> { match request { ClientRequest::InitializeRequest(request) => self .initialize(request.params, context) .await .map(ServerResult::InitializeResult), ClientRequest::PingRequest(_request) => { self.ping(context).await.map(ServerResult::empty) } ClientRequest::CompleteRequest(request) => self .complete(request.params, context) .await .map(ServerResult::CompleteResult), ClientRequest::SetLevelRequest(request) => self .set_level(request.params, context) .await .map(ServerResult::empty), ClientRequest::GetPromptRequest(request) => self .get_prompt(request.params, context) .await .map(ServerResult::GetPromptResult), ClientRequest::ListPromptsRequest(request) => self .list_prompts(request.params, context) .await .map(ServerResult::ListPromptsResult), ClientRequest::ListResourcesRequest(request) => self .list_resources(request.params, context) .await .map(ServerResult::ListResourcesResult), ClientRequest::ListResourceTemplatesRequest(request) => self .list_resource_templates(request.params, context) .await .map(ServerResult::ListResourceTemplatesResult), ClientRequest::ReadResourceRequest(request) => self .read_resource(request.params, context) .await .map(ServerResult::ReadResourceResult), ClientRequest::SubscribeRequest(request) => self .subscribe(request.params, context) .await .map(ServerResult::empty), ClientRequest::UnsubscribeRequest(request) => self .unsubscribe(request.params, context) .await .map(ServerResult::empty), ClientRequest::CallToolRequest(request) => { if request.params.task.is_some() { tracing::info!("Enqueueing task for tool call: {}", request.params.name); self.enqueue_task(request.params, context.clone()) .await .map(ServerResult::CreateTaskResult) } else { self.call_tool(request.params, context) .await .map(ServerResult::CallToolResult) } } ClientRequest::ListToolsRequest(request) => self .list_tools(request.params, context) .await .map(ServerResult::ListToolsResult), ClientRequest::CustomRequest(request) => self .on_custom_request(request, context) .await .map(ServerResult::CustomResult), ClientRequest::ListTasksRequest(request) => self .list_tasks(request.params, context) .await .map(ServerResult::ListTasksResult), ClientRequest::GetTaskInfoRequest(request) => self .get_task_info(request.params, context) .await .map(ServerResult::GetTaskInfoResult), ClientRequest::GetTaskResultRequest(request) => self .get_task_result(request.params, context) .await .map(ServerResult::TaskResult), ClientRequest::CancelTaskRequest(request) => self .cancel_task(request.params, context) .await .map(ServerResult::empty), } } async fn handle_notification( &self, notification: ::PeerNot, context: NotificationContext, ) -> Result<(), McpError> { match notification { ClientNotification::CancelledNotification(notification) => { self.on_cancelled(notification.params, context).await } ClientNotification::ProgressNotification(notification) => { self.on_progress(notification.params, context).await } ClientNotification::InitializedNotification(_notification) => { self.on_initialized(context).await } ClientNotification::RootsListChangedNotification(_notification) => { self.on_roots_list_changed(context).await } ClientNotification::CustomNotification(notification) => { self.on_custom_notification(notification, context).await } }; Ok(()) } fn get_info(&self) -> ::Info { self.get_info() } } #[allow(unused_variables)] pub trait ServerHandler: Sized + Send + Sync + 'static { fn enqueue_task( &self, _request: CallToolRequestParam, _context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::internal_error( "Task processing not implemented".to_string(), None, ))) } fn ping( &self, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(())) } // handle requests fn initialize( &self, request: InitializeRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { if context.peer.peer_info().is_none() { context.peer.set_peer_info(request); } std::future::ready(Ok(self.get_info())) } fn complete( &self, request: CompleteRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(CompleteResult::default())) } fn set_level( &self, request: SetLevelRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn get_prompt( &self, request: GetPromptRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn list_prompts( &self, request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListPromptsResult::default())) } fn list_resources( &self, request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListResourcesResult::default())) } fn list_resource_templates( &self, request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListResourceTemplatesResult::default())) } fn read_resource( &self, request: ReadResourceRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err( McpError::method_not_found::(), )) } fn subscribe( &self, request: SubscribeRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn unsubscribe( &self, request: UnsubscribeRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn call_tool( &self, request: CallToolRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn list_tools( &self, request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListToolsResult::default())) } fn on_custom_request( &self, request: CustomRequest, context: RequestContext, ) -> impl Future> + Send + '_ { let CustomRequest { method, .. } = request; let _ = context; std::future::ready(Err(McpError::new( ErrorCode::METHOD_NOT_FOUND, method, None, ))) } fn on_cancelled( &self, notification: CancelledNotificationParam, context: NotificationContext, ) -> impl Future + Send + '_ { std::future::ready(()) } fn on_progress( &self, notification: ProgressNotificationParam, context: NotificationContext, ) -> impl Future + Send + '_ { std::future::ready(()) } fn on_initialized( &self, context: NotificationContext, ) -> impl Future + Send + '_ { tracing::info!("client initialized"); std::future::ready(()) } fn on_roots_list_changed( &self, context: NotificationContext, ) -> impl Future + Send + '_ { std::future::ready(()) } fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext, ) -> impl Future + Send + '_ { let _ = (notification, context); std::future::ready(()) } fn get_info(&self) -> ServerInfo { ServerInfo::default() } fn list_tasks( &self, request: Option, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn get_task_info( &self, request: GetTaskInfoParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Err(McpError::method_not_found::())) } fn get_task_result( &self, request: GetTaskResultParam, context: RequestContext, ) -> impl Future> + Send + '_ { let _ = (request, context); std::future::ready(Err(McpError::method_not_found::())) } fn cancel_task( &self, request: CancelTaskParam, context: RequestContext, ) -> impl Future> + Send + '_ { let _ = (request, context); std::future::ready(Err(McpError::method_not_found::())) } }