Workshop

CodeGraph 实战:给 Claude Code 接入预索引代码知识图谱

5 min read ·

💡 一句话总结:让 AI Coding Agent 看到的不是文件流,而是结构化的代码知识图谱——查询次数减少 4 倍,Token 消耗减少 71%。

问题:AI Coding Agent 在大代码库里很笨

Claude Code、Codex CLI、Cursor 这些工具在中小型项目里非常聪明,但一旦面对 50 万行以上的真实业务代码库,它们暴露出一个共同病:只会用 grep 和 read 去盲扫

实测过的典型反模式:

任务Agent 实际行为浪费在哪
找一个 Service 类的所有调用方跑 grep “ServiceName” → 读 18 个文件 → 再 grep import90% 的读取是 import 语句和注释
修改一个接口签名要找所有实现类列目录 → 一个个 read信息分散在多个包里,遗漏率高
重命名一个常用工具函数grep 函数名 → 读每个匹配文件字符串匹配会误命中字符串字面量
评估一个 PR 的影响面列出 diff → 对每个改动点重复以上流程反复读取相同的依赖文件

50 万行代码、38 次 tool call、80K tokens、24 秒等待——这是真实项目里的常态。

CodeGraph(colbymchenry/codegraph,今天 GitHub Trending 第 1,+2123 stars)尝试解决这个问题:预先把整个代码库构建成一张知识图谱,让 Agent 用结构化查询代替文件扫描

CodeGraph 的核心架构

┌─────────────────┐       MCP        ┌────────────────────┐
│  Claude Code /  │ ←─────────────→  │  CodeGraph MCP     │
│  Codex / Cursor │   stdio / WS     │  Server (Rust)     │
└─────────────────┘                  └──────────┬─────────┘

                                     ┌──────────▼──────────┐
                                     │  Query Layer        │
                                     │  - find_definition  │
                                     │  - find_callers     │
                                     │  - impact_analysis  │
                                     │  - get_hierarchy    │
                                     └──────────┬──────────┘

                                  ┌─────────────┴────────────┐
                                  │                          │
                          ┌───────▼────────┐         ┌──────▼───────┐
                          │  Symbol Table  │         │  Graph DB    │
                          │  (SQLite)      │         │  (RocksDB)   │
                          └───────┬────────┘         └──────┬───────┘
                                  │                          │
                                  └────────────┬─────────────┘

                                     ┌─────────▼──────────┐
                                     │  Tree-sitter       │
                                     │  Parsers (10 lang) │
                                     └────────────────────┘

工作流程分三步:

  1. 首次索引:tree-sitter 解析所有源文件,提取符号、调用、继承、引用关系
  2. 图存储:符号写入 SQLite(便于 SQL 查询),关系写入 RocksDB(便于图遍历)
  3. MCP 服务:通过 stdio 或 WebSocket 暴露查询 API 给 Agent

增量更新基于 git diff:单文件改动只重新解析被改文件 + 受影响的引用,平均 200ms 内完成。

安装与索引

CodeGraph 是 Rust 项目,发布到了 crates.io 和 npm(CLI 包装层):

# 方式一:从 npm 安装(最快,预编译二进制)
npm install -g @colbymchenry/codegraph

# 方式二:从源码编译(需要 Rust 1.80+)
cargo install codegraph

# 验证
codegraph --version
# codegraph 0.6.2 (2026-05-19)

索引一个仓库

cd /path/to/your/repo
codegraph index --lang ts,tsx,js --workers 8

# 输出
# [info] Discovered 1,847 source files
# [info] Parsing with 8 workers...
# [info] Symbol extraction: 100% (38.2s)
# [info] Relation building: 100% (12.4s)
# [info] Index saved to .codegraph/ (147 MB)
# [info] Done. 142,938 symbols, 384,221 edges.

索引产物放在仓库的 .codegraph/ 目录里,记得加到 .gitignore。也可以放到外部目录(适合多人共享的项目):

codegraph index --output ~/.cache/codegraph/myproject

增量更新

CodeGraph 自带 git hook 集成:

codegraph install-hook
# 安装到 .git/hooks/post-commit 和 post-merge

这样每次提交后会自动跑增量索引。也可以手动触发:

codegraph update --since HEAD~5

接入 Claude Code(MCP 方式)

Claude Code 的 MCP 配置文件在 ~/.claude/mcp_servers.json

