gograph
gograph MCP server provides static analysis and codebase intelligence for Go repositories: symbol navigation, call-graph tracing, change/risk analysis, architecture quality checks, security-flow review, test attribution, and agent session tooling.
Symbol exploration: query, source, node, context, explain, identity, public, skeleton
Call graph analysis: callers, callees, path, impact, dependents, deps
Change & risk: changes, plan, review, risk, api drift, check
Architecture & quality: boundaries, coupling, complexity, godobj, orphans, hotspot, arity, concurrency
Types & structs: fields, implementers, interfaces, embeds, constructors, literals, usages, mutate, schema
Infrastructure discovery: routes, endpoint, sql, envs, httpcalls, errors, errorflow, globals, imports
Security analysis: flow for potential untrusted-data paths to SQL, process, filesystem, and outbound HTTP sinks
Testing support: tests, coverage, untested, fixtures, mocks
Session telemetry: session create/end/audit/cleanup for agent compliance
Docs & orientation: doc, wiki, summary, capabilities, stats, stale
Allows analysis of Go projects using the Gin framework, including extracting HTTP routes and endpoint call chains.
Provides tools for analyzing Go repositories using Git metadata, including comparing symbols against Git refs, detecting uncommitted changes, and computing blast radius of changes since a baseline.
Generates Mermaid flowchart diagrams for visualizing call graphs, package dependencies, and coupling in Go code.
gograph
Give Go coding agents a compiler-aware map for safer refactors.
gograph builds a local structural graph of your Go repository, with optional
type-checked CHA/SSA enrichment. Its CLI and MCP workflows help coding agents
trace callers and interface implementations, plan change impact, and enforce
architecture without embeddings or a hosted code index.
Explore the interactive no-install demo · Review the reproducible benchmark
See CLI/MCP query contracts for bounded result pages, snapshot-bound cursors, exact/possible impact, and change-evaluation status.
Companion projects: Scrinium provides repository-owned, evidence-backed knowledge for coding agents, while Rulefloor protects repository-local invariants by binding them to concrete tests and detecting drift. They are independent, optional tools: Scrinium can keep Gograph structural observations and Rulefloor validation results as separate evidence without treating either as proof of unrelated behavior or global project correctness.

