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