核對協議角色
從調用方向判斷客户端與服務端,避免把內部 Hub Server 等同於 MCP Server。
真正的客户端還要完成配置合併、OAuth、能力發現、命名隔離、模型可見性控制、狀態推送和斷綫恢復。源碼將這些責任拆在 MCP crate 與 Session Actor 周邊。
從調用方向判斷客户端與服務端,避免把內部 Hub Server 等同於 MCP Server。
解釋工具如何從 tools/list 進入快照、搜索索引與模型註冊表。
把 OAuth、狀態合併、客户端身份和重啓退避放進同一連接生命週期。
McpClient 啓動 stdio 或 Streamable HTTP 連接,執行初始化、list_tools 與 call_tool。Computer Hub MCP Adapter 也描述為把 MCP Server 的工具橋接進 Hub 路由。
xai-grok-workspace 的 Hub Server 屬於 xAI Computer Hub 協議。當前快照未找到將 Grok Build 自身通過 MCP 傳輸暴露給任意 MCP Client 的入口,因此本課只確認客户端角色。
oauth_client_id
oauth_client_secret_env_var
oauth_scopescrates/codegen/xai-grok-config-types/src/mcp.rslet path = grok_home
.join("mcp_credentials.json");
// lock + load + insert + atomic save源碼採用該檔案存儲,並通過檔案鎖與原子保存處理併發寫入。
crates/codegen/xai-grok-mcp/src/credentials.rs · oauth.rsserver__tool註冊名由服務端名、保留分隔符 __ 和原始工具名組成。源碼要求完整名稱中恰好出現一次分隔符,避免解析歧義,也讓兩個 Server 的同名工具擁有不同 ToolId。
禁用工具會存入 disabled_tool_registrations;model_visible 為真才進入模型側 Tool Bridge;帶 ui.resourceUri 的工具可單獨進入 UI 通知。
ToolMetadataSnapshot 保存工具與服務端元數據,BM25 索引支持按 qualified name 或裸工具名精確命中,再提供搜索結果。mcp_initialized 告訴搜索層能力發現是否完成。
pub struct ToolMetadataSnapshot {
pub tools: Vec<ToolMetadata>,
pub servers: Vec<ServerMetadata>,
pub mcp_initialized: bool,
}crates/codegen/xai-grok-shell/src/session/tool_index.rsmcp_dispatcher 以 (server_name, event_kind) 為鍵,在 50 ms tumbling window 內 last-write-wins。高頻 tools/list_changed 最終只推一次 ACP 狀態。
移除 dead client 前比較 client_id。如果斷綫事件屬於已被替換的舊客户端,保持當前客户端,並丟棄過期狀態。
stdio 自動重啓使用固定退避 1s → 4s → 16s,並檢查關閉中、已禁用、配置移除等護欄。HTTP 先嘗試客户端內恢復,並使用獨立退避。成功重連後重新發現與註冊工具,隨後刷新快照。
提交物
狀態圖與 6 條測試
tools/list_changed,寫出 50 ms 合併後的預期通知數。client_id 護欄如何保護新連接。MCP 集成的工程量集中在協議外圍。命名、可見性、身份、狀態合併和恢復策略共同決定一條連接能否長期穩定工作。
源碼快照説明:本頁依據本地 grok-build-main 的 MCP、config-types、shell session 與 computer-hub adapter 源碼整理。程式碼片段為教學截取。關於 MCP 服務端角色的結論採用保守口徑,內部 Hub Server 不作為通用 MCP Server 證據。