CodeGraph MCP Server 指南:单工具 codegraph_explore 策略、CODEGRAPH_MCP_TOOLS 配置与 Agent 使用范式
CodeGraph 通过一个常驻的 MCP(Model Context Protocol)Server 将预构建的代码知识图谱暴露给 AI Agent,默认只暴露一个"Read 级等价"的核心工具 codegraph_explore。本文基于仓库文档 MCP Server 展开,结合 MCP 工具定义源码、服务器级指令 与 MCP 启动逻辑,完整讲清 MCP 面的工具清单、CODEGRAPH_MCP_TOOLS 允许列表、输入输出边界,以及"一次 explore 取代 grep + Read 循环"的 Agent 使用范式。
启动方式:由安装器托管,无需手动运行
CodeGraph 以 MCP Server 身份运行。由安装器配置的 Agent 会自动拉起它,开发者不需要手动启动:
codegraph serve --mcp
安装器会把这一条命令写进各 Agent 客户端的 MCP 配置。从源码可以看到,所有安装目标统一使用 args: ['serve', '--mcp'],例如 共享安装目标、Antigravity 目标、OpenCode 目标;CLI 入口在 src/bin/codegraph.ts 中为 serve 子命令注册了 --mcp 选项(Run as MCP server,stdio transport)。
一个重要的设计约束是索引主权属于用户:
- 工作区存在
.codegraph/索引时,Agent 才会获得 CodeGraph 的工具; - 在没有索引的工作区,服务器宣布自己处于非激活状态并不列出任何工具——Agent 继续用内置工具正常工作,是否建立索引始终由用户决定(用户可以在该项目中运行
codegraph init); - 从源码看,即使服务器启动点本身没有索引,服务器仍会通过
projectPath参数支持按项目查询任何已建索引的项目,并下发一套专用的服务器指令 SERVER_INSTRUCTIONS_NO_ROOT_INDEX,明确告诉 Agent "无默认项目、每次调用传projectPath"。
从 src/mcp/index.ts 的注释还可以看到,serve --mcp 实际有三种运行时形态:Direct(单进程单客户端,CODEGRAPH_NO_DAEMON=1 时的行为)、Proxy(与共享 daemon 之间的 stdio↔socket 管道)、Daemon(脱离宿主进程、按项目根复用的后台进程)。三者对 Agent 透明,这里不展开。
默认只有一个工具:codegraph_explore
默认情况下,MCP 服务器只暴露一个工具:codegraph_explore。它是 Read 级等价的——输入一个自然语言问题或一袋子符号/文件名,返回相关符号的逐字、带行号的源码(按文件分组,和 Read 工具输出同一 <n>\t<line> 形状,可直接基于其 Edit),外加它们之间的调用路径(包括 grep 追不上的动态分发跳变,如回调、React re-render、JSX 子节点)以及一份影响面(blast-radius)摘要——说明哪些代码依赖这些符号。一次调用通常就能回答整个问题。
"只暴露一个强工具"是刻意的设计决策。仓库记录了对 Agent 行为的实测:一个瞄准精准的工具比一堆更窄的工具更能引导 Agent 直达答案(误选更少),而且 Agent 在回答问题和编辑代码时都会主动使用它。这个决策在源码中落为一行常量 DEFAULT_MCP_TOOLS = new Set(['explore']):其余工具的定义与处理逻辑全部保留,只是不再列给 Agent。
explore 的输入与动态描述
工具定义 中 codegraph_explore 的输入为:
| 参数 | 类型 | 说明 |
|---|---|---|
query(必填) |
string | 符号名、文件名或简短代码词,也可以是自然语言问题;流程类问题应命名跨流程的符号(如 mutateElement renderScene) |
maxFiles |
number | 最多包含源码的文件数,默认 12 |
projectPath |
string | 跨项目查询时指定目标项目(就近解析其 .codegraph/) |
另外两点源码级细节:
- 预算建议随项目规模动态注入:getTools() 会按索引文件数计算建议的 explore 调用次数(文件数 <500 时 1 次,逐级到 5 次),并把它追加进工具描述,例如
Budget: make at most 2 calls for this project (12,345 files indexed); - 输出预算按规模分级:getExploreOutputBudget() 按文件数分档(150/500/5000/15000),总输出上限从 13K 字符封顶到约 24K,保证响应不会被宿主客户端外置成文件再读回来。
只读契约:工具注解
所有工具共享一组 READ_ONLY_ANNOTATIONS:readOnlyHint: true、destructiveHint: false、idempotentHint: true、openWorldHint: false。代码注释解释了它的实际价值——MCP 的 ToolAnnotations 是客户端可选参考但普遍会依据其行为做门控的字段,例如 Cursor 的 Ask 模式会拒绝任何未声明 readOnlyHint: true 的 MCP 工具;测试 mcp-tool-annotations.test.ts 覆盖了这一契约。
输入长度防护
MCP 客户端可能发送超大负载,源码为此设了三道上限(src/mcp/tools.ts):
MAX_OUTPUT_LENGTH = 15000字符:防止上下文膨胀;MAX_INPUT_LENGTH = 10_000字符:自由文本入参(query/task/symbol),超过即拒绝,避免恶意客户端用 100MB 字符串打爆 FTS5 扫描;MAX_PATH_LENGTH = 4_096字符:路径类入参(projectPath、path 过滤、glob)的上限。
越界时工具返回明确错误(如 query exceeds maximum length of 10000 characters),而不是崩溃或挂起。
其余 7 个工具:完全可用,但默认不列出
另有 7 个工具存在且完全功能可用,只是默认不在 tools/list 中列出——因为它们返回的信息已经内联在 codegraph_explore 的响应里(explore 的影响面小节、关系图、符号本体及其被调用列表):
| 工具 | 用途 |
|---|---|
codegraph_node |
单个符号的源码 + caller/callee 链路;或以 Read 同等形状(带行号)整文件读取,重名时返回所有重载定义体 |
codegraph_search |
按名称跨库查找符号(只返回位置,不返回代码) |
codegraph_callers |
找出调用某函数的所有函数 |
codegraph_callees |
找出某函数调用的所有函数 |
codegraph_impact |
分析修改某符号会波及哪些代码 |
codegraph_files |
获取已索引的文件结构(比文件系统扫描更快) |
codegraph_status |
检查索引健康度与统计信息 |
各工具的完整 JSON Schema 见 tools.ts 中的定义,常用默认值可一览:
codegraph_search:kind支持 function/method/class/interface/type/variable/route/component 过滤,limit默认 10;codegraph_callers/codegraph_callees:必填symbol,可用file在重名符号间消歧,limit默认 20;codegraph_impact:depth默认 2(遍历多少层依赖);codegraph_node:两种模式——只传file是"整文件读取"(支持offset/limit/symbolsOnly,与 Read 同形),传symbol(+可选includeCode/line)是"单符号定位 + 源码 + 调用链";codegraph_files:支持path目录过滤、patternglob、format(tree/flat/grouped)。
每个工具都有对应的 CLI 等价命令,供脚本和非 MCP 场景使用:
| MCP 工具 | CLI 等价命令 |
|---|---|
codegraph_node |
codegraph node |
codegraph_search |
codegraph query |
codegraph_callers |
codegraph callers |
codegraph_callees |
codegraph callees |
codegraph_impact |
codegraph impact |
codegraph_files |
codegraph files |
codegraph_status |
codegraph status |
README 对这一点有同样说明:这些工具"stays fully functional but unlisted by default",并给出了 CODEGRAPH_MCP_TOOLS 与 CLI 等价命令的组合用法。
用 CODEGRAPH_MCP_TOOLS 重新启用工具
CODEGRAPH_MCP_TOOLS 环境变量接受一个逗号分隔的短名允许列表,整体替换默认工具面:
CODEGRAPH_MCP_TOOLS=explore,node,search,callers
源码行为细节(见 getStaticTools() 与 ToolHandler.toolAllowlist()):
- 未设置/为空:走默认面(仅
explore); - 设置后:完整替换默认,任意已定义工具都可被重新启用;
- 匹配用短名,
node与codegraph_node均可,前缀可带可不带; - 被允许列表裁掉的工具是真正从 ListTools 消失,而不是调用时才被拒绝;若客户端仍调用一个被禁用的工具,会收到
Tool <name> is disabled via CODEGRAPH_MCP_TOOLS的明确错误; - 测试 mcp-tool-allowlist.test.ts 覆盖了允许列表解析与禁用报错两条路径。
该变量通常写在 MCP 配置的 env 块中(仓库的评测脚本 run-arms.sh 正是这样做的:"env":{"CODEGRAPH_MCP_TOOLS":"$TOOLS"}),无需改客户端的工具清单配置即可收缩工具面。
Agent 使用范式:一次 explore 代替 grep + Read
CodeGraph 就是那个预构建的搜索索引。文档给出的用法原则:
- 面对"X 如何工作"、架构问题、流程问题("X 如何到达 Y")、"X 在哪"类问题,以及编辑代码过程中,Agent 应直接用
codegraph_explore回答然后停下,典型情况下零次文件读取,而不是用 grep + Read 重新推导答案; - 量级对比:一次直接的 CodeGraph 回答是 1 到几次调用;一次 grep/read 式探索则是几十次。
这份指导如何到达 Agent 的?两条通道:
- MCP
initialize响应:服务器在握手时下发服务器级指令(SERVER_INSTRUCTIONS),MCP 客户端(Claude Code、Cursor、opencode 等)会自动把它注入主 Agent 的系统提示。指令内容包括:任何结构性/流程性问题优先 explore;把 explore 返回的源码视为"已 Read",不要再重复打开这些文件;反模式清单(不要用 grep 复核 codegraph 的结果、不要先 grep/Read 再 explore、不要手工拼流程、编辑后留意 staleness 横幅);以及局限说明(索引落后文件写入约 1 秒、跨文件解析是尽力而为的名称匹配、不承担实时正确性验证职责); - 安装器写入的指令文件段:由于子 Agent 和非 MCP 框架永远看不到
initialize响应,安装器会额外在每个 Agent 的指令文件中写入一段简短的、带标记围栏的说明,指向codegraph exploreCLI 等价命令(安装器实现见 src/installer/ 目录)。
两条通道共同保证了无论 Agent 走 MCP 还是 CLI,拿到的行为指引一致。
小结
CodeGraph 的 MCP 面设计可以概括为三句话:默认一个 codegraph_explore 工具承担几乎全部场景(逐字源码 + 调用路径 + 影响面,一次调用取代几十次 grep/Read);其余 7 个工具保留完整功能并通过 CODEGRAPH_MCP_TOOLS 一键重新露出;Agent 侧的使用范式通过 initialize 响应与安装器指令文件双通道下发。工具定义、允许列表与输出预算的实现均可在 src/mcp/tools.ts 中直接查阅,行为边界由 mcp-tool-allowlist.test.ts、mcp-tool-annotations.test.ts 等测试固化。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00