cpp-coro-graph
Provides tools to index and analyze Linux kernel source code, extracting coroutine and device-domain graphs with query and visualization capabilities.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cpp-coro-graph Who calls OnSos?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cpp-coro-graph
一个语法层级(syntax-level)的 C++17 协程 + 设备标签(device) 调用图工具。
主要运行目标:Linux。 仅依赖 Python 3.9+ 标准库(运行时不需要额外 pip 依赖)。
功能概览:
所有函数都建点:包括定义
{...}和声明Foo();/= default/= delete类/结构体成员函数会解析为
Class::Method(含构造/析构)从
co_await/CO_AWAIT提取await边,同时保留普通calls边从
spawn/scope->spawn/sync_wait等 peel 出真实 worker,生成spawn(或 calls)边when_all(...)内的并行任务会 peel 成多条await成员调用链支持:
co_await m.Init()→SosModel::Init通过
rules/devices.json标注 device(cpu/gpu/npu/dsp;与业务 namespace 如yuv_domain区分)文件节点可查;
#include→includes;按 namespace 过滤;ccg seq/--by-namespace提供 HTML 可视化 + CodeGraph 风格 CLI(
ccg)+ MCP 服务
回归样例 fake_sample/
最小化 C++ 树,覆盖 P1–P11(spawn+on_empty、when_all、类成员/重载/模板、header-only、深 await、sync_wait、同名不同 namespace、多级 include、多 stage seq)。
python3 scripts/verify_fake_sample.py # 自动回归(推送前已跑通)
# 人工对照预期:fake_sample/verify.md
ccg index fake_sample && ccg query --namespace nsA::moduleB --kind coroutineRelated MCP server: prayog-repo-fleet
安装 CLI(类似 codegraph)
git clone https://github.com/ArcherLin13/cpp-coro-graph.git
cd cpp-coro-graph
# 把 `ccg` 放到 PATH(~/.local/bin)— 不需要 pip
chmod +x scripts/*.sh scripts/ccg scripts/cpp-coro-graph
./scripts/install_cli.sh
# 确保 ~/.local/bin 已加入 PATH
# 或者:可编辑安装
python3 -m pip install -e .安装后可使用短命令(与 CodeGraph 体验一致):
ccg index /path/to/repo # 生成 .cpp-coro-graph/graph.db
cd /path/to/repo # --db 会向上自动发现
ccg status
ccg status --by-namespace
ccg query OnSos
ccg query --kind file processor.h
ccg query --namespace nsA::moduleB --kind coroutine
ccg node OnSos # symbol: callers + callees
ccg node file:src/foo.cpp # file: contains / includes / importers
ccg callers OnSos
ccg callees OnSos
ccg seq OnSos # ordered calls/await inside a function
ccg explore OnSos # in/out + wider neighborhood
ccg path Call Init # control path A → B(file 查询则走 includes)
ccg impact OnSos
ccg viz --module path/to/module别名关系:cpp-coro-graph == ccg。
不安装也可直接用:./scripts/ccg callers OnSos --db .../graph.db
建库(Index)
ccg index /path/to/your/linux/repo
# 或者一条命令完成 index + HTML + status
./scripts/index_repo.sh /path/to/your/linux/repo日常改代码后增量更新(不用全量 index):
ccg sync /path/to/your/linux/repo
# 或在仓库根目录(自动发现 .cpp-coro-graph/graph.db)
cd /path/to/your/linux/repo && ccg syncsync 会对比文件的 size/mtime,只重解析新增/变更的文件,以及调用到这些文件符号的 caller 文件。
第一次没有 db 时会自动退化为全量 index。
输出文件位于仓库目录下:
.cpp-coro-graph/graph.db.cpp-coro-graph/graph.html(fromccg viz/ index script)
建议在源码所在的 Linux 机器上运行(避免 WSL 的 /mnt/c/... 路径)。
冒烟与回归验证(覆盖 spawn / fx::ex::on / run_* / 模板 co_await):
python3 scripts/validate_fixtures.py # aigc + pipeline + sample
ccg index fixtures/aigc --db /tmp/aigc.db
ccg node run_pipeline --db /tmp/aigc.db
ccg path run_pipeline Init --db /tmp/aigc.db快速查关系
需求 | 命令 |
查符号 |
|
谁调用了 X / X 调用了谁 |
|
只看调用者 |
|
只看被调方 |
|
邻域展开 |
|
A 如何到达 B |
|
变更影响面 |
|
脚本化 JSON 输出 | 加 |
默认边过滤是 control = calls + await。
如果关注结构关系,使用 --edge-kind inherits,contains。
可视化(模块主干)
ccg viz --module path/to/module --depth 2
ccg viz --around Call --depth 2
ccg viz --full # 旧版全图模式,大工程不建议浏览器交互:选择 module → 选择 entry chip → 双击节点展开下一层。calls 默认开启。
OpenCode MCP(快速接入)
和 CodeGraph 类似:先在终端建库,再让 Agent 通过 MCP 只读查询。
重要限制:
MCP 不会
index/sync,也不会生成graph.dbAgent 调
ccg_*时不能临时换另一个 db;启动 MCP 时就定死连接哪一个库源码变更后要在终端跑
ccg sync(或全量ccg index),再继续用 MCP 查
# 1) 先保证 CLI 在 PATH
./scripts/install_cli.sh # 或者: pip install -e .
# 2) 对你的 C++ 仓库建库(这一步必须做;MCP 不会帮你做)
ccg index /path/to/your/repo
# 之后改代码:ccg sync
# 3) 写入 OpenCode 配置(项目级或全局)
cd /path/to/your/repo
ccg install-opencode --agents # 写入 ./opencode.json + AGENTS.md 提示
# 或用户级:
ccg install-opencode --global
# 4) 重启 OpenCode 并检查
opencode mcp list若 opencode mcp list timeout:
调大
timeout通常没用。OpenCode 的timeout是「握手/拉 tools」的等待上限;
一直 timeout = 进程根本没回 initialize(命令起不来、stdout 被缓冲、或 PATH/模块错误),不是“太慢”。
请按下面排查:
# 1) 看 install 写进去的真实 command
ccg install-opencode --agents --db /abs/path/.cpp-coro-graph/graph.db
# 会打印: mcp command: ["/usr/bin/python3", "-u", ".../scripts/ccg_mcp.py", "--db", "..."]
# 2) 手动跑同一条 command(应卡住等 stdin,stderr 有 mcp entry 日志)
python3 -u /path/to/cpp-coro-graph/scripts/ccg_mcp.py --db /abs/path/graph.db
# Ctrl+C 退出。如果立刻 ModuleNotFoundError / 找不到文件 → 先修这个
# 3) 确认 opencode.json 里是 type=local + command 数组(不要用 args/env 旧字段)现象 | 原因 | 处理 |
timeout / MCP error -32001 且调大无效 | 握手无响应(常见:帧头只认 CRLF、进程起不来、stdout 缓冲) | 更新后重装;手动跑 |
command not found: | OpenCode PATH 无 | 重装(新安装器不再依赖裸 |
tools 返回 no graph.db | 还没建库 / cwd 不对 |
|
仅 Windows 全挂 | OpenCode 已知 Windows stdio 问题 | 尽量在 Linux 跑 OpenCode;或升级 OpenCode |
推荐稳妥写法(pin db + 重装配置):
cd /path/to/your/repo
ccg index .
ccg install-opencode --agents --db "$(pwd)/.cpp-coro-graph/graph.db"opencode.json 配置示例(examples/opencode.json 里也有;command 应为绝对 python 路径):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cpp-coro-graph": {
"type": "local",
"command": ["ccg", "mcp"],
"enabled": true,
"timeout": 15000
}
}
}MCP 怎么选 db?
启动 ccg mcp 时按下面顺序决定唯一的 db,之后所有查询都用它:
配置里显式
--db(最稳)ccg install-opencode --db /abs/path/.cpp-coro-graph/graph.db
→ command 变成["ccg", "mcp", "--db", "/abs/.../graph.db"]未写
--db:从 OpenCode 启动 MCP 时的项目 cwd 向上查找.cpp-coro-graph/graph.db(最多 8 层)
因此推荐:在目标 C++ 仓库根目录执行 ccg index + ccg install-opencode,让 cwd 自动对上该仓库的 db。
MCP 工具(Agent 侧)
工具 | 用途 |
| 符号详情 + callers + callees(建议从这里开始) |
| 单方向查询 |
| 邻域展开( |
|
|
| 变更影响面 |
| 搜索 / 健康检查 |
没有 ccg_index / ccg_sync 工具——建库请用终端 CLI。
Prompt 建议:“use ccg_node on OnSos”,或直接把安装生成的 AGENTS.md 片段贴进系统提示。
Cursor MCP(可选)
同样需要先 ccg index;db 发现规则与上面相同(cwd 向上找,或 args 里加 --db):
{
"mcpServers": {
"cpp-coro-graph": {
"command": "ccg",
"args": ["mcp"]
}
}
}自定义设备规则(device)
字段名为 device(取值 cpu/gpu/npu/dsp),不要与业务 C++ namespace(如 yuv_domain)混淆。
可直接修改 rules/devices.json,或通过 --rules your.json 传入:
{
"patterns": [
{"match": "RunOnNpu", "device": "npu", "backend": "custom"},
{"match": "clEnqueue", "device": "gpu", "backend": "opencl"}
]
}规则按顺序匹配,命中即停;建议把更长、更具体的匹配项放前面。
边类型(Edge kinds)
kind | 可视化 | 含义 |
| 青色实线 | 直接/同步调用 |
| 红色虚线 |
|
| 橙色 | 从 |
| 紫色虚线 | 同一 caller 内:前一个被调 → 后一个被调(顺序) |
| (默认不画) |
|
| 灰色 | 文件包含函数/类 |
| 绿色虚线 |
|
查询提示:
ccg query --kind file module_b/ccg node file:src/foo.cpp— 文件节点 + contains / includes / importersccg query --namespace ns::mod --kind coroutine— 按 namespace 过滤ccg seq Call— 函数内按行号的 calls/await/spawn 序列ccg status --by-namespace— 模块级符号计数文件间:
ccg path file:A.h file:B.cpp、ccg impact pipeline.hpp(走 includes)
callers / callees 默认 control = calls + await + spawn。ccg callees Call 会按源码顺序输出 #1 #2 …。可视化里可切换 seq (顺序);可展开节点会显示 + 和琥珀色边框。
ccg callees Call # 按顺序输出 #1 Init, #2 Load, …
ccg explore Init --edge-kind seq # Init -[seq]-> Load(在 Call 中的下一步)
ccg viz --module .默认跳过目录
.git, build, out, third_party, node_modules, .codegraph, bazel-*, .repo, prebuilts, …
Available Tools
11 toolsccg_calleesB
What this symbol calls / awaits (outgoing). Ordered by source line (#1,#2).
Inputs: query (required), limit, show_unresolved.
ccg_callersB
Who calls / awaits this symbol (incoming control edges).
Inputs: query (required), limit, show_unresolved.
ccg_exploreC
Neighborhood around a symbol: in/out + optional BFS depth (like codegraph explore for coroutines).
Inputs: query (required), depth, limit, edge_kind, +1 more.
ccg_impactC
Incoming blast radius. Symbols: callers. Files (file:… / *.h): importers via #include.
Inputs: query (required), depth, limit.
ccg_nodeC
One symbol or file: location + related edges. Symbols → callers/callees (control). Files → contains (symbols) + includes (headers) + importers.
Inputs: query (required), limit, show_unresolved.
ccg_pathC
Shortest path between two symbols (control) or two files (includes). Use file:path or *.hpp queries for include topology.
Inputs: dst (required), src (required), depth, limit.
ccg_queryB
Search symbols or file nodes by name/qname/path fragment. Use kind=file for files; namespace= for C++ namespace filter (exact or nested prefix). Empty query + namespace lists that module.
Inputs: kind, limit, query, namespace, +1 more.
ccg_seqA
Ordered calls/await sequence inside a function (by source line). Preferred over explore edge_kind=seq for understanding in-function order.
Inputs: query (required), limit, show_unresolved.
ccg_statsA
cpp-coro-graph: node/edge counts by kind and device. Optional by_namespace=true for per-namespace symbol counts. Call first to confirm the graph DB is loaded.
Inputs: limit, namespace, by_namespace.
coro_exploreD
Alias of ccg_explore (legacy).
Inputs: query (required), depth, limit, device.
coro_statsC
Alias of ccg_stats.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Many tools have clear distinct purposes (stats, query, node, callers, callees, seq, path, impact), but ccg_explore and ccg_seq overlap with ccg_node's related edges and callers/callees, creating some ambiguity. The presence of aliases (coro_stats, coro_explore) adds confusion for an agent.
Most tools follow a consistent ccg_verb or ccg_noun pattern (ccg_stats, ccg_query, ccg_node, ccg_callers, etc.), which is predictable. However, the aliases coro_stats and coro_explore deviate from the ccg_ prefix, slightly breaking consistency.
11 tools is a reasonable count for a graph-based code analysis server covering stats, query, traversal, and impact. The two aliases are redundant but don't bloat the count excessively.
The tool set covers essential operations: graph stats, symbol/file lookup, edge exploration (callers, callees, sequence), path finding, and impact analysis. It lacks explicit filtering or aggregation tools, but the core analysis surface is well-covered for a read-only graph explorer.
Maintenance
Related MCP Connectors
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
Repository knowledge graph MCP server for codebase understanding and debugging.
Ask a codebase what calls what: search, blast radius, paths between symbols, and diffs.
Ask who calls a route, what a change breaks or who reads a field, across a system's repos.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceBuilds a semantic knowledge graph of C++ code and exposes 9 MCP tools for AI assistants to search classes, functions, inheritance, callers, callees, overrides, and more.3-
- AlicenseNot gradedqualityDmaintenanceExposes code graphs across multi-program repositories via MCP, enabling humans and agents to query the fleet with evidence.MIT
- FlicenseNot gradedqualityBmaintenanceCodeGraph MCP is a powerful standalone tool that parses your entire C/C++ codebase into a semantic knowledge graph and seamlessly exposes it to AI coding assistants via the Model Context Protocol (MCP). By providing AI (like Claude Desktop, Cursor, or Google Antigravity) with a structural map of your project—including caller/callee relationships, file dependencies, and dynamic function definition1-
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to query a local, continuously updated symbol graph of a codebase, providing ranked search, caller/callee exploration, dependency paths, and git-diff impact analysis through MCP tools.10 npmApache 2.0