核心问题: 你是否需要一个基于 tree-sitter、可通过 MCP 被大模型查询的本地 GraphRAG 层,而不必自己写检索胶水代码?
Evaluation snapshot
Verdict:
Try it if
Skip it if
15-minute evaluation checks
验证范围
测试环境: 仅完成来源摘要复核;尚无 RepoDaily 运行测试环境。
已验证
- 已复核 RepoDaily Brief 中记录的仓库声明和来源,包括文档中的本地优先架构与解析范围。
- 已将 graphify 归入 Code Intelligence 试点的本地图检索场景。
未验证
- RepoDaily 尚未安装 graphify,也未在试点仓库完成 extract-and-query 流程
- parser 覆盖、图谱准确率、增量新鲜度、产物清理和 Agent 结果改善仍未验证
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 92/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 6 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 6 个工作流步骤、5 个下一步动作,以及 4 个命令/安装信号。
趋势热度为 +937 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 7 条安全说明与 4 条跳过条件。
3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 9 个 AI/Agent 相关信号。
项目概览
graphify 是一个 Python 工具,能够把源代码、SQL schema、R 脚本、Shell 脚本、文档、论文、图片、视频等文件夹内容,转换为可查询的知识图谱。其在 PyPI 上的包名为 graphifyy,版本 0.1.14,但用户面对的命令仍然是 graphify。项目定位为面向 Claude Code、Codex、OpenCode、Cursor、Gemini CLI 等 AI 编程助手的技能,同时也能作为 Model Context Protocol 服务器,支持 stdio 传输,或在安装 mcp extra 后从源码构建出 Streamable HTTP 传输。
graphify 与一般 RAG 封装的区别在于解析管线。它使用 tree-sitter 语法支持 Python、JavaScript、TypeScript、Go、Rust、Java、C、C++、Ruby、C#、Kotlin、Scala、PHP,从 AST 中抽取真实的调用与导入边,而不是按文本切块;再借助 graspologic 的 Leiden 社区发现对相关节点聚类,可选的 LLM 步骤会补充 AST 中不可见的语义概念(例如被模型归到整个仓库层面的项目级概念)。最终产物是一个 graph.json,下游 Agent 可用自然语言查询。
项目明确把自己定位为本地开发工具。SECURITY.md 写明,graphify 在图谱分析阶段不做任何网络调用,只有在用户主动通过 ingest 子命令提供 URL 时才会联网。它不会执行源码文件(tree-sitter 仅解析 AST,不使用 eval 或 exec),不在任何 subprocess 调用中使用 shell=True,也不存储凭据或 API key。对无法把自有源码送进托管检索 API 的团队来说,这种姿态正是其核心卖点。
成熟度是主要 caveat。包仍在 0.1.x,SECURITY.md 只把 0.1.x 列为受支持版本,CHANGELOG 显示管线核心部分仍在频繁改动,包括自然语言查询的 seed 选择、TS/JS 与 C# 成员调用解析、Obsidian canvas 导出器,以及在 update 与 watch 模式下对已删除文件的提取器对账逻辑。方向是连贯的,但表层仍在变动。
为什么现在变热
- 本期获得 937 颗星,2026-07-04 排名第 7,背后是对 MCP 原生技能而非纯提示词助手的需求。
- 交付的是真实语法图谱:13 个 tree-sitter 语法加 graspologic Leiden 聚类,多数技能型仓库并不具备。
- 既可作为 Claude Code 技能运行,也可作为本地 MCP stdio 服务器,并且提供了通过 mcp extra 从源码构建 HTTP 传输的 Dockerfile 路径。
- 可选后端保持灵活:neo4j 用于图存储、pypdf 加 html2text 用于 PDF 摄取、watchdog 用于文件系统实时更新。
- 支持导出到 Obsidian canvas 与知识图谱格式,让人能直观检查 Agent 实际在查什么。
解决什么问题
- LLM 编程 Agent 在大型仓库中会丢失结构上下文,容易把调用图压扁成文本块。
- 朴素 RAG 按字符切块,丢弃了做影响分析时至关重要的 import、call、receiver-type 关系。
- 托管型代码图谱服务需要把自有源码发到网络,对很多企业仓库是被禁止的。
- 本地 grep/ripgrep 类 MCP 服务器不理解语言语义,无法回答类似 typed receiver 会调用哪个方法的问题。
- PDF、论文、图片、视频等多模态输入很少能与源码共用同一查询入口,导致团队要维护多套索引。
工作原理
- 安装运行:PyPI 包名为 graphifyy,可执行命令为 graphify,pyproject.toml 中 requires-python 设为 >=3.10。
- 抽取:graphify extract 遍历目标文件夹,用对应 tree-sitter 语法解析每种支持语言,构建 networkx 调用与导入边图。
- 聚类:graspologic 运行 Leiden 社区发现,把相关节点分组,可选 LLM 步骤补充 AST 看不到的语义概念。
- 查询:graphify query 对图做按词 BFS seed 选择;近期 _pick_seeds 修复防止某个精确匹配词饿死其他查询词。
- 服务:graphify serve 把图作为 MCP 服务器暴露。stdio 模式不开启网络监听;HTTP 模式(通过 Dockerfile 路径)需要 API key 并可绑定 host。
- 导出:graphify export obsidian 把 graph.json 写成 Obsidian canvas 与知识图谱文件,近期修复同时在 to_obsidian 和 to_canvas 中过滤悬空社区成员。
集成面:graphify 接到哪里
- Claude Code 技能:包内附带 skill.md(在 pyproject.toml 的 tool.setuptools.package-data 中声明),Claude Code 可直接加载。
- MCP stdio 服务器:graphify serve 在默认传输下只通过 stdio 通信,不开启网络监听,依据 SECURITY.md。
- MCP HTTP 服务器:Dockerfile 基于 python:3.12-slim 构建,安装 mcp extra(引入 mcp、starlette、uvicorn),运行 python -m graphify.serve 并带 --transport http 与可配置 --api-key。
- 可选 Neo4j 后端:neo4j extra 允许把图持久化到 Neo4j,而不仅依赖本地 graph.json。
- 可选 PDF 与 watch extra:pypdf 加 html2text 处理本地 PDF 摄取,watchdog 驱动实时 update 与 watch 模式,均不联网。
上手路径:来自源码包的具体命令
- 本地技能安装:在 Python 3.10 及以上执行 pip install graphifyy(PyPI 名带双 y),随后使用 graphify 命令。
- 一步到位安装:pip install graphifyy[all] 一次性拉取 mcp、neo4j、pypdf、html2text、watchdog。
- 一次性分析:graphify extract <folder> 之后执行 graphify query "<自然语言问题>"。
- 实时编辑循环:graphify watch 让 graph.json 随文件变化保持同步;近期修复在删除后会按仍在场的文件对账提取器源。
- 容器化 HTTP 服务器:docker build -t graphify . 之后 docker run -p 8080:8080 -v "$(pwd)/graphify-out:/data" graphify /data/graph.json --transport http --host 0.0.0.0 --api-key "$SECRET"。
维护风险:CHANGELOG 透露了什么
CHANGELOG 显示这是一个正在持续加固的工具,而不是稳定的 1.0。近期未发布条目修复了 graphify export obsidian 在 to_canvas 中因社区成员 id 无对应节点而抛 KeyError 的崩溃(#1236 跟进),把 TS/JS 成员调用解析扩展到 const s = new Svc(); s.doThing() 以及返回闭包内的 typed-parameter 调用(#1630),并新增 C# receiver-typed 成员调用解析,使 recv.Method() 解析到 receiver 类型的方法,而不是匹配语料中任意同名方法(#1609)。
其中两个修复针对的是正确性而非打磨。BFS seed 多样性修复(#1596 / #1445)防止单个精确标签匹配劫持多词查询,此前会让探索塌缩到一个无关邻域;extract 崩溃修复(#1618)处理 source_file 等于扫描根的节点,此前会在所有 LLM 抽取成本已花完之后抛 ValueError: '.' has an empty name。两者都未被标记为 0.9.5 回归,但都说明真实语料的边界情况仍在被发现。
架构解读:解析、聚类与服务
管线分三层。解析层是 tree-sitter,字节切片以 errors="replace" 解码,使非 UTF-8 源码优雅降级而不是让抽取崩溃。图层是 networkx 加 graspologic,由 Leiden 社区发现对节点分组,可选 LLM 步骤补充语义概念;语义重映射逻辑 _semantic_id_remap 会跳过 source_file 等于扫描根的节点,因为它没有可重映射的 per-file 身份。
服务层承载了安全模型。serve.py 的 _load_graph 会捕获 json.JSONDecodeError 并打印恢复提示,而不是在 graph.json 损坏时崩溃。security.validate_url 把抓取限制为 http 与 https scheme,自定义 _NoFileRedirectHandler 会阻断 file:// 重定向。safe_fetch 流式读取并在 50 MB 中止,safe_fetch_text 在 10 MB 中止。对 MCP 面,security.validate_graph_path 解析路径并要求其位于 graphify-out/ 内,security.sanitize_label 会剥离控制字符、把标签截到 256 字符、在 pyvis 嵌入前对节点标签与边标题做 HTML 转义,并同样作用于 MCP 文本输出,使得来自用户可控源文件的节点标签无法破坏返回给 Agent 的文本格式。
谁适合关注
适合关注
- 在私有 monorepo 上使用 Claude Code 或其他支持 MCP 的助手、且不能用托管代码图谱 SaaS 的团队。
- 横跨 Python、TypeScript、Go、Rust、Java、C#、Kotlin、Scala、PHP、Ruby、C、C++ 的多语言仓库。
- 希望把代码、SQL schema、R 脚本、PDF、论文、图片放进同一张图来查询的知识管理场景。
- 任何希望在机器可查的 MCP 面之外,再得到一份人可审视的 Obsidian canvas 导出的用户。
可以先跳过
- grep 已经能回答一切的单文件、单语言脚本场景。
- 锁定在低于 3.10 的 Python 环境,因为 requires-python 设为 >=3.10。
- 需要稳定 1.0 API 合同、才敢在 graph.json 格式之上搭建内部工具的团队。
- 需要托管云控制面的场景;graphify 刻意 local-first,不提供托管层。
风险与注意事项
对 0.1.x 工具而言,其安全模型异常清晰,但管线核心仍在针对真实语料边界情况加固。
- 版本为 0.1.14,SECURITY.md 仅把 0.1.x 列为受支持,graph.json 格式与 CLI 表层仍可能变动。
- 近期修复触及正确性关键路径,包括 BFS seed 选择、TS/JS 与 C# 成员调用解析、以及 extract 阶段崩溃处理。
- HTTP MCP 传输需要你自行提供并管理 API key,并正确绑定 host;配置不当会暴露图谱。
- 可选 extra(neo4j、mcp、pypdf、html2text、watchdog)需单独安装,行为取决于用户实际拉取的 extra。
- 图谱分析阶段不做网络调用;唯一可选联网路径是 ingest 子命令抓取用户主动提供的 URL。
- URL 抓取被限制为 http 与 https scheme,自定义重定向处理器会阻断 file:// 目标。
- 下载上限:safe_fetch 在 50 MB 中止,safe_fetch_text 在 10 MB 中止;非 2xx 响应抛 HTTPError 而非被当成内容。
- MCP 路径校验要求图谱路径解析后位于 graphify-out/ 内,并要求该目录存在,阻断目录穿越。
- sanitize_label 剥离控制字符、截到 256 字符、在 pyvis 嵌入前对标签与边标题做 HTML 转义,并同样作用于 MCP 文本输出,抵御来自节点标签的提示注入。
- tree-sitter 字节切片以 errors="replace" 解码,使非 UTF-8 源码优雅降级;detect.py 中 os.walk 显式使用 followlinks=False。
- 不对源码文件做 eval 或 exec,subprocess 调用不使用 shell=True,也不存储凭据或 API key。
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
Microsoft GraphRAG | 当你想要一条面向文档、研究级的 GraphRAG 管线,并能接受更重的 LLM 驱动抽取步骤。 | 开源(MIT),但规模化时 LLM 抽取成本显著。 |
LlamaIndex | 当你需要覆盖面更广的索引与检索框架,有大量数据加载器,并希望挂接图存储。 | 开源(MIT),embedding 与 LLM 成本取决于你的配置。 |
LangChain | 当检索只是更大 Agent 编排的一部分,你需要通用的 chain 与工具抽象。 | 开源(MIT),LLM 与 embedding 成本取决于所选供应商。 |
Sourcegraph Cody / Code Search | 当你想要托管、Web 级的代码搜索与 AI 助手,并能把源码送到托管或自托管企业实例。 | 商业产品,提供自托管企业版。 |
这个趋势说明了什么
替换内部编程 Agent 中的临时检索
在 Claude Code、Codex 或自建 MCP 客户端上搭内部 Agent 的团队,可把手写的 grep 加 embed 检索换成 graphify 的 tree-sitter 加 Leiden 图谱,直接拿到具备影响感知的答案。
在一个有代表性的服务上跑 graphify extract,然后问 Agent 一个 affected 类问题,例如某方法签名变化会影响哪些调用方,并与现有检索路径在同一查询上对比。
面向研究团队的混合媒体知识库
因为 ingest 接受代码、SQL schema、R 脚本、PDF、论文、图片、视频,研究团队可以把一个同时包含分析脚本和所引用 PDF 论文的项目目录交给 graphify,从同一个 MCP 客户端查询合并后的图。
把一个同时包含 R 分析脚本和它引用的 PDF 论文的目录交给 graphify,extract 后确认查询面能同时返回两种模态的节点。
用 Obsidian 做代码评审
Obsidian canvas 与知识图谱导出为评审者提供了社区与调用边的可视化地图,对在不熟悉仓库上做架构评审很有帮助。
把一个中型服务用 graphify export obsidian 导出到 Obsidian,检查社区方块是否对应真实子系统,而不是随机聚类。
RepoDaily 判断
graphify 是少数真正交付语法感知图谱、而非提示词封装的技能型仓库。它的 tree-sitter 加 Leiden 管线、明确的 local-first 安全模型,以及 MCP 面使其成为 Claude Code 与其他支持 MCP 助手的可信检索层,前提是你接受 0.1.x 管线仍在加固,以及 HTTP 传输需要谨慎管理 key 与 host。