Kivgraph
Kivgraph
Kivgraph 是一个本地的面向 AI 编码代理的跨仓库代码智能 MCP 服务器。它跨多个已注册仓库构建一个规范的语义代码图,并回答关于符号、仓库关系、调用者、依赖和变更影响的问题。
它只对语料库索引一次,并提供不可变的图:边由 go/types、TypeScript 检查器和 rust-analyzer 解析,而不是通过名称匹配。这就是它与搜索工具的区别,也是让空答案有价值的原因——空的引用列表意味着没有人调用它,而不是没有找到任何东西,而 grep 无法区分这两种情况。
Kivgraph 专注于语义代码关系,而不是自动发现服务之间的每个 HTTP、gRPC、Kafka 或数据库运行时流程。
文档
阅读 Kivgraph 用户文档 了解安装、MCP 客户端、代码智能、仓库关系和工作区代码图。发布站点与发布包分开配置;此链接在任何检出中均保持有效。
Related MCP server: MCP Indexer
每个工具回答什么
问题 | 工具 |
谁调用它,什么引用了它 |
|
如果我修改它会破坏什么 |
|
它向外触达什么 |
|
谁从另一个仓库使用它 |
|
它在哪里声明 |
|
这个包里声明了什么 |
|
给我这些符号的代码 |
|
关于这一个符号的一切 |
|
索引了什么,图是否是最新的 |
|
十个只读工具,外加一个需要同意才能执行的变更操作(index_project),客户端必须先授权,才能注册仓库或发布一代。
每一行只要提到符号,都会带上它的仓库、路径、限定名和行范围,因此无需第二次调用即可打开;每个工具都接受这个三元组来代替不透明的键。
它的劣势。 在单个小仓库中查找一个罕见名称,用 grep 更便宜;索引一个小文件的成本也高于读取它。它在常见名称、传递影响、另一个仓库中的消费者以及证明“不存在”方面占优。针对 37 个仓库的语料库、29 个问题进行的测量(benchmarks/graph-tools-comparison/results-all.json,提交 954b9eb,分词器 o200k_base):Kivgraph 花费 35,961 个 token,而 grep 加读取花费 267,980 个 token;29 个问题中双方在 28 个上完全一致,每个问题的中位数是 Kivgraph 占优 5.95x。在这 29 个问题中,grep 在 5 个上更便宜,且这 5 个双方都达到了完全召回:T1_go_trivial 询问的是语料库声明了两次的名称,在那里 grep 的成本是 Kivgraph 的 0.53x。
第二个测试工具 benchmarks/mcp-token-cost 与逐字捕获的宿主自身工具输出进行比较,但它在 Kivgraph 自己的单一仓库(13,222 个符号)上运行:答案本身为 7.64x,整个会话为 1.60x,而双方都要支付的源代码正文设定了 2.41x 的下限。
状态
已发布并投入使用。kivgraph version 报告已发布的版本;每个阶段的待办事项和验收门都在 TASKS.md 中。
语言: Go、TypeScript、Rust、Python 和 Dart。Python 在回退模式下使用内置的 AST worker;那些推断出的引用是
CANDIDATE,绝不会是EXACT。精确 Python 模式使用内置的 Pyright LSP 适配器,并配合已安装的 Pyright/BasedPyright 服务器。Dart 使用 Dart 或 Flutter SDK 提供的 Dart Analysis Server。语义依赖: 当且仅当一个已注册的提供者拥有所请求的包时,Python 和 Dart 的导入可以发布包依赖;符号级的跨仓库边需要显式的提供者身份。
接口: 通过 STDIO 提供十个只读工具,外加一个需要同意才能执行的变更操作(
index_project)。契约见 docs/protocol/mcp-surface-v3.md。存储: LadybugDB 是权威存储;查询从原子发布的不可变 HotSnapshot 提供,绝不直接来自数据库。
平台:
linux/amd64、darwin/arm64和windows/amd64。查看器:
kivgraph ui提供已发布图的只读 3D 视图。
要求
需要 Go 1.26 或更高版本才能从源码构建。索引器使用链接进二进制的
go/types进行类型检查,因此它只能读取为其自身语言版本或更早版本编写的仓库和依赖;kivgraph doctor会报告这个上限。索引 Rust 需要
cargo和rust-analyzer。发布包自带分析器;它不携带 Rust 工具链。索引 TypeScript 需要 Node.js 22 或更高版本才能运行 worker。
索引 Python 需要 Python 3.10 或更高版本才能运行内置 worker。它是一个语法感知的回退实现,并显式报告动态或无法解析的名称;精确模式还需要一个与 Pyright 兼容的语言服务器。
索引 Dart 需要
dart可执行文件;Flutter 安装会提供它。加载器使用 Analysis Server 协议,并且不会修改 Flutter 项目。
安装
用一个脚本安装 MCP
安装程序会检测平台,下载该平台最新的已发布 MCP 版本,验证发布归档和包校验和,并在不需要 Go 或 pnpm 的情况下完成安装。发布内容包含 Go 服务器、固定版本的 LadybugDB 库、TypeScript worker、内置的 Python AST worker、固定版本的 rust-analyzer、语法清单和 Web 查看器,其中查看器资源占包的 2.3 MB。scripts/build-bundle.sh --mcp-only 可以为需要的人生成不含查看器的包。
已发布的包:Linux amd64 和 macOS arm64。
运行时要求:Bash、Node.js 22 或更高版本、索引 Python 时需要 Python 3.10 或更高版本、curl、tar,以及 sha256sum 或 shasum。包自带 rust-analyzer;索引 Rust 仓库还需要 PATH 上有 cargo,索引 Dart 需要 Dart 或 Flutter SDK。
在 macOS 上,二进制文件未经公证。用 curl 下载的发布不会被隔离,可以直接运行;用浏览器下载的副本需要执行 xattr -dr com.apple.quarantine。参见 docs/development/macos.md。
用一条命令安装最新版本:
curl -fsSL https://github.com/Luqueee/kivgraph/releases/latest/download/install.sh | bash从检出目录中,可以直接运行同一个安装程序:
./scripts/install.sh要安装特定版本而不是最新版本:
KIVGRAPH_VERSION=v0.9.1 ./scripts/install.sh脚本将包安装在 ~/.local/opt/kivgraph,并将启动器放在 ~/.local/bin。它从不修改已注册的仓库、创建索引或替换配置文件。要使用其他位置,请设置 KIVGRAPH_INSTALL_ROOT 和 KIVGRAPH_BIN_DIR。
将启动器目录添加到当前 shell,并验证两个运行时:
export PATH="$HOME/.local/bin:$PATH"
kivgraph version
kivgraph-ts-worker <<'EOF'
hello
EOF检查是否有新版本,或更新已安装的包:
kivgraph update --check
kivgraph update更新是原子的,保留配置和图状态,验证发布和包校验和,并且只替换已安装的包。更新后请重启 MCP 客户端,以便它启动新的二进制文件。
当 kivgraph 在交互式终端中不带命令调用时,它会以 800 ms 超时检查是否有新版本,并在平台缓存目录(Linux 上是 $XDG_CACHE_HOME,macOS 上是 $HOME/Library/Caches)下的 kivgraph/update-check.json 中缓存 24 小时。当网络不可用时,这个可选检查绝不会阻塞命令。
当输出目标是终端时,交互式命令输出会使用语义化的 ANSI 颜色。设置 NO_COLOR 或重定向输出可以保持纯文本。
配置 MCP 客户端并安装技能
发布安装程序不会自动编辑客户端配置。安装 Kivgraph 后,不带 --target 运行集成命令,以检测本机上存在的编码代理并选择其中一个或多个:
kivgraph mcp install --scope user
kivgraph skill install --scope userKivgraph 会检查每个客户端已知的本地配置或安装根目录,并标记检测到的代理。使用 ↑/↓(或 j/k)移动,space 切换代理,a 全选,n 全不选,Enter 确认,q 或 Esc 取消。如果没有检测到任何代理,选择器启动时不选中任何代理。仅在脚本化、非交互式安装中使用 --target。
支持的 MCP 目标有 claude-code、claude-desktop、codex、opencode 和 oh-my-pi。支持的技能目标有 claude-code、codex、opencode 和 oh-my-pi;Claude Desktop 没有本地技能目标。默认作用域是 user;项目本地配置使用 --scope project。使用 --dry-run 可以在不写入的情况下检查计划。现有的不兼容条目会报错停止;替换或移除需要 --force。现有文件以模式 0600 原子写入,并在替换或移除前获得 *.kivgraph.bak 备份。
显式检查或移除注册:
kivgraph mcp status --target claude-code --scope user
kivgraph mcp remove --target claude-code --scope user
kivgraph skill status --target claude-code --scope user
kivgraph skill remove --target claude-code --scope user在启动 MCP 服务器之前初始化并发布图:
kivgraph init \
--repository project=/absolute/path/to/project \
--languages go,typescript,rust
kivgraph doctor
kivgraph index --fullinit 写入一份自包含的配置:当 --config 指向其他位置时,它的状态、缓存和注册表都挂在该目录下,因此一次性的索引绝不会触碰真实的索引。index --full 原子地重新发布——任何阶段的失败都会让上一代继续服务。已经运行的服务器会自动跟随新的一代。
日常使用:
kivgraph graph status # what is published, and whether a tree has moved
kivgraph doctor # toolchains, storage, and the type-checking ceiling
kivgraph ui # read-only 3D viewer, default 0.0.0.0:7777
kivgraph logs --follow # what it indexed, served and answered, as it happens
kivgraph tool-stats # per-tool cost, calls, and failures
kivgraph stop # terminate this user's serve and ui, never an index
kivgraph clean --keep-activekivgraph ui 默认绑定非回环地址,因为图在仓库所在的位置被索引,而从其他地方查看;它没有身份验证,所以它会记录自己暴露的内容,而 --addr 可以限制它。
logs 和 tool-stats 读取状态目录中的追加只读记录,而不是询问服务器,这正是它们能够回答的原因:serve 维护的每个工具计数器在启动时生成,在停止时消失。读取文件还使答案覆盖所有曾经运行过的服务器。
配置任意 MCP 客户端通过 STDIO 启动服务器:
{
"mcpServers": {
"kivgraph": {
"command": "/home/user/.local/bin/kivgraph",
"args": [
"serve",
"--config",
"/home/user/.config/kivgraph/config.yaml"
]
}
}
}kivgraph serve 在图存在之前就会启动:在没有已发布的一代时,它完成握手,不发布任何查询工具,并将重建命令放在 instructions 中。客户端自己启动该进程,因此退出会被视为崩溃。它只将 MCP 帧写入 stdout,并将日志写入 stderr。
图承载什么,以及它拒绝什么
一条边只有在证据充分且来源正确时才是 EXACT。它绝不会从名称、路径、别名或单个候选中创建;无法解析的引用会以 UNRESOLVED 发布,并附上原因、仓库和语言,而不是被丢弃。graph_status 会分别报告这两者。
这就是为什么有些答案是“不存在”而不是边。在索引了 Rust 标准库的情况下,impl Add for u32 由宏生成,不存在于任何源码范围中,因此它的每次使用都会按符号声明为 PROVIDER_DEFINITION_NOT_INDEXED,而不是变成一条任何人都无法打开的边。
Kivgraph 从机器上派生的提供者——目前是以工具链命名的 Rust 标准库 rust:1.96.1——默认从读取结果中隐藏:一个工具链大约有两万个符号,搜索 Clone 会返回 core。include_derived 可以请求包含它们,而 graph_status 会单独列出它们的贡献,使总数保持可读。
开发
make build
make test
make semantic-coverage
make test-ladybugmake test-ladybug 是运行链接固定原生库的标签的唯一受支持方式。贡献约定见 AGENTS.md,CLAUDE.md 中链接了该文件。
make semantic-coverage 是 Go、TypeScript、Python 和 Dart 的发布门禁。它验证 testdata/semantic-coverage/manifest.json 中的机器可读矩阵,运行确切的 TypeScript、Go 和 Dart 套件,并且需要与 Pyright 兼容的语言服务器来运行确切的 Python 套件。当某项能力只有 fixture 而没有可执行的回归测试时,该语言不被视为已完成。
存储与图基准测试
LadybugDB 资格认证、合成语料库生成器、加载与查询基准测试,以及 doctor、rebuild、rollback 和 snapshot 命令均记录在 docs/development/storage-benchmarks.md 中。文档以 ACCEPT_LADYBUGDB_WITH_LIMITS 结尾。
公共站点
landing/ 承载落地页和用户文档。它不随任何发布包分发,通过 make landing-check 和 make landing-build 验证,并在端口 6767 上提供服务。它发布的内容、MCP 参考的捕获方式以及尚未完成的事项记录在 docs/development/landing-site.md 中。
结构
cmd/kivgraph/ Main executable.
internal/ Kivgraph internal packages.
ts-worker/ TypeScript worker.
web/ Graph viewer served by `kivgraph ui`.
landing/ Landing page and documentation site (not part of any release).
testdata/ Test fixtures and corpora.
benchmarks/ Benchmark results.
docs/ Documentation and ADRs.
scripts/ Auxiliary automation.许可证
Kivgraph 根据 Apache License 2.0 分发。
第三方许可证
随 Kivgraph 分发的依赖项的通知和许可证记录在 THIRD_PARTY_NOTICES.md 中。每当有依赖项添加到可分发产品中时,该列表都会更新。
Available Tools
12 toolsfind_by_intentBRead-only
Which symbols a plain-language description likely names, and the files to open.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| repo | No | ||
| view | No | ||
| limit | No | ||
| cursor | No | ||
| intent | Yes | ||
| keywords | No | ||
| path_prefix | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context: results are approximate ('likely names') and include both symbols and files to open. However, it does not disclose pagination, ranking, or how the intent is interpreted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded phrase with no filler or redundancy. It conveys the essence of the tool efficiently, though it is compact enough that some information is sacrificed for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With nine parameters, no output schema, and only a read-only annotation, the description is far too sparse to fully guide an agent. It omits parameter semantics, result structure, pagination behavior, and how to shape a good intent query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the schema's lack of documentation. It only indirectly covers 'intent' via 'plain-language description' and leaves the other eight parameters including kind, repo, limit, cursor, and keywords entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the core function: mapping a plain-language description to likely symbols and files to open. This clearly distinguishes it from siblings like find_symbol, which target exact symbol lookups. However, it is phrased as a noun phrase rather than an explicit verb+resource statement, which slightly weakens clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'plain-language description' implies this tool should be used when the user describes intent rather than naming an exact symbol. But it does not explicitly explain when to prefer find_by_intent over find_symbol or find_references, nor does it list exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_cross_repo_consumersCRead-only
Consumers of a symbol in other repositories, exact uses kept apart from package-level dependencies. A language server stops at its workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| repo | No | ||
| view | No | ||
| limit | No | ||
| cursor | No | ||
| language | No | ||
| repository | No | ||
| stable_key | No | ||
| qualified_name | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description adds meaningful behavioral context: it separates exact uses from package-level dependencies and notes that a language server stops at its workspace, implying this tool spans workspaces. It does not disclose pagination, cursor behavior, or result shape, so the additional transparency is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise and front-loads the core purpose in the first clause. Both sentences earn their place, and there is no filler or repetition, though the elliptical noun-phrase style and lack of a verb make it slightly less polished than the strongest examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 optional parameters, no parameter descriptions, and no output schema, the description is too sparse to allow correct invocation: an agent can guess the tool's purpose but not what to pass for path, repo, stable_key, qualified_name, or response_format. It provides enough context for selection but not enough for reliable execution.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 10 parameters and 0% schema description coverage, the description carries the burden of explaining parameter meaning, but it does not mention path, repo, stable_key, qualified_name, view, cursor, or any other parameter. The only hint is the word 'symbol', which could relate to qualified_name or stable_key, but no explicit mapping is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as finding consumers of a symbol in other repositories, and the phrase 'exact uses kept apart from package-level dependencies' distinguishes it from dependency-level queries. It lacks an explicit verb and is phrased as a noun fragment, so it does not fully meet the top bar, but the resource and scope are intelligible.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need consumers beyond the current repository and want exact uses rather than package-level dependencies. However, it never names alternatives such as find_references or states explicitly when not to use this tool, leaving usage guidance to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_referencesARead-only
Who calls or references a symbol. Type-checked, not name-matched: grep cannot separate homonyms, and an empty answer means nobody calls it. A bare name suffices: an ambiguous one returns its candidates, so no lookup call first. view: "files" answers which files without a line each.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| path | No | ||
| repo | No | ||
| view | No | ||
| limit | No | ||
| cursor | No | ||
| language | No | ||
| direction | No | ||
| confidence | No | ||
| edge_kinds | No | ||
| repository | No | ||
| stable_key | No | ||
| qualified_name | No | ||
| include_derived | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses type-checked behavior, homonym handling, the meaning of an empty result, ambiguity resolution, and the 'view: files' behavior. This is rich behavioral context that materially changes how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, behavioral distinction, usage shortcut, and a view variant. The most important information is front-loaded, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the minimal invocation path well and explains key result semantics, but with 15 optional parameters and no output schema it leaves advanced usage undocumented. There is no mention of pagination via cursor/limit, language or repo scoping, or what the default response shape is. It is adequate for basic calls but not fully complete given the parameter surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, but it only explains two parameters: the bare 'name' usage and 'view: files'. The remaining 13 parameters—path, repo, limit, cursor, language, direction, confidence, edge_kinds, repository, stable_key, qualified_name, include_derived, response_format—receive no semantic explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line, 'Who calls or references a symbol,' states a clear verb and resource. The description goes further by contrasting with grep and explaining type-checked semantics, but it does not explicitly distinguish this from sibling tools like find_symbol or trace_dependencies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical usage context: a bare name suffices, ambiguous names return candidates, and an empty answer means nobody calls it. It does not explicitly state when to prefer an alternative sibling tool, so exclusions are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_symbolARead-only
Where a symbol is declared, by name, qualified name, prefix or substring. Narrow with kind, repo and path_prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| mode | No | ||
| name | Yes | ||
| repo | No | ||
| view | No | ||
| limit | No | ||
| cursor | No | ||
| path_prefix | No | ||
| include_derived | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no meaningful annotations, so the description carries the behavioral burden. It conveys that this is a search/lookup operation with flexible name matching and filters, but it does not disclose pagination behavior, result shape, or index/search limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences lead with the tool's purpose and then list the narrowing options, with no filler or repetition. Each phrase adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 0% schema description coverage, no annotations, and no output schema, this short description leaves important call behavior unspecified, including pagination, output formatting, and derived-symbol handling. It is a strong summary but not complete enough for an agent to configure the tool confidently in all cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must add parameter meaning. It does explain the required name parameter's matching flexibility and maps kind, repo, and path_prefix as narrowing filters, but it leaves mode, view, limit, cursor, include_derived, and response_format unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the core action, finding where a symbol is declared, and specifies the matching modes (name, qualified name, prefix, substring). This clearly distinguishes it from sibling tools like find_references (where used) and get_symbol (retrieve symbol details).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended scenario (locate a declaration site) and how to narrow results with kind, repo, and path_prefix. It does not name sibling alternatives or explicitly state when not to use it, but the declaration-focused wording supplies clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blast_radiusBRead-only
What a change to this symbol reaches, by repository, package, depth and relation kind. Grep does not follow a chain.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| view | No | ||
| depth | No | ||
| kinds | No | ||
| limit | No | ||
| cursor | No | ||
| max_nodes | No | ||
| confidence | No | ||
| edge_kinds | No | ||
| repository | No | ||
| stable_key | No | ||
| qualified_name | No | ||
| include_derived | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety; the description adds the key behavioral trait that this tool follows a dependency chain and reports reach by repository, package, depth, and relation kind. It does not, however, disclose output shape, pagination behavior, or how confidence and edge kinds are applied—details that would matter for a graph-query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no filler, and the main idea is front-loaded. The second sentence about grep earns its place by clarifying the tool's transitive nature, even though the phrasing is terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite its simplicity, the tool has a large optional parameter set, no schema descriptions, and no output schema. The description does not explain which identifier parameter to use, how pagination works, what response_format values are accepted, or what the returned blast radius looks like, making it insufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and 14 parameters, the description must compensate, but it only hints at repository, depth, relation kind, and symbol identity. Parameters such as cursor, max_nodes, confidence, include_derived, stable_key, and response_format receive no guidance, leaving the agent to guess their meaning or required combinations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly conveys the tool's purpose even without an explicit verb: it shows what a change to a symbol reaches across repositories, packages, depth, and relation kinds. This distinguishes it from ordinary reference lookup, though it does not explicitly name sibling tools such as trace_dependencies or find_cross_repo_consumers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Grep does not follow a chain' implies the tool should be used when transitive dependency traversal is needed, rather than simple text search. However, it provides no explicit when-to-use guidance against sibling tools like find_cross_repo_consumers or trace_dependencies, leaving the choice largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_outlineARead-only
Declarations under a path, grouped by file, with kind, signature and range. Use it for a package; one small file is cheaper to read.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| path | Yes | ||
| view | No | ||
| limit | No | ||
| cursor | No | ||
| repository | Yes | ||
| include_members | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals output behavior beyond the readOnlyHint annotation: results are grouped by file and include kind, signature, and range. It also gives a cost-oriented hint. This adds useful context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences. The core meaning is front-loaded, and the second sentence adds practical usage guidance without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For basic use with only required parameters, the description is adequate: it tells the agent what the tool returns and when to use it. However, with no output schema, minimal annotations, and several optional parameters that affect pagination and response format, the description leaves meaningful gaps for an agent trying to fully understand invocation options.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are 8 parameters, but the description only clarifies the notion of a path and, ambiguously, 'kind' as an output field. Parameters like limit, cursor, view, include_members, and response_format are left completely unexplained, so the description does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: retrieving declarations under a path, grouped by file, with kind, signature, and range. This clearly goes beyond restating the tool name, though it does not name a sibling or explicitly contrast itself with get_source or get_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance to use this for a package and hints that reading a single small file directly is cheaper. It does not name the alternative tool or provide a formal when-not-to-use list, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourceBRead-only
The code of several symbols in one call. Prefer it to reading each range: no line numbers, one call across files and repositories.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | ||
| context_lines | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile. The description adds useful behavioral context: it returns source for multiple symbols, excludes line numbers, and spans files/repositories. It does not explain response format or potential limitations, but it does not contradict the annotation and discloses the most relevant behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the core purpose front-loaded and the usage rationale following. There is minor redundancy of 'one call' appearing twice, but otherwise every phrase earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no parameter descriptions in the schema, and only a terse description, the definition omits key invocation details. The agent cannot infer how to structure the symbol objects (path, repository, stable_key, qualified_name), what context_lines does, or what response_format values are accepted. This is incomplete for a tool with three parameters and zero schema-level documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters. It only implies that 'symbols' is the main input by saying 'several symbols' and gives a hint about cross-repository support. context_lines and response_format are completely unexplained, leaving the agent without enough information to set them correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool returns the code of several symbols in one call, making the core purpose clear. It also distinguishes itself from per-range reads by noting cross-file and cross-repository support, which helps differentiate it from the sibling get_symbol. It lacks an explicit verb like 'retrieves', but the meaning is still unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage preference: prefer this tool over reading each range when you need multiple symbols, citing benefits like no line numbers and one call across files/repositories. It does not name particular alternative tools or state exclusions, but the guidance is clear enough for an agent to make a reasonable choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbolBRead-only
One symbol's package, signature, visibility and line range, by stable key or by repository, path and qualified name.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| repository | No | ||
| stable_key | No | ||
| qualified_name | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, so the safety profile is covered. The description adds useful context about the returned symbol data and the two lookup modes, but it does not disclose behavior for ambiguous matches, missing symbols, or precedence when multiple parameters are provided. Given the read-only annotation, this is acceptable but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence with no filler, front-loading the returned data before the lookup modes. Every phrase adds relevant information and the length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, five optional parameters, and eleven sibling tools, the description is thin on operational context. It does not explain response_format, valid parameter combinations, ambiguity/error behavior, or how get_symbol relates to find_symbol and get_source, so an agent receives insufficient guidance for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters. It does map stable_key to one lookup mode and repository, path, qualified_name to another, adding meaning beyond bare schema names. However, response_format is left unexplained, and with no required parameters the agent cannot be certain which parameter combinations are valid or whether the modes are mutually exclusive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('get'), a specific resource ('one symbol'), and the returned metadata (package, signature, visibility, line range). It also distinguishes the lookup style from search-oriented siblings by mentioning exact retrieval via stable key or repository/path/qualified name, though it does not explicitly contrast it with a sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use get_symbol instead of siblings such as find_symbol, find_references, or get_source. The description implies an exact-lookup use case but does not state exclusions, prerequisites, or scenarios where another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_statusARead-only
The published generation: counts, provenance, and whether a repository moved since it was indexed. Call it when an answer looks stale.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds meaning beyond that: it discloses the kind of status information returned (counts, provenance, moved flag) and ties it to staleness checking. No contradiction with annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry all the essential content: what the tool reports and when to call it. The wording is front-loaded and contains no filler or redundant restating of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only status tool, the description covers what it returns and when to use it. Since no output schema exists, the explicit enumeration of counts, provenance, and repository-moved status partially compensates, though terms like 'published generation' and 'provenance' are left somewhat underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the parameter burden is minimal. With no parameters to document, the baseline of 4 applies; the description appropriately says nothing about parameters because there are none to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource—the published generation—and specifies three concrete data categories it exposes: counts, provenance, and repository-moved status. It is clearly distinct from retrieval/indexing siblings like find_symbol or index_project, though it lacks a direct verb like 'reports' or 'returns'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger: 'Call it when an answer looks stale.' This gives clear context for when to use the tool. It does not spell out when not to use it or name specific alternatives, but the sibling list makes the status-versus-search distinction apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_projectIndex projectADestructive
Registers projects and rebuilds the graph once, after explicit user approval. Pass every project in one call: a rebuild costs the whole corpus. It never writes inside the source projects.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| path | No | ||
| projects | No | ||
| confirmed | No | ||
| languages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| index | Yes | |
| counts | Yes | |
| project | Yes | |
| projects | Yes | |
| snapshot_id | Yes | |
| generation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description clarifies exactly what is affected—the graph is rebuilt—and explicitly states that source projects are never written to. It also adds the cost implication of a rebuild, which is valuable behavioral context and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying essential information: purpose, approval, batching/cost, and source safety. The key constraints are front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the critical workflow, safety boundary, and rebuild cost, and an output schema exists to describe return values. However, with five undocumented parameters and ambiguity about how to supply a single project versus multiple projects, the agent still has to fill significant gaps before calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for explaining the parameters. It only indirectly covers projects via 'pass every project in one call' and confirmed via 'explicit user approval'; name, path, languages, and the relationship between the top-level fields and the projects array are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: register projects and rebuild the graph, which clearly distinguishes this from the read-only find/get/list siblings. It does not explicitly name an alternative or contrast itself with sibling tools, so it stops just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete operational guidance: only run after explicit user approval, and pass every project in one call because a rebuild costs the whole corpus. It does not explicitly say when not to use the tool or which sibling to prefer in other situations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repositoriesCRead-only
The repositories the published graph covers, with the commit each was indexed at.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals safe read-only behavior, so the description does not need to restate that. It does add useful context about the output's scope—repositories covered by the published graph and their indexed commits. However, it does not mention pagination behavior, ordering, or whether results are stable snapshots, which would be valuable for a cursor-based list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no filler. It front-loads the core subject and includes only the essential distinguishing detail—the associated commit—without redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple and read-only, the description omits parameter semantics, pagination behavior, and any connection to the broader published-graph state. There is no output schema to compensate, so an agent lacks enough detail to confidently construct a correct paginated call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the parameters limit and cursor have no schema-level documentation. The description adds nothing about their meaning or interaction, leaving the agent to guess that cursor is for pagination. This is a significant gap in a tool whose only two parameters are entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource—repositories covered by the published graph—and adds the meaningful detail that each entry includes the commit it was indexed at. The tool name supplies the verb 'list,' so the overall purpose is clear. It differentiates from sibling tools like find_symbol or trace_dependencies by its repository-level scope, even though it does not explicitly compare itself to them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, how pagination works, or what context would make it the right choice. The description only says what the tool returns, leaving the agent to infer when to call it. This is a clear gap given the tool has siblings and two pagination parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_dependenciesBRead-only
What this symbol reaches outward, bounded by depth. Pass to for the route by which it reaches one named symbol. Grep does not follow a chain.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| path | No | ||
| repo | No | ||
| view | No | ||
| depth | No | ||
| limit | No | ||
| cursor | No | ||
| to_path | No | ||
| language | No | ||
| max_nodes | No | ||
| confidence | No | ||
| edge_kinds | No | ||
| repository | No | ||
| stable_key | No | ||
| qualified_name | No | ||
| include_derived | No | ||
| response_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description adds some behavioral context: traversal is outward, depth-bounded, and can return a route to a named symbol. It does not disclose cycle handling, response shape, performance characteristics, or failure modes, so the disclosure remains minimal but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core behavior, but the grammar is awkward and incomplete ('Pass to for the route...'), which hurts readability. Each sentence contributes something, but the overall structure is fragmented rather than cleanly specifying behavior, parameters, and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 17 parameters, no output schema, and no parameter descriptions, the description covers only the basic notion of outward traversal and a single routing parameter. An agent would struggle to know what `edge_kinds`, `stable_key`, `view`, `cursor`, or `response_format` control, and what the tool returns. The definition is far from complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the tool has 17 parameters. The description meaningfully explains only `depth` and `to`; the remaining 15 parameters such as `edge_kinds`, `max_nodes`, `stable_key`, `confidence`, and `response_format` receive no guidance. This is far too little semantic support for an API of this size.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description communicates that the tool traces what a symbol reaches outward, bounded by depth, which identifies it as a transitive dependency tracer. It also explains that passing `to` yields the route to one named symbol. However, it does not explicitly distinguish itself from sibling tools like find_references or get_blast_radius, and the phrasing is elliptical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Grep does not follow a chain' gives a hint that this tool should be used when transitive or multi-hop dependency chains are needed, rather than simple text search. But it does not mention when to prefer or avoid sibling tools such as find_references or get_blast_radius, leaving most usage decisions implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v0.9.2- First observed
find_by_intent - First observed
find_cross_repo_consumers - First observed
find_references - First observed
find_symbol - First observed
get_blast_radius - First observed
get_file_outline - First observed
get_source - First observed
get_symbol - First observed
graph_status - First observed
index_project - First observed
list_repositories - First observed
trace_dependencies
TDQS
Scored across 12 tools
Each tool targets a distinct query type—semantic search, identifier search, symbol metadata, reference/consumer lookup, forward/reverse graph traversal, and index administration—but get_blast_radius vs trace_dependencies and find_references vs find_cross_repo_consumers are close enough that an agent must read descriptions carefully to pick correctly.
Most tools follow a verb_noun pattern (find_*, get_*, list_repositories, index_project, trace_dependencies), forming clear families for search and retrieval. graph_status is the notable outlier, reading as a noun phrase rather than a verb-object command.
Twelve tools is well within the ideal range for a code-intelligence server, and each tool earns its place: symbol search, references, cross-repo consumers, dependency/impact analysis, source/outline retrieval, and index administration. None of the tools feels redundant.
The surface covers discovery, metadata, source/outline retrieval, references/consumers, dependency and blast-radius analysis, plus index status and registration, so core workflows are well supported. Minor gaps exist around arbitrary file-content reads and project removal or re-indexing semantics, but agents can work around them.
Maintenance
Related MCP Connectors
Search indexed code, trace dependencies, assess change impact, and recall repository memory.
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Ask who calls a route, what a change breaks or who reads a field, across a system's repos.
Codebase graphs, caller impact analysis, and recorded project context for AI coding agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables querying and analyzing code relationships by building a lightweight graph of TypeScript and Python symbols. Supports symbol lookup, reference tracking, impact analysis from diffs, and code snippet retrieval through natural language.-
- AlicenseNot gradedqualityDmaintenanceEnables semantic code search across multiple repositories using natural language queries. Provides intelligent code discovery, symbol lookups, and cross-repo dependency analysis for AI coding agents.MIT
- AlicenseNot gradedqualityAmaintenanceSupercharge your Agent with Semantic Code Intelligence and save 💰 in the process!662MIT
- AlicenseNot gradedqualityAmaintenanceSupercharges AI coding agents with a pre-indexed semantic code graph, enabling instant symbol relationships, impact analysis, and context retrieval across 20+ languages.128,535 npm74,173MIT