每日一个开源项目(第135篇):codebase-memory-mcp - 给 AI Agent 一张代码库的知识图谱
引言
“AI Agent 探索代码库时读取每一个文件,消耗 412,000 个 token。换成知识图谱查询,只需要 3,400 个 token。”
这是"每日一个开源项目"系列的第135篇文章。今天的主角是 codebase-memory-mcp——一个用纯 C 编写的代码库知识图谱 MCP 服务器。
你用 Claude Code 处理一个中型项目时,Agent 会怎么理解代码结构?通常是逐文件读取:先看目录结构,再读几个关键文件,再追踪引用,再读更多文件……每一步都在消耗 token,每次新会话都要重新来一遍,大型代码库里很快就触到上下文限制。
codebase-memory-mcp 的思路是:先把代码库的结构信息提取成持久化的知识图谱,存进 SQLite;Agent 需要了解代码结构时,不读文件,查图谱。从"每次重新探索"变成"查询已有的结构记忆"。120 倍的 token 差距来自这个设计改变。
你将学到什么
- 代码知识图谱的数据模型:节点类型和边类型是什么
- 两层解析架构:Tree-sitter 语法层 + Hybrid LSP 语义层
- 14 个 MCP 工具的功能分布:从索引到 Cypher 查询
- 性能数据:Linux 内核级别的代码库需要多久建完图谱
- 团队协作场景:共享压缩图谱文件的工作流
- 安全设计:SLSA Level 3、Sigstore 签名、VirusTotal 扫描
前置知识
- 使用过 Claude Code 或其他支持 MCP 的 AI 编程工具
- 了解代码库结构(函数、类、调用关系)的基本概念
- 了解 MCP 协议的基本概念
项目背景
项目简介
codebase-memory-mcp 是一个代码智能 MCP 服务器,把代码库的结构信息构建成持久化的知识图谱,让 AI Agent 通过结构化查询而非文件读取来理解代码。
"知识图谱"在这里是精确的词:节点是代码结构元素(文件、类、函数、路由、资源),边是结构关系(调用、继承、导入、HTTP 调用、数据流),整个图存在 SQLite 数据库里,支持 Cypher 风格的图查询语言。
项目是 Anthropic 开源后最早出现的高质量 MCP Server 之一,背后有学术论文支撑(arXiv:2603.27277)。
作者/团队介绍
- 组织: DeusData
- 语言: 纯 C(零运行时依赖)
- License: MIT
- 最新版本: v0.8.1
- 测试用例: 5,604 个
项目数据
- ⭐ GitHub Stars: 5,400+
- 🍴 Forks: 491+
- 📄 License: MIT
- 🔬 论文: arXiv:2603.27277
主要功能
核心作用
传统方式(逐文件读取):
AI Agent → 读 file1.py → 读 file2.py → 读 file3.py → ...
↓
~412,000 tokens,每次会话重复,遇到上下文限制
知识图谱方式:
AI Agent → query_graph("MATCH (f:Function)-[:CALLS]->(g)...")
↓
~3,400 tokens,结果来自持久化图谱,秒级响应
使用场景
- 大型代码库理解:接手陌生代码库时,通过图查询快速定位关键结构,不需要逐文件阅读
- 重构辅助:查找所有调用某函数的路径(
trace_path),确认改动影响范围 - 死代码检测:找到没有被任何调用链触及的孤立函数
- 架构分析:用 Leiden 社区检测算法自动识别代码的模块边界
- 跨仓库分析:
CROSS_*边类型链接多个已索引的仓库,分析服务间依赖
快速开始
安装:
# 一键安装脚本
curl -fsSL https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash
# npm
npm install -g codebase-memory-mcp
# PyPI
pip install codebase-memory-mcp
# Homebrew (macOS)
brew install deusdata/tap/codebase-memory-mcp
配置到 Claude Code(自动配置,支持 11 个 Agent):
codebase-memory-mcp setup claude-code
手动配置 ~/.claude/mcp.json:
{
"mcpServers": {
"codebase-memory": {
"command": "codebase-memory-mcp",
"args": ["serve"]
}
}
}
在 Claude Code 中使用:
# 告诉 Agent 索引当前项目
"Index this project"
# Agent 调用 index_repository,几秒到几分钟后图谱建完
# 之后所有代码探索走图谱,不走文件读取
"Find all functions that call the authentication handler"
"What does the payment flow look like from API to database?"
"Are there any functions that are never called?"
CLI 直接查询:
# 搜索包含 Handler 的函数
codebase-memory-mcp cli search_graph \
'{"name_pattern": ".*Handler.*", "label": "Function"}'
# 追踪某函数的调用路径
codebase-memory-mcp cli trace_path \
'{"function_name": "processPayment", "direction": "both"}'
# Cypher 图查询
codebase-memory-mcp cli query_graph \
'{"query": "MATCH (f:Function)-[:CALLS]->(g:Function) WHERE f.name = \"main\" RETURN g.name"}'
14 个 MCP 工具
| 工具 | 功能 |
|---|---|
index_repository |
索引代码库,构建或更新知识图谱 |
search_graph |
按名称模式/标签搜索节点 |
search_code |
四阶段混合代码搜索(grep + 图智能) |
semantic_query |
向量嵌入语义搜索(Nomic nomic-embed-code) |
trace_path |
追踪函数调用链(可指定方向和深度) |
query_graph |
原生 Cypher 图查询 |
find_dead_code |
检测未被调用的孤立代码 |
analyze_architecture |
用 Leiden 算法检测模块边界 |
get_node |
获取单个节点的详细信息 |
list_routes |
列出所有 HTTP 路由(REST API 分析) |
get_dependencies |
获取包/模块的依赖关系 |
get_graph_stats |
图谱统计(节点数、边数、覆盖率) |
watch_repository |
启动后台 Git 感知自动同步 |
get_index_status |
查看索引状态和进度 |
项目详细剖析
知识图谱数据模型
图谱里的节点和边涵盖代码库的完整结构语义:
节点类型(部分):
Project ← 仓库根节点
Package ← 包/模块
File ← 源文件
Class ← 类定义
Function ← 独立函数
Method ← 类方法
Route ← HTTP 路由端点
Resource ← 基础设施资源(K8s、Docker)
边类型(部分):
CALLS ← 函数/方法调用关系
IMPORTS ← 模块导入关系
INHERITS ← 类继承关系
HTTP_CALLS ← 跨服务 HTTP 调用
EMITS ← 事件发送(消息队列)
LISTENS_ON ← 事件监听
DATA_FLOWS ← 数据流向关系
SIMILAR_TO ← MinHash 近似重复代码
CROSS_* ← 跨仓库依赖边
这个数据模型的精度超过大多数 IDE 的符号索引。DATA_FLOWS 和 HTTP_CALLS 边需要理解运行时行为,不只是语法结构。
两层解析架构
解析流水线
↓
Layer 1: Tree-sitter
├── 158 种语言的语法分析
├── 提取:函数/类/方法定义、调用关系、导入
└── 速度极快,但只有语法层面的信息
(不知道泛型实例化的具体类型、跨模块的类型解析)
↓
Layer 2: Hybrid LSP(9 种语言)
├── Python、TypeScript/JS、PHP、C#
├── Go、C/C++、Java、Kotlin、Rust
└── 类型感知分析:
├── 跨模块调用解析(知道 foo() 调用的是哪个 foo)
├── 泛型实例化
├── 继承链解析
└── 类型推断
关键:Hybrid LSP 不启动语言服务器进程,在进程内完成类型解析
v0.7.0 引入 Hybrid LSP 后,TypeScript 编译器索引时间从 ~5,100 秒降到 ~50 秒(100 倍提升)。代价是仅对 9 种主流语言有效,其余 149 种语言只有 Tree-sitter 语法层。
Cypher 查询语言
图谱支持类似 Neo4j Cypher 的查询语法:
-- 找出所有被超过 5 个函数调用的函数(高耦合节点)
MATCH (g:Function)<-[:CALLS]-(f:Function)
WITH g, count(f) AS caller_count
WHERE caller_count > 5
RETURN g.name, caller_count
ORDER BY caller_count DESC
-- 找出完整的认证调用链
MATCH path = (api:Route)-[:CALLS*..5]->(auth:Function)
WHERE auth.name CONTAINS "authenticate"
RETURN path
-- 检测循环依赖
MATCH (a:Package)-[:IMPORTS]->(b:Package)-[:IMPORTS]->(a)
RETURN a.name, b.name
查询延迟 小于1ms,因为 SQLite 在 WAL 模式下运行,图遍历和过滤在 C 层执行。
性能基准
在 Apple M3 Pro 上测试:
| 操作 | 时间 |
|---|---|
| Linux 内核完整索引(28M LOC,75K 文件) | ~3 分钟 |
| Django 完整索引(约 10 万行) | ~6 秒 |
| 平均规模仓库 | 毫秒级 |
| Cypher 查询 | 小于1ms |
| 追踪调用路径(深度 5) | 小于10ms |
| 死代码检测 | ~150ms |
纯 C 实现是性能的基础:没有 GC 暂停,没有 JVM 预热,没有 Python 解释器开销,索引过程全程在 C 层进行。
团队协作:共享图谱文件
这是一个值得单独说的设计:
# 把压缩后的图谱文件提交到 git
git add .codebase-memory/graph.db.zst
git commit -m "update codebase knowledge graph"
git push
# 队友克隆后直接用,不需要重新索引
git clone ...
codebase-memory-mcp serve # 图谱已经在 .codebase-memory/ 里
graph.db.zst 是 Zstandard 压缩的 SQLite 数据库。对大型代码库,团队里每人重新索引一遍浪费时间;由 CI 生成并提交图谱文件,其他人直接用。
安全设计
单一可执行二进制的分发方式有供应链风险,这个项目的安全措施比多数同类项目完善:
- SLSA Level 3 构建来源:每个 Release 的构建过程有可验证的来源证明
- Sigstore cosign 无密钥签名:不需要管理 GPG 密钥,签名可以通过 Sigstore 链验证
- VirusTotal 扫描:v0.8.1 的二进制在 72 个引擎上 0/72 检出
- CodeQL SAST:代码安全静态分析作为发布门禁
- 本地处理承诺:所有代码处理发生在本地,不发送到外部服务
- HTTP 绑定 127.0.0.1:内置可视化界面只接受本地连接,v0.8.1 明确排除了任何非 localhost 访问路径
项目地址与资源
官方资源
- 🌟 GitHub: DeusData/codebase-memory-mcp
- 📄 论文: arXiv:2603.27277
分发渠道
npm、PyPI、Homebrew、Scoop、Winget、AUR、Chocolatey、MCP Registry 官方目录
总结
codebase-memory-mcp 的核心贡献是把一个系统性问题做出了工程解答:AI Agent 探索代码库的方式效率极低,每次会话重新读文件,token 消耗是结构查询的 120 倍。
知识图谱的思路在数据库领域是成熟的,但专门为代码库 + MCP 接口设计并实现的工具并不多。纯 C + 零依赖的实现使它成为分发最容易、性能最稳定的选项之一;158 语言覆盖和 Hybrid LSP 语义层解析使它对多语言代码库实际可用;14 个 MCP 工具的接口设计使 Agent 可以精确描述想要的结构信息。
对于长期在同一个代码库上工作的开发者,或者使用 Claude Code 处理超过 5 万行代码的场景,这个 MCP 服务器值得装上试试。
探索 PrimeSkills —— 精选 AI Agent 与技能的市场,每一个都经过真实企业工作流验证,去掉浮夸,留下真正有用的。
欢迎访问我的个人主页,发现更多有价值的见解和有趣的产品。
更多推荐
所有评论(0)