diff --git a/crates/mcp-client/examples/stdio_integration.rs b/crates/mcp-client/examples/stdio_integration.rs index 9acd208..ffdcc10 100644 --- a/crates/mcp-client/examples/stdio_integration.rs +++ b/crates/mcp-client/examples/stdio_integration.rs @@ -82,5 +82,16 @@ async fn main() -> Result<(), ClientError> { let resource = client.read_resource("memo://insights").await?; println!("Resource: {resource:?}\n"); + let prompts = client.list_prompts(None).await?; + println!("Prompts: {prompts:?}\n"); + + let prompt = client + .get_prompt( + "example_prompt", + serde_json::json!({"message": "hello there!"}), + ) + .await?; + println!("Prompt: {prompt:?}\n"); + Ok(()) } diff --git a/crates/mcp-server/src/main.rs b/crates/mcp-server/src/main.rs index eee2500..907cc1b 100644 --- a/crates/mcp-server/src/main.rs +++ b/crates/mcp-server/src/main.rs @@ -1,6 +1,7 @@ use anyhow::Result; use mcp_core::content::Content; -use mcp_core::handler::ResourceError; +use mcp_core::handler::{PromptError, ResourceError}; +use mcp_core::prompt::{Prompt, PromptArgument}; use mcp_core::{handler::ToolError, protocol::ServerCapabilities, resource::Resource, tool::Tool}; use mcp_server::router::{CapabilitiesBuilder, RouterService}; use mcp_server::{ByteTransport, Router, Server}; @@ -61,6 +62,7 @@ impl Router for CounterRouter { CapabilitiesBuilder::new() .with_tools(false) .with_resources(false, false) + .with_prompts(false) .build() } @@ -153,6 +155,37 @@ impl Router for CounterRouter { } }) } + + fn list_prompts(&self) -> Vec { + vec![Prompt::new( + "example_prompt", + Some("This is an example prompt that takes one required agrument, message"), + Some(vec![PromptArgument { + name: "message".to_string(), + description: Some("A message to put in the prompt".to_string()), + required: Some(true), + }]), + )] + } + + fn get_prompt( + &self, + prompt_name: &str, + ) -> Pin> + Send + 'static>> { + let prompt_name = prompt_name.to_string(); + Box::pin(async move { + match prompt_name.as_str() { + "example_prompt" => { + let prompt = "This is an example prompt with your message here: '{message}'"; + Ok(prompt.to_string()) + } + _ => Err(PromptError::NotFound(format!( + "Prompt {} not found", + prompt_name + ))), + } + }) + } } #[tokio::main]