Static analysis; no target-code execution. Default indexing parses Go source locally and does not call application services. Linked directories and linked/special files for extensions recognized by
go/buildare excluded; unrelated regular-file or dangling links with non-Go extensions are not Go tool inputs and do not block precise analysis. Graph-directed source reads remain confined to regular files beneath the analyzed repository, and linked/non-regular Go tool metadata (go.mod,go.sum,go.work,go.work.sum, andvendor/modules.txt) is rejected before toolchain invocation; an explicitly symlinked repository root remains supported. Applicablego.work usemembers may be sibling modules beneath the nearest real Git checkout; without that boundary they remain confined beneath the workspace directory. Each member directory,go.mod, and optionalgo.sumis validated beforecmd/gostarts. Gograph also reads project metadata such as.gitignore, graph/config JSON, and Git state. Indexing asks the installed Go toolchain for the effective build/module context; precise mode additionally performs package type loading, anddocrunsgo doc. Those operations follow your configured module/cache/network policy. Before repository package loading orgo doc, applicable local module/workspace source trees are preflighted for links thatcmd/gomay inspect;.gitand.gographsubtrees are excluded. Session telemetry is local under.gograph/sessions/; nothing is sent to gograph services.
Quick Start
# Install
brew install --cask ozgurcd/tap/gograph
# or: go install github.com/ozgurcd/gograph/cmd/gograph@latest
# Confirm which installation will run and detect PATH shadowing
gograph doctor --json
# Build a type-enriched precise graph, then verify it
gograph build . --precise
gograph stats
# Optional CI contract: fail when precise enrichment falls back
gograph build . --precise --strict
# Optional: prioritize lower heap use on constrained hosts
gograph build . --precise --memory-mode=low --max-memory=1GiB
# Optional: include integration-tagged files and tests in this graph
gograph build . --precise --tags=integration
# Optional: omit unrelated broken package directories
gograph build . --precise --strict --exclude-dirs=legacy,examples/broken
# Start with repository-wide results that require no guessed symbol
gograph summary
gograph hotspot --top 5
gograph flow --no-testsHomebrew and go install install the normal gograph CLI. MCP clients that
support MCP Bundles can instead discover the local stdio server in the
official MCP Registry as
io.github.ozgurcd/gograph. Registry/MCPB installation is a separate
distribution path; it does not install the Homebrew cask or configure the
Claude Code marketplace plugin. The Registry is currently in preview. See
Official MCP Registry and MCPB installation for client
support, target selection, and current limitations.
Choose a real function or method shown by summary, hotspot, or
gograph complexity, then substitute its name below:
gograph explore "YourSymbol" --compact # low-token discovery, identity/role, and complete evidence counts
gograph explore "YourSymbol" # standard source + callers/callees + tests + exact identity impact
gograph explore "YourSymbol" --deep # standard response + depth-3 exact evidence, package context, explanation
gograph context "YourSymbol" # source + callers + callees + tests
# For compilable repositories, enrich the graph before a major refactor
gograph build . --precise
gograph plan "YourSymbol"Build artifacts are written under the target .gograph/ directory. gograph
adds .gograph/ to the enclosing Git repository root .gitignore when
available, falls back to the build target .gitignore outside Git, and exits
without replacing artifacts if no Go files are found or no source file parses
successfully. The update accepts only an absent or regular .gitignore; a
repository-provided link is refused and its target is not modified. Go build
constraints, explicit comma-separated --tags (or inherited GOFLAGS when
the flag is absent), cmd/go package-directory rules, generated
sources, module-mode ignore directives, and Git ignores use the same scanner
policy for building, freshness checks, and change detection. Linked .go
files, linked directories, and other non-regular recognized Go inputs are
reported and excluded. Unrelated regular-file and dangling links with non-Go
extensions (for example YAML configuration or TSV fixtures) are ignored by
Go-tool preflight;
linked/non-regular go.mod, go.sum, go.work, go.work.sum, and
vendor/modules.txt entries are rejected before gograph or the Go toolchain
reads them. Applicable go.work use members may be sibling modules beneath the
nearest real Git checkout. Non-Git layouts retain workspace-directory
confinement, nested Git boundaries are not crossed, and every member directory,
go.mod, and optional go.sum is validated before cmd/go starts.
.gograph itself must be a real directory, and graph.json must be a regular
repository-confined file. Graphs with a missing or unsupported confinement
policy marker must be rebuilt with the current binary before graph-backed
commands use them. Older binaries do not enforce this boundary and should not
be used to analyze untrusted repositories.
Each indexed source file stores a SHA-256 content digest. Rebuilds reparse all
selected files in a changed package together and reuse parser records for
unchanged packages; stats reports reused_files and rebuilt_packages.
Precise builds reuse that AST work but still recompute repository-wide
type/CHA/SSA enrichment so cross-package dispatch remains correct.
Low-memory mode preserves those graph semantics while using more aggressive
garbage collection, reclaiming memory between production and test analysis,
and avoiding a full JSON copy of the AST graph. --max-memory accepts integer
byte sizes such as 1GB or 1GiB and requires --memory-mode=low. It is a
soft Go-runtime memory target—not a hard RSS cap—so memory-mapped files,
the executable, and Go toolchain subprocesses can make process memory exceed
the requested value. Aggressive GC can increase CPU time, and a target that is
too low may make the build much slower or fail; Gograph never silently reduces
precision to meet it.
Precise fallback continues to exit zero by default for compatibility and is
recorded in graph metadata. Add --strict with --precise when fallback must
fail CI; Gograph still publishes or retains the diagnostic artifact before
returning non-zero.
For precise builds blocked by unrelated directories, see
directory exclusions. Use the same --exclude-dirs
selection on gograph mcp startup; imported dependencies must still type-check.
For symlinked skills, v1.7.2 supports --exclude-dirs=.claude/skills: directory
links beneath that real directory are hidden from Go loading, without following
their targets. Linked Go inputs and metadata remain protected. See the
Codex MCP setup guide for registration and verification.
Related MCP server: Axon
Machine-readable structural validation
External consumers can validate one closed structural predicate without parsing human CLI output:
gograph version --json
gograph validate --repo /work/project --binding-json '{"schema_version":"gograph.binding.v1","predicate":"symbol_exists","subject":{"language":"go","kind":"symbol","id":"example.com/project/internal/auth::Authorize"},"required_precision":"ast"}' --jsonThe version and result schemas are gograph.version.v1 and
gograph.validation.v1; bindings use gograph.binding.v1. V1 supports only
symbol_exists, package_imports, call_edge_exists, and type_implements.
Validation is read-only and never builds or refreshes the graph. Exit 0 means
pass, exit 1 means a conclusively evaluated fail, and exit 2 means
cannot_evaluate or an invalid request.
Negative results require predicate-specific completeness: symbol and direct
import absence need a current complete AST graph; implementation absence needs
a current precise-complete graph; call absence additionally requires complete
resolution of the subject's relevant call edges. Missing, stale, partial,
ambiguous, or unresolved evidence degrades to cannot_evaluate; a
precise_fallback graph may support AST presence but never evaluated absence.
The result binds the exact graph bytes, selected source/build-context manifest,
and canonical binding with SHA-256 fingerprints.
Gograph validates selected-build-context Go structure. It does not prove
runtime behavior or business correctness. CHA edges are possible static targets,
not runtime dispatch certainty. V1 excludes reachability, unstable or external
symbol identities, unnamed types, and non-Go languages. See the exact
machine-validation contract.
Applicable local module/workspace source roots must remain beneath the explicit
--repo root; v1 returns cannot_evaluate instead of widening that authority.
MCP refreshes stay in memory by default. To publish each successful refresh for CLI consumers and later server processes, start the server explicitly with:
gograph mcp . --persist-refresh
# Keep MCP startup and every later refresh on the integration-tagged selection:
gograph mcp . --tags=integration
# Optional low-memory policy for startup analysis and later refreshes:
gograph mcp . --memory-mode=low --max-memory=1GiBThis opt-in mode writes or overwrites .gograph/graph.json and the nine
Markdown reports after a confirmed-fresh refresh. It does not modify
.gitignore, so ignore .gograph/ yourself before enabling it when needed.
The directory holds only the latest published state; it is not a per-branch
cache. If no usable graph exists (including an unsafe or unsupported artifact),
the startup auto-build is published before serving;
a failure there prevents startup. A later tool-triggered publication failure
makes that tool return an error, and the server retries the pending publication
on another refresh-capable call without rebuilding the already-fresh in-memory
graph. Writers coordinate through a local .gograph/.artifacts.lock file; an
existing lock entry must be regular rather than a link or special file.
Reports are replaced first and graph.json is replaced last as the publication
commit marker; the complete ten-file bundle is not a single atomic filesystem
transaction. Same-directory replacement is atomic on Unix-like systems; Go
does not guarantee atomic rename semantics on non-Unix platforms. The lock
file remains as operational coordination state in addition to the ten outputs.
Persisted graphs are bound to their effective Go environment and build
selection. Start MCP with the same GOWORK, GOFLAGS, and --tags context
used to build the graph; a mismatch is stale and must refresh successfully or
return a diagnostic rather than silently serving incompatible facts.
gograph doctor --json reports that repository diagnostic.
Why gograph?
Illustrative point-in-time output comparison from an earlier gograph revision (counts vary as the repository evolves; these commands return different kinds of evidence):
Task |
|
| Observed output difference |
Find callers of | 158 matching lines (comments, docs, vars) | 56 AST-derived call-site rows | ~65% fewer rows in that run |
Locate symbol definitions | 842 lines matching "Symbol" | 83 true type/method declarations | ~90% noise eliminated |
Read one function body |
|
| ~93% fewer source lines in that run |
Gather common symbol context | Separate node, source, caller, callee, and test queries |
| Five evidence types in one response |
Key Features
Machine and Agent Workflows — explore provides bounded first-call discovery with ranked lexical matches, explicit symbol selection, source, callers, callees, tests, and exact identity-resolved impact; focused callers, callees, broader impact, reverse test coverage, stable identity, plan, review, flow, validation, and policy commands remain available. The MCP server registers 68 endpoints including four session lifecycle tools. Full command reference →
Federated Workspaces — model multiple checked-out repositories through independently fingerprinted repository graphs plus a small deterministic cross-repository overlay. Resolution scopes support alternative fleets such as OSS/CE without merging repository ownership. P0 resolves Go modules, ordinary cross-repository Go calls, and first-class HTTP contracts for workspace-wide status, query, path, and impact analysis. The four read-only workspace MCP tools return the same native result values as CLI --json; member refresh and overlay publication remain explicit CLI mutations. Workspace guide →
Native MCP Server — all 64 repository query, analysis, and workflow capabilities have project-MCP equivalents for Claude, Cursor, Copilot, and other MCP clients; four additional endpoints cover session lifecycle (68 project tools total). A separate workspace server provides status, query, path, and impact with the same native results as the corresponding CLI operations. The normal mapping is CLI <command> to MCP gograph_<command>; contract, boundaries --create, and session actions use the documented special mappings. CLI-only process/host/artifact operations are build, validate, doctor, gate, snapshot, plugin/hook installation, project/workspace MCP startup, workspace build/member refresh, and help. The standalone version command has no MCP tool, but gograph_capabilities reports the running server version. Transport presentation differs where appropriate, but paired operations share functional semantics. Complete CLI/MCP matrix →
Explicit Freshness Model — CLI graph-backed analysis reads the last trusted persisted graph. Its JSON envelope includes gograph.graph-state.v1, separating source (persisted/in_memory), freshness (current/stale), completeness (complete/partial), precision (ast/precise/fallback), refresh outcome, and persistence outcome; bounded diagnostics remain on the operation that produced them. Text stats and stale report the same persisted state. gograph stale compares selected source content digests plus the effective build/module fingerprint; mtimes are diagnostic only for current indexes. It is a tri-state predicate: exit 0 means current, 2 means stale, and 1 means an operational or JSON serialization error; a missing or unsupported source-policy marker is an explicit status-1 rebuild requirement. MCP source-analysis tools check the same freshness per call, adopt a newer persisted precise graph, and incrementally rebuild changed package ASTs in memory using the latest requested analysis mode. Refresh-backed tools preserve their compatibility text and add gograph.mcp-result.v1 (source/context instead use gograph.read.v1 with the answer or refusal) structured content plus _meta.gograph_graph_state. Failed precise enrichment can serve a clearly marked current in-memory fallback, while an ordinary refresh failure can serve the last trusted stale graph; neither degraded result is silently published, and a mismatched effective Go environment still fails closed. MCP stale, default changes, and stats inspect the trusted persisted snapshot, or the startup auto-build fallback when no usable artifact exists. With --persist-refresh, that snapshot advances after a successful refresh; publication failures leave the fresh in-memory graph usable and explicitly report persistence.outcome=failed with a persistence diagnostic for retry.
Compact Composite Workflows — explore, context, plan, and explain combine source and graph evidence that would otherwise require several separate queries. explore is additive: specialized commands remain the complete, stable interfaces for focused analysis. Actual tool-call and token savings depend on the repository and task.
Narrow by Design — never runs target repository binaries or tests and does not intentionally scan .env, key, certificate, or credential files. Linked directories and linked/special recognized Go build inputs are excluded; unrelated non-Go regular-file links are outside Go-tool preflight. On-demand source and snippet reads use a repository-rooted filesystem handle and accept only regular .go files without symlink components. Linked/non-regular Go module/workspace metadata, sums, and vendor/modules.txt are rejected before toolchain use. Applicable go.work members may be siblings inside the nearest real Git checkout and otherwise stay beneath the workspace directory; their directories plus module metadata are preflighted before cmd/go. Default/relative policy configs are project-confined; documented absolute config/output arguments are explicit operator-selected local locations. AI worktree directories (.claude/, .cursor/, .agents/) are excluded. The installed Go toolchain resolves effective build context during indexing; precise repository package loading and external go doc run only after a preflight that rejects source-tree links cmd/go may inspect across the selected root plus its effective module root, or the workspace root and member trees, excluding .git and .gograph. Dependency and toolchain resolution remain open-world under the user's Go environment.
Architecture Enforcement — boundary rules, API drift detection, complexity gates, dead code sweeps, god-object detection, coupling analysis. Run in CI with gograph gate.
Security Flow Analysis — flow follows potential HTTP request, decoded JSON, and environment data across assignments and function calls to SQL query text, process execution, filesystem paths, and outbound HTTP targets. Findings include severity, confidence, and source-to-sink path steps; MCP exposes the same analysis as gograph_flow.
Integrity-Aware Indexing — publication refuses a linked or non-directory .gograph; graph.json is staged and replaced last only after a successful parse (the same-directory rename is atomic on Unix-like systems), records complete/partial build health and ast/precise/precise_fallback analysis status, and exposes both through gograph stats. gate refuses to evaluate a stale graph.
Agent Compliance Auditing — session telemetry tracks whether agents run plan before edits and review after. Grades agent behavior A–F with actionable recommendations.
Command Reference
Query and composed-analysis commands support --json; version --json and
validate ... --json use their dedicated machine schemas. The exact --files-only
surface is listed in the command reference. Operational commands such as
build, wiki, gate, snapshot, installation, and help use text
output; doctor and workspace build/status/query/path/impact also accept --json, and
session audit additionally supports raw JSON. CLI --mermaid renders
callers, callees, impact, endpoint, dependents, deps, path, and
coupling as fenced Mermaid. Their MCP equivalents accept mermaid=true and
return the same Markdown-fenced Mermaid text; without it, each tool retains its
normal response format.
Category | Commands | What it does |
Indexing |
| Parse AST, optionally require precise success or prioritize lower heap use, write graph, check freshness and health. |
Machine Validation |
| Versioned exact structural predicates with tri-state outcomes. |
Navigation |
| Find symbols, trace call chains, extract source. |
Context |
| Bundled structural data in one call. Token savers. |
Change Analysis |
| Pre-edit planning, post-edit review, risk analysis, blast radius, drift. |
Architecture |
| Quality gates, dead code, coupling, god objects. |
Types & Structs |
| Struct fields, interface satisfaction, type usage. |
Infrastructure |
| Bounded CLI/MCP route and PostgreSQL static SQL pages with cursor continuation, module selectors, explicit test controls, and structured filtering; plus env vars, concurrency, outbound HTTP calls, and imports. |
Security |
| Potential untrusted-data paths to SQL, process, filesystem, and outbound HTTP sinks. |
Testing |
| Direct and transitive reverse exact/possible static test attribution, one-sweep gap census, full stable-ID output, helpers, mock implementations. |
Error Tracing |
| Reverse-BFS from error strings to HTTP entry points. |
Diagnostics |
| Install/PATH plus current graph freshness/capability diagnostics, hotspots, return usage, API signatures, Mermaid diagrams. |
CI/CD |
| Policy checks, threshold enforcement, metric snapshots. |
Telemetry |
| Agent compliance tracking and grading (A–F). |
LLM-Wiki |
| Generate |
Summary |
| Single-call codebase briefing: top 3 hotspots, worst instability package, highest complexity function, orphan count, god-object count. Replaces 5 separate calls. |
Stable IDs |
| Print and re-resolve module/package/receiver/name identity that survives line shifts and file moves inside a package; package disambiguates external-test collisions. |
Reverse Attribution |
| Transitive product-symbol set for one unambiguous test, with stable-ID paths and exact/possible propagation. Static evidence only—not runtime or branch coverage. |
Tests reaching a symbol |
| Versioned reverse attribution listing every test with a representative stable-ID path to one product symbol. Default |
Untested |
| Called production symbols without an exact transitive test path. Precise builds devirtualize only proven concrete receivers; open interface paths remain |
Doc |
|
|
Precise implementers results merge type-checked production types with
AST-discovered test-file fakes; --test-only/MCP test_only=true returns only
the latter. Direct tests lookup accepts Receiver.Method (including pointer
receivers) or a stable ID. usages covers signature/field/interface references
and Foo{...} construction; literals remains the focused construction-only
view.
SQL extraction includes direct literals and statically resolvable local or
same-file package const/var declarations, straight-line assignments, and
bounded string concatenations. Runtime-generated SQL remains excluded. Route and SQL JSON are
paged row censuses; --files-only follows all pages but emits a complete
deduplicated file census, not every row.
Full command reference with examples: gograph.identuum.ai/docs/command-reference
Define boundaries in .gograph/boundaries.json:
{
"layers": [
{ "name": "domain", "packages": ["internal/domain/**"], "may_import": [] },
{ "name": "handler", "packages": ["internal/handler/**"], "may_import": ["internal/service/**", "internal/domain/**"] }
]
}Run gograph stale (and rebuild when stale) before gograph boundaries; the
CLI evaluates the persisted graph and exits with code 1 on violation. The
default policy is .gograph/boundaries.json; use --config PATH for another
regular, repository-confined policy. MCP uses the same evaluation after its
normal source refresh. Works in CI/CD.
gograph flow includes test files by default; add --no-tests for production-only results. It automatically reads .gograph/flow.json when present, or accepts --config <path> for another JSON file inside the graph root. Sanitizers apply to a function's return value and can be scoped to selected sink kinds:
{
"sanitizers": [
{ "function": "security.CleanPath", "for": ["filesystem"] },
{ "function": "security.ValidateURL", "for": ["outbound_http"] }
]
}Omit for to trust the return value for every sink kind. function accepts the call spelling or a fully-qualified symbol ID; use the fully-qualified form when names collide. A validator that returns only bool or error does not sanitize the original input; wrap validation in a function that returns the trusted value if that is the intended policy.
AI Agent Integration
Official MCP Registry (preview): MCPB-capable clients can discover
io.github.ozgurcd/gograph. The bundle asks for the root directory of the Go
project and launches the bundled executable with separate arguments equivalent
to gograph mcp <project-directory>. Releases provide macOS, Linux, and
Windows bundles for both amd64 and arm64. The current Registry package schema
cannot select by CPU architecture, so choose the asset whose filename matches
the host; do not assume a client will select it automatically. All analysis
still runs locally over stdio, with no hosted gograph service or remote
telemetry.
The Registry bundle and installer-generated MCP registrations intentionally omit
--persist-refresh, keeping disk publication off by default. Use a custom
local MCP command if you explicitly want that behavior.
Desktop config, shared rules, and Claude Code hook setup:
gograph add-claude-pluginThis registers the Claude Desktop MCP server, injects shared CLAUDE.md steering rules, and installs a Claude Code PreToolUse hook. The hook redirects Go-symbol searches only when an effective search target belongs to a repository with a .gograph index, so unindexed folders in multi-root workspaces remain unaffected. For Claude Code MCP registration, also run the command printed by the installer: claude mcp add gograph -- gograph mcp .. The installer exits non-zero when any installation step fails.
Alternative — install via Claude Code plugin marketplace:
/plugin marketplace add ozgurcd/gograph
/plugin install gograph@gographDiscovers gograph through Claude Code's plugin marketplace and ships a SKILL.md that auto-activates on Go work, teaching the agent the workflow (doctor --json → capabilities → stats → plan → context → edit → review), when a durable precise CLI build is useful, when to use structural queries, and when to verify with gopls or targeted text/source search.
You still need the gograph binary installed (brew install --cask ozgurcd/tap/gograph or go install github.com/ozgurcd/gograph/cmd/gograph@latest). Use gograph add-claude-plugin for Claude Desktop MCP wiring plus shared rules and the Claude Code hook; register the Claude Code MCP server with the printed claude mcp add command. Use the plugin marketplace when you prefer discovery from Claude Code's plugin UI.
Other agents (Cursor, Copilot, Antigravity, etc.):
gograph mcp . # stdio server; refreshes stay in memory
gograph mcp . --persist-refresh # opt in to publishing refreshed artifacts
gograph mcp . --tags=integration # retain the same tagged context on every refresh
gograph mcp . --memory-mode=low --max-memory=1GiB # same low-memory refresh policy as CLI buildsAdd to your .cursorrules or AI system prompt:
Before answering architecture or repository questions, inspect the available
gograph_*MCP tools and rungograph capabilities. Prefer gograph for supported structural queries; usegoplsor targeted source/text search when results are ambiguous, precision fell back, or a known source call is missing.
Query and composed-analysis commands support --json for machine-readable output:
gograph callers "YourSymbol" --json
# → {"schema_version": "1", "command": "callers", "status": "ok", "count": 2, "results": [...]}For full integration guides, see docs/coding-agent-usage.md.
Zero-cost orientation with llm-wiki/: Run gograph wiki once per session to generate a directory of machine-first markdown pages — overview, architecture diagram, hotspots, routes, env vars, error sites, concurrency, per-package docs, and the full API surface. Agents read these pages instead of issuing dozens of individual tool calls:
gograph build . --precise
gograph wiki # writes to ./llm-wiki/
# generated orientation starts at: llm-wiki/overview.md
# if maintained governance pages exist, read:
# llm-wiki/index.md → project.md → agent-rules.md → agent-contract.mdAdd generated wiki output to .gitignore when it is disposable. Do not
overwrite a repository's maintained or Scrinium-protected agent-rules.md;
propose governed changes through that repository's documented workflow.
Regeneration removes only obsolete package pages that match Gograph's generated
signature; custom package pages and packages/README.md are preserved.
Example Output
When you run gograph build ., the generated GRAPH_REPORT.md gives your AI a condensed context map:
External Dependencies (Tech Stack)
Module | Version |
|
|
|
|
Important Symbols (Top by outgoing calls)
Symbol | Kind | File | Line | Calls out |
| method |
| 42 | 18 |
| function |
| 12 | 14 |
How does gograph complement gopls?
gopls is the Go project's
compiler-backed language server. It provides live workspace diagnostics,
navigation, references, implementations, refactoring support, and an
experimental MCP server. It should remain the first choice for editor and
compiler-aware workspace operations.
gograph adds a different layer for repository and agent workflows:
Persisted snapshots — CLI analysis can inspect a stable graph artifact, while MCP refreshes source-analysis state and preserves the requested precision mode.
Repository-level analyses — change impact, reachability, routes, SQL, environment reads, security-flow candidates, coupling, and policy gates are represented together.
Composed responses —
context,plan,review, andsummarypackage related evidence for agent workflows rather than exposing only one language operation at a time.
Use gopls for live compiler-backed navigation and refactoring, rg for text
and non-Go searches, and gograph when a persisted repository graph or composed
change-analysis workflow is useful. See the benchmark guidance
for how to measure these different workflows without assuming one tool is a
drop-in replacement for another.
Default mode uses Go AST parsing and best-effort heuristics. Tolerates incomplete or non-compiling repositories.
Repository source boundary excludes linked directories plus linked/special recognized Go build inputs before build selection, while unrelated regular-file or dangling non-Go links do not block precision. It supplies confined bytes to the AST parser and confines later
source, caller/callee snippet, complexity, and changed-file reads to regular repository files. Linked/non-regulargo.mod,go.sum,go.work,go.work.sum, andvendor/modules.txtmetadata is rejected before gograph or the Go toolchain reads it. Applicablego.work usepaths may select sibling modules beneath the nearest real Git checkout; without one they remain beneath their workspace directory. Nested Git boundaries are not crossed, and member directories,go.mod, and optionalgo.sumare validated beforecmd/go. Precise loading anddocpreflight the selected root plus its effective module root, or the workspace root and every member tree;.gitand.gographare excluded from that source-tree walk. Persistedgraph.jsonis also read through this boundary,.gographmust be a real directory, and an explicitly symlinked repository root is allowed. Missing or unsupported source-policy markers and artifacts larger than 512 MiB are rebuild-required, and serialized graph roots are never trusted. Saved baseline graphs must be regular non-linked files inside the selected project with the exact marker and size bound. Default/relative check and flow configs, boundaries, gate config, and repository-controlled session/snapshot/wiki mutations reject linked path components; documented absolute config/wiki locations are explicit operator selections. Use the current binary for untrusted repositories.Precise mode attempts type-checked production enrichment and needs compilable, build-selected packages for CHA/SSA results. SSA bodies are built for selected repository packages, not the full transitive dependency closure; imported types and local external-call references remain available without dependency-body call graphs or their source-less wrapper noise. If enrichment fails or omits an indexed non-test source file, the command warns, publishes the AST graph, and records
precise_fallback; if a fresh successful precise artifact already covers the same sources, a failed retry keeps that artifact instead. Default fallback remains exit zero for compatibility;--strictrequires--preciseand returns non-zero after publication or retention. Successful and AST-only builds recordpreciseandastrespectively. Test packages are loaded in a separate non-fatal typed pass: broken tests yieldtyped_partialtest-call attribution without downgrading successful production precision. Typed-only test targets are recomputed rather than reused as parser facts, preventing edge multiplication across unchanged precise builds.Low-memory mode changes execution policy, not analysis meaning. It uses aggressive GC, releases completed production type/SSA state before typed-test loading, and honors an optional soft Go runtime memory target. The target is neither an RSS ceiling nor a guarantee that all repositories can complete within that amount; Gograph reports fallback/failure normally rather than silently omitting precise facts.
A precise interface invocation whose SSA receiver is proven to contain one concrete dynamic type is devirtualized to one exact ordinary call. Otherwise it is represented by one call edge per valid named in-repository CHA target. A single visible implementation is never treated as proof.
callers Interface.Method(including inherited and promoted methods) expands through recorded implementers and deduplicates shared source expressions. Compiler-generated promoted-method forwarding remains traversal-only.Open CHA dispatch is conservative rather than points-to precise: it may retain implementations that cannot occur in one runtime configuration. Reflection,
unsafe, plugins, unresolved function values, test-only implementations, unnamed concrete types, and module-external implementations can still be incomplete. Precise test attribution also proves single-assignment, non-escaping concrete interface locals; other interface targets remain explicitly possible, andtyped_partialmeans some tests stayed on parser heuristics.Callback references are retained only when they resolve to repository callables, and exact call edges are deduplicated before serialization.
Mutation queries ignore ordinary local assignments and retain owning type information when statically known, so
Type.Fielddisambiguates same-named fields.Synchronization extraction requires a receiver tied to a known
synctype. Error messages come frompanic,errors.New, andfmt.Errorf, including import aliases.Heuristic extractors (routes, SQL, parser-only tests, and error mapping) are navigation aids, not authoritative program analysis. SQL classification is limited to static PostgreSQL literals, reports
exact/partial/unknown, resolves CTEs to their terminal operation, preserves data-modifying CTE write evidence, and does not claim coverage of runtime-generated SQL. Typed test attribution is still static evidence rather than runtime coverage proof.Security flow analysis is interprocedural and path-insensitive, with call/return matching across up to 16 nested repository calls. Default graphs resolve direct local/imported functions;
build . --precisesupplies stronger method/interface targets. It does not model reflection, globals, arbitrary heap aliases, or every dynamic call. Unresolved external transformations are retained with low confidence; every finding requires source review.
No multi-language parsing
No AI/model API calls
No embeddings or SaaS backend
No remote telemetry or hosted analytics (optional audit sessions write local metadata only)
No replacement for compiler/type-checker correctness
Contributing
Pull requests welcome! See CONTRIBUTING.md for build, test, and contribution guidelines.
Language Support:
gographcurrently parses Go only. The architecture is extensible — if you want to add Python, TypeScript, Rust, etc., please open an issue first.
License
MIT — see LICENSE.
Available Tools
68 toolsgograph_apiARead-onlyIdempotent
Detect public API surface drift by comparing exported Go symbols between the current working tree and a baseline. A since value ending in .json loads a regular saved graph inside the project root with no linked path component and the exact current repository source-policy marker; its serialized root is ignored. Otherwise gograph validates the value as a Git ref and uses git archive to build a temporary baseline. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only apart from reading the selected graph or extracting a temporary archive that is removed after the call. WHEN TO USE: Before releasing or merging a PR to catch breaking-change regressions — exported symbols added, removed, or renamed since the baseline. NOT TO USE: For listing current exports without a diff baseline (use gograph_public or gograph_skeleton instead). RETURNS: JSON with baseline and breaking flags; nested exported_symbols, interfaces, structs, and routes groups containing added/removed arrays plus changed detail objects; affected_tests, affected_mocks, and findings arrays. Empty groups indicate no drift.
| Name | Required | Description | Default |
|---|---|---|---|
| since | Yes | A baseline Git ref (for example 'main' or 'HEAD~1') or regular in-project saved graph path ending in .json, with no linked component and the exact current source-policy marker |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations declaring readOnly, idempotent, and non-destructive, the description adds critical behavioral details: it extracts a temporary archive removed after the call, checks freshness, refreshes in the current analysis mode, and retries CHA/SSA for precise graphs. These details go far beyond the annotations and clarify the tool's runtime behavior.
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 structured with clear sections (intro, parameter behavior, safety, WHEN/NOT TO USE, RETURNS). Every sentence carries specific information, and the most important facts are front-loaded. It's longer than most but each sentence earns its place, making it efficient and scannable.
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 one parameter, no output schema, but supported by rich annotations, the description covers all necessary aspects: input semantics, execution behavior (including failure modes and side effects), return structure, and intended use cases. It leaves no significant gaps for an agent to invoke 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?
The schema covers 100% of the single parameter 'since', but the description enriches it with significant semantics: it explains the two accepted value types (Git ref vs .json saved graph), special handling for .json paths, and the meaning of 'regular saved graph' with source-policy marker. This adds value beyond the schema's basic description.
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 a precise verb+resource statement: 'Detect public API surface drift by comparing exported Go symbols between the current working tree and a baseline.' It clearly distinguishes itself from sibling tools like gograph_public and gograph_skeleton by explicitly stating it's for diffing against a baseline, not listing current exports.
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?
WHEN TO USE and NOT TO USE sections are explicit and actionable. It says use before releasing or merging a PR to catch breaking changes, and directs users to gograph_public or gograph_skeleton for listing current exports without a baseline. This is the gold standard for usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_arityARead-onlyIdempotent
Find functions and methods with at least a threshold number of parameters — the long-parameter-list smell. The MCP server checks freshness before this call. Read-only; no side effects. min sets the inclusive minimum (default: 5; 0 includes zero-arity functions), matching CLI --min. WHEN TO USE: During code smell audits. NOT TO USE: For struct field counts (use gograph_fields or gograph_godobj). RETURNS: Functions meeting the threshold with parameter count, signature, and file location.
| Name | Required | Description | Default |
|---|---|---|---|
| min | No | Inclusive minimum argument count to report (default: 5; 0 includes zero-arity functions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only; no side effects.' It adds useful context beyond annotations by mentioning the MCP server checks freshness before the call, which is a behavioral trait not captured in 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 compact, uses clear section headers (WHEN TO USE, NOT TO USE, RETURNS), and every sentence adds meaningful information. It is well-organized and front-loaded with the core purpose.
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 simple tool with one optional parameter and no output schema, the description is complete: it explains what it returns (parameter count, signature, file location), covers usage scenarios, and indicates the freshness check. No critical information is missing.
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 100% for the single 'min' parameter, so the schema already documents it well. The description adds value by explaining the default and edge case (0 includes zero-arity functions) and mentioning the CLI --min equivalence, which provides additional context beyond the schema.
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 states a specific action ('Find') targeting a specific resource ('functions and methods') with a clear qualifier ('at least a threshold number of parameters') and explicitly names the code smell it addresses ('long-parameter-list smell'). It also distinguishes itself from sibling tools by mentioning alternatives for struct field counts.
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 provides explicit WHEN TO USE and NOT TO USE sections, including concrete alternative tool names (gograph_fields, gograph_godobj). This gives the agent clear guidance for tool selection and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_boundariesARead-onlyIdempotent
Refresh source analysis and check package imports against a boundaries.json configuration. The required config defaults to .gograph/boundaries.json; explicit paths must remain inside the analyzed project, and every path component plus the final regular file is read through the rooted repository boundary. Create it with gograph_boundaries_create. Read-only; no side effects. WHEN TO USE: In CI gates or post-edit reviews to enforce layer separation. NOT TO USE: For unconstrained dependency exploration (use gograph_deps or gograph_coupling). RETURNS: Structured pass state and boundary violations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| config | No | Optional in-project path to a regular, non-linked boundary config (default .gograph/boundaries.json) | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description still adds real context beyond them: it refreshes source analysis, enforces that config paths stay inside the analyzed project, and reads every path component through the rooted repository boundary. It stops short of noting cost/pagination behavior of the refresh.
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?
Front-loaded purpose sentence followed by WHEN/NOT/RETURNS blocks that are easy to scan. The middle clause about path components and the rooted boundary is dense and slightly redundant with the config param description, holding it below a 5.
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?
Even with no output schema, the RETURNS line tells the agent to expect structured pass state and boundary violations, and the WHEN/NOT guidance plus config prerequisites make the tool fully callable. Nothing an agent needs is missing.
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 100%, so the baseline is 3, but the description adds meaning the schema lacks – the config path must be in-project, non-linked, and defaults to .gograph/boundaries.json. It adds a bit of the boundary-safety constraint rather than merely restating field descriptions.
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?
States a specific verb (check) plus resource (package imports against a boundaries config) and immediately differentiates from siblings by naming gograph_deps and gograph_coupling as the tools for unconstrained exploration. An agent can pick this tool without opening any schema.
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?
Explicit WHEN TO USE (CI gates, post-edit reviews for layer separation) and NOT TO USE (dependency exploration) sections, with the alternative siblings named by tool. Also points to gograph_boundaries_create for creating the required config, covering the setup path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_boundaries_createA
Create a baseline architecture boundary configuration from the repository's current package imports. Defaults to .gograph/boundaries.json under the graph root, uses repository-rooted regular-file creation, and refuses linked paths or overwrite. Mutating and non-idempotent; no network access. WHEN TO USE: Once when adopting boundary checks in an existing repository, then review and tighten the generated rules. NOT TO USE: To verify an existing configuration (use gograph_boundaries). RETURNS: The written config path or an error when the path is unsafe or already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Optional in-project output path, absolute or repository-relative; linked components and existing entries are refused (default .gograph/boundaries.json) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false, but the description adds meaningful context: 'Mutating and non-idempotent; no network access', and explicitly states safety behaviors like refusing linked paths and overwriting. This goes beyond the annotations and provides operational constraints.
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 well-structured with a clear purpose statement, followed by behavior details, THEN/NOT TO USE, and RETURNS. It is slightly longer than a minimal description but every sentence adds value, avoiding 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 a single-parameter create tool with no output schema, the description is comprehensive: it covers what it does, when to use it, safety constraints, and the return value ('The written config path or an error when the path is unsafe or already exists'). No critical gaps remain.
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 100%, so the parameter is already well-documented. The description adds the default path value ('.gograph/boundaries.json') which is not in the schema description, but this is a minor addition. The baseline of 3 applies since the schema does the heavy lifting.
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 action ('Create a baseline architecture boundary configuration') and the resource ('from the repository's current package imports'). It also distinguishes from the sibling tool gograph_boundaries by specifying NOT TO USE for verification, making it highly distinguishable.
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 provides explicit 'WHEN TO USE' (once when adopting boundary checks) and 'NOT TO USE' (to verify an existing configuration, with the alternative gograph_boundaries named). This is exemplary guidance that directly addresses tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_calleesARead-onlyIdempotent
Find functions and methods called by the specified function. Defaults to one-hop fan-out; depth 2-10 expands the downstream call graph. The MCP server refreshes source analysis before the call. Read-only; no persistent side effects. WHEN TO USE: To understand a function's downstream dependencies. NOT TO USE: For upstream callers (use gograph_callers); for package dependency trees (use gograph_deps). RETURNS: Callee symbols with package paths, file locations, and call-site line numbers; with mermaid=true, Mermaid flowchart text.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Traversal depth from 1 to 10 (default 1) | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| mermaid | No | Return Mermaid flowchart text instead of the normal response | |
| function | Yes | The name of the calling function to inspect callees for (supports short name 'Serve', dot-notation 'graph.Graph.Build', or fully-qualified ID) | |
| no_tests | No | Exclude call edges originating in *_test.go files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so safety is covered; the description nonetheless adds genuinely new behavioral context, namely that the MCP server refreshes source analysis before the call and that depth 2-10 expands the traversal. It stops short of latency/cost implications of that refresh, so not quite a 5.
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?
Front-loaded with purpose and defaults, then cleanly sectioned into WHEN/NOT TO USE and RETURNS. Dense but every sentence carries distinct information; 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, the RETURNS section correctly carries the return-shape burden (callee symbols, package paths, file locations, call-site line numbers, Mermaid text) and the refresh behavior is disclosed. An agent has everything needed to invoke and interpret results.
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 100%, so the baseline is 3; the description goes further by explaining the default fan-out and the depth 2-10 expansion semantics, and by naming the mermaid=true alternate response mode. It adds meaning beyond the schema rather than restating it.
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?
States a specific verb+resource ('Find functions and methods called by the specified function') and immediately scopes it against sibling tools by name ('use gograph_callers', 'use gograph_deps'). An agent can select it correctly without opening the schema.
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?
Explicit WHEN TO USE and NOT TO USE sections that name the two most confusable alternatives and the exact condition that routes to each (upstream callers vs. package dependency trees). This is the strongest possible guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_callersARead-onlyIdempotent
Find functions and methods that call the specified function or interface method. Defaults to one-hop fan-in; depth 2-10 expands callers-of-callers. In a precise graph, Interface.Method expands through all recorded implementations and reports a shared source call site once. The MCP server refreshes source analysis before the call. Read-only; no persistent side effects. WHEN TO USE: Before renaming, removing, or changing a function or interface method signature. NOT TO USE: For unbounded upstream blast radius (use gograph_impact); for downstream callees (use gograph_callees). RETURNS: Caller symbols with package paths, file locations, and call-site line numbers; with mermaid=true, Mermaid flowchart text.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Traversal depth from 1 to 10 (default 1) | |
| exact | No | Require an exact symbol-name or fully-qualified-ID match | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| mermaid | No | Return Mermaid flowchart text instead of the normal response | |
| function | Yes | The target function or method (supports short name 'BuildGraph', interface notation 'Repository.Delete', concrete dot-notation 'Store.Delete', or a fully-qualified ID) | |
| no_tests | No | Exclude call edges originating in *_test.go files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered; the description's 'Read-only; no persistent side effects' partly duplicates that. It adds genuine non-obvious behavior beyond the annotations: the server refreshes source analysis before the call, the default is one-hop fan-in with depth 2-10 expanding callers-of-callers, and interface method calls expand through implementations but report a shared source call site once.
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?
Well front-loaded: the core action leads, then scope/defaults, then WHEN TO USE / NOT TO USE / RETURNS blocks. Dense but each block carries distinct information; only the 'Read-only; no persistent side effects' clause is somewhat redundant with annotations.
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?
No output schema exists, so the RETURNS block (caller symbols with package paths, file locations, call-site line numbers, and Mermaid text) is necessary and present. Combined with pagination notes implied by cursor/limit, the definition gives an agent everything needed to call it 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 coverage is 100%, so baseline is 3, but the description adds real meaning the schema lacks: it explains the depth semantic (default one-hop vs 2-10 expanding callers-of-callers), the mermaid=true output switch, and the interface/concrete dot-notation behavior behind the 'function' and 'exact' parameters. These are usage-level semantics not stated in the schema descriptions.
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?
States a specific verb and resource ('Find functions and methods that call the specified function or interface method') and immediately differentiates from siblings by contrasting with gograph_impact (upstream blast radius) and gograph_callees (downstream). An agent can distinguish it from the ~60 sibling tools without opening the schema.
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?
Contains explicit WHEN TO USE ('Before renaming, removing, or changing a function or interface method signature') and NOT TO USE clauses that name alternative tools (gograph_impact, gograph_callees) with the conditions that select each. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_capabilitiesARead-onlyIdempotent
List the running gograph server version, all available MCP tools, their purposes, and recommended agent workflows. Once the project-scoped MCP server has started, this tool has no additional graph-state prerequisite. Read-only; no side effects. WHEN TO USE: Call once per session to record the analysis instrument and orient before issuing analytical queries. NOT TO USE: Do not repeat after capabilities are cached in context. RETURNS: Structured JSON with version, every registered tool name, one-line purposes, recommended workflow sequences, and known static-analysis limitations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so much is covered. The description nonetheless adds real value by stating there is no graph-state prerequisite once the server has started and by describing the return payload, which annotations cannot convey.
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?
Front-loaded purpose sentence, then labeled WHEN TO USE / NOT TO USE / RETURNS sections. Every sentence carries distinct information; there is no filler or repetition.
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 parameters and no output schema, the description compensates by enumerating the return contents (version, tool names, purposes, workflow sequences, limitations). An agent knows exactly what it gets and when to invoke it.
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 takes zero parameters, which is the baseline-4 case. The schema is empty and the description correctly implies a no-arg invocation, so no parameter clarification is needed or missing.
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?
States a precise verb (List) and a clearly scoped set of resources: server version, all registered MCP tools, their purposes, and recommended workflows. This meta/self-description role is unmistakably distinct from every analytical sibling such as gograph_summary or gograph_stats.
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?
Explicit WHEN TO USE ('call once per session to orient before issuing analytical queries') and NOT TO USE ('do not repeat after capabilities are cached'). Both the triggering condition and the anti-pattern are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_changesARead-onlyIdempotent
Compare Go declaration fingerprints, including bodies, without marking every symbol in an edited file modified. Without git_ref, inspects trusted persisted graph.json without refreshing, or the startup fallback if no usable artifact exists. With git_ref, refreshes and extracts a confined declaration baseline without compiling application code. Existing but deselected files are excluded, not deleted; unsafe inputs and parse failures produce diagnostics, never deletion proof. Missing legacy declaration fingerprints produce unknown. Read-only analysis. WHEN TO USE: After editing to identify changed declarations before impact/review. NOT TO USE: For line-level diffs or a complete census when evaluation is partial/cannot_evaluate. RETURNS: Native gograph.changes.v1 with complete/partial/cannot_evaluate, diagnostics, changed_files, and new/modified/deleted/excluded/unknown symbol rows; CLI uses the same value and exits 2 for incomplete evaluation. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| git_ref | No | Optional git reference to compare against (e.g., 'main', 'HEAD~5', 'v1.4.50') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description layers rich additional context: behavior with vs without git_ref, that deselected files are excluded rather than deleted, that unsafe inputs/parse failures yield diagnostics and never deletion proof, and that missing legacy fingerprints resolve to 'unknown'. This is exactly the beyond-annotations behavioral detail the dimension rewards.
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?
Front-loads the core purpose and uses clear WHEN/NOT/RETURNS sectioning, so structure is strong. However it is quite long and dense for a one-parameter tool, with some jargon-heavy clauses (native gograph.changes.v1, current-graph consumers) that could be trimmed.
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?
There is no output schema, so the description carries the full return-value burden and discharges it well by enumerating the complete/partial/cannot_evaluate states, diagnostics, changed_files, and the symbol-row categories, plus CLI exit-code semantics. For a complex comparison tool this is thoroughly 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 coverage is 100%, so the single git_ref parameter is already documented, establishing a baseline of 3. The description adds genuine meaning by explaining the semantic split between omitting git_ref (trusted persisted graph, no refresh) and supplying it (refresh and confined baseline extraction), which the schema alone does not convey.
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 lead sentence states a specific verb and resource: compare Go declaration fingerprints including bodies, with the key differentiator of not marking every symbol in an edited file as modified. It is distinguishable from siblings like gograph_stale and gograph_impact, though the opening clause is dense and takes a moment to parse.
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?
Explicit WHEN TO USE ('After editing to identify changed declarations before impact/review') and NOT TO USE ('For line-level diffs or a complete census when evaluation is partial/cannot_evaluate') sections route the agent precisely, and it names a concrete alternative workflow ('Inspect changes --git REF'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_checkARead-onlyIdempotent
Refresh source analysis and run static policy checks: boundaries, API drift, changed-route/export tests, test coverage, orphans, globals, arity, and complexity. The default or a relative checks config is confined to a regular non-linked file beneath the project; an absolute config is an explicit operator-selected regular file. Baselines use the same validated builder as CLI: a value ending in .json loads a regular saved graph inside the project root with no linked component and the exact current source-policy marker, ignoring its serialized root; otherwise it is treated as a Git ref and extracted temporarily. WHEN TO USE: During PR review or pre-commit analysis. NOT TO USE: For CI process exit enforcement (use CLI gograph gate). RETURNS: Structured pass/warn/fail status, findings, and summary counts. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Git ref or regular in-project saved graph path ending in .json, with no linked component and the exact current source-policy marker, for api_drift | |
| config | No | Optional checks.json path; relative/default paths are project-confined, while an absolute path explicitly selects a regular local file | |
| uncommitted | No | If true, include uncommitted changes in the analysis scope |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/no-destructive/no-open-world), the description discloses substantial behavior: config path confinement rules, how a `.json` baseline is validated vs. treated as a Git ref, what uncommitted mode compares against, and specific refusal conditions (incomplete comparisons, deleted declarations, missing/ambiguous graph identities). This is rich operational context the annotations cannot convey.
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?
Front-loaded purpose with clearly labeled WHEN/NOT/RETURNS sections that aid scanning. It is dense (config path semantics and baseline validation are stated at near-schema level of detail and partially restated), but every section is purposeful and no sentence is pure 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, the description supplies a RETURNS summary (pass/warn/fail status, findings, summary counts) and covers the tricky edge cases (incomplete comparisons, historical caller evidence, identity ambiguity) an agent must anticipate. Complete for a tool of this complexity.
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 already 100%, so the baseline is 3, but the description adds real meaning: it clarifies the marker/linked-component validation for `.json` baselines, that the serialized root is ignored, and that otherwise the value is extracted as a Git ref. That goes beyond the schema's terse parameter text.
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?
States a specific verb+resource ('run static policy checks') and enumerates the exact check families covered (boundaries, API drift, route/export tests, coverage, orphans, globals, arity, complexity). An agent can tell this is a composite policy-check tool that bundles what the sibling single-topic tools (gograph_boundaries, gograph_coverage, etc.) expose individually.
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?
Explicit 'WHEN TO USE: During PR review or pre-commit analysis' and 'NOT TO USE: For CI process exit enforcement (use CLI gograph gate)', giving both the trigger context and the named alternative. Nothing about when to select this over siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_complexityARead-onlyIdempotent
Report estimated cyclomatic complexity for Go functions, sorted highest-to-lowest with severity labels (LOW/MEDIUM/HIGH/VERY HIGH). A function whose repository source cannot be read or parsed safely is retained as UNKNOWN with score -1. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Optional symbol substring filters to a specific function or set of functions. WHEN TO USE: During code quality audits, identifying functions that need decomposition, or setting complexity budgets in CI. NOT TO USE: For import dependency metrics (use gograph_coupling or gograph_deps); for God Object detection (use gograph_godobj). RETURNS: Structured list of functions with complexity score and severity label; empty when no functions match the filter.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | Optional Go function or method symbol name substring to filter the complexity report (e.g., 'Build') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive, but the description adds substantial behavior: UNKNOWN handling with score -1, freshness checks and retry logic in specific graph modes, and side-effect-free guarantee. This goes well beyond the structured 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 longer than the ideal two-sentence pattern but is well structured with labeled sections (WHEN TO USE, NOT TO USE, RETURNS). It remains readable and every sentence contributes useful 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?
Even without an output schema, the description covers return shape (list of functions with score and severity label), empty-result behavior, and edge cases (UNKNOWN functions). This is complete for a reporting tool with no nested objects.
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 100% for the only parameter `symbol`, so baseline is 3. The description merely restates that it is an optional substring filter, adding minimal semantic value beyond the schema.
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 a specific verb+resource: 'Report estimated cyclomatic complexity for Go functions' and adds sorting and severity labels. It clearly distinguishes from sibling tools by naming alternatives like gograph_coupling and gograph_deps.
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?
Explicit 'WHEN TO USE' and 'NOT TO USE' sections are present, with concrete alternatives for other metric types. This gives the agent unambiguous guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_concurrencyARead-onlyIdempotent
Find indexed concurrency sites in the codebase: goroutine spawns (go statements), channel sends, and calls on sync.Mutex/RWMutex, sync.WaitGroup, and sync.Once. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Optional term filter (e.g., "mutex", "goroutine", "channel"). WHEN TO USE: When auditing race safety, understanding async flow, or locating synchronization points before a concurrency refactor. NOT TO USE: For standard sequential call flow analysis (use gograph_callers/gograph_callees). RETURNS: File locations, line numbers, and primitive kind for each indexed concurrency site; empty when no sites are found. Channel receives and select statements are not indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional filter term (e.g., 'goroutine', 'mutex', 'channel') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/no-destruction profile, and the description goes further by disclosing the server-side freshness check and refresh-in-current-mode behavior, plus the CHA/SSA retry on source changes. The 'Read-only; no side effects' clause merely restates annotations, and the 'RETURNS' details about file/line/kind are useful but expected.
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?
Front-loaded with the resource set, then cleanly sectioned into WHEN TO USE / NOT TO USE / RETURNS. Slightly over-long due to the redundant 'Read-only; no side effects' line and a dense freshness/refresh sentence, but overall well organized.
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 read-only discovery tool with no output schema, the description supplies the return shape (file locations, line numbers, primitive kind), the empty-result case, and the explicit exclusion of channel receives and select statements. Combined with annotations covering safety and the schema covering params, nothing an agent needs to call it correctly is missing.
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 100%, so the schema already documents term, limit, and cursor. The description only adds example filter terms ('mutex', 'goroutine', 'channel'), which is marginal value over the schema; baseline 3 is appropriate.
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 a specific verb (Find) and enumerates the exact resource set: goroutine spawns, channel sends, and calls on sync.Mutex/RWMutex, WaitGroup, and Once. It further distinguishes itself from siblings by directing sequential-flow queries to gograph_callers/gograph_callees, so an agent can identify this tool without opening the schema.
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?
Explicit WHEN TO USE (race-safety audit, async flow understanding, locating synchronization points before a concurrency refactor) and NOT TO USE (sequential call flow, with named alternatives gograph_callers/gograph_callees). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_constructorsARead-onlyIdempotent
Find all factory and constructor functions that instantiate and return a named Go struct (functions whose return type includes the struct name). The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When looking for the canonical way to create a struct, or before modifying struct initialization to ensure all construction paths are updated. NOT TO USE: For direct composite-literal sites (use gograph_literals); for struct fields (use gograph_fields). RETURNS: List of constructor function names with signatures, package paths, and file locations; empty when no factory functions are found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| struct | Yes | The exact name of the target Go struct to find constructors for (e.g., 'User', 'Config') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds valuable context beyond that: the freshness check before the call, refresh in the current analysis mode, and CHA/SSA retry after source changes, plus the empty-result behavior. It does not, however, detail pagination/cursor interaction beyond what the schema states.
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?
Front-loaded with the core definition and organized into labeled WHEN TO USE / NOT TO USE / RETURNS blocks that make scanning easy. The freshness/retry sentence is dense and somewhat implementation-flavored, but it still earns its place as behavioral context.
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?
Although there is no output schema, the RETURNS section describes the return shape (constructor names with signatures, package paths, file locations; empty when none found). Combined with 100% schema coverage on inputs and the sibling routing, an agent has everything needed to call it 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 100%, so limit, cursor, and struct are all fully documented in the schema. The description adds no syntax or format detail for the struct parameter beyond the schema's own example. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb and resource: 'Find all factory and constructor functions that instantiate and return a named Go struct,' with a parenthetical defining the exact return-type condition. It explicitly disambiguates from the closest siblings (gograph_literals, gograph_fields), so the agent can route correctly without opening schemas.
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 explicit WHEN TO USE conditions (finding the canonical creation path, pre-modification impact checks) and NOT TO USE exclusions that name the correct alternative for each case (literals, fields). Nothing is left to inference about when this tool is the right pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_contextARead-onlyIdempotent
Fetch a pre-flight context bundle for a single Go symbol: AST node metadata, source code, direct callers, direct callees, linked test functions, and architectural role classification — all in one call. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only analysis; an active audit session may append local command telemetry. Set uncommitted=true to bundle context for all currently modified symbols at once. WHEN TO USE: As the first call before editing a symbol — eliminates 4–5 separate tool roundtrips. NOT TO USE: For package-level orientation (use gograph_focus); for transitive blast radius (use gograph_impact). RETURNS: JSON with node (first match), nodes[] (all matches), source, callers[], callees[], tests[], test_results[], and top-level role in both text and gograph.read.v1 structured content; a missing symbol is a named error. source_error reports a partial context when indexed metadata exists but source cannot be served, also named in graph_state.read_diagnostic. With uncommitted=true, returns a contexts[] array; count:0 when no uncommitted symbols exist. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | Require an exact symbol-name or fully-qualified-ID match in single-symbol mode. | |
| symbol | No | The exact name, dot-notation 'graph.Graph', or ID of the symbol to retrieve context for. | |
| uncommitted | No | If true, return context for all uncommitted modified symbols bundled in one response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/destructive/openWorld, and the description adds substantial context beyond them: the freshness-check-before-call behavior, precise/precise_fallback CHA/SSA retry semantics, the audit-session telemetry caveat, and the uncommitted-mode declaration-vs-HEAD comparison rules including refusal conditions. It also documents partial-failure behavior (source_error, graph_state.read_diagnostic) and named errors.
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?
Front-loaded purpose and clearly labeled WHEN TO USE / NOT TO USE / RETURNS sections make it scannable despite its length. The opening paragraph is dense with internals (CHA/SSA retry, precise_fallback) that are less relevant to selection, adding some weight without much routing value.
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?
There is no output schema, so the description carries the full burden and meets it: it spells out the JSON return fields (node, nodes[], source, callers[], callees[], tests[], test_results[], role), the uncommitted contexts[] variant, error/partial-context states, and the git-inspection follow-up. For a tool with a batch mode and multiple failure paths, this is 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 coverage is 100%, so the schema already defines exact, symbol, and uncommitted, making the baseline 3. The description adds value by tying uncommitted=true to a different return shape (contexts[], count:0) and to declaration-census/HEAD comparison semantics, which goes slightly beyond the schema's own wording.
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?
States a specific verb (fetch) and resource (pre-flight context bundle for a single Go symbol) and enumerates exactly what the bundle contains: AST node metadata, source, direct callers, direct callees, tests, and role classification. It distinguishes itself from siblings by explicitly naming gograph_focus and gograph_impact as the tools for adjacent needs, so an agent can route without opening either schema.
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?
Includes explicit WHEN TO USE ('first call before editing a symbol — eliminates 4–5 separate tool roundtrips') and NOT TO USE clauses that name the alternatives and the conditions that select them (gograph_focus for package orientation, gograph_impact for transitive blast radius). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_couplingARead-onlyIdempotent
Report fan-in (Ca), fan-out (Ce), and instability I=Ce/(Ca+Ce) per package. The MCP server refreshes source analysis before the call. Read-only; no side effects. package filters by substring; include_stdlib and internal_only control scope. WHEN TO USE: To evaluate package isolation. RETURNS: Package coupling records; with mermaid=true, Mermaid flowchart text.
| Name | Required | Description | Default |
|---|---|---|---|
| mermaid | No | Return Mermaid flowchart text instead of structured JSON | |
| package | No | Optional package name substring to filter results | |
| internal_only | No | Restrict the report to the project's own packages (anything starting with the module path from go.mod). Strictly stronger than excluding stdlib — also excludes third-party deps. | |
| include_stdlib | No | Include standard-library packages in the report. Default false — users asking 'how coupled is my code?' rarely care about stdlib coupling. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds 'Read-only; no side effects' which is consistent. It also discloses that the server refreshes source analysis before the call and mentions mermaid output behavior, providing extra behavioral context beyond 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?
The description is well-structured with labeled sections for WHEN TO USE and RETURNS, and it stays compact. It includes a small redundancy ('Read-only; no side effects' duplicates annotations) but overall every sentence contributes value.
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?
There is no output schema, so the description compensates by stating that returns are 'Package coupling records' and that Mermaid flowchart text is returned when mermaid=true. The metrics are already explained in the first sentence, making the return type sufficiently clear, though more detail on record fields or sorting would improve completeness.
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 100% with descriptive text for every parameter, so the baseline is 3. The description adds a brief restatement ('package filters by substring; include_stdlib and internal_only control scope') but does not meaningfully clarify parameter semantics beyond what the schema already provides.
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 a specific verb ('Report') and precisely names the metrics: fan-in (Ca), fan-out (Ce), and instability I=Ce/(Ca+Ce) per package. This clearly distinguishes gograph_coupling from sibling tools like gograph_deps or gograph_imports, which focus on different aspects of 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?
An explicit 'WHEN TO USE' section states 'To evaluate package isolation,' giving a clear and actionable use case. It does not name alternative tools or conditions when not to use it, so it falls short of the full explicit-exclusion bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_coverageARead-onlyIdempotent
Return the transitive set of production functions and methods statically reachable from one test function. The MCP server refreshes the graph first. Exact results have an all-static path; any parser-only or CHA dispatch edge degrades that symbol and its descendants to possible. Same-named tests in multiple packages return status=ambiguous and are never merged; retry with the stable test ID from matched_tests or gograph_identity. The optional package qualifier resolves the uncommon in-package versus external foo_test ID collision. Set exact_only=true to omit possible results. This is static attribution, not runtime or branch coverage proof. Read-only; no side effects. WHEN TO USE: To map one test to the product symbols it structurally exercises. NOT TO USE: To claim execution or branch coverage. RETURNS: gograph.coverage.v1 JSON with analysis precision, test-call resolution, matched tests, symbols, resolution, depth, representative stable-ID paths, and limitations.
| Name | Required | Description | Default |
|---|---|---|---|
| test | Yes | Exact test name or canonical stable test symbol ID | |
| package | No | Optional exact Go package name used only to disambiguate matching test symbols | |
| exact_only | No | Return only symbols reached entirely through exact/static edges |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description goes well beyond that: it discloses that the server refreshes the graph first, explains how exact versus possible results are determined via static vs CHA/parser-only dispatch edges, and specifies ambiguity handling. It explicitly states 'Read-only; no side effects' and distinguishes static attribution from runtime or branch coverage, which is critical behavioral context for an AI agent.
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 well structured and information-dense, using clear sections for when to use, not to use, and return value. Every sentence adds behavioral or semantic detail. It is longer than minimal, but the tool involves non-trivial precision semantics and ambiguity handling, so the length is justified. The most important statement about transitive reachability is front-loaded.
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 is complete for a read-only analysis tool with no output schema. It covers the core behavior, the degradation semantics, ambiguity resolution, retry strategies, exact-mode filtering, the optional package qualifier, and a summary of what the return payload contains. There are no obvious missing behavioral details an agent would need to invoke 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?
The input schema already has 100% description coverage for all three parameters. The tool description still adds meaningful semantic context: 'test' is clarified as exact name or canonical stable ID with guidance to use matched_tests/gograph_identity for retries; 'package' is defined as resolving the uncommon in-package versus external foo_test collision; 'exact_only' is connected to omitting possible results. This expands beyond the schema descriptions.
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 a specific verb-resource statement: 'Return the transitive set of production functions and methods statically reachable from one test function.' It clearly defines the input (a test function) and the output relationship, and it disambiguates from siblings like gograph_tests, gograph_untested, and gograph_callees by emphasizing static reachability from a single test rather than coverage claims or general call graphs.
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 explicitly provides WHEN TO USE ('map one test to the product symbols it structurally exercises') and NOT TO USE ('To claim execution or branch coverage') sections. It also gives concrete conditional guidance for ambiguous cases: same-named tests return status=ambiguous, and the agent should retry with the stable test ID from matched_tests or gograph_identity. The package qualifier is framed precisely as resolving only the in-package versus external foo_test collision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_dependentsARead-onlyIdempotent
Find all packages that import the named package (inverse of gograph_deps). The MCP server refreshes source analysis before the call. Read-only; no side effects. WHEN TO USE: Before a package-level interface change or removal. NOT TO USE: For a single function's callers (use gograph_callers). RETURNS: Dependent packages; with mermaid=true, Mermaid flowchart text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| mermaid | No | Return Mermaid flowchart text instead of the normal response | |
| package | Yes | The package to find dependents for (e.g., 'internal/auth', 'auth', or a full import path) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/no-destructive safety, so 'Read-only; no side effects' is largely redundant. However, the description adds genuine behavior beyond the annotations: the server refreshes source analysis before the call (freshness guarantee) and the mermaid return-format branch. This extra context is useful but modest.
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?
Front-loaded with the core purpose, then cleanly sectioned WHEN TO USE / NOT TO USE / RETURNS. Every sentence earns its place with 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?
For a read-only query with no output schema, the description covers purpose, routing to alternatives, freshness behavior, and return format (including the mermaid variant). Nothing an agent needs to call it correctly is missing.
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 100%, so limit, cursor, mermaid, and package are all documented in the schema itself. The description only echoes the mermaid=true behavior and adds no syntax or format detail beyond what the schema already provides, so baseline 3 applies.
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?
States a specific verb and resource ('Find all packages that import the named package') and distinguishes itself from siblings by naming gograph_deps as its inverse. An agent can tell exactly what this returns without opening any schema.
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?
Explicit WHEN TO USE ('Before a package-level interface change or removal') and NOT TO USE ('For a single function's callers (use gograph_callers)') with a named alternative. The condition selecting the sibling is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_depsARead-onlyIdempotent
List the import dependencies of a named package. With transitive=false (default), returns direct imports; true returns the BFS closure. The MCP server refreshes source analysis before the call. Read-only; no side effects. WHEN TO USE: When auditing package layering. NOT TO USE: For reverse lookup (use gograph_dependents). RETURNS: direct[] and transitive[] arrays; with mermaid=true, Mermaid flowchart text; found:false when absent.
| Name | Required | Description | Default |
|---|---|---|---|
| mermaid | No | Return Mermaid flowchart text instead of structured JSON | |
| package | Yes | The target package path or name to inspect (e.g., 'internal/search', 'internal/cli') | |
| transitive | No | If true, return the full transitive import closure via Breadth-First Search (BFS) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's 'Read-only; no side effects' is redundant. However, it adds valuable context: the MCP server refreshes source analysis before the call, and it documents the 'found:false' return condition. This goes beyond 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 moderately long but highly structured: purpose, behavior, when to use, when not to use, and return format. Every sentence carries information. The capitalized labels (WHEN TO USE, NOT TO USE, RETURNS) improve scannability. A slight trim could be made, but it remains efficient.
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 no output schema and moderate complexity, the description fully explains behavior, settings, return values, and edge cases ('found:false'). It also addresses the refreshing behavior, making it self-contained. Sibling differentiation is present. Nothing critical is missing.
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 100%, so the schema already documents all three parameters. The description adds the default for transitive (false) and clarifies the return structure (direct[] vs transitive[]), which is not explicitly in the schema. This strengthens parameter understanding without being repetitive.
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 a specific verb and resource: 'List the import dependencies of a named package.' It clearly distinguishes itself from sibling tools by explicitly naming gograph_dependents as the reverse lookup tool. The transitive flag and its effect on scope are also mentioned.
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?
Explicit WHEN TO USE and NOT TO USE sections are provided. 'When auditing package layering' gives a concrete use case, and the exclusion of gograph_dependents for reverse lookup prevents misuse. This is exactly the kind of guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_diagramARead-onlyIdempotent
Refresh source analysis and generate a Mermaid architecture diagram of the package dependency graph. Read-only; no side effects. WHEN TO USE: Onboarding, architecture review, or communicating package structure. Use group_by=module for monorepos and group_by=file for drill-downs. NOT TO USE: For call-graph traversal or single-package focus. RETURNS: Mermaid text; use max_depth or coarser grouping for large graphs.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | Grouping level: 'package' (default), 'module', 'service', or 'file' | |
| max_depth | No | Maximum BFS depth from graph roots (0 = unlimited) | |
| include_stdlib | No | If true, include Go standard library packages in the diagram |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent; the description reinforces this with 'Read-only; no side effects' and adds behavioral context: refreshing source analysis, returning Mermaid text, and advising max_depth/grouping for large graphs. This goes beyond 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?
The description is well-structured with labeled sections (WHEN TO USE, NOT TO USE, RETURNS), front-loads the purpose, and every sentence earns its place. It is concise while packing substantial 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 annotations cover safety and schema covers parameters, the description provides complete operational context: output format (Mermaid text), typical use cases, exclusions, and scale guidance. Since no output schema exists, stating the return type is critical and handled.
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 covers all three parameters fully, so baseline is 3. The description adds practical guidance for group_by values and max_depth for large graphs, enhancing meaning beyond schema. include_stdlib is not mentioned but the schema description is sufficient.
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 states it generates a Mermaid architecture diagram of the package dependency graph, with a specific verb and resource. It also distinguishes from siblings by explicitly excluding call-graph traversal and single-package focus.
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 explicit WHEN TO USE and NOT TO USE sections, plus parameter-specific guidance for monorepos (group_by=module) and drill-downs (group_by=file). This gives clear direction on when to select this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_docARead-onlyIdempotent
Fetch Go documentation for a package, stdlib symbol, or third-party symbol by running go doc <query>. The handler does not query the graph, though the project-scoped MCP server must already have started with a usable artifact or buildable Go source. Filesystem-shaped queries are rejected, and the command is refused for source-tree links the Go toolchain may inspect across the selected root plus its effective module root, or the workspace root and member trees; .git and .gograph are excluded from that preflight. It also refuses a special recognized Go build input, linked/non-regular Go tool metadata (go.mod, go.sum, go.work, go.work.sum, or vendor/modules.txt), or a workspace member outside the workspace directory. Each applicable member directory, go.mod, and optional go.sum is validated first. Dependency and toolchain resolution remain open-world under the user's Go environment. WHEN TO USE: When a call chain reaches code outside the project. NOT TO USE: For project-internal symbols (use gograph_source or gograph_context). RETURNS: A one-element JSON array containing {query, output}, where output is the raw go doc text; an error when the query or repository input is unsafe, the symbol is not found, or go is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The go doc query string. Examples: 'fmt.Errorf', 'net/http.HandleFunc', 'io.Reader', 'github.com/jackc/pgx/v5.Conn.QueryRow' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations, detailing rejection of filesystem-shaped queries, refusal of certain source-tree links and Go metadata, validation of member directories/go.mod files, open-world dependency resolution, and return/error behavior. It fully discloses the safety and execution model without contradicting the read-only, idempotent, open-world hints.
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 lengthy but purposefully structured with clear sections (WHEN TO USE, NOT TO USE, RETURNS) and front-loaded with the core action. Every sentence adds value, though the dense security preflight details could be more compact. It remains readable and well-organized.
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 is complete for a tool of this complexity. It covers the return format (one-element JSON array with query and output), error conditions, prerequisites, and behavioral edge cases. With no output schema and only one parameter, the description adequately fills all gaps.
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 schema already describes the query parameter with concrete examples, achieving 100% coverage. The description adds context about acceptable query types (package, stdlib, third-party) and restrictions (filesystem-shaped rejected), which is useful but not a significant departure from the schema. Thus the baseline 3 is appropriate.
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 a specific verb and resource: 'Fetch Go documentation for a package, stdlib symbol, or third-party symbol by running `go doc <query>`.' It clearly distinguishes from siblings by noting the tool does not query the graph and by explicitly contrasting with gograph_source and gograph_context for project-internal symbols.
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 explicit WHEN TO USE ('When a call chain reaches code outside the project') and NOT TO USE ('For project-internal symbols (use gograph_source or gograph_context)') sections, naming alternative tools. It also states prerequisites about the MCP server needing a usable artifact or buildable source, giving clear context for when the tool is applicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_embedsARead-onlyIdempotent
Find all Go structs that embed the named struct via anonymous field composition. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When understanding how a base type is extended throughout the codebase, or before modifying a shared embedded struct to estimate blast radius. NOT TO USE: For interface implementations (use gograph_implementers); for named field type references in other structs (use gograph_usages). RETURNS: List of embedding parent struct names with package paths and file locations; empty when the struct is embedded nowhere.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| struct | Yes | The exact name of the target struct to inspect embedding relationships for (e.g., 'Symbol', 'PackageNode') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, so 'Read-only; no side effects' is redundant. However the description adds genuinely useful disclosures beyond the annotations: the freshness check/refresh behavior before the call and the CHA/SSA retry on precise and precise_fallback graphs after source changes. These are real behavioral traits an agent cannot get from structured fields.
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?
Front-loads the purpose, then organizes WHEN/NOT/RETURNS into scannable labeled clauses. The freshness/CHA-SSA sentence is somewhat implementation-heavy for the value it adds, but the overall structure is tight and every other sentence earns its place.
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 having no output schema, the description spells out the return shape (embedding parent struct names with package paths and file locations, empty when nowhere embedded), so an agent knows exactly what to expect. Together with usage guidance and freshness semantics, the definition is complete for a 3-param read-only 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 100%, so limit, cursor, and struct are all documented in the schema itself. The description only restates that a named struct is the target, adding no syntax or edge-case detail (e.g., exact-name matching, pagination semantics) beyond the schema. Baseline 3 is appropriate.
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?
States a specific verb (Find) and resource (Go structs that embed the named struct via anonymous field composition), and explicitly distinguishes itself from gograph_implementers and gograph_usages. An agent can identify the tool's niche without opening any schema.
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?
Has explicit WHEN TO USE ('understanding how a base type is extended', 'estimate blast radius before modifying a shared embedded struct') and NOT TO USE sections that name the two alternative tools for adjacent questions. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_endpointARead-onlyIdempotent
Build a full vertical slice for one HTTP route: the matched handler symbol, a BFS call chain downstream (default depth 5), all SQL queries emitted in that chain, and all env vars read. Constant nested Gin/Echo/Fiber Group prefixes and Chi Route closure prefixes are composed into final paths; dynamically computed prefixes remain unresolved and can still be queried by suffix or handler. The MCP server checks content-digest freshness before this call and incrementally refreshes changed package ASTs in the current requested analysis mode; precise and precise_fallback graphs retry repository-wide CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When auditing what an API endpoint does end-to-end — its downstream dependencies, database queries, and configuration reads. NOT TO USE: For listing all routes (use gograph_routes first to find the pattern); for raw handler source code only (use gograph_source). RETURNS: Array of endpoint slices with route, handler, call chain, SQL, and env fields; found:false with a suggestion when the query does not match any route. query accepts route pattern ("POST /api/users"), path fragment ("/users"), or handler name. depth controls call-chain BFS depth (default: 5).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | BFS depth for call chain traversal, clamped to 1-20 (default: 5) | |
| query | Yes | Route pattern ("POST /api/users"), path suffix ("POST /users"), or handler symbol name ("CreateUser"). Constant grouped prefixes are resolved; dynamic prefixes remain best-effort. | |
| mermaid | No | Return Mermaid flowchart text instead of structured JSON | |
| include_tests | No | Include routes registered in *_test.go files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds transparency beyond the annotations by explaining internal behaviors such as content-digest freshness checks, incremental AST refreshes, and handling of dynamic prefixes. While valuable, some details are repeated, slightly reducing impact.
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 overly verbose and repetitive. It repeats parameter descriptions, route-resolution details, and the concept of depth multiple times. It could be streamlined to half its length without losing essential 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?
The description compensates for the lack of an output schema by describing the return structure (array of endpoint slices with route, handler, call chain, SQL, env fields) and the not-found case (found:false with suggestion). It also explains the refresh behavior, making it fairly 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?
The schema already provides descriptions for all four parameters, and the description repeats these almost verbatim. It adds minimal extra clarification (e.g., depth meaning, mermaid alternative) but does not significantly enhance understanding beyond the schema.
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 states that the tool builds a full vertical slice for one HTTP route, listing the specific outputs (handler symbol, BFS call chain, SQL queries, env vars). It differentiates from sibling tools by focusing on a single route and its end-to-end behavior.
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 explicitly provides usage guidance via 'WHEN TO USE' and 'NOT TO USE' sections, naming alternatives like gograph_routes for listing all routes and gograph_source for raw source code. This gives clear direction on when to choose this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_envsARead-onlyIdempotent
Find all environment variable reads in the codebase via os.Getenv, os.LookupEnv, and common config frameworks, with their enclosing function context. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Optional term filters by key name substring (e.g., "DATABASE" matches DATABASE_URL and DATABASE_HOST). WHEN TO USE: When compiling a deployment configuration manifest, documenting required env vars, or auditing what secrets a service reads at startup. NOT TO USE: For reading actual runtime env values (this is static analysis); for database queries (use gograph_sql). RETURNS: List of env key names, calling function, and file/line; empty when no env reads match the filter.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional filter term (e.g., 'DATABASE' matches DATABASE_URL, DATABASE_HOST, etc.) | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context beyond the annotations: the freshness check before the call, mode-dependent CHA/SSA retry after source changes, and an empty-list return when no reads match. It restates 'read-only; no side effects' (redundant with annotations) but the freshness/retry disclosure is substantive.
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?
Well front-loaded: purpose first, then behavior, then labeled WHEN TO USE / NOT TO USE / RETURNS sections. It runs somewhat long and the term example duplicates the schema, but every section maps to a decision the agent must make, so there is little waste.
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, the description carries the return-value burden and does so (key names, calling function, file/line, empty case). Combined with freshness/retry behavior and full parameter coverage, an agent has what it needs; only the limit/cursor pagination interplay is left entirely to the schema.
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 100%, so all three parameters are documented in the schema itself (term with the DATABASE example, limit as rows-per-page with byte budget, cursor as opaque next_cursor). The description largely repeats the term example and adds no semantics for limit or cursor, so the baseline 3 for full schema coverage is correct.
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?
States a specific verb (find) and resource (environment variable reads) and enumerates the exact detection mechanisms (os.Getenv, os.LookupEnv, config frameworks) plus enclosing function context. An agent can distinguish this from siblings like gograph_globals or gograph_literals without opening either schema.
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?
Explicit WHEN TO USE (deployment manifest, documenting required env vars, auditing secrets) and NOT TO USE clauses, including a named alternative (gograph_sql for database queries) and the clarification that this is static, not runtime, analysis. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_errorflowARead-onlyIdempotent
Trace how a named error sentinel or error message string is defined, returned, and propagates up the call graph toward HTTP handlers or CLI entry points. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Accepts either query (preferred) or term as the error name or message substring. WHEN TO USE: When auditing how a specific error is produced and handled end-to-end — find definition sites, all return sites, and upstream propagation paths (e.g., ErrNotFound). NOT TO USE: For general upstream traversal of any function (use gograph_callers or gograph_impact); for listing all error definitions (use gograph_errors). RETURNS: Definition sites, return sites, propagation path chains, and related test names; paths is empty when no propagation chain is found. Note: heuristic analysis — does not perform SSA or full data-flow tracking.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | The error string or sentinel error name (e.g., 'ErrInvalidToken' or 'invalid token') | |
| query | No | The error string or sentinel error name (preferred over term) | |
| no_tests | No | If true, exclude test files from related-test collection (matches CLI --no-tests) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds important behavioral context: freshness checks, retry of CHA/SSA after source changes, and that it's heuristic without full SSA or data-flow tracking. This exceeds annotation coverage.
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 well-structured with sections but slightly verbose. It front-loads the core purpose and clearly separates usage guidelines and return information. Efficient but could be more concise.
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 no output schema, the description specifies what is returned (definition sites, return sites, propagation paths, test names) and explains edge cases (paths empty when no chain). It also notes the heuristic limitation. Complete for a complex analysis tool.
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 100%, so baseline 3. The description adds nuance: 'query' is preferred over 'term', and explains the boolean 'no_tests' excludes test files. This provides helpful guidance beyond schema.
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 states the tool traces how a named error sentinel or string is defined, returned, and propagates up the call graph toward HTTP handlers or CLI entry points. It distinguishes from siblings by explicitly saying not for general upstream traversal (use gograph_callers or gograph_impact) and not for listing errors (use gograph_errors).
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?
Explicit WHEN TO USE section describes auditing a specific error end-to-end, and NOT TO USE section provides alternatives for general traversal and error listing. This gives clear guidance on appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_errorsARead-onlyIdempotent
Find all error and panic sites in the codebase: errors.New, fmt.Errorf, sentinel var declarations, and panic calls. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Optional term filters by message substring (e.g., "ErrInvalid", "unauthorized"). WHEN TO USE: When cataloging error codes and panic paths, standardizing error messages, or checking whether a specific error string is already defined before adding a new one. NOT TO USE: For tracing how an error propagates up the call stack (use gograph_errorflow instead). RETURNS: List of error or panic sites with message text, file path, and line number; empty when no matches found.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional keyword to filter the returned error structures (e.g., 'ErrInvalid', 'unauthorized') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| no_tests | No | Exclude error sites in *_test.go files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's 'Read-only; no side effects' is partly redundant. It does add genuinely new behavioral context: the server checks freshness before the call, refreshes in the requested analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes – useful preconditions an agent wouldn't infer from 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?
Front-loaded with the core purpose and clearly sectioned into WHEN/NOT/RETURNS blocks. The freshness/CHA-SSA sentence is somewhat dense and internal-mechanism heavy, but every part is scannable and earns its place for an agent deciding how to call it.
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, the description correctly carries the return-shape burden: it specifies the list contents (message text, file path, line number) and the empty-result case. Combined with usage and behavioral notes, an agent has everything needed to select and invoke it 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 coverage is 100%, so term/limit/cursor/no_tests are already documented. The description restates the term filter with examples ('ErrInvalid', 'unauthorized') and implies pagination via 'empty when no matches found', but adds no semantics beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb ('Find') and resource ('error and panic sites'), then enumerates the exact patterns detected (errors.New, fmt.Errorf, sentinel var declarations, panic calls). It explicitly distinguishes itself from the sibling gograph_errorflow, so an agent can route correctly without opening either schema.
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 explicit WHEN TO USE scenarios (cataloging error codes, standardizing messages, checking whether a string exists) and an explicit NOT TO USE clause pointing to the alternative gograph_errorflow for propagation tracing. When/when-not/alternative are all covered unambiguously.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_explainARead-onlyIdempotent
Generate a synthesized, LLM-ready narrative for a Go symbol: role classification, callers, callees, complexity, SQL, env vars, HTTP routes, concurrency primitives, tests, and interface satisfaction — all in one structured document. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: For onboarding to an unfamiliar symbol, generating PR documentation, or getting an opinionated architectural assessment without issuing multiple tool calls. NOT TO USE: For raw source code (use gograph_source); for targeted blast-radius analysis (use gograph_impact). RETURNS: Rich structured JSON with role, narrative summary, and all associated cross-references; {"found":false} when symbol is not in the graph.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | The name or ID of the symbol to explain (supports short name 'CreateUser', dot-notation 'graph.Graph', or fully-qualified ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Read-only; no side effects,' which aligns perfectly with annotations (readOnlyHint=true, destructiveHint=false). It also discloses caching and freshness behavior, explaining that the server checks freshness and retries CHA/SSA after source changes, adding significant context beyond 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?
The description is well-structured with clear sections and front-loads the purpose. It is slightly verbose in listing all included aspects, but each sentence adds value and does not waste space.
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 lacking an output schema, the description sufficiently describes the return value: rich structured JSON with role, narrative, cross-references, and a not-found indicator. Given the tool's complexity and number of siblings, the description is complete enough for an agent to invoke 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?
Only one parameter (symbol) exists with 100% schema description coverage. The description adds value by enumerating the supported formats (short name, dot-notation, fully-qualified ID), which is useful but not required. Baseline 3 is elevated to 4 due to this extra context.
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 uses a specific verb 'Generate' and specifies the exact resource: a synthesized, LLM-ready narrative for a Go symbol with a detailed list of included aspects (role classification, callers, callees, etc.). It clearly distinguishes from siblings like gograph_source and gograph_impact by contrasting use cases.
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 includes explicit 'WHEN TO USE' and 'NOT TO USE' sections, providing clear context for when the tool is appropriate (onboarding, PR docs, architectural assessment) and when alternatives like gograph_source or gograph_impact should be used instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_exploreARead-onlyIdempotent
Explore a lexical term or Go symbol in one bounded call. Standard mode combines ranked matches with selected-symbol source, direct callers/callees, tests, and exact impact. compact=true returns discovery, selected-node metadata, role, complete counts, and explicit omitted_sections while suppressing token-heavy bodies (default limit 5). deep=true retains standard evidence and adds bounded depth-3 exact identity callers/callees, package context, and explanation (default limit 25). compact and deep are mutually exclusive; an explicit limit overrides their defaults. Possible dispatch is excluded from bundled identity impact and deep traversals. The MCP server refreshes source analysis before the call. Read-only; no persistent side effects. Question-like text is lexical, not model-interpreted. Focused tools remain authoritative for complete output. RETURNS: shared gograph.explore.v1 with mode, selection_basis, ambiguity, totals, truncation, and omission metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | Expanded response: standard evidence plus bounded depth-3 exact callers/callees, package context, and explanation; mutually exclusive with compact | |
| exact | No | Require exact resolution for selected-symbol context; broad lexical matches remain visible | |
| limit | No | Maximum rows returned per section, clamped to 1-100; defaults to 5 compact, 10 standard, or 25 deep | |
| query | Yes | A symbol, fully-qualified ID, lexical feature term, or short question-like phrase to explore | |
| compact | No | Low-token response: matches, selected node/role, complete counts, and explicit omissions; mutually exclusive with deep |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint/idempotent/destructive:false, which already establish the safety profile), the description adds genuine behavioral context: source analysis is refreshed before the call, possible dispatch is excluded from bundled identity impact and deep traversals, compact/deep are mutually exclusive, and question-like text is lexical rather than model-interpreted. 'Read-only; no persistent side effects' is redundant with the annotations, but the other disclosures are valuable and non-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 definition is dense but front-loads the core purpose before diving into modes, constraints, and return shape, so an agent can extract the essentials quickly. Some sentences are load-bearing (mutual exclusivity, dispatch exclusion, refresh behavior), though 'Read-only; no persistent side effects' duplicates the annotations and the overall length is on the heavy side.
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 complex multi-mode aggregation tool with no output schema, the description supplies the missing return-value information explicitly via the RETURNS block (shared gograph.explore.v1 with mode, selection_basis, ambiguity, totals, truncation, omission metadata) and covers mode defaults, limits, and exclusions. Nothing an agent needs to invoke this correctly appears to be missing.
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 100%, so the schema already documents all five parameters including the compact/deep exclusivity and the clamped 1-100 limit. The description reinforces mode defaults (5/25) but adds little semantic detail beyond what the schema provides, matching the baseline for full schema coverage.
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 sentence gives a specific verb and resource (explore a lexical term or Go symbol) and frames the tool as a single bounded aggregation call that bundles matches, source, callers/callees, tests, and impact. It differentiates itself from the many focused siblings by noting that 'focused tools remain authoritative for complete output,' which tells an agent this is the bundled-overview option. The differentiation is meaningful though it references the sibling class generically rather than naming specific tools.
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 clearly explains the mode-selection conditions (compact for low-token discovery, deep for expanded evidence, mutual exclusivity, explicit limit overriding defaults) and when to prefer this over focused tools for complete output. It provides strong usage context but stops short of explicit when-not-to-use guidance or naming the specific alternative tools for a given task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_fieldsARead-onlyIdempotent
Extract all declared fields from a named Go struct: field names, Go types, and raw struct tag strings (json, db, yaml, gorm, etc.). The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When mapping JSON/DB serialization tags, inspecting struct layouts, or enumerating fields before adding a new one. NOT TO USE: For methods on the struct (use gograph_node or gograph_source); for all struct initialization sites (use gograph_literals). RETURNS: Array of field entries with name, type, and tag string; empty when the struct is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| struct | Yes | The exact name of the target struct to inspect fields for (e.g., 'Config', 'User') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the bare safety profile is covered. The description adds genuinely non-obvious behavior: a freshness check performed server-side, refresh in the requested analysis mode, and CHA/SSA retry for precise/precise_fallback graphs after source changes. It also states the empty-result case, though it does not discuss rate limits or how pagination interacts with graph snapshots.
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 labeled WHEN TO USE / NOT TO USE / RETURNS structure makes it scannable and front-loads the core action. It is somewhat dense with implementation detail about freshness and CHA/SSA retries, but each sentence carries routing or behavioral value; little is filler beyond the redundant 'Read-only; no side effects.'
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?
There is no output schema, so the description correctly supplies the return shape (array of {name, type, tag}) and the empty/not-found case. Combined with schema-documented pagination and the annotations covering safety, an agent has everything needed to call and interpret this tool.
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 100%, so the schema already documents struct, limit, and cursor including bounds and byte-budget caveats. The description only implies the 'struct' argument's role ('named Go struct') and adds no syntax or format detail beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.
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 a specific verb and resource ('Extract all declared fields from a named Go struct') and enumerates exactly what is returned: field names, Go types, and raw tag strings. It further distinguishes this from sibling tools by naming gograph_node/gograph_source for methods and gograph_literals for initialization sites, so an agent can route without opening another schema.
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?
Explicit WHEN TO USE clause covers three concrete scenarios (mapping serialization tags, inspecting layouts, enumerating fields before adding one), and the NOT TO USE clause names both alternatives and the conditions that select them (methods vs. initialization sites). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_fixturesARead-onlyIdempotent
Find test helper structs and factory/builder functions declared in *_test.go files for a named package. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: Before writing new tests — check what test infrastructure (helper builders, stub factories, shared setup structs) already exists in the package to avoid duplication. NOT TO USE: For test functions that exercise a symbol (use gograph_tests); for external test data files on disk (those are not tracked in the graph — use filesystem search). RETURNS: Symbols defined in test files for the package including helper structs and factory functions; empty when the package has no test helper infrastructure.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| package | Yes | The package path or name (e.g., 'internal/auth') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive, but the description adds genuine operational context: the server checks freshness before the call, refreshes in the requested analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes. 'Read-only; no side effects' is redundant with annotations, but the staleness/retry behavior is real added value.
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?
Well front-loaded: purpose first, then usage routing, then returns. However, the freshness/CHA/SSA retry sentence is fairly detailed implementation trivia that borders on noise for a selection decision. Still, structure is clean and labels (WHEN TO USE, NOT TO USE, RETURNS) make it scannable.
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, the description carries the return burden and does so explicitly (helper structs and factory functions, empty when none exist), plus the pagination behavior. An agent has everything needed to call it correctly and interpret the result.
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 100%, so the schema fully documents package, limit, and cursor. The description only implies the package scoping ('for a named package') and says nothing about pagination or the limit/cursor semantics beyond what the schema already states. Baseline 3 is appropriate.
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?
States a specific verb+resource: 'Find test helper structs and factory/builder functions declared in *_test.go files for a named package.' This precisely distinguishes it from gograph_tests (test functions) and shared-setup detection, so an agent can select it without opening the schema.
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?
Includes explicit WHEN TO USE (before writing new tests, to avoid duplication) and NOT TO USE clauses that name alternatives: use gograph_tests for test functions exercising a symbol, and filesystem search for external test data files. Both the positive and negative routing conditions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_flowARead-onlyIdempotent
Find potential untrusted-data paths from HTTP request objects, decoded JSON values, or environment variables to SQL query text, process execution arguments, filesystem paths, or outbound HTTP targets. The MCP server refreshes source analysis before this call; run gograph build . --precise first for stronger method/interface targets. Read-only; no side effects. WHEN TO USE: During a security review or before changing request parsing, command execution, file access, SQL construction, or URL handling. NOT TO USE: As proof of exploitability; the analysis is path-insensitive and matches call/return context for at most 16 nested repository calls. RETURNS: Structured findings with source, sink, severity, confidence, and path steps. Configure trusted return-value sanitizers in .gograph/flow.json or with config.
| Name | Required | Description | Default |
|---|---|---|---|
| sink | No | Optional sink kind: sql_query, process_execution, filesystem, or outbound_http | |
| term | No | Optional substring filter matched against functions, files, endpoints, and path steps | |
| config | No | Sanitizer policy path inside the graph root (default .gograph/flow.json when present) | |
| source | No | Optional source kind: http_request, decoded_json, or environment | |
| no_tests | No | Exclude functions in *_test.go files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. Description adds: MCP server refreshes source analysis before call, and the tool has no side effects. It explains what the analysis does and doesn't do (path-insensitive). Adds value beyond annotations without contradiction.
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?
Description is well-structured with clear sections, front-loaded with purpose. It is informative but slightly verbose in the limitations part. Every sentence adds value; no wasted words. Could be tightened but still concise enough.
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?
Tool has 5 optional params, no output schema. Description compensates by stating returns include source, sink, severity, confidence, path steps. Provides context about analysis being path-insensitive and depth limit. Covers usage, limitations, and returns adequately.
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 100% with each parameter having a description. The description adds marginal context: mentions configuring sanitizer policy via .gograph/flow.json for the config parameter. Baseline 3 is appropriate as schema does the heavy lifting.
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?
Description clearly states it finds potential untrusted-data paths from specific sources (HTTP requests, JSON, env vars) to specific sinks (SQL queries, process execution, etc.). It uses a specific verb-resource pair. However, it does not explicitly differentiate from sibling tools, which are numerous but mostly unrelated to data-flow analysis. Slight deduction for lack of sibling differentiation.
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?
Includes explicit 'WHEN TO USE' and 'NOT TO USE' sections, providing clear context and exclusions. It specifies appropriate scenarios (security review) and warns against misuse (as proof of exploitability). Also notes limitations (path-insensitive, 16-call depth). Perfect guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_focusARead-onlyIdempotent
Extract a comprehensive structural summary of one Go package: all files, defined symbols, internal call edges, and package-level imports. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When orienting to an unfamiliar package before editing it — provides a full map of what the package contains and how it connects to the rest of the codebase. NOT TO USE: For a single symbol's details (use gograph_context or gograph_source); for global keyword searches (use gograph_query). RETURNS: All files, symbol names, call edges, and import paths within the package; empty when the package is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| package | Yes | The package path or name to focus on (e.g., 'internal/auth') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds freshness-check context and the CHA/SSA retry behavior on source changes, which is genuine behavioral value beyond the annotations. It does not describe pagination totals or failure modes beyond the empty-result case, so it stops short of a 5.
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?
Front-loaded purpose followed by clearly labeled WHEN/NOT/RETURNS blocks; every sentence carries information. The behavior sentence about freshness and CHA/SSA retries is dense but not wasteful.
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, the description carries the return-shape burden and does so explicitly (files, symbol names, call edges, import paths, empty when package not found). Combined with annotations covering safety and the schema covering pagination, an agent has everything needed to call it 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 100%, so the baseline is 3. The description names the package focus conceptually but adds no syntax or format detail beyond the schema, and says nothing about limit/cursor semantics.
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?
States a specific verb (Extract) and resource (structural summary of one Go package) and enumerates exactly what it returns: files, defined symbols, internal call edges, and package-level imports. It also names the siblings it is not for, so an agent can distinguish it without opening a schema.
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?
Explicit WHEN TO USE (orienting to an unfamiliar package before editing) and NOT TO USE clauses that route to alternatives by name (gograph_context/gograph_source for a single symbol, gograph_query for global searches). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_globalsARead-onlyIdempotent
Find package-level variable declarations (var blocks) and the functions that mutate them in a specific package. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When auditing mutable global state, identifying thread-safety hazards, or locating shared singleton variables before a concurrency refactor. NOT TO USE: For local-scope variables; for environment variable reads (use gograph_envs). RETURNS: Package-level variable names, types, and the functions that write to them; empty when the package has no package-level variables.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| package | Yes | The package name or path to inspect (e.g., 'internal/config') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint/openWorldHint, so safety is covered. The description adds substantial non-obvious behavior: freshness checks before the call, refresh in the requested analysis mode, and CHA/SSA retry on precise/precise_fallback graphs after source changes. It stops short of describing pagination semantics fully, but goes well beyond 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?
Front-loaded with the core purpose, then clearly delimited WHEN TO USE / NOT TO USE / RETURNS sections. Slightly dense with the freshness/CHA-SSA detail, but every sentence carries information and headings aid scanning.
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, the description compensates by describing the return payload (variable names, types, mutating functions, empty case). Combined with usage guidance and freshness behavior, an agent has everything needed to call it 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 100%, so the schema already documents package, limit, and cursor (including byte-budget and cursor-snapshot semantics). The description adds no parameter-level detail beyond what the schema provides, so the baseline of 3 is appropriate.
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?
States a specific verb (find) and resource (package-level variable declarations / var blocks) plus the secondary output (functions that mutate them) scoped to a specific package. It clearly distinguishes itself from siblings like gograph_envs and from local-scope variable analysis.
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 explicit WHEN TO USE (mutable global state audits, thread-safety hazards, shared singletons before concurrency refactors) and NOT TO USE (local-scope vars; environment variable reads, routed to gograph_envs). The alternative is named with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_godobjARead-onlyIdempotent
Detect God Object anti-pattern candidates by scoring structs on method count, field count, and outgoing call count. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Thresholds: methods (default: 5), fields (default: 8), calls (default: 15); top limits results (default: 10). Exceeding any enabled threshold qualifies a struct, and the combined excess determines rank. WHEN TO USE: During architecture reviews to find monolithic structs that should be decomposed. NOT TO USE: For general struct layout inspection (use gograph_fields); for single-function complexity (use gograph_complexity). RETURNS: Ranked candidates with method, field, and call counts; empty when no threshold is exceeded.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum results to return (default: 10) | |
| calls | No | Minimum outgoing call count (default: 15) | |
| fields | No | Minimum field count (default: 8) | |
| methods | No | Minimum method count (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only; no side effects.' Beyond that, it adds valuable operational context: the MCP server checks freshness, refreshes in the requested analysis mode, and retries CHA/SSA after source changes for precise graphs. No contradictions with annotations; the extra context enhances transparency.
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 well-structured with clear sections (purpose, behavior, thresholds, when to use, returns). It is longer than the high-reference example but every sentence contributes useful information. Slightly verbose, but the structure and front-loaded purpose make it easy to scan.
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 is complete for a moderately complex analysis tool. It covers purpose, thresholds and qualification logic, freshness/refresh behavior, usage guidelines, alternatives, and return format ('Ranked candidates with method, field, and call counts; empty when no threshold is exceeded'). No output schema exists, so describing returns is necessary and done well.
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 covers all four parameters with descriptions and defaults (coverage 100%). The description goes further by explaining the qualification logic: 'Exceeding any enabled threshold qualifies a struct, and the combined excess determines rank.' It also restates defaults and clarifies that top limits results, adding semantic meaning beyond the schema's simple 'Minimum ...' labels.
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 a specific verb and resource: 'Detect God Object anti-pattern candidates by scoring structs on method count, field count, and outgoing call count.' This clearly states what the tool does and highlights the unique scoring criteria, distinguishing it from sibling tools. The NOT TO USE section further clarifies its scope by contrasting with gograph_fields and gograph_complexity.
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?
WHEN TO USE is explicitly stated: 'During architecture reviews to find monolithic structs that should be decomposed.' NOT TO USE provides concrete alternatives: 'For general struct layout inspection (use gograph_fields); for single-function complexity (use gograph_complexity).' This is an exemplary model of when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_hotspotARead-onlyIdempotent
Rank functions by incoming call count (fan-in) to identify the most-depended-on symbols in the codebase. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. top controls result count (default: 10; 0 = all). Set include_tests=true to count test-file call edges — by default excluded so test helpers don't dominate rankings in test-heavy codebases. WHEN TO USE: When deciding where to invest refactoring effort or documentation — high fan-in functions are the highest-risk change targets. NOT TO USE: For single-package metrics (use gograph_focus or gograph_coupling); for complexity scores (use gograph_complexity). RETURNS: Ranked list of function names with fan-in count and package location.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Number of results to return (default: 10, 0 = all) | |
| include_tests | No | Include call edges from *_test.go files. Default false — production fan-in only, otherwise test helpers (baseReq, newTestFoo, etc.) tend to dominate rankings in test-heavy codebases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, destructiveHint, but the description adds valuable context about freshness checking, mode-specific retry of CHA/SSA, and the rationale for excluding test files. This goes beyond the annotations without contradicting them.
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 well-structured with clear sections (main purpose, behavior, parameters, WHEN/NOT TO USE, RETURNS). Every sentence adds value without fluff, 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?
Despite having no output schema, the RETURNS section specifies what the agent should expect: 'Ranked list of function names with fan-in count and package location.' Combined with behavior, params, and usage guidance, the description is fully self-contained for correct 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?
While the schema covers 100% of parameters, the description adds meaningful semantics: 'top' default and 0 meaning, and include_tests explains why test helpers are excluded by default ('otherwise test helpers ... tend to dominate rankings'). This enriches the schema's parameter descriptions.
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 a specific verb and resource: 'Rank functions by incoming call count (fan-in)' which precisely identifies the tool's function. It also distinguishes it from siblings by noting alternatives in the NOT TO USE section, making the purpose 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?
The description includes explicit WHEN TO USE and NOT TO USE sections, naming specific alternative tools: gograph_focus, gograph_coupling, gograph_complexity. This clearly guides the agent on when to select this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_httpcallsARead-onlyIdempotent
List a bounded page of HTTP evidence from imported, unshadowed net/http Get/Post/PostForm/Head calls and possible NewRequest/NewRequestWithContext construction. Client receiver methods and arbitrary URL-building functions are not inferred. Static strings and bounded lexical base + static suffix expressions are recorded; runtime environment values are never read. Construction is not dispatch proof. Workspace http_clients may explicitly map bases or env:KEY to scoped logical authorities; unresolved destinations remain workspace diagnostics. The MCP server refreshes source analysis before this call. Read-only. Optional term matches method, URL/base, or function. RETURNS: gograph.results.v1 rows with file/line and dynamic base/suffix or request-only evidence in detail, plus total/returned/truncated/next_cursor. For server routes use gograph_routes.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional filter term (matches method, URL, or function name — e.g., 'POST' or 'api.example.com') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable non-obvious behavior: 'The MCP server refreshes source analysis before this call,' 'runtime environment values are never read,' pagination via 'next_cursor' tied to a 'same graph snapshot,' and the caveat that 'Construction is not dispatch proof.' That is substantive context beyond 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 dense but front-loaded: lead sentence states purpose, then scope exclusions, semantics, behavior, and return shape. Every sentence earns its place, though the wording is dense enough that a reader may need to parse carefully; it avoids 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?
Given three params, no output schema, and a read-only bounded list tool, the description supplies the needed return shape (gograph.results.v1 rows, total/returned/truncated/next_cursor), pagination behavior, and scoping caveats. It is nearly complete for invocation, with minor gaps around filtering semantics beyond the term option.
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 100%, so the schema documents all three parameters with semantics (term matches method/URL/function, limit byte budget, cursor snapshot bounds). The description adds little beyond what the schema provides, so baseline 3 applies.
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 precisely states the resource (HTTP evidence from net/http calls) and the exact syntactic constructs captured (Get/Post/PostForm/Head, NewRequest variants) while bounding scope. It explicitly names the sibling it replaces for server routes ('For server routes use gograph_routes'), making it distinguishable from the large sibling set.
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 clearly states what is included (static strings, bounded lexical base + static suffix) and what is excluded ('Client receiver methods and arbitrary URL-building functions are not inferred'). The routing pointer to gograph_routes is an explicit alternative. However, it doesn't describe when an agent should reach for this tool over, e.g., gograph_literals or gograph_endpoint, leaving some selection inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_identityARead-onlyIdempotent
Resolve an exact Go symbol spelling or canonical stable ID to location-independent symbol identity plus current source location. Canonical IDs are module import path + receiver/name and survive line shifts and file moves within the same package; package/module moves, receiver changes, and renames change the ID. Ambiguous short names return every candidate and never select one silently. An optional exact package qualifier disambiguates the uncommon in-package versus external foo_test ID collision. The MCP server refreshes the graph first. Read-only; no side effects. WHEN TO USE: Before persisting cross-document references or to re-resolve an existing stable ID. RETURNS: gograph.identity.v1 JSON with status exact, ambiguous, or not_found and deterministic matches.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exact symbol name, package/receiver-qualified spelling, or canonical stable ID | |
| package | No | Optional exact Go package name used to disambiguate matching symbols |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry read-only, idempotent, and non-destructive hints, so the description still adds meaningful context: the MCP server refreshes the graph first, canonical IDs survive line shifts but change on significant refactors, ambiguous names return all candidates instead of silently picking one. The 'read-only; no side effects' line matches annotations and adds no conflict.
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 front-loaded with purpose before complexity, and uses clear structural markers (all caps WHEN TO USE, RETURNS). It is dense, though perhaps slightly longer than minimal, with the canonical-ID mechanism explanation adding context that directly affects downstream usage rather than being 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?
For a read-only two-parameter tool with no output schema, the description sufficiently explains the return envelope (gograph.identity.v1 JSON), the status cases (exact, ambiguous, not_found), deterministic behavior, and how the optional parameter resolves collisions. An agent could confidently invoke this for the intended use case without additional clarification.
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 descriptions are complete for both fields, and the description layers on meaning beyond the schema: it explains that the symbol can be an exact name, qualified spelling, or canonical stable ID, and that the package parameter specifically disambiguates a known in-package/external ID collision. This gives an agent richer decision-making for both parameters than the schema alone.
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 specific operation ('Resolve') and resource ('Go symbol spelling or canonical stable ID') and clearly separates it from siblings by emphasizing location-independent symbol identity plus current source location, not merely looking up a graph node. It explicitly notes the handling of ambiguous short names, which further distinguishes its behavior from other graph tools.
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 provides a clear WHEN TO USE statement ('Before persisting cross-document references or to re-resolve an existing stable ID') that gives an agent actionable context for invoking the tool. It does not explicitly name alternatives or list when-not-to-use conditions, so it falls short of the strongest possible guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_impactARead-onlyIdempotent
Traverse the call graph backwards to find every symbol that transitively calls the target — the full upstream blast radius of a change. The MCP server checks freshness before the call. Read-only; no side effects. Three modes: (1) single symbol via symbol; (2) uncommitted changes via uncommitted=true; (3) git-ref changes via since. WHEN TO USE: Before refactoring a core function to see what breaks. NOT TO USE: For direct one-hop callers only (use gograph_callers). RETURNS: Transitive upstream affected symbols; with mermaid=true, Mermaid flowchart text; a bounded native page (including empty pages). Exact and possible paths remain distinct; Mermaid uses dotted edges for possible evidence. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| since | No | Git ref (e.g. 'main', 'HEAD~5'): blast radius of all symbols changed since this ref | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| symbol | No | Symbol name for single-symbol blast radius (supports short name 'ValidateToken', dot-notation 'graph.Graph', or fully-qualified ID) | |
| mermaid | No | Return Mermaid flowchart text instead of the normal response | |
| exact_only | No | Exclude any path that depends on possible call evidence; default false retains explicitly labeled possible results | |
| uncommitted | No | If true, compute blast radius of all uncommitted modified symbols |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so 'Read-only; no side effects' is partly redundant. However the description adds substantial beyond-annotation behavior: a pre-call freshness check, refusal conditions for incomplete comparisons/deleted declarations/ambiguous identities, and the requirement to rebuild before traversing newly added symbols.
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?
Front-loaded with the core purpose, then modes, usage guidance, returns, and constraints in a scannable order. It is dense and slightly long, but nearly every sentence carries actionable detail rather than 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, the description carries the return-value burden well: it lists the transitive upstream symbols, Mermaid flowchart text, bounded paging including empty pages, and the exact/possible distinction. Modes, constraints, and edge cases are all covered, leaving nothing an agent needs to call it 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 coverage is 100%, so the baseline is 3, but the description adds real meaning by framing the three mutually exclusive modes (symbol, uncommitted, since) and clarifying exact_only semantics (excludes paths relying on possible evidence) and mermaid output. It goes beyond the per-field schema text.
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?
States a specific verb (traverse backwards), resource (call graph / symbols), and scope (full upstream blast radius), which immediately distinguishes it from the one-hop sibling gograph_callers. An agent can tell exactly what it computes without opening the schema.
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?
Has explicit WHEN TO USE ('before refactoring a core function to see what breaks') and NOT TO USE ('for direct one-hop callers only, use gograph_callers') guidance. The alternative and the condition that selects it are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_implementersARead-onlyIdempotent
Find all concrete structs that implement a named Go interface. Type-checked production results are merged with AST-discovered implementations from test files because production package loading excludes test variants. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Set test_only=true to restrict to structs in *_test.go files (mocks/stubs). WHEN TO USE: When tracing polymorphism, locating dependency injection points, or finding all mock implementations of an interface. NOT TO USE: For interfaces a struct satisfies — inverse direction (use gograph_interfaces instead); for struct fields (use gograph_fields). RETURNS: List of implementing struct names with package paths and file locations; empty when no struct implements the interface.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| interface | Yes | The name of the interface (e.g., 'AuthService') | |
| test_only | No | If true, return only structs defined in test or mock files (replaces gograph_mocks) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations that already declare read-only/idempotent behavior, the description discloses non-obvious mechanics: production type-checked results are merged with AST-discovered test implementations because package loading excludes test variants. It also explains freshness checking and CHA/SSA retry behavior for precise graphs, which materially affects result interpretation.
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 front-loaded with purpose and uses clear WHEN TO USE / NOT TO USE / RETURNS sections. It is slightly overstuffed, and 'Read-only; no side effects' duplicates the annotations, but the additional behavioral details earn most of their space.
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 complex graph-analysis tool with no output schema, the description covers purpose, behavioral mechanics, alternatives, and return format. An agent has enough context to call it correctly and interpret the result.
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 100%, so the schema already documents all four parameters including limit, cursor, interface, and test_only. The description adds only a brief restatement of test_only's purpose, which is already present in the schema, so the baseline of 3 applies.
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 first sentence states a specific verb and resource: 'Find all concrete structs that implement a named Go interface.' It explicitly distinguishes itself from siblings by naming gograph_interfaces for the inverse direction and gograph_fields for struct fields, so an agent can route correctly without opening other schemas.
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 contains explicit WHEN TO USE and NOT TO USE sections. It names concrete scenarios (tracing polymorphism, dependency injection points, mocks) and points to the exact alternative tools for excluded cases (gograph_interfaces, gograph_fields).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_importsARead-onlyIdempotent
Find all files and packages in the codebase that import a specific package by its exact import path. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When isolating usage of a third-party library before removing or replacing it, or tracing where an internal package is consumed from outside. NOT TO USE: For a package's own outgoing imports (use gograph_deps); for reverse package-level dependency lookup by short name (use gograph_dependents). RETURNS: File paths and package names of all importers; empty when the package is imported nowhere.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| package | Yes | The exact import path of the target package to trace imports for (e.g., 'github.com/redis/go-redis') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false. The description adds genuinely new context: the server checks freshness before the call, refreshes in the requested analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes. The 'read-only; no side effects' line merely restates annotations, but the freshness/retry behavior is valuable. A 4 fits given annotations carry the safety profile.
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?
Front-loads the core purpose, then structures WHEN/NOT-TO-USE and RETURNS cleanly. Dense but every section earns its place; slightly long due to the freshness/CHA-SSA detail, but not padded.
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?
No output schema exists, but the description supplies a RETURNS section (file paths, package names, empty when unused) and covers the freshness/refresh behavior an agent needs to interpret results. Sufficient for correct 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 100%; the package, limit, and cursor params are all documented in the schema, and the description's 'exact import path' wording reinforces the package format. It adds little beyond the schema, so the baseline 3 is appropriate.
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?
States a specific verb+resource+scope: 'Find all files and packages that import a specific package by its exact import path.' It explicitly names the siblings it is not (gograph_deps for outgoing imports, gograph_dependents for short-name reverse lookup), so an agent can disambiguate without opening either schema.
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?
Contains explicit WHEN TO USE ('isolating usage of a third-party library before removing/replacing it, or tracing where an internal package is consumed from outside') and NOT TO USE clauses that route to gograph_deps and gograph_dependents. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_interfacesARead-onlyIdempotent
Find all Go interfaces satisfied by a named concrete struct (duck-typing resolution — inverse of gograph_implementers). Given a struct name, returns every interface whose complete method set is a subset of that struct's methods. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When you need to know which contracts a struct implicitly fulfills — useful before refactoring a method to understand which interface contracts will break. NOT TO USE: For finding structs that implement an interface (use gograph_implementers); for listing interface declarations in a package (use gograph_node or gograph_public). RETURNS: Interface names, method signatures, and file locations; empty when the struct satisfies no known interfaces.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| struct | Yes | The name of the struct (e.g., 'AuthService') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety bar is low. The description adds genuinely useful beyond-annotation context: freshness is checked before the call, a refresh happens in the current analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes. It stops short of describing pagination or the empty-result edge case in depth.
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?
Front-loaded with the core one-line definition followed by clearly labeled WHEN/NOT/RETURNS sections. Some phrasing is dense (CHA/SSA retry detail) but each sentence carries distinct information; 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, the description compensates by enumerating returns (interface names, method signatures, file locations) and the empty case. Combined with the explicit usage routing and freshness behavior, an agent has everything needed to call it 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 100%, so the schema already documents struct, limit (byte budget caveat), and cursor. The description restates that a struct name is the input and clarifies the subset semantics of the query, but adds no syntax or format detail beyond the schema. Baseline 3 applies.
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?
States a specific verb (find) and resource (Go interfaces satisfied by a struct), and explicitly frames itself as the inverse of gograph_implementers via duck-typing resolution. An agent can distinguish it from siblings without opening any schema.
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?
Includes explicit WHEN TO USE (know which contracts a struct implicitly fulfills, e.g. before refactoring a method) and NOT TO USE clauses that name the correct alternatives (gograph_implementers for the inverse, gograph_node/gograph_public for interface declarations). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_literalsARead-onlyIdempotent
Find every composite-literal initialization site for a named Go struct — all locations where Foo{...} syntax is used to construct the struct. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: Before adding a required field to a struct — every site returned will fail to compile if the new field has no default; run this first to scope the migration blast radius. NOT TO USE: For finding string or integer magic values (use gograph_envs or grep for those); for factory functions that return the struct (use gograph_constructors). RETURNS: All file paths and line numbers where the named struct is composite-initialized; empty when the struct has no direct initialization sites.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| struct | Yes | The name of the struct (e.g., 'User') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), but the description adds non-obvious behavior: a freshness check before the call, a refresh in the requested analysis mode, and CHA/SSA retry on precise graphs after source changes. That is genuine context beyond structured fields, though it could clarify result caching or pagination interaction.
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?
Front-loads the core purpose, then uses labeled WHEN/NOT/RETURNS blocks that are easy to scan. Slightly dense, particularly the analysis-mode freshness sentence, but every section earns its place.
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, the description supplies the return contract itself (file paths and line numbers, empty when no sites), plus usage conditions and behavioral caveats. Nothing an agent needs to invoke and interpret this tool is missing.
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 100%, so the struct, limit, and cursor semantics are already fully documented in the schema (opaque next_cursor, byte-budget caveat). The description reinforces the 'named struct' concept but adds no syntax or format detail beyond the schema, so baseline 3 applies.
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?
States a precise verb (find) and resource (composite-literal initialization sites for a named Go struct) and clarifies with concrete syntax Foo{...}. It distinguishes itself from siblings by naming gograph_constructors and gograph_envs, so an agent can separate it without opening other schemas.
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?
Explicit WHEN TO USE (scoping a required-field migration blast radius) and NOT TO USE sections that name the correct alternatives for excluded cases (gograph_envs/grep for magic values, gograph_constructors for factory functions). No inference required to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_mocksARead-onlyIdempotent
Find structs in *_test.go files that implement a named interface — test doubles, mocks, and stubs. Equivalent to gograph_implementers with test_only=true; kept for compatibility. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When writing tests and wanting to find existing mock implementations before creating a new one. NOT TO USE: For production interface implementers (use gograph_implementers without test_only); prefer gograph_implementers(test_only=true) for new code. RETURNS: Test-file struct names implementing the interface with file locations; empty when no test mocks exist for the interface.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| interface | Yes | The name of the interface (e.g., 'AuthService') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/no-destructive, so 'Read-only; no side effects' is redundant. However the description adds genuinely non-obvious behavior beyond the annotations: the server checks freshness before the call, refreshes in the requested analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes. The empty-result behavior is also disclosed.
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?
Front-loaded with the core purpose before the equivalence note, then cleanly sectioned as WHEN TO USE / NOT TO USE / RETURNS. Slightly dense in the middle where the graph-freshness mechanics are packed into one long sentence, but 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, the RETURNS section correctly compensates by describing the return shape (test-file struct names with file locations, empty when none exist). Purpose, alternatives, behavior, and return values are all covered for a 3-parameter tool.
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 100%, and the schema already documents limit, cursor, and interface (including the 'AuthService' example), so the baseline is 3. The description adds nothing further about parameter syntax, pagination usage, or how cursor interacts with the freshness/retry behavior described.
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?
States a specific verb and resource ('Find structs in *_test.go files that implement a named interface') and sharpens it with the domain gloss ('test doubles, mocks, and stubs'). It also declares its exact equivalence to the sibling gograph_implementers(test_only=true), so an agent can distinguish it from siblings without opening either schema.
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?
Contains explicit WHEN TO USE and NOT TO USE sections, names the alternative (gograph_implementers without test_only) for the production case, and even recommends the canonical call for new code. There is no ambiguity left about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_mutateARead-onlyIdempotent
Find struct-field and package-global mutation sites. Use Type.Field to exclude same-named fields on unrelated types; ordinary local-variable assignments are excluded. The MCP server refreshes in the current requested analysis mode; a precise graph adds ++/+=, pointer-alias, atomic/sync/wrapper, and channel mutations and re-runs that analysis after source edits. Read-only; no side effects. WHEN TO USE: Diagnosing state changes or auditing mutability. NOT TO USE: For field declarations (gograph_fields) or whole-struct initialization (gograph_literals). RETURNS: Mutation locations and indirect mutator method names when applicable.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | The field name to search for mutations (e.g., 'Status') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description redundantly restates 'Read-only; no side effects'. It does, however, add real behavioral context: the server re-refreshes in the requested analysis mode, a precise graph widens detection (++/+=, pointer-alias, atomic/sync/wrapper, channel), and analysis re-runs after source edits.
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?
Front-loaded purpose followed by labeled WHEN/NOT/RETURNS sections make it scannable. Slightly dense in the middle sentence about analysis modes, but every sentence carries information and nothing is padding.
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?
Covers selection constraints, freshness/re-analysis behavior, and return contents (mutation locations plus indirect mutator method names), which compensates for the absent output schema. Pagination is documented in the schema via limit/cursor.
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 100%, so the baseline is 3. The description goes further by explaining the 'Type.Field' qualified form for the required field parameter, which disambiguates same-named fields across unrelated types, and by stating the exclusion of local-variable assignments.
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?
Opens with a specific verb+resource: 'Find struct-field and package-global mutation sites', which is a distinct capability from siblings like gograph_fields or gograph_usages. The scope qualifiers (excludes ordinary local-variable assignments) further sharpen what is returned.
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?
Explicit WHEN TO USE ('Diagnosing state changes or auditing mutability') and NOT TO USE clauses that name the correct alternatives: gograph_fields for declarations, gograph_literals for whole-struct initialization. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_nodeARead-onlyIdempotent
Fetch AST metadata for a named symbol, package, or file: kind, file path, line number, full signature, doc comment, and struct fields if applicable. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When you need structural metadata (kind, signature, line number) without the full source body — lighter than gograph_source for metadata-only lookups. NOT TO USE: For full source code (use gograph_source); for call relationships (use gograph_callers/gograph_callees). RETURNS: Node properties array with kind, file, line, and signature; empty when the name is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The exact symbol, package path, or Go file name to inspect (e.g., 'Graph', 'internal/search', 'server.go') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds meaningful context: the MCP server checks freshness before the call, refreshes in the requested analysis mode, and precise graphs retry CHA/SSA after source changes. It also states empty return when the name is not 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?
Purpose is front-loaded, followed by WHEN TO USE, NOT TO USE, and RETURNS sections. The structure is clean and every sentence contributes selection or behavior 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?
No output schema exists, but the description explains the return shape (node properties array with kind, file, line, signature) and the empty-result case. Combined with the schema covering pagination parameters, it is complete for correct 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 100%, so the schema already documents name, limit, and cursor in detail. The description's 'symbol, package, or file' phrase loosely maps to the name parameter but adds no syntax or format detail beyond the schema, making baseline 3 appropriate.
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 verb and resource (fetch AST metadata for symbol/package/file) and enumerates returned fields. It explicitly distinguishes itself from gograph_source and gograph_callers/gograph_callees, so an agent can choose correctly without opening schemas.
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 has explicit WHEN TO USE and NOT TO USE sections, names the relevant alternatives (gograph_source, gograph_callers, gograph_callees), and gives the selecting condition (metadata-only lookups vs full source or call relationships).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_orphansARead-onlyIdempotent
Find functions and methods unreachable from runtime roots (main/init), test/benchmark/fuzz roots, HTTP route handlers, and eligible externally callable exports; exports confined under internal/ are not roots. Uses full BFS reachability. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: During code cleanup or dead-code audits. NOT TO USE: For checking one symbol's usages (use gograph_usages or gograph_callers). RETURNS: Orphan symbols with package paths and file locations; empty means no unreachable code was detected.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial beyond that: the MCP server checks freshness and refreshes in the requested analysis mode, and precise/precise_fallback graphs retry CHA/SSA after source changes. It also discloses the algorithm (full BFS reachability), which affects result interpretation.
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?
Front-loaded purpose, then labeled WHEN TO USE / NOT TO USE / RETURNS sections that make scanning easy. Dense but every clause carries information; the middle sentence on freshness/retry is somewhat heavy but genuinely useful.
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?
No output schema exists, yet the description covers returns (orphan symbols with package paths and file locations, empty = none detected) plus pagination via the schema. For a read-only analysis tool, an agent has everything needed to call and interpret it.
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 100% for both params (limit, cursor), and the schema already explains the byte budget and opaque cursor semantics. The description adds no parameter detail beyond that, so baseline 3 applies.
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?
States a specific verb+resource ('Find functions and methods unreachable from runtime roots') and precisely enumerates what counts as a root (main/init, test/benchmark/fuzz, HTTP route handlers, eligible external exports, with internal/ exclusion). An agent can distinguish this dead-code detector from gograph_usages, gograph_callers, and gograph_untested without opening a schema.
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?
Explicit WHEN TO USE ('During code cleanup or dead-code audits') and NOT TO USE with named alternatives ('For checking one symbol's usages use gograph_usages or gograph_callers'). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_pathARead-onlyIdempotent
Find the best call chain from one symbol to another. Competing paths rank exact before possible, then shorter, production before tests, typed resolution before heuristics, with a deterministic canonical tie-breaker. The MCP server refreshes source analysis before the call. Read-only; no side effects. WHEN TO USE: To confirm reachability between non-adjacent symbols. NOT TO USE: For all transitive upstream callers (use gograph_impact). RETURNS: from, to, found, and steps[]; with mermaid=true, Mermaid flowchart text.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The target symbol name | |
| from | Yes | The starting symbol name | |
| mermaid | No | Return Mermaid flowchart text instead of structured JSON |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine beyond-annotation context: the ranking rules (exact before possible, shorter, production before tests, typed before heuristics), the canonical tie-breaker, and that the server refreshes source analysis before the call. It does not cover error/failure behavior, which keeps it from a 5.
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?
Front-loads the purpose, then organizes ranking rules, mutation/safety note, and WHEN/NOT/RETURNS blocks. Slightly dense with the ranking sentence, but each clause carries meaning and nothing is padding.
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?
There is no output schema, so the explicit RETURNS section (from, to, found, steps[], plus Mermaid text when mermaid=true) fills that gap. Combined with usage routing and ranking behavior, an agent has everything needed to call it 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 100%, so all three parameters are already documented in the schema. The only added hint is 'with mermaid=true, Mermaid flowchart text,' which largely restates the mermaid parameter's own schema description. Baseline 3 when the schema does the heavy lifting.
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?
States a specific verb and resource: 'Find the best call chain from one symbol to another.' It also distinguishes itself from the sibling gograph_impact by name, so an agent can route correctly without opening schemas.
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?
Contains explicit WHEN TO USE ('confirm reachability between non-adjacent symbols') and NOT TO USE ('for all transitive upstream callers, use gograph_impact') sections, naming the alternative and the condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_planARead-onlyIdempotent
Generate a structured pre-edit plan for a target symbol: which symbols to read first, which tests cover them, which routes and env vars they touch, and whether the change is public-API or SQL-touching. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Set with_context=true to inline full source+callers+callees for each symbol to inspect — eliminates follow-up gograph_context calls. WHEN TO USE: Before multi-file refactoring or architectural changes to understand scope upfront. NOT TO USE: For trivial single-line fixes; for post-edit verification (use gograph_review instead). RETURNS: JSON with inspect_first[], tests[], routes[], env[], and a risk object (public_api, touches_sql, etc.); with with_context=true, also includes inspect_contexts[] with full per-symbol bundles. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | The name of the symbol you intend to modify (supports short name 'ValidateToken', dot-notation 'graph.Graph', or fully-qualified ID) | |
| uncommitted | No | Set to true to generate a global plan for all currently uncommitted changes across the repository | |
| with_context | No | If set to true, bundles full context, source code, callers, callees, and architectural roles for each symbol to be inspected |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, yet the description adds real behavioral context: the server checks freshness before the call, retries CHA/SSA for precise modes, uncommitted modes compare declarations against HEAD, and consumers refuse incomplete comparisons or missing/ambiguous graph identities. This is disclosure well beyond the structured hints.
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?
Front-loaded with the core purpose and well-organized into WHEN/NOT/RETURNS blocks. It is dense and long, and 'Read-only; no side effects' partially restates the readOnlyHint annotation, but nearly every sentence carries actionable 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?
With no output schema, the description compensates by fully describing the JSON return shape (inspect_first[], tests[], routes[], env[], risk object, inspect_contexts[] with with_context). Combined with the freshness and refusal semantics, an agent has everything needed to call it 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 coverage is 100%, so the baseline is 3, but the description adds genuine meaning: with_context=true inlines full source/callers/callees and eliminates follow-up gograph_context calls, and uncommitted=true produces a global plan for all uncommitted changes. Only the symbol parameter's short/dot/fully-qualified forms are left to the schema.
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?
States a specific verb ('Generate') and resource ('structured pre-edit plan for a target symbol') and enumerates the plan's contents (symbols to read first, tests, routes, env vars, public-API/SQL risk). It distinguishes itself from siblings by naming gograph_review and gograph_context explicitly.
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 WHEN TO USE / NOT TO USE block is explicit: use before multi-file refactoring or architectural changes; do not use for trivial single-line fixes or post-edit verification, and it routes the latter to gograph_review. The with_context guidance further tells the agent how to avoid follow-up gograph_context calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_publicARead-onlyIdempotent
List all exported (public) symbols of a specific package, including functions, methods, types/interfaces, variables, and constants. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When reviewing a package's public contract before changing it, building integration documentation, or checking what a package exposes to callers. NOT TO USE: For unexported/private symbols (use gograph_node or gograph_focus); for API drift detection against a baseline (use gograph_api). RETURNS: List of exported symbol names with kinds and file locations; empty when the package has no exports or is not found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| package | Yes | The package name or path to inspect (e.g., 'internal/auth') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description goes beyond that by disclosing the server-side freshness check and refresh in the current analysis mode, and the CHA/SSA retry after source changes, plus empty-result semantics — meaningful operational behavior not captured by 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?
Front-loads the core purpose, then uses clearly delimited WHEN TO USE / NOT TO USE / RETURNS blocks. Each sentence carries distinct information (scope, freshness behavior, routing, empty-result behavior) with no 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?
With no output schema, the description compensates by describing the return shape (exported symbol names with kinds and file locations, empty when no exports or package not found). Combined with annotation coverage and freshness notes, an agent has everything needed to call it 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 100%, so package, limit, and cursor are already documented in the schema (including the byte-budget note and opaque cursor semantics). The description adds no parameter-level detail beyond that, so the baseline 3 applies.
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?
States a specific verb and resource ('List all exported (public) symbols of a specific package') and enumerates the kinds returned (functions, methods, types/interfaces, variables, constants). It also scopes itself against siblings by naming the private-symbol and drift alternatives, so an agent can distinguish it without opening a schema.
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?
Contains explicit WHEN TO USE (reviewing a package's public contract, integration docs, checking exposure) and NOT TO USE conditions with named alternatives: gograph_node/gograph_focus for unexported symbols and gograph_api for drift against a baseline. This is textbook routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_queryARead-onlyIdempotent
Search the graph index for symbols, packages, files, and import edges that match one or more keyword substrings. Multiple terms use OR semantics, matching CLI query term.... The MCP server refreshes source analysis before the call. Read-only; no persistent side effects. WHEN TO USE: During initial exploration when you have a keyword or feature name but do not know its package. NOT TO USE: When you already know the exact symbol (use gograph_source or gograph_node); for package dependency trees (use gograph_deps). RETURNS: Matching symbols, files, and imports; empty when no terms match.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | One keyword search term (e.g. 'AuthService') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| terms | No | Optional list of keyword terms combined with OR semantics | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: the server refreshes source analysis before the call, multiple terms use OR semantics, and results are empty when no terms match. It stops short of describing pagination/cursor behavior, which keeps it from a 5.
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?
Front-loads the core purpose, then uses labeled WHEN/NOT/RETURNS sections. Each sentence carries distinct information and there is no redundancy or 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, the description steps in to describe return values (matching symbols, files, imports; empty on no match) and pagination is hinted via the cursor semantics. For a search tool with full annotation and schema coverage, nothing an agent needs to invoke it correctly is missing.
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 100%, so the schema already documents term, terms (OR semantics), limit (byte budget caveat), and cursor. The description largely restates the OR semantics already present in the schema and adds little new parameter-level meaning. Baseline 3 is appropriate.
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?
States a specific verb (Search) and a well-scoped resource (graph index for symbols, packages, files, and import edges), plus the matching mechanism (keyword substrings). An agent can distinguish it from siblings like gograph_source and gograph_deps without opening any schema.
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?
Explicit WHEN TO USE (initial exploration with a keyword but unknown package) and NOT TO USE clauses that name the exact alternatives (gograph_source, gograph_node for known symbols; gograph_deps for dependency trees). Routing is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_returnusageARead-onlyIdempotent
Show how each caller uses the return value(s) of a named function: discarded, assigned, partially ignored, returned upstream, or passed directly to another call. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: Before changing a function's return signature — see which callers ignore the error or only use some return values. NOT TO USE: For error propagation tracing (use gograph_errorflow); for finding all callers without usage detail (use gograph_callers). RETURNS: List of call sites with usage classification (discarded/assigned/partially_ignored/returned/passed); empty when the function has no callers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. | |
| function | Yes | The function name to analyse (e.g., 'ValidateToken') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds meaningful non-annotation context: freshness checking, conditional CHA/SSA retry after source changes, and the empty-result case, though it also redundantly repeats 'Read-only; no side effects.'
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 front-loaded and structured with WHEN TO USE, NOT TO USE, and RETURNS labels. It is mostly efficient, but repeats the read-only/no-side-effects point already covered by annotations and includes implementation-level CHA/SSA detail that is useful but not tightly edited.
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, the description supplies the return shape, classification values, and empty-result behavior. It also covers freshness and retry behavior, making the definition complete enough for an agent to call the tool and interpret its results.
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 100%, so the schema already documents function, limit, and cursor semantics. The description names the function parameter and return classifications but adds no syntax, constraints, or edge cases beyond what the schema provides.
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?
States a specific verb ('Show how each caller uses') and resource ('return value(s) of a named function'), with clear distinctions from sibling tools in the NOT TO USE section. An agent can tell it apart from gograph_callers and gograph_errorflow without opening schemas.
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 explicit WHEN TO USE guidance tied to a concrete scenario (changing a function's return signature) and NOT TO USE guidance naming the alternative tools gograph_errorflow and gograph_callers. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_reviewARead-onlyIdempotent
Summarize the scope and risk profile of a change: which symbols changed, which tests cover them, which routes and env vars they touch, and whether SQL is involved. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Requires either symbol or uncommitted=true. WHEN TO USE: After editing — as a post-edit verification step before committing; confirms the blast radius matches expectations. Use uncommitted=true to review all current unstaged changes at once. NOT TO USE: For boundary constraint enforcement (use gograph_boundaries); for pre-edit planning (use gograph_plan). RETURNS: JSON with changed_symbols[], tests[], routes[], env[], errors[], and a risk object (public_api, touches_sql, touches_routes, touches_env). Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | The name of the target symbol to run the design review for (e.g. 'AuthService') | |
| uncommitted | No | Set to true to review all uncommitted/modified changes in the repository |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: freshness checking and refresh behavior, CHA/SSA retry on the precise graph, mode-dependent semantics ('Uncommitted modes compare declarations against HEAD, including selected untracked Go files'), and refusal conditions (incomplete comparisons, deleted declarations, missing/ambiguous identities). This is rich behavioral disclosure.
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?
Front-loaded with the core purpose and clearly segmented into WHEN TO USE / NOT TO USE / RETURNS sections, so structure aids scanning. It is somewhat verbose, with internal engine details ('precise and precise_fallback graphs retry CHA/SSA', 'Current-graph consumers refuse...') that are informative but border on excess for a selection-time description.
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 present, the description compensates by describing the RETURNS shape (changed_symbols[], tests[], routes[], env[], errors[], risk object with public_api/touches_sql/touches_routes/touches_env). Combined with usage rules and refusal conditions, an agent has everything needed for correct 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 coverage is 100%, so the schema documents both params and the baseline is 3. The description adds value the schema lacks: it states the mutual requirement ('Requires either symbol or uncommitted=true') and clarifies what uncommitted=true actually reviews ('all current unstaged changes at once'), which is more precise than the schema's 'uncommitted/modified changes'.
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 a specific verb+resource: 'Summarize the scope and risk profile of a change', and immediately enumerates the dimensions covered (changed symbols, covering tests, routes, env vars, SQL). It further differentiates itself from siblings by explicitly naming gograph_boundaries and gograph_plan as alternatives for other jobs.
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?
Contains explicit WHEN TO USE guidance ('After editing — as a post-edit verification step before committing') and a NOT TO USE section routing to gograph_boundaries for boundary enforcement and gograph_plan for pre-edit planning. It also states the invocation condition: 'Requires either symbol or uncommitted=true', and explains the uncommitted=true usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_riskARead-onlyIdempotent
Evaluate the change risk profile of target symbol(s) or uncommitted changes. Combines blast radius, cyclomatic complexity, test coverage, and downstream environment/SQL dependencies into a normalized 0–100 risk score and verdict. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. Requires either symbol or uncommitted=true. WHEN TO USE: Before committing edits or when planning changes to understand the technical risk. NOT TO USE: For post-edit review checklist generation (use gograph_review); for pre-edit plan generation (use gograph_plan). RETURNS: JSON with title, results[] containing risk scores, verdicts, and breakdown metrics, and optional message. Uncommitted modes compare declarations against HEAD, including selected untracked Go files. Current-graph consumers refuse incomplete comparisons, deleted declarations requiring historical caller evidence, and missing/ambiguous graph identities. Inspect changes --git REF for the declaration census; rebuild before traversing newly added symbols.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | The name of the target symbol to run the risk evaluation for (e.g. 'AuthService') | |
| uncommitted | No | Set to true to evaluate risk for all uncommitted/modified changes in the repository |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent, and the description adds real behavioral context: freshness checking before the call, graph-mode retries (CHA/SSA), and current-graph consumer refusal conditions (incomplete comparisons, deleted declarations, ambiguous identities). This goes well beyond the annotation surface.
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?
Front-loads purpose and organizes content into usage, exclusion, and return sections. However, the trailing sentences about graph consumers, declaration census, and rebuilds are dense implementation detail that could crowd out agent-relevant guidance.
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, the description supplies a RETURNS section (title, results[], scores, verdicts, breakdown metrics, optional message) and covers uncommitted-mode behavior. An agent has enough to call and interpret it 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 coverage is 100% so the baseline is 3, but the description adds a meaningful constraint not captured by the schema: 'Requires either symbol or uncommitted=true' (schema marks neither required). This clarifies mutual-requirement semantics for the two params.
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?
States a specific verb and resource ('Evaluate the change risk profile of target symbol(s) or uncommitted changes') and spells out what the score combines (blast radius, complexity, coverage, dependencies). The explicit WHEN/NOT TO USE clauses naming gograph_review and gograph_plan let an agent distinguish it from the large sibling set without opening schemas.
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 explicit 'WHEN TO USE: Before committing edits...' and 'NOT TO USE: ... use gograph_review ... use gograph_plan' guidance. The routing conditions are unambiguous and name the concrete alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_routesARead-onlyIdempotent
List a deterministic bounded page of HTTP routes with methods, URL patterns, handler names, and source locations. Production routes are returned by default; include_tests=true adds *_test.go registrations. Optional term matches method/path, handler, or file. module selects an exact module path/directory, a unique nested-module directory basename, or the repository directory name for a root module. limit defaults to 100 and is restricted to 1-200; next_cursor continues the same filtered census. Each page is also bounded to 64 KiB so the result stays directly consumable instead of spilling to an out-of-band file. Constant nested Gin/Echo/Fiber Group prefixes and Chi Route closure prefixes are composed; Gin/Fiber use the final variadic argument as the terminal handler, while Echo uses the handler immediately after the path. Dynamically computed prefixes remain unresolved. The MCP server refreshes source analysis before this call. Read-only; no side effects. WHEN TO USE: To inventory one service/module or find a route before gograph_endpoint. NOT TO USE: For a handler's downstream call chain (use gograph_endpoint). RETURNS: gograph.routes.v1 JSON with total, returned, truncated, routes[], and next_cursor when more matches exist.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional case-insensitive substring matched against method/path, handler, or file | |
| limit | No | Maximum rows in this page, 1-200 (default: 100); the 64 KiB byte budget may return fewer | |
| cursor | No | Opaque next_cursor from the previous gograph_routes result; reuse the same filters | |
| module | No | Optional exact module path/directory, unique nested-module directory basename, or repository directory name for a root module (for example identuum-idp) | |
| include_tests | No | Include routes registered in *_test.go files; false by default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/no-destructive, so the bar is lower, yet the description adds substantial non-annotation behavior: the server refreshes source analysis before the call, pages are capped at 64 KiB to avoid spilling to an out-of-band file, Gin/Fiber vs Echo handler-resolution rules differ, constant Group/Route prefixes are composed, and dynamic prefixes stay unresolved. These are real operational traits an agent cannot infer from the schema or hints.
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?
Front-loaded with purpose, then caveats, then WHEN TO USE/NOT TO USE and RETURNS. Dense but every sentence carries information; the framework-specific handler-resolution detail is the only passage bordering on over-explanation for a listing tool.
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?
No output schema exists, so the description compensates by naming the gograph.routes.v1 payload shape (total, returned, truncated, routes[], next_cursor). Combined with pagination limits, test inclusion, and module resolution semantics, an agent has everything needed to call it 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 coverage is 100%, so the baseline is 3; the description goes slightly beyond by framing cursor reuse as continuing the 'same filtered census' and explaining that limit interacts with the 64 KiB byte budget (the page may return fewer than limit rows). Most param text overlaps the schema, so it is not a full 5.
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?
Specific verb (List) + resource (HTTP routes) + explicit scope (deterministic bounded page) with the returned fields enumerated. The WHEN TO USE / NOT TO USE block names gograph_endpoint as the sibling for downstream call chains, so an agent can distinguish it from the surrounding gograph_* tools without opening any schema.
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?
Contains an explicit WHEN TO USE (inventory one service/module, find a route before gograph_endpoint) and NOT TO USE (handler downstream call chain → use gograph_endpoint). The condition selecting the alternative is stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_schemaARead-onlyIdempotent
Find Go structs that declare a mapping to a specific database table via struct tags (e.g., db:"table_name", gorm:"table:table_name"). The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: When tracing which Go types represent a database table, or before writing a migration to understand the current ORM model. NOT TO USE: For non-tagged Go structs used as query results (use gograph_fields or gograph_query instead). RETURNS: Matching struct names with package paths and file locations; empty when no structs map to the named table.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| table | Yes | The table or schema name to search for in struct tags (e.g., 'users', 'roles') | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description is consistent ("Read-only; no side effects"). It adds genuinely new behavioral context beyond annotations: freshness checking before the call, refresh in the requested analysis mode, and CHA/SSA retry after source changes in precise modes.
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?
Front-loaded with the core purpose, then clearly sectioned WHEN TO USE / NOT TO USE / RETURNS. Efficient overall, though the freshness/CHA-SSA sentence is dense and slightly tangential to selection.
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?
No output schema exists, and the description supplies the return shape (struct names, package paths, file locations, empty result semantics). Combined with purpose, usage, and behavioral notes, an agent has everything needed to call it 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 100%, so the schema already documents table, limit, and cursor with clear semantics. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.
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 verb (find) and resource (Go structs mapping to a DB table via struct tags) with concrete examples of the tag forms (db:"table_name", gorm:"table:table_name"). It is clearly distinguishable from siblings like gograph_fields, gograph_query, and gograph_sql.
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?
Explicit WHEN TO USE (tracing which types represent a table, pre-migration ORM model inspection) and NOT TO USE (non-tagged structs as query results) with named alternatives gograph_fields and gograph_query. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_session_auditARead-onlyIdempotent
Review and grade agent compliance (Plan rule, Review rule, Composability/Efficiency) and tool success rates. Session IDs are strictly validated and only regular repository-confined logs are read. No additional prerequisite once the MCP server is running. WHEN TO USE: After ending a session to obtain compliance metrics and recommendations. RETURNS: Audited session details and grade.
| Name | Required | Description | Default |
|---|---|---|---|
| json | No | Set to true to return structured JSON format instead of human-readable ASCII layout. | |
| session_id | No | Optional session ID to audit. If not supplied, audits the most recent session in the repository. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable behavior beyond annotations: strict Session ID validation, reading only repository-confined logs, no additional prerequisites, and a summary of return values. This enriches the agent's understanding without contradicting 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?
The description is compact and well-structured with explicit labels (WHEN TO USE, RETURNS). Every sentence contributes meaningful information, with no redundancy or 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?
For a simple tool with two optional parameters and no output schema, the description covers the purpose, usage context, behavioral guarantees, and returns. It is self-sufficient even without additional structured context.
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 100%, so the schema fully documents the parameters. The description adds no parameter-specific semantics, but the baseline of 3 is appropriate given the high schema coverage.
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 verb ('Review and grade') and resource ('agent compliance' and 'tool success rates'), with explicit grading criteria (Plan rule, Review rule, Composability/Efficiency). This clearly distinguishes it from sibling session tools like gograph_session_create or gograph_session_cleanup.
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 provides explicit context: 'WHEN TO USE: After ending a session to obtain compliance metrics and recommendations.' This clearly indicates the timing but does not explicitly name alternatives or when not to use, which would merit a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_session_cleanupADestructiveIdempotent
Delete stale inactive regular session telemetry JSONL logs without following linked repository paths. If no session is active, it deletes all eligible logs; an active log is preserved. MCP annotations mark this operation mutating and destructive. No prerequisites. WHEN TO USE: Call after auditing to keep the repository clean. RETURNS: Number of deleted session files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive and non-read-only behavior. The description adds useful context: active logs are preserved, linked repository paths are not followed, and it returns the number of deleted files. The redundant note that annotations mark it destructive is not additive but does not detract.
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?
Description is structured with WHEN TO USE and RETURNS sections, making it easily parseable. However, the sentence 'MCP annotations mark this operation mutating and destructive' is redundant with the structured annotations, which slightly reduces conciseness.
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 fully explains what is deleted, conditional behavior (active log preserved), prerequisites, and return value. For a zero-parameter destructive tool, this is sufficient for safe invocation, though an explicit note on idempotence (already in annotations) could have made it a 5.
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 zero parameters, so baseline is 4. The description appropriately notes 'No prerequisites', which clarifies that no arguments are needed and the call is unconditional aside from session state.
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 states the tool deletes 'stale inactive regular session telemetry JSONL logs' and scopes it 'without following linked repository paths'. It differentiates from sibling session tools (audit, create, end) by focusing on cleanup, so purpose is 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?
Provides clear usage context with 'WHEN TO USE: Call after auditing to keep the repository clean' and 'No prerequisites'. It gives a solid recommendation but does not explicitly discuss alternatives or when not to use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_session_createA
Start a telemetry audit session for tracking agent compliance and tool success metrics. Writes only regular, repository-confined session state under .gograph/sessions and refuses linked storage; MCP annotations mark it mutating and non-idempotent. No prerequisites once the MCP server is running. WHEN TO USE: Call once at the start of a multi-step coding task to track your work. NOT TO USE: When a session is already active. RETURNS: Structured message with the newly generated session ID.
| Name | Required | Description | Default |
|---|---|---|---|
| custom_word | No | Optional custom word prefix to incorporate in the timestamped session ID (e.g. 'implement_feature') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutating and non-idempotent, and the description reinforces this while adding specifics: it writes only repository-confined state under .gograph/sessions and refuses linked storage. It also clarifies there are no prerequisites. This adds context beyond the annotations without contradiction.
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 structured with labeled sections and front-loads the purpose. The sentence about 'MCP annotations mark it mutating and non-idempotent' is redundant since annotations are visible, but it doesn't significantly bloat the text. Overall, it earns its place.
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 single-parameter tool with no output schema, the description covers purpose, when to use/not use, side effects (write location and storage refusal), and return value (session ID). There are no gaps for the agent to select and invoke 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?
The input schema already provides 100% coverage for the only parameter, custom_word, with a clear description. The tool description adds no parameter-specific guidance, but the schema fully compensates. Baseline 3 is appropriate.
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 states it 'Start[s] a telemetry audit session' for tracking compliance and success metrics, distinguishing it from sibling session tools like audit, cleanup, and end. It also specifies the resource scope (session state under .gograph/sessions), making it 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?
WHEN TO USE and NOT TO USE sections give explicit start-of-task and active-session conditions. It mentions no prerequisites once the MCP server is running, which is useful. However, it does not name alternative sibling tools (e.g., gograph_session_audit), so differentiation is less explicit than it could be.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_session_endA
End the active telemetry session cleanly, append its end record, and remove the active-session pointer through repository-confined regular-file operations. MCP annotations mark it mutating and non-idempotent. No additional prerequisite once the MCP server is running. WHEN TO USE: Call once after you have completed all edits and post-edit reviews. NOT TO USE: When no session is active. RETURNS: Message confirming ending of the session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by detailing the side effects: appending an end record and removing the active-session pointer via 'repository-confined regular-file operations'. It also notes there are no additional prerequisites. While it explicitly references the annotations (mutating, non-idempotent), it adds useful behavioral context that the bare annotations lack.
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 well-structured and succinct, using clearly labeled sections (WHEN TO USE, NOT TO USE, RETURNS) with no redundant or extraneous information. Every sentence contributes essential context.
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 no parameters and no output schema, the description fully covers what an agent needs: the action, the effects, the prerequisites, when to use/not use, and the return message. It is complete for correct 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?
The tool has zero parameters, and the schema already reflects this with 100% coverage. The description adds no parameter information because none exists. Following the baseline for 0-parameter tools, a score of 4 is appropriate.
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 ending the active telemetry session and specifies the exact actions: 'append its end record' and 'remove the active-session pointer'. It distinguishes itself from related session tools like gograph_session_create and gograph_session_cleanup by focusing on termination.
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?
Explicit WHEN TO USE and NOT TO USE sections provide unambiguous guidance: call once after edits and reviews, and avoid when no session is active. This tells the agent exactly when to invoke the tool and when to avoid it, satisfying the requirement for clear usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_skeletonARead-onlyIdempotent
Emit the full repository's API signatures with function bodies stripped — struct definitions, interface declarations, and function/method signatures only. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WARNING: output can be very large on big repositories — consider using gograph_public per package for targeted queries. WHEN TO USE: When an LLM needs a compact map of the entire codebase's shape without reading source files individually. NOT TO USE: For full implementations (use gograph_source); for a single package (use gograph_public). RETURNS: Multi-line text of all stripped declarations across all packages; always non-empty when the graph has symbols.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds freshness checking, refresh behavior, and 'Read-only; no side effects', which is consistent and extends beyond 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?
Efficiently structured with clear sections: main description, warning, when/not to use, returns. Front-loaded with purpose. Every sentence adds value.
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 no output schema, description explains return type and non-empty guarantee. Covers behavior, warnings, usage guidance, and alternatives. Complete for a read-only, parameterless tool.
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?
No parameters in schema; baseline 4. Description does not need to add parameter info as zero params.
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?
Description states verb 'Emit' and resource 'full repository's API signatures with function bodies stripped', clearly distinguishing from siblings like gograph_public and gograph_source.
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?
Explicit WHEN TO USE and NOT TO USE sections with alternative tools named: 'use gograph_source' and 'use gograph_public'. Also warns about large output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_sourceARead-onlyIdempotent
Retrieve verbatim Go source for a named function, method, struct, interface, type, variable, or constant, including complete bodies or declarations. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Source reads are confined to regular .go files beneath the analyzed repository and reject symlink path components. Read-only; no side effects. WHEN TO USE: When you need a specific implementation or declaration in full without loading a large file — a targeted alternative to reading the whole file. NOT TO USE: For call hierarchy information (use gograph_callers/gograph_callees); for AST metadata without the full source (use gograph_node). RETURNS: Raw Go source blocks with file paths and line numbers. Text and gograph.read.v1 structured content both carry the source or a named refusal: absent symbol, ambiguity with candidates, unsafe/unreadable source, invalid indexed range, or source exceeding 65536 bytes (with its size).
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | The name of the symbol to retrieve source for (supports short name 'ValidateToken', dot-notation 'graph.Graph', or fully-qualified ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive, closed-world), the description discloses unusual behavior: a pre-call freshness check with mode-aware CHA/SSA retries, confinement to regular .go files under the repo, symlink path rejection, and a 65536-byte size cap. This is far more than the annotations carry and materially affects invocation expectations.
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?
Front-loaded with the core action, then clearly delimited WHEN TO USE / NOT TO USE / RETURNS sections. Despite its length every clause is functional; there is no filler or repetition.
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?
No output schema exists, yet the description fully compensates by explaining the return shape (raw Go source blocks with file paths and line numbers, mirrored in text and gograph.read.v1 structured content) and enumerating named refusal cases. An agent has everything needed to call and interpret results.
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 100% and the single 'symbol' parameter already documents short name, dot-notation, and fully-qualified ID forms. The description adds only a restatement of symbol kinds, which partially overlaps the enum of retrievable kinds but adds no new format or syntax detail beyond the schema, so the baseline 3 applies.
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?
States a specific verb (retrieve) and resource (verbatim Go source) with an enumerated scope of symbol kinds (function, method, struct, interface, type, variable, constant) and clarifies bodies vs declarations. The NOT TO USE section explicitly separates it from gograph_callers/gograph_callees and gograph_node, so an agent can disambiguate without opening schemas.
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 explicit WHEN TO USE (targeted alternative to reading a whole file) and NOT TO USE clauses naming the correct alternatives for call hierarchy and AST metadata. Both the condition and the routing target are spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_sqlARead-onlyIdempotent
Return one bounded gograph.sql.v1 page of static PostgreSQL query literals with operation, read/write/DDL access, referenced tables, enclosing function, module ownership, and source location. Extraction covers direct literals plus statically resolvable local or same-file package const/var declarations, straight-line assignments, and bounded string concatenations. The MCP server checks freshness before this call and refreshes in the current requested analysis mode. Read-only; no side effects. Filters in different categories AND-compose; repeated values within tables, verbs, and accesses OR-compose. Tests remain included by default for backward compatibility; set no_tests=true for production-only results. CTEs resolve to their actual operation, data-modifying CTEs retain write access/table evidence, PostgreSQL UPSERT remains INSERT, and unsupported classification is explicit rather than guessed. WHEN TO USE: Audit database interactions, write paths, or queries touching a table. NOT TO USE: For ORM struct mappings (use gograph_schema) or runtime-generated SQL that is not a static literal. RETURNS: A deterministic page with total/returned/truncated/next_cursor and queries[].
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional case-insensitive raw SQL substring filter | |
| limit | No | Page size from 1 to 200; defaults to 100 | |
| verbs | No | Optional PostgreSQL operation filters; values OR-compose | |
| cursor | No | Opaque next_cursor from the previous gograph_sql page; reuse the same filters | |
| module | No | Optional exact module path/directory, unique nested basename, or repository basename for a root module | |
| tables | No | Optional PostgreSQL table selectors; values OR-compose and may be table or schema.table | |
| accesses | No | Optional statement access classes; values OR-compose | |
| function | No | Optional case-insensitive enclosing-function substring | |
| no_tests | No | Exclude SQL facts from *_test.go files; tests are included by default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior, so the safety profile is covered. The description adds useful operational context not in annotations: server-side freshness checks, refresh mode, AND/OR filter composition, test inclusion default, and classification rules for CTEs/UPSERT. However, it does not describe pagination mechanics beyond the return shape or any rate limit or auth requirements. It is solid, but not rich enough for a 4-5 given the lower bar with 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 front-loaded with the core behavior, then extraction scope, freshness, filter semantics, defaults, and finally WHEN/NOT TO USE and RETURNS blocks. It is dense but every section serves a distinct purpose. Minor inefficiency: the classification rules for CTEs and UPSERT feel like implementation notes that could be trimmed.
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 a 9-parameter, highly configurable query tool with no output schema, the description provides the missing pieces: filter combination logic, default test inclusion, pagination via cursor, freshness guarantees, and return page shape. An agent has everything needed to call it correctly and interpret the response.
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 100%, so every parameter is documented in the schema. The description only adds high-level filter composition rules (AND across categories, OR within) and the test-inclusion default; the rest of the semantics for term, module, function, cursor, and tables come from the schema. A baseline 3 is appropriate because the description does not meaningfully extend the schema's parameter documentation.
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?
Starts with a specific verb and resource: returns one bounded page of static PostgreSQL query literals, enumerated with precise fields. It distinguishes itself from siblings by explicitly routing ORM mappings to gograph_schema and runtime SQL elsewhere. An agent can identify this tool without opening the schema.
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?
Explicit WHEN TO USE and NOT TO USE sections name concrete scenarios, including the sibling (gograph_schema) to use instead for ORM mappings. The only missing negative is runtime-generated SQL, but that is called out as well, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_staleARead-onlyIdempotent
Check whether the trusted persisted graph index loaded from a regular, repository-confined .gograph/graph.json differs from the current selected-file inventory, effective Go build context, or selected source content digests. Modification times are returned only as diagnostics; legacy indexes without digests temporarily use the former mtime fallback until rebuilt. This tool intentionally does not refresh first; when the artifact is missing, unreadable, unsafe, or uses an unsupported source policy it compares against the startup auto-build fallback. Read-only; no side effects. WHEN TO USE: To decide whether CLI snapshot analysis or precise enrichment needs rebuilding. NOT TO USE: For module dependency freshness; for changed symbols (use gograph_changes). RETURNS: is_stale, graph_age, newest source metadata, changed_files, and build_context_changed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds critical behavioral details: mtime fallback, no auto-refresh, fallback comparison on missing/unreadable artifacts, and read-only/no side effects. It enriches the safety profile 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 well-structured with clear sections (WHEN TO USE, NOT TO USE, RETURNS) and each sentence conveys essential information. It is detailed yet not bloated, front-loading the core purpose before expansion.
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, the description explicitly lists return fields (is_stale, graph_age, newest source metadata, changed_files, build_context_changed) and explains fallback behavior. For a 0-parameter tool, it covers all necessary context for correct invocation and interpretation.
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 zero parameters, the baseline is 4. The description does not need to add parameter-level semantics, and it doesn't, but it stays at the baseline. No additional value is required here.
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: checking whether the trusted persisted graph index differs from selected-file inventory, build context, or content digests. It clearly names the resource (.gograph/graph.json) and defines the scope, and explicitly differentiates from gograph_changes via the NOT TO USE section, making it distinct among many sibling tools.
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?
WHEN TO USE and NOT TO USE sections provide explicit context (deciding whether rebuilding is needed) and exclusions (module dependency freshness, changed symbols with gograph_changes named as alternative). This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_statsARead-onlyIdempotent
Report trusted persisted-index health and counts without refreshing source analysis, or startup-fallback health when graph.json is missing, unreadable, unsafe, or uses an unsupported source policy: schema/build timestamps, complete/partial status, ast/precise/precise_fallback analysis status, scanned/parsed/reused/rebuilt-package/failure counts, and graph entity totals. Read-only; no side effects. WHEN TO USE: To validate the snapshot/fallback before relying on its data. NOT TO USE: For a live symbol profile (use gograph_node or gograph_complexity). RETURNS: Structured build health and repository counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and no destructive/intent, but the description adds valuable behavioral context: 'without refreshing source analysis' clarifies that this tool does not trigger recomputation, and it specifies fallback conditions (missing, unreadable, unsafe graph.json). No contradiction with annotations; the description enriches what annotations imply.
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 structured with clear markers (WHEN TO USE, NOT TO USE, RETURNS) and front-loaded with the core purpose. Every sentence provides essential information without fluff, balancing detail with readability.
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 no-parameter, read-only health-check tool, the description thoroughly covers what it reports, when it uses fallback, and what it does not do. It also mentions read-only and no side effects, making it complete given the tool's simplicity and the lack of output schema.
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 zero parameters, so the schema covers everything (coverage 100%). Per guidelines, baseline is 4 when no parameters exist. The description does not need to add parameter detail since there are none, and it doesn't.
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 states the tool reports trusted persisted-index health and counts, with specific details on what is included (schema/build timestamps, statuses, counts). It explicitly distinguishes from siblings by naming alternatives for live symbol profiling, making the purpose 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?
Explicit WHEN TO USE (validate snapshot/fallback before relying) and NOT TO USE sections with named alternatives (gograph_node, gograph_complexity). This provides clear direction on when this tool is appropriate versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_summaryARead-onlyIdempotent
Single-call codebase briefing: top 3 hotspots (most-called symbols), worst instability package, highest cyclomatic complexity function, total orphan count, and god-object count. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: At the very start of any session — replaces running gograph_hotspot + gograph_coupling + gograph_orphans + gograph_complexity + gograph_godobj separately (5 calls → 1). NOT TO USE: For detailed drill-down into a specific metric (use the dedicated tool after reviewing summary). RETURNS: JSON with symbols, packages, hotspots[], worst_instability, top_complexity, orphan_count, and god_object_count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent. Description adds context about freshness checks and retry behavior for different analysis modes, which is beyond 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?
Concise yet comprehensive. Front-loaded with purpose, followed by details, then clear usage guidance. Every sentence adds value.
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 0 parameters and no output schema, the description fully explains what the tool does, when to use, what it returns (JSON with specific fields), and how it interacts with analysis modes. No gaps.
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?
No parameters, so baseline is 4. Description doesn't need to add parameter details, and schema coverage is 100%.
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?
Clearly states it's a single-call codebase briefing with specific metrics (hotspots, instability, complexity, orphans, god-objects). Distinguishes from siblings by noting it replaces 5 separate calls.
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?
Explicitly says when to use ('at the very start of any session') and when not to use ('for detailed drill-down'), with alternative dedicated tools listed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_testsARead-onlyIdempotent
Find test functions in *_test.go files that statically exercise a named symbol, or list all attributed test edges when no symbol is given. Direct mode accepts Receiver.Method (including pointer receivers) or a full stable symbol ID. By default this preserves the direct-edge result contract. Set transitive=true with a required symbol to return gograph.tests.v1 reverse attribution, including exact/possible resolution, depth, and a representative stable-ID path from every reaching test; exact_only omits uncertain paths and package disambiguates the selected product symbol. The MCP server checks freshness before this call and refreshes in the current requested analysis mode. Read-only; no side effects. WHEN TO USE: Before editing a function — use transitive=true for router/callback-mediated coverage and direct mode for concrete test call sites. NOT TO USE: For test helper infrastructure (use gograph_fixtures); for running tests or proving runtime coverage. RETURNS: Direct result rows by default, or a versioned reverse-transitive report when requested.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | The symbol name to find tests for (optional) | |
| package | No | With transitive=true, optional exact Go package name used to disambiguate the selected symbol | |
| exact_only | No | With transitive=true, omit paths containing possible edges | |
| transitive | No | Return reverse-transitive test attribution; requires symbol |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavior beyond that: the server checks freshness and refreshes in the requested analysis mode, and the return contract changes shape when transitive=true (versioned report with exact/possible resolution and depth). It stops short of describing rate limits or size/pagination of large result sets.
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?
Front-loaded with the core purpose, then modes, then WHEN/NOT/RETURNS blocks. Slightly redundant — 'By default this preserves the direct-edge result contract' is restated in the RETURNS block — but nearly every sentence carries routing or contract 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?
No output schema exists, so the description must describe returns; it does so at a high level (direct rows vs versioned reverse-transitive report with resolution/depth/path). Adequate for a 4-param, optional-arg tool, though field-level detail of the returned rows is absent.
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 100%, so the baseline is 3, but the description adds non-obvious semantics: transitive requires a symbol, package only applies with transitive=true, and exact_only omits uncertain paths. The cross-parameter dependencies go beyond the per-parameter schema text.
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?
States a specific verb+resource ('find test functions in *_test.go files'), distinguishes two modes (direct vs transitive), and names the sibling it is not (gograph_fixtures). An agent can separate it from the other ~60 graph tools without opening the schema.
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?
Explicit WHEN TO USE ('Before editing a function — transitive=true for router/callback-mediated coverage, direct mode for concrete test call sites') and NOT TO USE clauses with named alternatives (gograph_fixtures for helpers; not for running tests or runtime coverage). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_traceARead-onlyIdempotent
Alias for gograph_errorflow. Refreshes in-memory source analysis, then traces an error string heuristically from its definition up through the call chain to HTTP handlers. Read-only; no side effects. WHEN TO USE: Prefer gograph_errorflow; this alias exists for compatibility. RETURNS: The same structured output as gograph_errorflow.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | Error string or symbol name to trace (e.g. 'ErrNotFound', 'permission denied') | |
| no_tests | No | If true, skip collecting related test functions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds context about refreshing in-memory analysis and explicitly states 'Read-only; no side effects,' which aligns with annotations and adds behavioral nuance beyond what schema or annotations provide.
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 three sentences long, front-loaded with purpose, usage, and return info. No unnecessary words; every sentence serves a clear function.
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?
There is no output schema, but the description mentions the return type (same as gograph_errorflow) which compensates. It covers purpose, usage, behavior, and parameters (via schema). The only minor gap is that the return structure of gograph_errorflow is not detailed, but the reference is sufficient.
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 input schema has 100% coverage for both parameters ($term, $no_tests). The description does not add any additional meaning or constraints beyond what the schema already provides, so it meets the baseline of 3.
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 states the tool is an alias for gograph_errorflow, specifies that it refreshes in-memory analysis and traces error strings from definition to HTTP handlers, and explicitly mentions it is read-only with no side effects. This distinguishes it from siblings by directing to the preferred 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?
The description provides explicit guidance: 'WHEN TO USE: Prefer gograph_errorflow; this alias exists for compatibility.' This tells the agent exactly when to use this tool versus the alternative, which is excellent clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_untestedARead-onlyIdempotent
Sweep the full graph in one pass and return called production functions and methods without an exact transitive static path from any test. The MCP server checks freshness first. Precise direct calls and proof-backed concrete interface receivers are exact; open CHA or parser-only paths propagate possible to descendants, which remain visible with test_resolution=possible and possible_test_count. Repeatable CLI --exclude globs map to the MCP exclude string array and match repository-relative source paths lexically. This is static attribution, not runtime coverage proof. Read-only; no side effects. WHEN TO USE: During test census or pre-release hardening; it replaces N forward coverage or direct gograph_tests probes. NOT TO USE: For running tests or proving branch execution. RETURNS: JSON rows sorted by caller_count with stable_id, name, kind, file, line, caller_count, package, test_resolution, and optional possible_test_count.
| Name | Required | Description | Default |
|---|---|---|---|
| pkg | No | Optional package name substring to filter results (e.g. 'cli', 'search') | |
| top | No | Limit results to top N by caller count (0 = all, default) | |
| exclude | No | Repository-relative path globs to exclude; use prefix/** for all descendants |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world hints. The description adds significant context: it checks freshness first, explains exact vs possible test attribution (CHA/parser-only paths), notes repeatable CLI --exclude mapping, clarifies it is static attribution not runtime coverage, and explicitly states it is read-only with no side effects, which reinforces rather than contradicts 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 well-structured with clear sections (general behavior, WHEN TO USE, NOT TO USE, RETURNS). It is somewhat long but every sentence adds useful information. Front-loads the core purpose before details.
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 the tool's complexity and lack of an output schema, the description is complete. It explains the return format (JSON rows sorted by caller_count with specified fields) and covers behavioral aspects like freshness check and static attribution. Nothing critical is missing for an agent to invoke it 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 coverage is 100%, so the schema already documents all three parameters. The description adds some detail about exclude globs mapping from CLI and matching repository-relative paths lexically, but does not go beyond the schema's own descriptions for pkg and top. Baseline 3 is appropriate when the schema does the heavy lifting.
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 verb and resource: 'Sweep the full graph in one pass and return called production functions and methods without an exact transitive static path from any test.' This clearly distinguishes it from siblings like gograph_tests and gograph_callers.
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?
Explicit WHEN TO USE and NOT TO USE sections are provided. It tells the agent to use it during test census or pre-release hardening and that it replaces forward coverage or direct gograph_tests probes. It also clearly states not to use it for running tests or proving branch execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_usagesARead-onlyIdempotent
Find every place a named Go type appears in function parameter lists, return type signatures, struct field or interface method declarations, and composite-literal construction. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. Read-only; no side effects. WHEN TO USE: Before changing an interface or type definition — see the consumption and construction blast radius. NOT TO USE: For call sites of a function (use gograph_callers); use gograph_literals when only struct Foo{...} initialization sites are needed; for all transitive callers use gograph_impact. RETURNS: File paths and line locations where the type appears; empty when the type is not referenced.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The type name to search for (e.g., 'AuthService', 'Repository') | |
| limit | No | Maximum rows per page; the byte budget may return fewer. | |
| cursor | No | Opaque next_cursor for the same graph snapshot and result selection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered. The description still adds real context the annotations do not: server-side freshness checks, refresh in the current analysis mode, and CHA/SSA retry after source changes. It does not cover rate limits or graph-snapshot staleness semantics for the cursor, but the added freshness/retry detail is substantive.
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?
Front-loaded with the core scope statement, then WHEN/NOT TO USE, then RETURNS. Dense but every sentence carries information; the enum-like field list in the opening sentence is slightly heavy but justifies the tool's breadth.
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?
No output schema exists, and the description compensates by describing the return values (file paths and line locations) and the empty-result case. Combined with the freshness behavior and alternative routing, an agent has everything needed to call it 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 100%, so all three parameters (type, limit, cursor) are already documented in the schema. The description adds no syntax or format guidance beyond that, so the baseline of 3 applies.
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?
States a specific verb ('Find every place') and resource ('named Go type') and enumerates the exact syntactic contexts searched (parameter lists, return signatures, struct/interface declarations, composite literals). An agent can distinguish it from sibling tools without opening any schema.
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?
Explicit WHEN TO USE ('before changing an interface or type definition') and NOT TO USE sections that name three alternatives — gograph_callers, gograph_literals, gograph_impact — each with the condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gograph_wikiADestructiveIdempotent
Generate the llm-wiki/ directory of machine-first markdown pages from the static graph. Pages produced: overview.md, architecture.md, hotspots.md, routes.md, env.md, errors.md, concurrency.md, api-surface.md, and one packages/.md per internal package. The MCP server checks freshness before this call and refreshes in the current requested analysis mode; precise and precise_fallback graphs retry CHA/SSA after source changes. A relative output is anchored beneath the graph root and rejects linked components; an absolute output explicitly selects a local destination whose final directory must be real. Generated page paths and regular-file writes remain confined beneath the selected output root. Writes may overwrite existing regular files; MCP annotations mark it mutating and destructive. WHEN TO USE: At the start of an agent session on an unfamiliar codebase — run once to get a token-efficient orientation without issuing dozens of individual tool calls. NOT TO USE: For targeted symbol lookups (use gograph_context or gograph_source). RETURNS: JSON manifest of written page filenames and a count; error when the graph cannot be loaded or the output directory is unsafe or cannot be created.
| Name | Required | Description | Default |
|---|---|---|---|
| output | No | Wiki directory: relative paths are graph-rooted; an absolute path explicitly selects a real local output root (default 'llm-wiki') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark mutating/destructive, and the description reinforces this by disclosing that writes may overwrite existing regular files and that page paths are confined beneath the output root. It also adds freshness/retry behavior and error conditions, going beyond annotation details.
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 long but every sentence serves a purpose, covering output list, freshness, path safety, overwrite behavior, usage guidance, and returns. It is well-structured with clear labels, though it could be slightly tightened without loss.
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 batch generation tool with one optional parameter and no output schema, the description provides thorough context: exact generated pages, output path rules, safety constraints, return manifest, and error cases. It also explains why to use it as an orientation tool, covering both context and alternatives.
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 single parameter is fully described in the schema (100% coverage), and the description restates the same semantics without adding extra nuance. Baseline 3 applies because schema carries the heavy lifting.
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 a specific verb and resource: 'Generate the llm-wiki/ directory of machine-first markdown pages from the static graph.' It lists exact page outputs and differentiates itself from sibling tools by positioning as a batch orientation tool, with targeted lookups delegated to gograph_context/gograph_source.
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 explicitly includes WHEN TO USE and NOT TO USE sections, prescribing use at the start of an agent session on an unfamiliar codebase and explicitly excluding targeted symbol lookups, pointing to specific sibling tools. This gives clear selection guidance.
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.
32 tool updates
v1.7.5- Changed
gograph_boundaries2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_callees2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_callers2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_concurrency2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_constructors2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_dependents2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_embeds2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_envs2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_errors2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Added
gograph_explore - Changed
gograph_fields2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_fixtures2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_focus2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_globals2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_httpcalls2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_impact3 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / exact_onlyAdded value: +{ + "description": "Exclude any path that depends on possible call evidence; default false retains explicitly labeled possible results", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_implementers2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_imports2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_interfaces2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_literals2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_mocks2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_mutate2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_node2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_orphans2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_public2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_query2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_returnusage2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_routes5 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor from the previous gograph_routes result; reuse the same filters", + "type": "string" +} - added
Input schema / properties / include_testsAdded value: +{ + "description": "Include routes registered in *_test.go files; false by default", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum rows in this page, 1-200 (default: 100); the 64 KiB byte budget may return fewer", + "type": "integer" +} - added
Input schema / properties / moduleAdded value: +{ + "description": "Optional exact module path/directory, unique nested-module directory basename, or repository directory name for a root module (for example identuum-idp)", + "type": "string" +} - added
Input schema / properties / termAdded value: +{ + "description": "Optional case-insensitive substring matched against method/path, handler, or file", + "type": "string" +}
- Changed
gograph_schema2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
gograph_sql10 fields changed- added
Input schema / properties / accessesAdded value: +{ + "description": "Optional statement access classes; values OR-compose", + "items": { + "enum": [ + "read", + "write", + "ddl" + ], + "type": "string" + }, + "maxItems": 32, + "type": "array" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor from the previous gograph_sql page; reuse the same filters", + "maxLength": 1024, + "type": "string" +} - added
Input schema / properties / functionAdded value: +{ + "description": "Optional case-insensitive enclosing-function substring", + "maxLength": 1024, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Page size from 1 to 200; defaults to 100", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / moduleAdded value: +{ + "description": "Optional exact module path/directory, unique nested basename, or repository basename for a root module", + "maxLength": 1024, + "type": "string" +} - added
Input schema / properties / no_testsAdded value: +{ + "description": "Exclude SQL facts from *_test.go files; tests are included by default", + "type": "boolean" +} - added
Input schema / properties / tablesAdded value: +{ + "description": "Optional PostgreSQL table selectors; values OR-compose and may be table or schema.table", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 32, + "type": "array" +} - changed
Input schema / properties / term / descriptionPrevious value: -"Optional SQL keyword or table name to filter database queries (e.g., 'SELECT', 'users')"New value: +"Optional case-insensitive raw SQL substring filter" - added
Input schema / properties / term / maxLengthAdded value: +4096 - added
Input schema / properties / verbsAdded value: +{ + "description": "Optional PostgreSQL operation filters; values OR-compose", + "items": { + "enum": [ + "SELECT", + "INSERT", + "UPDATE", + "DELETE", + "MERGE", + "CREATE", + "ALTER", + "DROP", + "TRUNCATE" + ], + "type": "string" + }, + "maxItems": 32, + "type": "array" +}
- Changed
gograph_tests3 fields changed- added
Input schema / properties / exact_onlyAdded value: +{ + "description": "With transitive=true, omit paths containing possible edges", + "type": "boolean" +} - added
Input schema / properties / packageAdded value: +{ + "description": "With transitive=true, optional exact Go package name used to disambiguate the selected symbol", + "type": "string" +} - added
Input schema / properties / transitiveAdded value: +{ + "description": "Return reverse-transitive test attribution; requires symbol", + "type": "boolean" +}
- Changed
gograph_usages2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor for the same graph snapshot and result selection.", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum rows per page; the byte budget may return fewer.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
3 tool updates
v1.6.2- Added
gograph_coverage - Added
gograph_identity - Changed
gograph_untested1 field changed- added
Input schema / properties / excludeAdded value: +{ + "description": "Repository-relative path globs to exclude; use prefix/** for all descendants", + "items": { + "type": "string" + }, + "type": "array" +}
1 tool update
v1.5.8- Changed
gograph_endpoint1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Route pattern (\"POST /api/users\"), final path suffix (\"POST /users\"), or handler symbol name (\"CreateUser\"). NOTE: Nested route-group prefixes are lost statically."New value: +"Route pattern (\"POST /api/users\"), path suffix (\"POST /users\"), or handler symbol name (\"CreateUser\"). Constant grouped prefixes are resolved; dynamic prefixes remain best-effort."
18 tool updates
v1.5.6- Changed
gograph_api1 field changed- changed
Input schema / properties / since / descriptionPrevious value: -"The baseline git reference (e.g., 'main' or 'HEAD~1') to compare against"New value: +"A baseline Git ref (for example 'main' or 'HEAD~1') or regular in-project saved graph path ending in .json, with no linked component and the exact current source-policy marker"
- Changed
gograph_arity2 fields changed- changed
Input schema / properties / min / descriptionPrevious value: -"Minimum argument count to report (default: 5)"New value: +"Inclusive minimum argument count to report (default: 5; 0 includes zero-arity functions)" - changed
Input schema / properties / min / typePrevious value: -"number"New value: +"integer"
- Changed
gograph_boundaries1 field changed- changed
Input schema / properties / config / descriptionPrevious value: -"Optional file path to boundary constraints configuration (defaults to .gograph/boundaries.json)"New value: +"Optional in-project path to a regular, non-linked boundary config (default .gograph/boundaries.json)"
- Changed
gograph_boundaries_create1 field changed- changed
Input schema / properties / config / descriptionPrevious value: -"Optional repository-relative output path (default .gograph/boundaries.json)"New value: +"Optional in-project output path, absolute or repository-relative; linked components and existing entries are refused (default .gograph/boundaries.json)"
- Changed
gograph_callees2 fields changed- changed
Input schema / properties / depth / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of the normal response", + "type": "boolean" +}
- Changed
gograph_callers2 fields changed- changed
Input schema / properties / depth / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of the normal response", + "type": "boolean" +}
- Changed
gograph_check2 fields changed- changed
Input schema / properties / config / descriptionPrevious value: -"Optional path to a checks.json config file (defaults to .gograph/checks.json if present)"New value: +"Optional checks.json path; relative/default paths are project-confined, while an absolute path explicitly selects a regular local file" - changed
Input schema / properties / since / descriptionPrevious value: -"Git ref for api_drift baseline (e.g. 'main', 'HEAD~5', 'v1.4.50')"New value: +"Git ref or regular in-project saved graph path ending in .json, with no linked component and the exact current source-policy marker, for api_drift"
- Changed
gograph_coupling1 field changed- added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of structured JSON", + "type": "boolean" +}
- Changed
gograph_dependents1 field changed- added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of the normal response", + "type": "boolean" +}
- Changed
gograph_deps1 field changed- added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of structured JSON", + "type": "boolean" +}
- Changed
gograph_diagram1 field changed- changed
Input schema / properties / max_depth / typePrevious value: -"number"New value: +"integer"
- Changed
gograph_endpoint4 fields changed- changed
Input schema / properties / depth / descriptionPrevious value: -"BFS depth for call chain traversal (default: 5)"New value: +"BFS depth for call chain traversal, clamped to 1-20 (default: 5)" - changed
Input schema / properties / depth / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / include_tests / descriptionPrevious value: -"Include call-chain edges originating in *_test.go files"New value: +"Include routes registered in *_test.go files" - added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of structured JSON", + "type": "boolean" +}
- Changed
gograph_godobj4 fields changed- changed
Input schema / properties / calls / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / fields / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / methods / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / top / typePrevious value: -"number"New value: +"integer"
- Changed
gograph_hotspot1 field changed- changed
Input schema / properties / top / typePrevious value: -"number"New value: +"integer"
- Changed
gograph_impact1 field changed- added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of the normal response", + "type": "boolean" +}
- Changed
gograph_path1 field changed- added
Input schema / properties / mermaidAdded value: +{ + "description": "Return Mermaid flowchart text instead of structured JSON", + "type": "boolean" +}
- Changed
gograph_untested1 field changed- changed
Input schema / properties / top / typePrevious value: -"number"New value: +"integer"
- Changed
gograph_wiki1 field changed- changed
Input schema / properties / output / descriptionPrevious value: -"Output directory for wiki pages (default: 'llm-wiki')"New value: +"Wiki directory: relative paths are graph-rooted; an absolute path explicitly selects a real local output root (default 'llm-wiki')"
9 tool updates
v1.5.4- Added
gograph_api - Added
gograph_arity - Added
gograph_boundaries - Added
gograph_boundaries_create - Added
gograph_callees - Added
gograph_callers - Added
gograph_capabilities - Added
gograph_imports - Added
gograph_literals
23 tool updates
v1.5.3- Added
gograph_changes - Added
gograph_dependents - Added
gograph_deps - Added
gograph_diagram - Added
gograph_doc - Added
gograph_envs - Added
gograph_errorflow - Added
gograph_errors - Added
gograph_explain - Added
gograph_fields - Added
gograph_fixtures - Added
gograph_flow - Added
gograph_focus - Added
gograph_globals - Added
gograph_godobj - Added
gograph_hotspot - Added
gograph_httpcalls - Added
gograph_impact - Added
gograph_implementers - Added
gograph_interfaces - Added
gograph_mocks - Added
gograph_mutate - Added
gograph_node
18 tool updates
v1.5.3- Added
gograph_check - Added
gograph_complexity - Added
gograph_concurrency - Added
gograph_constructors - Added
gograph_coupling - Removed
gograph_diagram - Added
gograph_embeds - Added
gograph_endpoint - Removed
gograph_errors - Removed
gograph_interfaces - Added
gograph_orphans - Added
gograph_path - Added
gograph_plan - Added
gograph_public - Added
gograph_query - Added
gograph_returnusage - Added
gograph_review - Added
gograph_routes
44 tool updates
v1.5.3- Removed
gograph_api - Removed
gograph_arity - Removed
gograph_boundaries - Removed
gograph_boundaries_create - Removed
gograph_callees - Removed
gograph_callers - Removed
gograph_capabilities - Removed
gograph_changes - Removed
gograph_check - Removed
gograph_complexity - Removed
gograph_concurrency - Removed
gograph_constructors - Removed
gograph_coupling - Removed
gograph_dependents - Removed
gograph_deps - Removed
gograph_doc - Removed
gograph_embeds - Removed
gograph_endpoint - Removed
gograph_envs - Removed
gograph_errorflow - Removed
gograph_explain - Removed
gograph_fields - Removed
gograph_fixtures - Removed
gograph_flow - Removed
gograph_focus - Removed
gograph_globals - Removed
gograph_godobj - Removed
gograph_hotspot - Removed
gograph_httpcalls - Removed
gograph_impact - Removed
gograph_implementers - Removed
gograph_imports - Removed
gograph_literals - Removed
gograph_mocks - Removed
gograph_mutate - Removed
gograph_node - Removed
gograph_orphans - Removed
gograph_path - Removed
gograph_plan - Removed
gograph_public - Removed
gograph_query - Removed
gograph_returnusage - Removed
gograph_review - Removed
gograph_routes
8 tool updates
- Added
gograph_boundaries_create - Changed
gograph_callees2 fields changed- added
Input schema / properties / depthAdded value: +{ + "description": "Traversal depth from 1 to 10 (default 1)", + "type": "number" +} - added
Input schema / properties / no_testsAdded value: +{ + "description": "Exclude call edges originating in *_test.go files", + "type": "boolean" +}
- Changed
gograph_callers4 fields changed- added
Input schema / properties / depthAdded value: +{ + "description": "Traversal depth from 1 to 10 (default 1)", + "type": "number" +} - added
Input schema / properties / exactAdded value: +{ + "description": "Require an exact symbol-name or fully-qualified-ID match", + "type": "boolean" +} - changed
Input schema / properties / function / descriptionPrevious value: -"The name of the target function to find callers for (supports short name 'BuildGraph', dot-notation 'graph.Graph.Build', or fully-qualified ID)"New value: +"The target function or method (supports short name 'BuildGraph', interface notation 'Repository.Delete', concrete dot-notation 'Store.Delete', or a fully-qualified ID)" - added
Input schema / properties / no_testsAdded value: +{ + "description": "Exclude call edges originating in *_test.go files", + "type": "boolean" +}
- Changed
gograph_context1 field changed- added
Input schema / properties / exactAdded value: +{ + "description": "Require an exact symbol-name or fully-qualified-ID match in single-symbol mode.", + "type": "boolean" +}
- Changed
gograph_endpoint1 field changed- added
Input schema / properties / include_testsAdded value: +{ + "description": "Include call-chain edges originating in *_test.go files", + "type": "boolean" +}
- Changed
gograph_errors1 field changed- added
Input schema / properties / no_testsAdded value: +{ + "description": "Exclude error sites in *_test.go files", + "type": "boolean" +}
- Added
gograph_flow - Changed
gograph_query3 fields changed- changed
Input schema / properties / term / descriptionPrevious value: -"The keyword search term to locate in symbols, files, and imports (e.g., 'AuthService', 'token', 'router')"New value: +"One keyword search term (e.g. 'AuthService')" - added
Input schema / properties / termsAdded value: +{ + "description": "Optional list of keyword terms combined with OR semantics", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[]
TDQS
Scored across 68 tools
Most tools target distinct analysis tasks, but several are explicit aliases or near-duplicates (gograph_trace vs gograph_errorflow, gograph_mocks vs gograph_implementers), and bundle-style tools such as context, explore, explain, plan, review, summary, and wiki overlap in scope. The descriptions provide WHEN/NOT TO USE guidance, which mitigates but does not eliminate misselection risk.
All 68 tools use the same gograph_ prefix and lower_snake_case convention, including multiword names like gograph_session_create and gograph_boundaries_create. There is no mixing of camelCase, PascalCase, or inconsistent delimiter styles.
68 tools is far beyond the 3-15 well-scoped range and exceeds the 50+ threshold for extreme mismatch. The large surface includes compatibility aliases and multiple overlapping analysis bundles, making the set unwieldy for agents despite the domain being broad.
The surface covers static Go analysis comprehensively: call graphs, dependencies, types and interfaces, SQL, routes, env vars, errors, concurrency, tests and coverage, complexity, hotspots, orphans, mutation, boundaries, API drift, changes, risk review, diagrams, docs, and session telemetry. No obvious lifecycle gap remains for the stated static-analysis purpose.
Maintenance
Related MCP Connectors
Codebase graphs, caller impact analysis, and recorded project context for AI coding agents.
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Deterministic context layer for your codebase: change impact, blast radius, answers with receipts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that transforms codebases into knowledge graphs using Neo4J, enabling AI assistants to understand code structure, relationships, and metrics for more context-aware assistance.28MIT
- AlicenseNot gradedqualityCmaintenanceA graph-powered code intelligence engine that indexes codebases into a structural knowledge graph to provide AI agents with deep context on function calls, types, and execution flows. It offers local, zero-dependency tools for hybrid search, impact analysis, and dead code detection across Python, JavaScript, and TypeScript projects.813MIT
- FlicenseNot gradedqualityDmaintenanceA minimalist indexing tool that provides AI agents with semantic search and structural AST parsing for deep codebase understanding. It enables autonomous agents to navigate large codebases predictably using vector embeddings and native language server capabilities like definition and reference tracking.-
- AlicenseNot gradedqualityAmaintenanceA local code-intelligence engine for AI agents that indexes repositories into a PostgreSQL-backed code graph and serves structured, token-budgeted context over MCP and HTTP, enabling targeted queries on symbols, dependencies, contracts, and impact analysis.4Apache 2.0