mcp/mcp.c — MCP 工具層

15 個工具的註冊與執行、JSON-RPC 2.0、session detection
檔案:src/mcp/mcp.c(11,797 行)· mcp.h

大方向

mcp.c 是 CBM 對 MCP client 的門面。它負責:JSON-RPC 2.0 的解析與回覆、15 個工具的 schema 註冊與分派、session 的生命週期、以及 auto-index 的觸發。當你的 agent 呼叫 search_graph,請求就是在這裡被解包、路由到 store/cypher/,再包成 JSON-RPC 回覆。


1. 工具註冊

工具 schema 表 mcp.c每個工具 = name + description + input schema,註冊進 tools list。

15 個工具的定義是資料導向的:每個工具列出參數(name/label/qn…)、型別、是否必填。MCP client 靠這份 schema 知道怎麼呼叫。工具的實際執行是 switch 或查表分派到對應 handler。

教學重點:MCP 的「工具」在本質上就是「有 JSON schema 的 RPC endpoint」——理解這張表就理解整個工具層的形狀。
cbm_mcp_get_tool_name() · cbm_mcp_get_arguments() mcp.c從 JSON-RPC 請求取出 tool name 與參數。

JSON-RPC 2.0 的 tools/call 請求 body 有 namearguments。這兩個函式是解包的入口——避免每次呼叫都手動翻 JSON。

2. Server 生命週期

cbm_mcp_server_new() · cbm_mcp_server_handle() · cbm_mcp_server_evict_idle() mcp.cserver 的建立、單次請求處理、閒置回收。

MCP server 是 stdio 協議:handle() 讀一行 JSON-RPC、解包、分派、回覆。evict_idle() 與 daemon 合作回收閒置 session 的資源。session 之間透過 daemon 共享索引、watcher、UI。

3. 工具分派(節選)

search_graph / trace_path / query_graph / get_code_snippet mcp.c查詢類工具:包住 store/ 的圖操作。

查詢類工具大多是薄包裝:解析參數 → 呼叫 store/(或 cypher/)→ 包成 MCP 結果。真正的圖操作在 store 層。想深入可以接著看 store/store.ccypher/cypher.c

index_repository mcp.c啟動索引(首次全索引或增量)。

接受 repo_path(絕對路徑),呼叫 pipeline 做索引。auto_index 開啟時,新 session 的第一次連線會自動對目前工作目錄觸發此工具。索引在 daemon 的共享 job 系統執行。

check_index_coverage mcp.c檢查一組路徑的索引涵蓋率。

回傳每個路徑是否被索引、有無 flagged/skipped/excluded 範圍。agent 的 Verify/Auditor tier 用它做證據檢查——clean 不代表完整證明,只代表「沒有記錄缺口」。

4. JSON-RPC 錯誤處理

cbm_jsonrpc_format_error() · cbm_jsonrpc_format_response() mcp.c包 JSON-RPC 錯誤/成功回覆。

統一的回覆格式:錯誤帶 code/message,Cypher 的 unsupported … 錯誤就在這裡成形。stdout 只出 JSON-RPC(機器可讀),日誌走 stderr / daemon log。

看完這頁你應該能說出:MCP 工具本質上是帶 JSON schema 的 RPC endpoint、mcp.c 是薄門面而重邏輯在 store/cypher、session 生命週期由 daemon 協調、以及 stdout 為何要乾淨。