The model context package manager
1use rmcp::{
2 ErrorData, RoleServer, ServerHandler, ServiceExt,
3 model::{
4 GetPromptRequestParam, GetPromptResult, Implementation, ListPromptsResult,
5 PaginatedRequestParam, Prompt, PromptMessage, PromptMessageRole, ServerCapabilities,
6 ServerInfo,
7 },
8 service::RequestContext,
9 transport::stdio,
10};
11
12pub(crate) async fn run() {
13 let server = Server {};
14 let service = server
15 .serve(stdio())
16 .await
17 .expect("Unable to serve MCP via stdio transport");
18 service.waiting().await.expect("MCP server failed");
19}
20
21struct Server {}
22
23impl ServerHandler for Server {
24 fn get_info(&self) -> ServerInfo {
25 ServerInfo {
26 server_info: Implementation {
27 name: "mcpkg".to_string(),
28 version: "dev".to_string(),
29 },
30 capabilities: ServerCapabilities::builder().enable_prompts().build(),
31 ..Default::default()
32 }
33 }
34
35 async fn list_prompts(
36 &self,
37 _request: Option<PaginatedRequestParam>,
38 _context: RequestContext<RoleServer>,
39 ) -> Result<ListPromptsResult, ErrorData> {
40 let prompt = Prompt::new("hello", Some("Says hello world"), None);
41 Ok(ListPromptsResult::with_all_items(vec![prompt]))
42 }
43
44 async fn get_prompt(
45 &self,
46 _request: GetPromptRequestParam,
47 _context: RequestContext<RoleServer>,
48 ) -> Result<GetPromptResult, ErrorData> {
49 Ok(GetPromptResult {
50 description: None,
51 messages: vec![PromptMessage::new_text(
52 PromptMessageRole::User,
53 "Hello world",
54 )],
55 })
56 }
57}