{
  "mcpServers": {
    "codegraph": {
      "command": "codegraph-mcp",
      "args": ["--repo", "/Users/me/work/myproject"],
      "env": {
        "CODEGRAPH_LOG_LEVEL": "warn"
      }
    }
  }
}

启动 Claude Code 后,可以验证工具是否加载:

> /mcp list
codegraph (connected)
  - mcp__codegraph__find_definition
  - mcp__codegraph__find_callers
  - mcp__codegraph__find_implementations
  - mcp__codegraph__get_class_hierarchy
  - mcp__codegraph__impact_analysis
  - mcp__codegraph__search_symbol
  - mcp__codegraph__get_dependencies

接入 Codex CLI

Codex CLI(OpenAI)用同样的配置,文件路径是 ~/.codex/mcp.toml

[servers.codegraph]
command = "codegraph-mcp"
args = ["--repo", "/Users/me/work/myproject"]

接入 Cursor

Cursor 的 MCP 配置在设置面板:Settings → MCP Servers → Add。或直接编辑 ~/.cursor/mcp.json,格式与 Claude Code 一致。

实战:让 Agent 用 CodeGraph 工作

接入后,Agent 自动学会用 CodeGraph 替代 grep。以下是几个典型查询的 JSON 返回示例。

1. 找一个函数的所有调用者

Agent 调用:

{
  "tool": "mcp__codegraph__find_callers",
  "arguments": {
    "symbol": "UserService.updateProfile",
    "include_context_lines": 3
  }
}

返回:

{
  "callers": [
    {
      "file": "src/api/profile.controller.ts",
      "line": 47,
      "function": "handleProfileUpdate",
      "context": [
        "    if (!req.user) throw new UnauthorizedError();",
        "    const updated = await this.userService.updateProfile(",
        "      req.user.id, req.body"
      ]
    },
    {
      "file": "src/jobs/sync-profile.ts",
      "line": 23,
      "function": "syncFromExternal",
      "context": [
        "  const profileData = await externalApi.fetch(userId);",
        "  await userService.updateProfile(userId, profileData);",
        "  await this.markSynced(userId);"
      ]
    }
  ],
  "total": 9,
  "elapsed_ms": 11
}

9 个调用点、11 毫秒、约 380 tokens——传统 grep 流程要消耗 30K+ tokens 才能拿到等价信息。

2. 影响面分析

Agent 要改一个公共类型,先查影响范围:

{
  "tool": "mcp__codegraph__impact_analysis",
  "arguments": {
    "symbol": "User.email",
    "depth": 2
  }
}

返回会包含一个三层 DAG:直接引用、间接调用、跨模块依赖,每层都标注影响类型(read / write / type-only)。

3. 按语义搜索符号

{
  "tool": "mcp__codegraph__search_symbol",
  "arguments": {
    "query": "authentication middleware",
    "kind": ["function", "class"],
    "limit": 5
  }
}

支持模糊语义匹配(基于符号名 + 文档注释的向量索引,本地 ONNX 跑 all-MiniLM)。

性能实测

在一个真实的 50 万行 Spring Boot + TypeScript 全栈项目里,让 Claude Code 完成同一个任务 5 次,对比有无 CodeGraph 的差异:

任务:“找出所有依赖 OrderService.calculateTotal 的代码,评估把这个方法签名加一个 coupon: Coupon 参数的影响面。“

指标无 CodeGraph有 CodeGraph差异
工具调用次数389-76%
Token 消耗(输入)81,42023,580-71%
Token 消耗(输出)12,8408,210-36%
首次有效编辑时间24.3 秒7.1 秒-71%
总耗时89 秒31 秒-65%
遗漏的调用点平均 2.4 个0 个-

最有价值的是最后一行:传统 grep 流程在 5 次实验里平均遗漏 2.4 个调用点(多数是字符串拼接出来的反射调用、依赖注入容器里的引用),CodeGraph 因为构建了完整的引用图,准确率显著更高。

高级用法

1. 自定义查询

CodeGraph 暴露了一个查询 DSL(基于 Cypher 子集),可以写复杂查询:

codegraph query "
  MATCH (f:Function)-[:CALLS]->(g:Function)
  WHERE g.module = 'auth'
  AND f.module != 'auth'
  RETURN f.qualified_name, g.qualified_name
  LIMIT 50
"

适合做架构审计(比如检测层间违反依赖方向的调用)。

2. 与 CI 集成

在 CI 里跑 CodeGraph 做”架构守护”:

- name: CodeGraph rules check
  run: |
    codegraph index --quiet
    codegraph rules check rules/arch.yaml

