CodeGraph 深度研究:本地代码知识图谱与 AI Agent 加速器
摘要
CodeGraph(colbymchenry/codegraph)是一个本地优先的代码情报工具:用 tree-sitter 把 20+ 语种的整个代码库解析成 AST,再把符号、调用边、导入关系、框架路由等沉淀进本地 SQLite 知识图谱,并通过 MCP 暴露给 Claude Code、Cursor、Codex、Gemini 等 AI 编码代理。它的核心价值是用一次预索引替换 Agent 反复 grep/Read 的”瞎找”过程,实测可在大型仓库上节省约 16–35% 成本、47–57% Token、58–71% 工具调用次数,全程不出本机。
研究问题
- CodeGraph 解决的核心问题是什么?相比纯靠 Agent 文件扫描有何优势?
- 它的工作原理(解析、存储、查询、同步)是什么样的?
- 适用范围:支持哪些语言/框架/Agent?什么场景受益最大、什么场景不适用?
- 怎么使用:安装、初始化、CLI、MCP 工具集与库化集成?
- 与 Serena、repomix、tree-sitter-analyzer、向量化 RAG 等同类方案有什么差异?
发现
定位:本地优先的”代码知识图谱 + MCP 服务器” — CodeGraph 自我定位为 “a local-first code-intelligence tool that turns any codebase into a queryable knowledge graph for AI coding agents”,所有数据落在
.codegraph/下的 SQLite,不出本机、不需要 API Key。来源解析与存储:tree-sitter + SQLite(FTS5) 的确定性抽取 — 用 tree-sitter 做增量 AST 解析,按语言查询提取节点(函数、类、方法、类型、路由、组件)和边(调用、导入、继承、引用、框架特定关系),结果写入启用 WAL 的 SQLite,并由 FTS5 提供全文检索。整个抽取过程”deterministic — derived from the AST, never LLM-summarized”,避免幻觉。来源
核心能力:符号关系图、调用图、影响半径、框架路由识别 — 支持调用者/被调用者追溯、变更影响半径分析(impact radius)、跨语言桥接(Swift↔Objective-C、React Native bridge、Expo Modules、Fabric view)、以及覆盖 17 个 Web 框架的路由识别(Next.js / Nuxt / SvelteKit 等)。来源
自动同步:原生文件事件 + 去抖动重建 — 使用 FSEvents(macOS)/ inotify(Linux)/ ReadDirectoryChangesW(Windows)做监听,默认 2 秒去抖动(
CODEGRAPH_WATCH_DEBOUNCE_MS可调 100ms–60s),并在 Agent 连接时做一次”reconciliation”补齐期间的漏更新。来源语言覆盖:20+ 主流语言全支持,框架感知扩展 — TypeScript、JavaScript、Python、Go、Rust、Java、C#、PHP、Ruby、C/C++、Objective-C、Swift、Kotlin、Scala、Dart、Lua、Luau、R、Svelte、Vue、Astro、Liquid、Pascal/Delphi 等。框架感知层进一步识别 SvelteKit 路由、Nuxt page/API/middleware、Scala 3 enums、Pascal/Delphi DFM/FMX 表单等。来源
跨文件依赖解析覆盖率(官方实测) — Python / PHP / Svelte 100%,Go 96.6%,TypeScript 95.8%,Java 93.3%,Rust 86.7%,Liquid 73.8%。这是 CodeGraph 对外宣传的”图谱完整度”指标。来源
基准:在 7 个真实仓库上的中位数收益 — 相比 Agent 不接 CodeGraph:成本 ↓16%、Token ↓47%、响应时间 ↓22%、工具调用 ↓58%。在大仓极端样例上:VS Code 仓 1.79M → 545k Token(-70%)、TypeScript 项目 32 次 → 3 次工具调用。来源 对照来源
安装与初始化:一行脚本 + 自动接入 Agent — 提供独立 Bundled Node 安装脚本(
curl ... install.sh | sh/irm ... install.ps1 | iex)以及 npm 全局包@colbymchenry/codegraph;codegraph install会自动检测并写入 Claude Code、Cursor、Codex CLI、opencode、Hermes、Gemini CLI、Antigravity IDE、Kiro 的 MCP 配置;进入项目后codegraph init建索引。来源CLI 查询接口 — 常用命令:
codegraph explore "How does authentication work?"(架构问答)、codegraph search UserService(按名查符号)、codegraph callers handleLogin(找全部调用点)、codegraph impact changePassword --depth=2(影响半径)、codegraph affected src/auth.ts(找被该文件影响的测试)。来源MCP 工具集(暴露给 Agent 的四个核心工具) —
codegraph_explore:一次调用回答架构性问题(”鉴权怎么走的”),等价于在图谱上做有方向的多跳查询;codegraph_node:读单个符号的源码 + 上下游依赖;codegraph_search:按名定位符号;codegraph_callers:列所有调用点。
通过CODEGRAPH_MCP_TOOLS可启用更多扩展工具(codegraph_callees/codegraph_impact/codegraph_affected/codegraph_files/codegraph_status)。详细参数与样例见下文「四个核心 MCP 工具详解」。来源
库化嵌入:可作为 Node 库直接调用 —
1
2
3
4
5import CodeGraph from '@colbymchenry/codegraph';
const cg = await CodeGraph.init('/path/to/project');
await cg.indexAll();
const results = cg.searchNodes('UserService');
cg.watch();适合做自定义脚手架/CI 影响分析/自家 Agent 的上下文供给。来源
零配置 + 可控环境变量 — 无需配置文件,自动排除
node_modules / vendor / dist / build / target / .venv / Pods / .next与.gitignore中的目录、>1MB 文件;可用.gitignore反向规则(!vendor/)覆盖。环境变量包括CODEGRAPH_WATCH_DEBOUNCE_MS、CODEGRAPH_NO_DAEMON、CODEGRAPH_DIR、CODEGRAPH_MCP_TOOLS、CODEGRAPH_TELEMETRY。来源隐私与遥测 — 索引完全本地;遥测仅上报命令使用频次、语言索引频次等聚合数据,不含代码/路径/IP;
codegraph telemetry off或CODEGRAPH_TELEMETRY=0关闭。许可证 MIT。来源与同类方案对比 —
- vs 纯 Agent(Claude Code 默认行为):CodeGraph 把”反复 grep + 文件读”折叠成一次 SQL 级查询,大仓收益最大;
- vs Tree-sitter Analyzer(另一个 MCP 工具):在符号密集仓如 Django 上 CodeGraph 优势更明显(-35% Token),TSA 在中位数成本上略低(-11% vs -4%);
- vs 向量 RAG(embedding 检索):CodeGraph 强在结构化/精确匹配查询(”谁调用了 X”、”改动 Y 影响哪些测试”),向量库更适合”找做某件事的代码”这类语义相似查询,两者互补而非替代;
- vs Serena / repomix:Serena 偏 LSP 驱动的语义工具集、repomix 偏”打包整仓喂大模型”,CodeGraph 主打”持续运行的本地图谱 + MCP 直查”,调用粒度更细、不依赖一次性塞 Token。来源 基准对照
对比与判断
- 最适合的场景:中大型多语言单体仓 / monorepo、需要让 AI Agent 跨文件追依赖、做重构影响分析、做”哪里调用了它”类问题。在 VS Code、Swift Compiler、FastAPI 这类规模上,Token 与工具调用降幅最大。
- 不太适合的场景:
- <100 文件的小仓,预索引 + MCP 调用的固定开销吃掉收益(Gin 仓只有 -15% 成本);
- “找做某件事的代码”这类纯语义检索问题,向量 RAG 仍优;
- 高度动态/反射/字符串拼接调用为主的代码(图谱无法静态解出全部边)。
- 工程取舍:
- 用确定性 AST 抽取换可解释性和稳定性,代价是没法像 LLM 那样总结意图;
- 用本地 SQLite 换隐私和零成本调用,代价是不像云端服务那样自动随团队共享索引(其官方有 hosted 版 waitlist);
- 自动监听 + 去抖动让”代码改完图谱就过时”的痛点最小化,但大改动落盘瞬间仍会触发短暂的重建窗口。
- 判断:对接入 Claude Code / Cursor 等 Agent 且仓库规模 ≥ 几千文件、跨语言或多框架的团队,CodeGraph 属于”装上几乎不亏”的工具——成本和延迟都在降,且可观测、可关闭、不出本机。对小项目或主要靠语义搜索的研究型代码库,先评估再决定。
四个核心 MCP 工具详解
CodeGraph 暴露给 AI 的”四件套”是 codegraph_explore / codegraph_node / codegraph_search / codegraph_callers;通过 CODEGRAPH_MCP_TOOLS 环境变量还能解锁 codegraph_callees / codegraph_impact / codegraph_affected / codegraph_files / codegraph_status 等扩展工具。每个 MCP 工具都有同名 CLI 命令(codegraph explore "..." ),不经 LLM 也能直接跑。
下面分工具详解。所有样例都在 shield 仓里实跑,输出已截断为关键片段。
1. codegraph_explore —— 架构问答的”瑞士军刀”
做什么:给一段自然语言描述,返回相关符号的源码 + 调用路径 + 影响半径,相当于把”模糊查询 → 多跳遍历图谱 → 回填源码”折叠成一次调用。这是日常用得最多的一个工具,本次实测 v2 中 14 次 codegraph 调用里有 10 次是它。
主要参数:
query(必填):自然语言或符号名,支持多个词。max_files(可选):限制返回源码的文件数,避免单次结果过大。
典型用途:
- “鉴权流程怎么走的?”
- “AI 参数从前端怎么传到后端?”
- “整个购买流程涉及哪些组件?”
实跑样例(codegraph explore "AI 参数传递路径" --max-files 1):
1 | ## Exploration: AI 参数传递路径 |
一次调用 = 定位 + 影响半径 + 引用关系 + 调用关系。这就是为什么 Q1 / Q4 在实战中只用 2 次 explore 就完成 baseline 11–13 turns 的工作。
2. codegraph_node —— 看一个符号的”完整档案”
做什么:拿单个符号的精确源码(含行号)+ 它的 caller / callee 列表。也支持”文件模式”——传文件路径就读整文件 + 列出文件内符号 + 谁依赖这个文件。
主要参数:
name(必填):符号名或文件路径。file(可选):在符号同名重复时用文件路径消歧。offset/limit(可选,文件模式):1-based 行号区间分页读取。symbols_only(可选,文件模式):只列符号映射 + 依赖,不返回源码。
典型用途:
- “看下
useAiStore这个 store 的源码 + 谁在用” - “这个组件
UserCard.vue怎么实现的?” - “把
getOperation函数贴出来 + 列出调用者”
实跑样例(codegraph node getOperation):
1 | ## getOperation (function) |
1 |
|
Search Results for “getOperation”:
function getOperation (10821%)
packages/shared-utils/src/middleware.ts:95
(status: number, token = ‘’, cookieCode = ‘’, urlCode = ‘’, loginPlatform = ‘’)
method getOperationsCount (5836%)
packages/copilot/core/src/chat-engine/event-stream/activity-manager.ts:190
(content: Record<string, any> | null | undefined): number
import @lexiang/shield-utils (1068%)
packages/app-admin/server/middleware/auth.ts:2
1 |
|
Callers of “getOperation” (3):
file auth.ts packages/app-admin/server/middleware/auth.ts:1
file auth.ts packages/app-h5/server/middleware/auth.ts:1
file auth.ts packages/app-pc/server/middleware/auth.ts:1
1 |
|
Impact of changing “getOperation” — 4 affected symbols:
packages/shared-utils/src/middleware.ts function getOperation:95
packages/app-admin/server/middleware/auth.ts file auth.ts:1
packages/app-h5/server/middleware/auth.ts file auth.ts:1
packages/app-pc/server/middleware/auth.ts file auth.ts:1
1 |
|
工具速查表
| 你想做的事 | 用哪个 | 一句口诀 |
|---|---|---|
| 搞清楚一段功能/流程怎么走 | codegraph_explore |
“我不知道在哪、给我一把抓” |
| 看具体一个符号长啥样 | codegraph_node |
“我知道名字、给我源码 + 上下游” |
| 找名字像 X 的东西 | codegraph_search |
“比 grep 快十倍的符号搜索” |
| 改它前先看看谁依赖 | codegraph_callers / codegraph_impact |
“评估爆炸半径” |
| 改了文件 X 跑哪些测试 | codegraph_affected |
“增量测试选择器” |
| 它内部又调了谁 | codegraph_callees |
“看下游接口” |
| 列目录结构 | codegraph_files |
“比 tree 多带元数据” |
| 排查索引状态 | codegraph_status |
“调试入口” |
如何优雅地使用 CodeGraph
把 CodeGraph 当成”给 Agent 配的本地代码图谱数据库”来用,而不是”装上就行的银弹”。下面是一套从选型到日常维护的可执行手册,部分要点来自《CodeGraph 实战:在 shield monorepo 上做 A/B 基准测试》中验证过的结论。
1. 先做选型自检(5 分钟)
只在符合下面”高 ROI”特征时才装:
- 仓库规模 ≥ ~500 文件,或属于 monorepo / 多子包;
- 仓库语言在它的 20+ 支持表内(TS/JS/Vue/Python/Go/Rust/Java/Swift/PHP 等);
- 你常问 Agent 跨文件类问题——“谁调用了 X”、”改 Y 影响哪些测试”、”鉴权链路怎么走”;
- 仓库内的代码不是高度动态/反射/字符串拼接调用为主(图谱解不出动态边)。
反过来不要装的情形:单文件脚本、< 100 文件的研究项目、纯靠”找做某件事的代码”这种语义相似检索的场景(继续用向量 RAG 即可)。
2. 安装:永远走 npm,不走管道脚本
1 | # 推荐:受 Node 生态管控、可锁版本 |
装完先确认版本:codegraph --version。
3. 初始化:先 init,再 install
正确顺序是 先在仓库里建索引,再注册到 Agent,避免 Agent 接到空索引误判项目。
1 | cd /path/to/your-repo |
-y 无人值守模式默认 --location=global --target=auto,会一次性给所有检测到的 Agent 都注册——团队多 Agent 环境下慎用,建议用 --target claude 之类显式指定。
4. 让 Agent 真的”愿意”调用 CodeGraph
实战中遇到的最大坑是 Agent 即使有 codegraph MCP 也可能选 grep+Read 路径,这时你白付索引成本。三件事让模型主动用:
codegraph install已经在~/.claude/CLAUDE.md里追加了一段 CODEGRAPH_START/END 区块,明确告诉模型 “在.codegraph/存在的仓库里,先用codegraph_explore/codegraph_node再考虑 grep”。别删它。- 在仓库的项目级
CLAUDE.md里再叠一句:”工作目录就是仓库根目录,需要查代码请直接调 codegraph_explore,不要反问’是哪个仓库’”——可以避免 LLM 偶发的”反问而非干活”退化(实战中出现过 2 次)。 - 写需求 prompt 时,在第一句给出明确的方向词(”鉴权”、”购买流程”),CodeGraph 的 FTS5 是关键词匹配,越具体命中越准。
5. 用对工具,别让模型乱跑
四个 MCP 工具的判断顺序:
| 你想做的事 | 优先用 | 理由 |
|---|---|---|
| 一次理清架构 / 调用链 / 业务流程 | codegraph_explore |
一次查询返回相关符号源码 + 调用路径,相当于多跳查询折叠 |
| 已知符号名,要看源码和调用者 | codegraph_node |
单符号 + 上下游一次拿全 |
| 只知道关键词,要先定位 | codegraph_search |
FTS5 模糊匹配,比 grep -r 快几个数量级 |
| “谁调用了我”类影响分析 | codegraph_callers / codegraph_impact |
直接走图谱边,不用 grep 聚合 |
CLI 端命令同名(codegraph explore "..." 等),写脚本或 CI 报告时直接调,不必经 LLM。
5.5 日常提问:自然语言就够,不用刻意点名 CodeGraph
只要第 4 节的”让 Agent 愿意调用”配置都到位,日常提问继续用自然语言即可,不需要在 prompt 里写”用 codegraph 帮我……”。模型会按你的问法自动选工具。基于实战 v2 的工具用量证据,把日常代码问题分成 3 类:
| 类型 | 共同特征 | 模型自动会选 | 是否要点名 codegraph |
|---|---|---|---|
| A. 位置已明型 | prompt 里出现具体目录或文件路径(pages/、config.ts) |
Glob / Read | ❌ 绝对不要点名,会让 codegraph 用在它不该用的场景 |
| B. 跨包依赖型 | 只有功能/概念描述,不知道在哪 | codegraph_explore / codegraph_callers / codegraph_impact |
不需要,自然语言就触发 |
| C. 已知符号型 | 知道符号名(函数 / 类 / 组件) | codegraph_node 或 Grep+Read |
可选;想极致省 token 才显式点名 |
示例对照:
1 | B 类(跨包依赖,自然语言): |
只有两种情况建议显式点名 codegraph:
- 纠偏:观察到模型已经反复
Bash grep -r还没收敛,丢一句”用 codegraph_explore 查一下”; - 极致省 token:你已经知道符号名,懒得让模型再绕一步搜索定位。
口诀:自然语言提问,把 “用 codegraph” 当成调试工具,而不是日常习惯。 显式点名只在 C 类的极致省钱场景或纠偏场景才有意义;在 A 类里反而是反模式。
6. 索引维护:默认自动,重大改动后手动校准
- 正常开发:FSEvents/inotify 监听 + 2 秒去抖动,存盘后秒级更新,啥也不用做;
- 拉新分支 / merge 大量改动:跑一次
codegraph sync显式同步,避免老索引误导 Agent; - 依赖大改 / 删除子包 / 改造目录结构:
codegraph init --force重建(或uninit后再init); - 节点数突然爆涨/爆跌:
codegraph status看下,多半是.gitignore改了导致包含/排除变化; - CI 场景:在 PR 流水线里
codegraph init && codegraph affected $(git diff --name-only)能直接列出改动影响的测试,省去自己写依赖图。
7. .codegraph/ 的版本库策略
强烈建议 .codegraph/ 加入 .gitignore,不要入仓。三个理由:
- SQLite 是二进制,git diff 没意义;
- 索引规模在中型仓上是几十到几百 MB(shield 仓 95 MB),污染仓库历史;
- 不同同事的 OS / Node 版本可能让索引格式差一截,入仓反而引发”我这边索引为啥不一样”的争论。
正确做法:每位同事各自 codegraph init 一次,后续监听自动维护。等官方 hosted 版上线后,再考虑团队层共享索引。
8. 控制成本与隐私的开关
- 关遥测:
codegraph telemetry off或CODEGRAPH_TELEMETRY=0(即使官方说只上报聚合指标,敏感企业仓库直接关掉更省心); - 关后台 daemon:
CODEGRAPH_NO_DAEMON=1,省一个常驻进程,代价是不再自动同步; - 调监听去抖动:
CODEGRAPH_WATCH_DEBOUNCE_MS=5000(默认 2000ms),改频繁的项目调大可减少 CPU 抖动; - 自定义索引目录:
CODEGRAPH_DIR=.cache/codegraph,把索引挪到缓存目录便于统一清理; - 启用扩展 MCP 工具:
CODEGRAPH_MCP_TOOLS=callees,impact,files,status等(官方未公开完整列表,跑codegraph --help确认)。
9. 调试:MCP 不工作的排查顺序
实战中最容易卡住的就是”装了但 Agent 没用上”。按这个顺序查:
codegraph status在仓库根目录能跑、有数据 → 索引 OK;claude mcp list能看到codegraph: ✓ Connected→ MCP 注册 OK;- 让 Agent 跑一次 “用 codegraph_search 找 X”,如果它说”没有这个工具” → MCP 没加载,多半是 Agent 进程没重启,或者
CLAUDE_CONFIG_DIR指向了别的配置目录(公司内部代理常见问题); - 如果它有工具但不调,回到第 4 节优化提示词。
10. 卸载与回退(保持仓库干净)
1 | codegraph uninstall # 从所有 Agent 配置中移除 MCP 注册 |
这三步能 100% 还原。~/.claude/CLAUDE.md 中的 CODEGRAPH_START/END 区块也会被 uninstall 一并清理,不会留垃圾。
不确定性
- README 标注的 49k stars / 3k forks 与早先文档显示的 43k stars 不一致,星数处于快速增长阶段,绝对值需以最新仓库页为准。
- “16% 成本 / 47% Token / 22% 时延 / 58% 工具调用”是官方在 7 个仓库上的中位数;其他第三方文章给出的 35% / 57% / 46% / 71% 是更早一版的数据,具体收益高度依赖仓库规模、Agent 行为和提示词。
- 跨文件解析覆盖率指的是”被解析出的边占静态可达边的比例”,对动态语言(Ruby/Python 反射、JS eval、依赖注入框架)的真实召回率仍可能低于 100%。
- MCP 工具列表中除四个核心工具外,
CODEGRAPH_MCP_TOOLS启用的扩展工具未在公开文档中详细列出,需要读源码或运行codegraph --help确认。
后续行动
- 在本地一个中型 TypeScript / Python 单体仓上跑
codegraph init+codegraph install,对比 Claude Code 接入前后同一组架构问题的 Token 与工具调用次数。 - 阅读
.codegraph/下的 SQLite schema,确认节点/边表结构与 FTS5 索引字段,评估能否直接 SQL 查询做自定义分析。 - 试一次
codegraph impact <symbol> --depth=2与codegraph affected <file>,验证它在本仓库重构场景的有效性。 - 跟踪 hosted 版(getcodegraph.com waitlist)发布动态,看是否要在团队层共享图谱。