Kivgraph
Kivgraph is a read-only MCP code-intelligence server that answers type-checked, cross-repository questions about symbols, references, dependencies, and change impact.
find_symbol — locate where a symbol is declared by name, qualified name, prefix, or substring.
get_symbol — get one symbol's package, signature, visibility, and line range.
get_source — fetch the code of several symbols in one call, across files and repositories.
get_file_outline — list declarations under a path, grouped by file, with kind, signature, and range.
find_references — find who calls or references a symbol, with type-checked results and ambiguity handling.
find_cross_repo_consumers — discover consumers of a symbol in other repositories, separating exact uses from package-level dependencies.
trace_dependencies — see what a symbol reaches outward, bounded by depth; can also trace the route to a specific symbol.
get_blast_radius — assess what a change to a symbol would impact, by repository, package, depth, and relation kind.
find_by_intent — resolve a plain-language description to likely symbol names and files to open.
list_repositories — list indexed repositories and the commit each was indexed at.
graph_status — inspect the published graph generation, counts, provenance, and whether repositories have moved since indexing.
index_project — after explicit user approval, register projects and rebuild the graph in one consent-gated operation.
Provides semantic code intelligence for Dart repositories, including symbol lookup, references, dependencies, and change impact analysis.
Provides semantic code intelligence for Python repositories, including symbol lookup, references, dependencies, and change impact analysis.
Provides semantic code intelligence for Rust repositories, including symbol lookup, references, dependencies, and change impact analysis.
Provides semantic code intelligence for TypeScript repositories, including symbol lookup, references, dependencies, and change impact analysis.
Click on "Install 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., "@Kivgraphwhat's the blast radius of changing the auth service's Login function?"
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.
Kivgraph
Kivgraph is a local cross-repository code intelligence MCP server for AI coding agents. It builds a canonical semantic code graph across multiple registered repositories and answers questions about symbols, repository relationships, callers, dependencies and change impact.
https://github.com/user-attachments/assets/b8410905-323d-4caf-9d7b-57c50ffca48c
It indexes a corpus once and serves an immutable graph: the edges are resolved
by go/types, the TypeScript checker and rust-analyzer, not by matching
names. That is the difference from a search tool, and it is what makes an empty
answer worth something — an empty reference list means nobody calls it, not
that nothing was found, and grep cannot tell those apart.
Kivgraph is focused on semantic code relationships, not automatic discovery of every HTTP, gRPC, Kafka or database runtime flow between services.
Documentation
Read the Kivgraph user documentation for installation,
MCP clients, code intelligence, repository relationships and workspace code
graphs. The same pages are the source of landing/src/content/docs in this
checkout, which is what a reader on a fork or without a network still has.
Related MCP server: MCP Indexer
What each tool answers
the question | the tool |
who calls this, what references this |
|
what breaks if I change it |
|
what does this reach outward |
|
who uses it from another repository |
|
where is it declared |
|
I don't know what it is called, what files to open |
|
what is declared in this package |
|
give me the code of these symbols |
|
everything about this one symbol |
|
what is indexed, and is the graph current |
|
Eleven read-only tools, plus one consent-gated mutation (index_project) that a
client has to authorize before it can register a repository or publish a
generation.
Every row that names a symbol carries its repository, path, qualified name and line range, so it can be opened without a second call, and every tool accepts that triple in place of an opaque key.
Where it loses. A rare name in one small repository is cheaper with grep,
and indexing a small file costs more than reading it. It wins on common names,
on transitive impact, on consumers in another repository, and on proving an
absence. Measured over 29 questions against a 37-repository corpus
(benchmarks/graph-tools-comparison/results-all.json, commit 954b9eb,
tokenizer o200k_base): 35,961 tokens for Kivgraph against 267,980 for
grep plus reading, both exact on 28 of the 29, median 5.95x per question in
Kivgraph's favour. grep is cheaper on 5 of those 29, all of them at full
recall on both sides: T1_go_trivial asks for a name the corpus declares
twice, and there grep costs 0.53x what Kivgraph does.
A second harness, benchmarks/mcp-token-cost, compares against the host's own
tool output captured verbatim, but it runs on Kivgraph's own single repository
of 13,222 symbols: 7.64x on the answers themselves and 1.60x over a whole
session, against a 2.41x floor set by the source bodies both arms pay for.
Status
Released and in use. kivgraph version reports the published release; the
backlog and the acceptance gate of every phase are in TASKS.md.
Languages: Go, TypeScript, Rust, Python and Dart. Python uses the bundled AST worker in fallback mode; those inferred references are
CANDIDATE, neverEXACT. Exact Python mode uses the bundled Pyright LSP adapter with an installed Pyright/BasedPyright server. Dart uses the Dart Analysis Server supplied by the Dart or Flutter SDK.Semantic dependencies: Python and Dart imports can publish a package dependency when exactly one registered provider owns the requested package; symbol-level cross-repository edges require an explicit provider identity.
Surface: eleven read-only tools over STDIO, plus one consent-gated mutation (
index_project). The contract is docs/protocol/mcp-surface-v3.md.Storage: LadybugDB is canonical; queries are served from an immutable HotSnapshot published atomically, never from the database.
Platforms:
linux/amd64,darwin/arm64andwindows/amd64.Viewer:
kivgraph uiserves a read-only 3D view of the published graph.
Installation
Install the MCP with one script
The installer detects the platform, downloads the latest published MCP release
for it, verifies both the release archive and the bundle checksums, and
installs it without requiring Go or pnpm. The release contains the Go server,
the pinned LadybugDB library, the TypeScript worker, the bundled Python AST
worker, the pinned rust-analyzer, the grammar manifest and the web viewer,
whose assets are 2.3 MB of the bundle. scripts/build-bundle.sh --mcp-only
produces a bundle without the viewer for anyone who wants one. --slim goes
further for anyone packaging an .mcpb: it leaves out the pinned
rust-analyzer and every symbol a debugger would read, which is 46.3 MB
packaged against 24.9 MB. It downloads nothing later, so that bundle reads
Rust only where the machine already has an analyzer on its PATH.
Published bundles: Linux amd64, macOS arm64 and Windows amd64.
Runtime requirements: Bash on Linux and macOS or PowerShell 5.1 or later on
Windows, Node.js 22 or later, Python 3.10 or later when indexing Python, and
on the POSIX platforms curl, tar, and sha256sum or shasum. The bundle
carries its own rust-analyzer; indexing Rust repositories additionally needs
cargo on the PATH, and indexing Dart needs the Dart or Flutter SDK. On
Windows the installer also installs the Visual C++ redistributable, without
which kivgraph.exe does not start.
On macOS the binaries are not notarized. A release downloaded with curl is
not quarantined and runs; a copy downloaded with a browser needs xattr -dr com.apple.quarantine. See
docs/development/macos.md.
Install the latest release in one command. On Linux and macOS the same line
covers both, because the installer reads uname and picks its own archive:
curl -fsSL https://kivgraph.dev/install.sh | bashOn Windows, where install.sh cannot run because there is no POSIX shell:
irm https://kivgraph.dev/install.ps1 | iexinstall.ps1 is a second implementation of the same pre-extraction checks, and
internal/release/install_parity_test.go fails when either script grows a check
the other lacks. Piping it into Invoke-Expression turns its
#Requires -Version 5.1 into a comment; download it to a file and run it as one
to keep that guard.
From a checkout, either installer can be run directly:
./scripts/install.shTo install a specific release instead of the latest one:
KIVGRAPH_VERSION=v0.9.10 ./scripts/install.shThe script installs the bundle in ~/.local/opt/kivgraph and puts launchers
in ~/.local/bin; on Windows it is %LOCALAPPDATA%\Programs\kivgraph and
%LOCALAPPDATA%\Programs\kivgraph-bin. It never modifies a registered
repository, creates an index, or replaces configuration files. To use a
different location, set KIVGRAPH_INSTALL_ROOT and KIVGRAPH_BIN_DIR.
Add the launcher directory to the current shell and verify both runtimes:
export PATH="$HOME/.local/bin:$PATH"
kivgraph version
kivgraph-ts-worker <<'EOF'
hello
EOFCheck for a newer release or update the installed bundle:
kivgraph update --check
kivgraph updateBundle replacement is atomic, preserves the configuration and graph state,
verifies the release and bundle checksums, and replaces the installed bundle.
The post-install runtime refresh may partially complete, fail, and make the
command exit non-zero. It also restarts an installed supervised daemon and
refreshes Kivgraph-managed user hooks, skills and MCP registrations. A stale
supervisor returns an error and is not restarted. Missing, foreign and
project-scoped
integrations are left alone. Client-owned serve and ui processes still
need a restart, or --stop, to use the new binary.
Development builds use a separate prerelease channel. Install one explicitly, then select that channel for later checks:
release=vX.Y.Z-dev.N
curl -fsSL \
"https://github.com/Luqueee/kivgraph/releases/download/$release/install.sh" |
KIVGRAPH_VERSION="$release" bash
kivgraph update --channel devFor a prerelease binary, omitting --channel already follows dev; stable
installations continue to follow the stable channel. KIVGRAPH_UPDATE_CHANNEL
can be used instead of the flag, including for the interactive update notice.
To remove the installed bundle and launchers without deleting configuration, repository registrations or graph state:
uninstall_url=https://github.com/Luqueee/kivgraph/releases/latest/download/uninstall.sh
curl -fsSL "$uninstall_url" -o /tmp/kivgraph-uninstall.sh
bash /tmp/kivgraph-uninstall.shUse bash /tmp/kivgraph-uninstall.sh --yes for a non-interactive removal.
Windows users can run the corresponding uninstall.ps1 with PowerShell.
When kivgraph is invoked without a command from an interactive terminal, it
checks for a newer release with an 800 ms timeout and a 24-hour cache in the
platform cache directory ($XDG_CACHE_HOME on Linux and
$HOME/Library/Caches on macOS), under kivgraph/update-check.json.
The optional check never blocks the command when the network is unavailable.
Interactive command output uses semantic ANSI colors when the destination is a
terminal. Set NO_COLOR or redirect output to keep it plain.
Configure Kivgraph and its coding agents
After an interactive release installation, the installer asks whether it should run this same guided setup. Run it later, or run it directly from a checkout:
kivgraph configureconfigure opens one selector for the coding agents detected on this machine
and installs the user-scoped MCP entry, skill and hook for every selected agent.
It also adds user-level Kivgraph instructions for every selected agent. It
initializes the empty Kivgraph configuration when needed, but it does not
register a repository or run an index. Repeat --target TARGET for scripted
setup; omit it to open the selector.
Use ↑/↓ (or j/k) to move, space to toggle an agent, a to select all,
n to select none, Enter to confirm, and q or Esc to cancel. The daemon
is offered once after the selection; --daemon requires it without asking and
--stdio keeps one serve process per client. --dry-run previews every
surface without writing.
Supported MCP targets are claude-code, claude-desktop, codex, opencode,
and oh-my-pi. Supported skill targets are claude-code, codex, opencode,
and oh-my-pi; Claude Desktop has no local skill target. The standalone
commands use user by default; use --scope project for project-local
configuration. Use --dry-run to inspect a plan without writing. Existing
incompatible entries stop with an error; --force is required to replace or
remove one. Existing files are written atomically with mode 0600 and receive
*.kivgraph.bak backup before replacement or removal.
The pre-tool-use gate supports claude-code, claude-desktop, codex,
opencode, and oh-my-pi. Oh My Pi receives a native extension under
~/.omp/agent/extensions/ for user scope or .omp/extensions/ for project
scope. The gate is fail-open when its graph query cannot be answered.
Searches wrapped as rtk rg ... or rtk proxy rg ... are classified by their
inner command, while RTK's own commands are left alone.
Add Kivgraph to user agent instructions
Add the Kivgraph navigation rules to the user context loaded by a coding agent:
kivgraph instructions install
# The selector can install one or more coding-agent destinations.
kivgraph instructions install --agent codex
kivgraph instructions install --agent claude
kivgraph instructions install --agent ompWith no --agent or --file, the interactive selector lets you choose one or
more coding agents. Each installation owns a KIVGRAPH.md prompt beside the
client configuration. Codex (~/.codex/AGENTS.md), Claude Code/Desktop
(~/.claude/CLAUDE.md), and Oh My Pi (~/.omp/agent/AGENTS.md) receive only a
small managed absolute-path reference to KIVGRAPH.md. OpenCode instead adds
its canonical path to ~/.config/opencode/opencode.json's native instructions list; it
does not modify OpenCode's AGENTS.md. The selector deduplicates shared
destinations. Existing instructions are preserved, the managed reference is
idempotent, and --dry-run previews the change. An edited Kivgraph prompt or
reference requires --force to replace. --file is retained for compatibility
and selects every matching global client; prefer --agent for new automation.
The command never changes repository instructions. Use configure when you
want these instructions and the compatible client integrations in one flow; the
individual commands remain available for explicit changes.
When set, CODEX_HOME replaces ~/.codex and PI_CODING_AGENT_DIR replaces
~/.omp/agent, matching the configuration roots those clients use.
Inspect or remove a registration explicitly:
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
kivgraph hook status --target claude-code --scope user
kivgraph hook remove --target claude-code --scope userInitialize and publish a graph before starting the MCP server:
kivgraph init \
--repository project=/absolute/path/to/project \
--languages go,typescript,rust
kivgraph doctor
kivgraph index --fullinit writes a self-contained configuration: with --config pointing
elsewhere, its state, cache and registry hang off that directory, so a throwaway
index never touches the real one. index --full republishes atomically — a
failure at any stage leaves the previous generation serving. A server already
running follows the new generation on its own.
When you are inside one project, kivgraph index detects its supported
languages, creates or reuses .kivgraph/, registers the current project as
project in its local registry, and runs the same full rebuild. With neither
--config nor --repositories, it does not alter the shared user registry;
those overrides intentionally select the configuration and registry to update.
Use kivgraph index --full when you want the explicit registered-repositories
workflow; both forms preserve the full-indexing contract.
The command does not install language toolchains implicitly; kivgraph doctor
reports any prerequisite that is missing on the host. Optional analyzers can be
managed explicitly by Kivgraph:
kivgraph toolchain status
kivgraph toolchain install pyright
kivgraph index --fulltoolchain install pyright pins and installs Pyright under Kivgraph's state,
then activates exact Python analysis in the selected configuration. For a
project-local configuration, pass --config .kivgraph/config.yaml. Removing
it requires an explicit confirmation and restores the bundled Python fallback
when the selected configuration uses the managed analyzer:
kivgraph toolchain remove pyright --yesThe first install requires npm and network access. Later status checks and reusing an installed version work offline.
The command family is intentionally language-agnostic; more managed analyzers
can use it without making index mutate the host or a repository.
Day to day:
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 # aligned history of what it indexed, served and queried
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 binds a non-loopback address by default, because the graph is
indexed where the repositories are and looked at from elsewhere; there is no
authentication, so it logs exactly what it exposes and --addr restricts it.
logs and tool-stats read an append-only record in the state directory
rather than asking a server, which is why they can answer at all: the per-tool
counters a serve keeps are minted when it starts and gone when it stops.
Reading the file also makes the answer span every server that ever ran.
logs renders a fixed-column table. Tool rows include a bounded, allow-listed
query summary: find_by_intent records its exact intent and any keywords,
while opaque cursors, consent flags, stable keys, and absolute project paths
stay out of the record. --json preserves the individual append-only records.
SYMBOL_NOT_FOUND renders as the neutral NOT_FOUND status with zero results,
not as an operational failure.
Configure any MCP client to start the server over STDIO:
{
"mcpServers": {
"kivgraph": {
"command": "/home/user/.local/bin/kivgraph",
"args": [
"serve",
"--config",
"/home/user/.config/kivgraph/config.yaml"
]
}
}
}kivgraph serve starts before a graph exists: with no published generation it
completes the handshake, publishes no query tool and puts the rebuild command in
instructions. A client launches the process itself, so exiting would read as a
crash. It writes MCP framing exclusively to stdout and logs to stderr.
Requirements
Go 1.26 or later to build from source. The indexer type-checks with the
go/typeslinked into the binary, so it can only read repositories and dependencies written for its own language version or older;kivgraph doctorreports that ceiling.Indexing Rust needs
cargoandrust-analyzer. The release bundle carries the analyzer; it does not carry a Rust toolchain.Indexing TypeScript needs Node.js 22 or later for the worker.
Indexing Python needs Python 3.10 or later for the bundled worker. It is a syntax-aware fallback and reports dynamic or unresolved names explicitly; exact mode additionally requires a Pyright-compatible language server.
Indexing Dart needs the
dartexecutable; a Flutter installation supplies it. The loader uses the Analysis Server protocol and does not modify the Flutter project.
What the graph carries, and what it refuses to
An edge is EXACT only with sufficient evidence and the right provenance. It is
never created from a name, a path, an alias or a single candidate, and a
reference that cannot be resolved is published as UNRESOLVED with its reason,
repository and language rather than dropped. graph_status reports both, broken
down.
That is why some answers are absences rather than edges. With the Rust standard
library indexed, impl Add for u32 is generated by a macro and exists in no
source range, so every use of it is declared PROVIDER_DEFINITION_NOT_INDEXED
once per symbol instead of becoming an edge nobody could open.
The providers Kivgraph derives from the machine — today the Rust standard
library, named rust:1.96.1 after the toolchain — are withheld from read
results by default: one toolchain is around twenty thousand symbols, and a
search for Clone would answer with core. include_derived asks for them, and
graph_status breaks out what they contribute so the totals stay readable.
Development
make build
make test
make semantic-coverage
make test-ladybugmake test-ladybug is the only supported way to run the tag that links the
pinned native library. Contributing conventions are in
AGENTS.md, which CLAUDE.md links to.
make semantic-coverage is the release gate for Go, TypeScript, Python and
Dart. It validates the machine-readable matrix in
testdata/semantic-coverage/manifest.json, runs the exact TypeScript, Go and
Dart suites, and requires a Pyright-compatible language server for the exact
Python suite. A language is not considered complete when a capability has a
fixture but no executable regression test.
Storage and graph benchmarks
The LadybugDB qualification, the synthetic corpus generator, the load and query
benchmarks, and the doctor, rebuild, rollback and snapshot commands are
documented in
docs/development/storage-benchmarks.md.
It concludes with ACCEPT_LADYBUGDB_WITH_LIMITS.
The public site
landing/ carries the landing page and the user documentation. It ships in no
release bundle, is verified with make landing-check and make landing-build,
and is served on port 6767. What it publishes, how the MCP reference was
captured, and what is still open are recorded in
docs/development/landing-site.md.
Structure
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.License
Kivgraph is distributed under the Apache License 2.0.
Third-party licenses
Notices and licenses for dependencies distributed with Kivgraph are recorded in THIRD_PARTY_NOTICES.md. The list is updated whenever a dependency is added to the distributable product.
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. Dates show when Glama detected each change.
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
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
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Ground-truth code graph for your codebase: exact callers, callees, symbols & dependencies.
Ask a codebase what calls what: search, blast radius, paths between symbols, and diffs.
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
251
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!616MIT
- AlicenseNot gradedqualityAmaintenanceSupercharges AI coding agents with a pre-indexed semantic code graph, enabling instant symbol relationships, impact analysis, and context retrieval across 20+ languages.113,76569,062MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Luqueee/kivgraph'
If you have feedback or need assistance with the MCP directory API, please join our Discord server