use crate::{ error::Error as McpError, model::*, service::{NotificationContext, RequestContext, RoleServer, Service, ServiceRole}, }; mod resource; pub mod tool; 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) => self .call_tool(request.params, context) .await .map(ServerResult::CallToolResult), ClientRequest::ListToolsRequest(request) => self .list_tools(request.params, context) .await .map(ServerResult::ListToolsResult), } } 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 } }; Ok(()) } fn get_info(&self) -> ::Info { self.get_info() } } #[allow(unused_variables)] pub trait ServerHandler: Sized + Send + Sync + 'static { 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(Err(McpError::method_not_found::())) } 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_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 get_info(&self) -> ServerInfo { ServerInfo::default() } }