use rmcp::{
handler::server::ServerHandler,
model::{
CallToolRequestParams, CallToolResult, CompleteRequestParams, CompleteResult, ErrorData,
GetPromptRequestParams, GetPromptResult, ListPromptsResult, ListResourceTemplatesResult,
ListResourcesResult, ListToolsResult, PaginatedRequestParams, ReadResourceRequestParams,
ReadResourceResult, ServerCapabilities, ServerInfo, SetLevelRequestParams,
SubscribeRequestParams, UnsubscribeRequestParams,
},
service::{RequestContext, RoleServer},
};
pub trait ToolsProvider: Send + Sync + 'static {
fn list_tools(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListToolsResult, ErrorData>> + Send;
fn call_tool(
&self,
request: CallToolRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CallToolResult, ErrorData>> + Send;
}
pub trait PromptsProvider: Send + Sync + 'static {
fn list_prompts(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListPromptsResult, ErrorData>> + Send;
fn get_prompt(
&self,
request: GetPromptRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetPromptResult, ErrorData>> + Send;
}
pub trait ResourcesProvider: Send + Sync + 'static {
fn list_resources(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + Send;
fn list_resource_templates(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + Send;
fn read_resource(
&self,
request: ReadResourceRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<ReadResourceResult, ErrorData>> + Send;
fn subscribe(
&self,
request: SubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + Send;
fn unsubscribe(
&self,
request: UnsubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + Send;
}
pub trait CompletionProvider: Send + Sync + 'static {
fn complete(
&self,
request: CompleteRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<CompleteResult, ErrorData>> + Send;
}
pub trait LoggingProvider: Send + Sync + 'static {
fn set_level(
&self,
request: SetLevelRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + Send;
}
pub trait ServerInfoProvider: Send + Sync + 'static {
fn get_info(&self) -> ServerInfo;
fn capabilities(&self) -> ServerCapabilities {
self.get_info().capabilities.clone()
}
}
impl<T: ServerHandler> ToolsProvider for T {
async fn list_tools(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> Result<ListToolsResult, ErrorData> {
ServerHandler::list_tools(self, request, context).await
}
async fn call_tool(
&self,
request: CallToolRequestParams,
context: RequestContext<RoleServer>,
) -> Result<CallToolResult, ErrorData> {
ServerHandler::call_tool(self, request, context).await
}
}
impl<T: ServerHandler> PromptsProvider for T {
async fn list_prompts(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> Result<ListPromptsResult, ErrorData> {
ServerHandler::list_prompts(self, request, context).await
}
async fn get_prompt(
&self,
request: GetPromptRequestParams,
context: RequestContext<RoleServer>,
) -> Result<GetPromptResult, ErrorData> {
ServerHandler::get_prompt(self, request, context).await
}
}
impl<T: ServerHandler> ResourcesProvider for T {
async fn list_resources(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> Result<ListResourcesResult, ErrorData> {
ServerHandler::list_resources(self, request, context).await
}
async fn list_resource_templates(
&self,
request: Option<PaginatedRequestParams>,
context: RequestContext<RoleServer>,
) -> Result<ListResourceTemplatesResult, ErrorData> {
ServerHandler::list_resource_templates(self, request, context).await
}
async fn read_resource(
&self,
request: ReadResourceRequestParams,
context: RequestContext<RoleServer>,
) -> Result<ReadResourceResult, ErrorData> {
ServerHandler::read_resource(self, request, context).await
}
async fn subscribe(
&self,
request: SubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> Result<(), ErrorData> {
ServerHandler::subscribe(self, request, context).await
}
async fn unsubscribe(
&self,
request: UnsubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> Result<(), ErrorData> {
ServerHandler::unsubscribe(self, request, context).await
}
}
impl<T: ServerHandler> CompletionProvider for T {
async fn complete(
&self,
request: CompleteRequestParams,
context: RequestContext<RoleServer>,
) -> Result<CompleteResult, ErrorData> {
ServerHandler::complete(self, request, context).await
}
}
impl<T: ServerHandler> LoggingProvider for T {
async fn set_level(
&self,
request: SetLevelRequestParams,
context: RequestContext<RoleServer>,
) -> Result<(), ErrorData> {
ServerHandler::set_level(self, request, context).await
}
}