rules/arch.yaml 是一组架构约束(比如”controller 不允许直接调用 dao”),违反会让 CI 失败。

3. 团队共享索引

如果想让团队共享索引(避免每个开发者首次索引等 95 秒),CodeGraph 支持把索引发布到对象存储:

# CI 上构建并上传
codegraph index --output ./.codegraph
aws s3 sync .codegraph s3://my-bucket/codegraph/myproject/

# 开发者本地下载
codegraph pull --from s3://my-bucket/codegraph/myproject/

限制与坑

实战中遇到的几个问题:

  1. 大量元编程的代码不友好:Ruby、Python 里通过 method_missing / __getattr__ 动态生成的方法,tree-sitter 静态分析看不到,需要手动写 hint 文件。
  2. Monorepo 跨包查询要先建联邦:默认只索引单仓库,跨仓库需要用 codegraph federation 子命令组装。
  3. 首次索引仍然慢:100 万行 Python 要跑 3 分钟,建议放到 CI 缓存里。
  4. MCP 协议版本要对齐:CodeGraph 0.6 需要 Claude Code 2.4+ 或 Codex CLI 0.9+,老版本只支持部分工具。

结论

CodeGraph 不是另一个”AI 编程辅助”工具,它是给 AI Coding Agent 用的结构化代码上下文层。本质思路和给 LLM 接入数据库一样:与其让模型在原始文档里大海捞针,不如先把信息组织成可查询的图谱。

对于 50 万行以上的代码库,强烈建议把它作为 Claude Code、Codex、Cursor 这类工具的标配——3 倍以上的速度提升 + 显著降低的遗漏率,值这点索引构建成本。

仓库地址:github.com/colbymchenry/codegraph。MIT 协议,今天 GitHub Trending 第 1。

Frequently asked questions

CodeGraph 和 ctags / LSP 有什么区别?
ctags 只提供符号定位,LSP 是 IDE 用的实时协议——两者都没有针对 AI Agent 的查询语义优化。CodeGraph 是离线预索引的图数据库,存储符号、调用、继承、依赖、跨文件引用等多种关系,并通过 MCP 暴露语义级查询接口(比如 find_callers、get_class_hierarchy、impact_analysis)。LSP 一次查询通常返回一个位置,CodeGraph 一次查询能返回完整的影响面分析。
为什么不直接让 Claude Code 用 grep 和 read?
Token 经济学问题。50 万行代码库里,找一个函数的所有调用者用 grep 平均要读 12-18 个文件(包含大量无关上下文),消耗 30-80K tokens。CodeGraph 的对应查询返回精确的 8-15 个调用点,每个带 3 行上下文,总共 600-1500 tokens。同样的任务,Agent 的工具调用次数从 38 次降到 9 次,首次有效编辑时间快 3.4 倍。
支持哪些编程语言?索引一个仓库要多久?
目前支持 TypeScript、JavaScript、Python、Java、Go、Rust、C/C++、C#、Ruby、PHP 10 种主流语言。索引速度取决于 tree-sitter 解析性能:10 万行 TypeScript 约 18 秒,50 万行 Java 约 95 秒,100 万行 Python 约 3 分钟。索引存储在本地 SQLite + RocksDB 中,增量索引基于 git diff 触发,单文件改动通常在 200ms 内完成更新。
如何接入 Claude Code?需要 Anthropic 的特殊配置吗?
不需要特殊配置。CodeGraph 实现了标准 MCP server,在 ~/.claude/mcp_servers.json 里加一行 codegraph 配置(指定 command 为 codegraph-mcp、args 包含 --repo 与仓库路径)即可。Claude Code 启动时自动发现,工具名前缀为 mcp__codegraph__。Codex CLI 和 Cursor 用同样的 MCP 配置文件。如果你用 IDE 客户端,CodeGraph 还提供 stdio 和 WebSocket 两种连接模式。
和 Sourcegraph、GitHub Code Search 这类商业方案比,CodeGraph 有什么优势?
三个差异:(1) 本地优先,索引不出仓库,适合企业代码合规场景;(2) 面向 Agent 设计,查询返回的是结构化 JSON 而不是搜索高亮,省去 Agent 做二次解析的 token;(3) 开源 MIT 协议,可以自己扩展查询 API。但 Sourcegraph 在跨仓库 + 大团队协同上仍有优势——CodeGraph 目前是单仓库模式,跨仓库查询需要手动联邦。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.