embacle_server/mcp/tools/
mod.rs1pub mod list_models;
8pub mod prompt;
9
10use std::collections::HashMap;
11
12use async_trait::async_trait;
13use serde_json::Value;
14
15use super::protocol::{CallToolResult, ToolDefinition};
16use crate::state::SharedState;
17
18#[async_trait]
20pub trait McpTool: Send + Sync {
21 fn definition(&self) -> ToolDefinition;
23
24 async fn execute(&self, state: &SharedState, arguments: Value) -> CallToolResult;
26}
27
28#[derive(Default)]
30pub struct ToolRegistry {
31 tools: HashMap<String, Box<dyn McpTool>>,
32}
33
34impl ToolRegistry {
35 pub fn new() -> Self {
37 Self::default()
38 }
39
40 pub fn register(&mut self, tool: Box<dyn McpTool>) {
42 let name = tool.definition().name;
43 self.tools.insert(name, tool);
44 }
45
46 pub fn list_definitions(&self) -> Vec<ToolDefinition> {
48 self.tools.values().map(|t| t.definition()).collect()
49 }
50
51 pub async fn execute(
53 &self,
54 name: &str,
55 state: &SharedState,
56 arguments: Value,
57 ) -> CallToolResult {
58 match self.tools.get(name) {
59 Some(tool) => tool.execute(state, arguments).await,
60 None => CallToolResult::error(format!("Unknown tool: {name}")),
61 }
62 }
63}
64
65pub fn build_tool_registry() -> ToolRegistry {
67 let mut registry = ToolRegistry::new();
68 registry.register(Box::new(prompt::Prompt));
69 registry.register(Box::new(list_models::ListModels));
70 registry
71}