| 11102 | /* ── Tool dispatch ────────────────────────────────────────────── */ |
| 11103 | |
| 11104 | static char *dispatch_tool(cbm_mcp_server_t *srv, const char *tool_name, const char *args_json) { |
| 11105 | if (!tool_name) { |
| 11106 | return cbm_mcp_text_result("missing tool name", true); |
| 11107 | } |
| 11108 | if (srv && !mcp_tool_allowed(srv->tool_profile, tool_name)) { |
| 11109 | char message[CBM_SZ_256]; |
| 11110 | snprintf(message, sizeof(message), "tool '%s' is not available in the %s tool profile", |
| 11111 | tool_name, mcp_tool_profile_name(srv->tool_profile)); |
| 11112 | return cbm_mcp_text_result(message, true); |
| 11113 | } |
| 11114 | |
| 11115 | if (strcmp(tool_name, "list_projects") == 0) { |
| 11116 | return handle_list_projects(srv, args_json); |
| 11117 | } |
| 11118 | if (strcmp(tool_name, "get_graph_schema") == 0) { |
| 11119 | return handle_get_graph_schema(srv, args_json); |
| 11120 | } |
| 11121 | if (strcmp(tool_name, "search_graph") == 0) { |
| 11122 | return handle_search_graph(srv, args_json); |
| 11123 | } |
| 11124 | if (strcmp(tool_name, "query_graph") == 0) { |
| 11125 | return handle_query_graph(srv, args_json); |
| 11126 | } |
| 11127 | if (strcmp(tool_name, "index_status") == 0) { |
| 11128 | return handle_index_status(srv, args_json); |
| 11129 | } |
| 11130 | if (strcmp(tool_name, "check_index_coverage") == 0) { |
| 11131 | return handle_check_index_coverage(srv, args_json); |
| 11132 | } |
| 11133 | if (strcmp(tool_name, "delete_project") == 0) { |
| 11134 | return handle_delete_project(srv, args_json); |
| 11135 | } |
| 11136 | if (strcmp(tool_name, "trace_path") == 0 || strcmp(tool_name, "trace_call_path") == 0) { |
| 11137 | return handle_trace_call_path(srv, args_json); |
| 11138 | } |
| 11139 | if (strcmp(tool_name, "get_architecture") == 0) { |
| 11140 | return handle_get_architecture(srv, args_json); |
| 11141 | } |
| 11142 | |
| 11143 | /* Pipeline-dependent tools */ |
| 11144 | if (strcmp(tool_name, "index_repository") == 0) { |
| 11145 | return handle_index_repository(srv, args_json); |
| 11146 | } |
| 11147 | if (strcmp(tool_name, "get_code_snippet") == 0) { |
| 11148 | return handle_get_code_snippet(srv, args_json); |
| 11149 | } |
| 11150 | if (strcmp(tool_name, "search_code") == 0) { |
| 11151 | return handle_search_code(srv, args_json); |
| 11152 | } |
| 11153 | if (strcmp(tool_name, "detect_changes") == 0) { |
| 11154 | return handle_detect_changes(srv, args_json); |
| 11155 | } |
| 11156 | if (strcmp(tool_name, "manage_adr") == 0) { |
| 11157 | return handle_manage_adr(srv, args_json); |
| 11158 | } |
| 11159 | if (strcmp(tool_name, "ingest_traces") == 0) { |
| 11160 | return handle_ingest_traces(srv, args_json); |
| 11161 | } |
no test coverage detected