1use rmcp::{
8 handler::server::ServerHandler,
9 model::{
10 CallToolRequestParams, CallToolResult, CompleteRequestParams, CompleteResult, ErrorData,
11 GetPromptRequestParams, GetPromptResult, ListPromptsResult, ListResourceTemplatesResult,
12 ListResourcesResult, ListToolsResult, PaginatedRequestParams, ReadResourceRequestParams,
13 ReadResourceResult, ServerCapabilities, ServerInfo, SetLevelRequestParams,
14 SubscribeRequestParams, UnsubscribeRequestParams,
15 },
16 service::{RequestContext, RoleServer},
17};
18
19pub trait ToolsProvider: Send + Sync + 'static {
23 fn list_tools(
25 &self,
26 request: Option<PaginatedRequestParams>,
27 context: RequestContext<RoleServer>,
28 ) -> impl Future<Output = Result<ListToolsResult, ErrorData>> + Send;
29
30 fn call_tool(
32 &self,
33 request: CallToolRequestParams,
34 context: RequestContext<RoleServer>,
35 ) -> impl Future<Output = Result<CallToolResult, ErrorData>> + Send;
36}
37
38pub trait PromptsProvider: Send + Sync + 'static {
42 fn list_prompts(
44 &self,
45 request: Option<PaginatedRequestParams>,
46 context: RequestContext<RoleServer>,
47 ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>> + Send;
48
49 fn get_prompt(
51 &self,
52 request: GetPromptRequestParams,
53 context: RequestContext<RoleServer>,
54 ) -> impl Future<Output = Result<GetPromptResult, ErrorData>> + Send;
55}
56
57pub trait ResourcesProvider: Send + Sync + 'static {
61 fn list_resources(
63 &self,
64 request: Option<PaginatedRequestParams>,
65 context: RequestContext<RoleServer>,
66 ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + Send;
67
68 fn list_resource_templates(
70 &self,
71 request: Option<PaginatedRequestParams>,
72 context: RequestContext<RoleServer>,
73 ) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + Send;
74
75 fn read_resource(
77 &self,
78 request: ReadResourceRequestParams,
79 context: RequestContext<RoleServer>,
80 ) -> impl Future<Output = Result<ReadResourceResult, ErrorData>> + Send;
81
82 fn subscribe(
84 &self,
85 request: SubscribeRequestParams,
86 context: RequestContext<RoleServer>,
87 ) -> impl Future<Output = Result<(), ErrorData>> + Send;
88
89 fn unsubscribe(
91 &self,
92 request: UnsubscribeRequestParams,
93 context: RequestContext<RoleServer>,
94 ) -> impl Future<Output = Result<(), ErrorData>> + Send;
95}
96
97pub trait CompletionProvider: Send + Sync + 'static {
101 fn complete(
103 &self,
104 request: CompleteRequestParams,
105 context: RequestContext<RoleServer>,
106 ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + Send;
107}
108
109pub trait LoggingProvider: Send + Sync + 'static {
113 fn set_level(
115 &self,
116 request: SetLevelRequestParams,
117 context: RequestContext<RoleServer>,
118 ) -> impl Future<Output = Result<(), ErrorData>> + Send;
119}
120
121pub trait ServerInfoProvider: Send + Sync + 'static {
125 fn get_info(&self) -> ServerInfo;
127
128 fn capabilities(&self) -> ServerCapabilities {
130 self.get_info().capabilities.clone()
131 }
132}
133
134impl<T: ServerHandler> ToolsProvider for T {
139 async fn list_tools(
140 &self,
141 request: Option<PaginatedRequestParams>,
142 context: RequestContext<RoleServer>,
143 ) -> Result<ListToolsResult, ErrorData> {
144 ServerHandler::list_tools(self, request, context).await
145 }
146
147 async fn call_tool(
148 &self,
149 request: CallToolRequestParams,
150 context: RequestContext<RoleServer>,
151 ) -> Result<CallToolResult, ErrorData> {
152 ServerHandler::call_tool(self, request, context).await
153 }
154}
155
156impl<T: ServerHandler> PromptsProvider for T {
157 async fn list_prompts(
158 &self,
159 request: Option<PaginatedRequestParams>,
160 context: RequestContext<RoleServer>,
161 ) -> Result<ListPromptsResult, ErrorData> {
162 ServerHandler::list_prompts(self, request, context).await
163 }
164
165 async fn get_prompt(
166 &self,
167 request: GetPromptRequestParams,
168 context: RequestContext<RoleServer>,
169 ) -> Result<GetPromptResult, ErrorData> {
170 ServerHandler::get_prompt(self, request, context).await
171 }
172}
173
174impl<T: ServerHandler> ResourcesProvider for T {
175 async fn list_resources(
176 &self,
177 request: Option<PaginatedRequestParams>,
178 context: RequestContext<RoleServer>,
179 ) -> Result<ListResourcesResult, ErrorData> {
180 ServerHandler::list_resources(self, request, context).await
181 }
182
183 async fn list_resource_templates(
184 &self,
185 request: Option<PaginatedRequestParams>,
186 context: RequestContext<RoleServer>,
187 ) -> Result<ListResourceTemplatesResult, ErrorData> {
188 ServerHandler::list_resource_templates(self, request, context).await
189 }
190
191 async fn read_resource(
192 &self,
193 request: ReadResourceRequestParams,
194 context: RequestContext<RoleServer>,
195 ) -> Result<ReadResourceResult, ErrorData> {
196 ServerHandler::read_resource(self, request, context).await
197 }
198
199 async fn subscribe(
200 &self,
201 request: SubscribeRequestParams,
202 context: RequestContext<RoleServer>,
203 ) -> Result<(), ErrorData> {
204 ServerHandler::subscribe(self, request, context).await
205 }
206
207 async fn unsubscribe(
208 &self,
209 request: UnsubscribeRequestParams,
210 context: RequestContext<RoleServer>,
211 ) -> Result<(), ErrorData> {
212 ServerHandler::unsubscribe(self, request, context).await
213 }
214}
215
216impl<T: ServerHandler> CompletionProvider for T {
217 async fn complete(
218 &self,
219 request: CompleteRequestParams,
220 context: RequestContext<RoleServer>,
221 ) -> Result<CompleteResult, ErrorData> {
222 ServerHandler::complete(self, request, context).await
223 }
224}
225
226impl<T: ServerHandler> LoggingProvider for T {
227 async fn set_level(
228 &self,
229 request: SetLevelRequestParams,
230 context: RequestContext<RoleServer>,
231 ) -> Result<(), ErrorData> {
232 ServerHandler::set_level(self, request, context).await
233 }
234}
235
236