codeprism_mcp/tools/
mod.rs

1//! MCP Tools modular implementation
2//!
3//! This module organizes tools into logical categories for better maintainability
4
5pub mod analysis;
6pub mod core;
7pub mod search;
8pub mod workflow;
9
10// Re-export all types from tools_legacy for backward compatibility
11pub use crate::tools_legacy::{
12    CallToolParams, CallToolResult, ListToolsParams, ListToolsResult, Tool, ToolCapabilities,
13    ToolContent, ToolManager,
14};
15
16use crate::CodePrismMcpServer;
17use anyhow::Result;
18
19/// Tool registry that coordinates all modular tools
20pub struct ToolRegistry {
21    server: std::sync::Arc<tokio::sync::RwLock<CodePrismMcpServer>>,
22}
23
24impl ToolRegistry {
25    /// Create a new tool registry
26    pub fn new(server: std::sync::Arc<tokio::sync::RwLock<CodePrismMcpServer>>) -> Self {
27        Self { server }
28    }
29
30    /// List all available tools from all modules
31    pub async fn list_tools(&self, _params: ListToolsParams) -> Result<ListToolsResult> {
32        let mut tools = Vec::new();
33
34        // Core navigation tools
35        tools.extend(core::navigation::list_tools());
36        tools.extend(core::symbols::list_tools());
37        tools.extend(core::repository::list_tools());
38
39        // Search and discovery tools
40        tools.extend(search::content::list_tools());
41        tools.extend(search::patterns::list_tools());
42
43        // Analysis tools
44        tools.extend(analysis::complexity::list_tools());
45        tools.extend(analysis::flow::list_tools());
46        tools.extend(analysis::specialized::list_tools());
47        tools.extend(analysis::quality::list_tools());
48
49        // Workflow orchestration tools
50        tools.extend(workflow::register_workflow_tools());
51
52        Ok(ListToolsResult {
53            tools,
54            next_cursor: None,
55        })
56    }
57
58    /// Route tool calls to appropriate modules
59    pub async fn call_tool(&self, params: CallToolParams) -> Result<CallToolResult> {
60        let server = self.server.read().await;
61
62        match params.name.as_str() {
63            // Core navigation tools
64            "repository_stats" => core::repository::call_tool(&server, &params).await,
65            "trace_path" | "find_dependencies" | "find_references" => {
66                core::navigation::call_tool(&server, &params).await
67            }
68            "explain_symbol" | "search_symbols" => core::symbols::call_tool(&server, &params).await,
69
70            // Search and discovery tools
71            "search_content" | "find_files" | "content_stats" => {
72                search::content::call_tool(&server, &params).await
73            }
74            "detect_patterns" => search::patterns::call_tool(&server, &params).await,
75
76            // Analysis tools
77            "analyze_complexity" => analysis::complexity::call_tool(&server, &params).await,
78            "trace_data_flow" | "analyze_transitive_dependencies" => {
79                analysis::flow::call_tool(&server, &params).await
80            }
81            "trace_inheritance" | "analyze_decorators" => {
82                analysis::specialized::call_tool(&server, &params).await
83            }
84            "find_duplicates"
85            | "find_unused_code"
86            | "analyze_security"
87            | "analyze_performance"
88            | "analyze_api_surface" => analysis::quality::call_tool(&server, &params).await,
89
90            // Workflow orchestration tools
91            "suggest_analysis_workflow" | "batch_analysis" | "optimize_workflow" => {
92                workflow::handle_workflow_tool(&params.name, &server, params.arguments.as_ref())
93                    .await
94            }
95
96            _ => Err(anyhow::anyhow!("Unknown tool: {}", params.name)),
97        }
98    }
99}