use crate::error::Error as McpError; use crate::model::*; use crate::service::{Peer, RequestContext, RoleServer, Service, ServiceRole}; mod resource; pub mod tool; 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, ) -> Result<(), McpError> { match notification { ClientNotification::CancelledNotification(notification) => { self.on_cancelled(notification.params).await } ClientNotification::ProgressNotification(notification) => { self.on_progress(notification.params).await } ClientNotification::InitializedNotification(_notification) => { self.on_initialized().await } ClientNotification::RootsListChangedNotification(_notification) => { self.on_roots_list_changed().await } }; Ok(()) } fn get_peer(&self) -> Option> { self.get_peer() } fn set_peer(&mut self, peer: Peer) { self.set_peer(peer); } fn get_info(&self) -> ::Info { self.get_info() } } #[allow(unused_variables)] pub trait ServerHandler: Sized + Clone + 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 + '_ { 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: PaginatedRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListPromptsResult::default())) } fn list_resources( &self, request: PaginatedRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListResourcesResult::default())) } fn list_resource_templates( &self, request: PaginatedRequestParam, 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: PaginatedRequestParam, context: RequestContext, ) -> impl Future> + Send + '_ { std::future::ready(Ok(ListToolsResult::default())) } fn on_cancelled( &self, notification: CancelledNotificationParam, ) -> impl Future + Send + '_ { std::future::ready(()) } fn on_progress( &self, notification: ProgressNotificationParam, ) -> impl Future + Send + '_ { std::future::ready(()) } fn on_initialized(&self) -> impl Future + Send + '_ { tracing::info!("client initialized"); std::future::ready(()) } fn on_roots_list_changed(&self) -> impl Future + Send + '_ { std::future::ready(()) } fn get_peer(&self) -> Option> { None } fn set_peer(&mut self, peer: Peer) { drop(peer); } fn get_info(&self) -> ServerInfo { ServerInfo::default() } }