
Codegraph
io.github.attnstack由 GitHub 帳號 attnstack 發布v1.0.0更新於 Nov 6, 2026
Call graph of a TS/JS repo: who-calls, impact with evidence chains, trace, hotspots.
概覽
本機 MCP 伺服器,為 TypeScript/JavaScript(及 Python)儲存庫建立靜態呼叫圖,讓助理回答誰呼叫誰、變更影響範圍、呼叫鏈與熱點問題。
- 可以做什麼
- 查找某個符號的呼叫端,並附上每個呼叫點的原始碼位置
- 依風險排序評估變更影響範圍,每條附完整證據鏈
- 追蹤兩個符號之間的路徑,並列出某函式呼叫了誰
- 偵測死程式碼、import 循環與熱點
- 搜尋符號,並用 git blame 對符號做歷史考古
- 每次工具呼叫前依檔案變更自動增量重建索引
- 適用情境
- 適合在評估一處程式碼變更會波及哪些地方、接手不熟悉的模組,或需要對 TS/JS、Python 儲存庫做結構性提問時使用,尤其是文字搜尋與 IDE 單跳引用不夠用的情況。
- 執行需求
- 以本機 stdio 程序執行,透過 mcp 子命令並指定儲存庫根目錄啟動。需要已編譯的 Rust 執行檔,或使用內附 Docker 映像並掛載儲存庫;未宣告帳號、API 金鑰或網路存取需求。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Codegraph,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
codegraph
改一行代码,怎么知道会波及哪些地方?IDE 的"查找引用"只给一跳,全局搜索只会匹配文本。codegraph 用 tree-sitter 把整个 TypeScript/JavaScript(以及 Python)仓库解析成一张调用图(函数 / 类 / 文件 × 调用 / 继承 / 导入),然后直接回答:
- 谁调用了它 —— 每个调用点带源码位置
- 改它影响谁 —— 影响面按风险排序,每条附完整调用链
- 从入口到 DB/外部调用 中间经过了谁
所有结论来自静态解析,每条边都能点回源码。解析不了的地方(动态调用、同名歧义、被局部变量遮蔽)会明确标成 dynamic 列出来,而不是硬塞一个可能错的答案给你。不需要向量库,不需要上传代码,查询结果可复现。
快速上手
Python 仓库用法完全一样——试试 --root fixtures/demo-py。
impact 的输出长上面截图那样:按风险排序的受影响清单 + 每条的证据链。风险分的算法在架构文档里,一句话版本是"沿调用链每跳衰减 0.8,不同边类型不同权重"。
接入 Claude Code / Cursor
CLI 之外还有一个 MCP stdio 出口,Agent 可以直接调用同一套查询:
不想装 Rust 工具链的话,仓库带了 Dockerfile:
提供 9 个工具:who_calls / impact / trace / callees / dead_code / cycles / hotspots / search / archaeology。改完文件不用手动重建——每次工具调用前会做 mtime/size 预筛,发现漂移自动增量更新。协议实现是手写的最小 JSON-RPC 子集,用官方 TypeScript SDK 做了契约测试(这也是 CI 的一部分)。
archaeology 单独说一下:基于 git blame -C 做代码考古,输入一个符号,返回它每行是哪个 commit 引入的、谁写的、关联哪个 PR。接手别人的老模块时挺好用。
为什么不用向量库
语义相似不等于真有调用关系。改代码影响评估需要的是确定的边,不是"感觉相关的前 k 个"。代价也很实在:解析成本(靠增量更新摊薄)和语言覆盖(目前只有 TS/JS)。如果你要的是"帮我找实现某个业务概念的代码",这是另一类问题,embedding 检索更合适,两者不冲突。
工作原理
几个关键取舍(细节在 docs/ARCHITECTURE.md):
- 节点身份不含行号。span 只是属性,否则每编辑一次全部节点 id 洗牌,增量更新就没法做了。
- 每个调用点单独存一行(refs 表),边表只是聚合缓存。证据链、增量重解析的原材料,都是同一份 refs。
- 增量的正确性靠拆分:tree-sitter 解析(贵)只做变更文件;符号解析(便宜,全是哈希查找)每次对全量视图重跑。所以"增量结果 == 全量重建"能拿 fuzz 测试证明——随机改文件,两边各查一遍全部符号,逐字段断言相等。这个测试在 CI 里跑。
性能
我机器上(Ryzen 7 7735H,Windows 11,release 构建)跑合成语料(700 个文件、10.5 万行、1.5 万节点 / 3.3 万边):
查询那 0.2s 基本是进程启动和快照装载,算法本身毫秒级。同目录 grep -rn 一遍要 0.35s,而且它只能给你文本行。
说句实话:这个规模下全量重建本来就不慢,增量并不比它快。增量的价值在于正确性模型(上面说的 fuzz 等式)和更大的语料/更慢的磁盘。数字怎么测的、怎么复现,见 scripts/bench.sh。
已知不足
- JS 没有类型信息,
obj.method()这类调用很多解析不出来,进了 dynamic 桶。要彻底解决得接 tsc 的类型表,暂时没做。 - 装饰器路由、DI 容器、monkey-patch 这类运行时魔法,静态分析原则上无解,全部如实标 dynamic。
- 证据链是调用链,不含数据流。严格的影响面要程序切片(SDG),是后面想做的方向。
- 语言适配器覆盖 TS/JS 和 Python。加一门语言 = 一个 grammar 依赖 + 一份 queries 文件 + 在 parse.rs 注册(见 CONTRIBUTING);python 的 import 环检测也顺带做了,但 barrel 式 re-export 链目前只在 TS 侧支持。
- benchmark 用的是合成语料,真实大型 monorepo(workspace 协议、多层 tsconfig extends)没回归过。
更新日志
版本历史见 CHANGELOG.md。
License
來源:README.md,提交 846fc34
工具
0版本歷史
1- v1.0.0最新Oct 30, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分