* feat: add prompt support with typed argument handling - Implement #[prompt], #[prompt_router], and #[prompt_handler] macros - Add automatic JSON schema generation from Rust types for arguments - Support flexible async handler signatures with automatic adaptation - Create PromptRouter for efficient prompt dispatch - Include comprehensive tests and example implementation This enables MCP servers to provide reusable prompt templates that LLMs can discover and invoke with strongly-typed parameters, similar to the existing tool system but optimized for prompt use cases. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> * refactor: unify parameter handling between tools and prompts - Replace Arguments<T> with Parameters<T> for consistent API - Create shared common module for tool/prompt utilities - Modernize async handling with futures::future::BoxFuture - Move cached_schema_for_type to common module for reuse - Update error types from rmcp::Error to rmcp::ErrorData - Add comprehensive trait implementations for parameter extraction 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> * refactor: extract Parameters wrapper to shared module and unify trait usage - Move Parameters type from common.rs to dedicated wrapper/parameters.rs module - Unify extractor traits by using FromContextPart for both tools and prompts - Remove duplicate FromToolCallContextPart and FromPromptContextPart traits - Add structured output support to Json wrapper with IntoCallToolResult impl - Improve error messages with more descriptive panic for schema serialization - Update all imports across codebase to use new module path - Clean up trailing whitespace and formatting inconsistencies This consolidates parameter extraction logic and reduces code duplication between tool and prompt handlers while maintaining backward compatibility. * chore: remove committed .egg-info directory and update gitignore * docs: fix documentation formatting
66 lines
1.5 KiB
Rust
66 lines
1.5 KiB
Rust
use rmcp::{
|
|
ErrorData as McpError, handler::server::wrapper::Parameters, model::*, schemars, tool,
|
|
tool_router,
|
|
};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
|
|
pub enum ChatRole {
|
|
System,
|
|
User,
|
|
Assistant,
|
|
Tool,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
|
|
pub struct ChatMessage {
|
|
pub role: ChatRole,
|
|
pub content: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
|
|
pub struct ChatRequest {
|
|
pub system: Option<String>,
|
|
pub messages: Vec<ChatMessage>,
|
|
}
|
|
|
|
#[derive(Clone, Default)]
|
|
pub struct Demo;
|
|
|
|
#[tool_router]
|
|
impl Demo {
|
|
pub fn new() -> Self {
|
|
Self
|
|
}
|
|
|
|
#[tool(description = "LLM")]
|
|
async fn chat(
|
|
&self,
|
|
chat_request: Parameters<ChatRequest>,
|
|
) -> Result<CallToolResult, McpError> {
|
|
let content = Content::json(chat_request.0)?;
|
|
Ok(CallToolResult::success(vec![content]))
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_complex_schema() {
|
|
let attr = Demo::chat_tool_attr();
|
|
let input_schema = attr.input_schema;
|
|
let enum_number = input_schema
|
|
.get("definitions")
|
|
.unwrap()
|
|
.as_object()
|
|
.unwrap()
|
|
.get("ChatRole")
|
|
.unwrap()
|
|
.as_object()
|
|
.unwrap()
|
|
.get("enum")
|
|
.unwrap()
|
|
.as_array()
|
|
.unwrap()
|
|
.len();
|
|
assert_eq!(enum_number, 4);
|
|
println!("{}", serde_json::to_string_pretty(&input_schema).unwrap());
|
|
}
|