Skip to main content
Glama
npm install -g trace-mcp   # MCP server, no app
trace init                 # wire it into your agent, once per machine
trace add                  # index the repo you are in

72.7% fewer input tokens to review a pull request — median over 60 merged PRs in six repos that are not ours, 13,595 → 3,291 per pull request. Method and reproduction →

Measured at trace-mcp 3.23.2 (cb8ab30c) on 7 September 2026 — a result from that build, not a claim about the current one. What it set out to measure, the bar it had to clear and the verdict: preregistration.

Cheaper is not the same as better, so the same 60 pull requests were reviewed twice and scored blind. The trace-mcp arm understood the change in 67% of them against 65% for naive file loading, at 0.80 false positives per PR against 0.58. Quality half of the benchmark →


The problem

AI agents pay repeatedly for work they have already done. Every turn, the agent re-reads the same files, re-traverses the same dependencies, and re-inflates the context window with structure it discovered five steps ago. That repeated work is most of what a long session costs in tokens and latency.

trace-mcp builds a framework-aware graph of your codebase once, then serves it through MCP so the agent reasons from a precomputed structure instead of brute-reading the repo. Ask "what breaks if I change this model?" — instead of 80 Grep calls and 190 file reads, the agent calls get_change_impact once and gets the blast radius across PHP, Vue, migrations, and DI. 88 framework integrations across 81 languages, 182 tools.

The binding constraint is recomputation, not model capability: token bills, latency, and hallucinations all grow with project size instead of with task complexity. trace-mcp closes the recomputation leak. The graph is built once, kept incrementally fresh, and served to every agent that asks — so the same work isn't paid for over and over.

  • Lower cost — fewer tokens per successful answer, on average and at peak

  • Lower latency — fewer sequential tool calls, fewer round-trips to the model

  • Higher accuracy — less noise in context means fewer hallucinations and stronger first-response correctness

  • Production stability — context growth tracks task complexity rather than repository size

We started with code intelligence, where the repetition is most expensive, and the same engine now indexes markdown knowledge vaults (Obsidian, Logseq, plain MD) as a peer domain. Wikilinks, tags, frontmatter, and embeds become graph edges and symbol metadata; search, find_usages, get_change_impact, and apply_rename work identically over both.


Related MCP server: LiLBrain

What trace-mcp does for you

You ask

trace-mcp answers

How

"What breaks if I change this model?"

Blast radius across languages + risk score + linked architectural decisions

get_change_impact — reverse dependency graph + decision memory

"Why was auth implemented this way?"

The actual decision record with reasoning and tradeoffs

query_decisions — searches the decision knowledge graph linked to code

"I'm starting a new task"

Optimal code subgraph + relevant past decisions + dead-end warnings

plan_turn — opening-move router with decision enrichment

"What did we discuss about GraphQL last month?"

Verbatim conversation fragments with file references

search_sessions — FTS5 search across all past session content

"Show me the request flow from URL to rendered page"

Route → Middleware → Controller → Service → View with prop mapping

get_request_flow — framework-aware edge traversal

"Find all untested code in this module"

Symbols classified as "unreached" or "imported but never called in tests"

get_untested_symbols — test-to-source mapping

"What's the impact of this API change on other services?"

Cross-subproject client calls with confidence scores

get_subproject_impact — topology graph traversal

"What notes link to this concept?"

Backlinks across the vault, with section + alias context

find_usages on a note:<basename> symbol

"What breaks if I rename this note?"

Every [[wikilink]] and [text](path.md) that references it

get_change_impact — wikilink-aware reverse graph

Four capabilities that are rare among adjacent tools:

  1. Framework-aware edges — trace-mcp understands that Inertia::render('Users/Show') connects PHP to Vue, that @Injectable() creates a DI dependency, that $user->posts() means a posts table from migrations. 88 framework integrations.

  2. Code-linked decision memory — when you record "chose PostgreSQL for JSONB support", it's linked to src/db/connection.ts::Pool#class. When someone runs get_change_impact on that symbol, they see the decision. MemPalace stores decisions as text; trace-mcp ties them to the dependency graph.

  3. Cross-session intelligence — past sessions are mined for decisions and indexed for search. When you start a new session, get_wake_up gives you orientation in ~300 tokens; plan_turn shows relevant past decisions for your task; get_wake_up { scope: "resume" } carries over structural context from previous sessions.

  4. Code and knowledge in one graph — point trace-mcp at a markdown vault (Obsidian, Logseq, plain MD) and the same engine indexes it: each note becomes a note:<basename> symbol, headings become nested sections, [[wikilinks]] and ![[embeds]] become graph edges, frontmatter and #tags ride on metadata. PageRank, Signal Fusion ranking, embeddings, and rename refactoring all apply unchanged. The agent does not learn a second tool: it is the same graph, holding both the codebase and the notes.


Why agents keep re-reading

AI coding agents recompute the same work every turn — and they're framework-blind while doing it.

They re-read UserController.php, then re-read it again next turn. They don't know that Inertia::render('Users/Show', $data) connects a Laravel controller to resources/js/Pages/Users/Show.vue. They don't know that $user->posts() means the posts table defined three migrations ago. They can't trace a request from URL to rendered pixel — so they trace it again, and again, every session.

The result: 5–15× repeated reads of hot files in a single task, context windows used as scratch databases, and agents that get more expensive the bigger the project gets — instead of more capable.

The solution

trace-mcp builds a cross-language dependency graph from your source code and exposes it through the Model Context Protocol — the plugin format Claude Code, Cursor, Windsurf and other AI coding agents speak. Any MCP-compatible agent gets framework-level understanding out of the box.

Without trace-mcp

With trace-mcp

Agent reads 15 files to understand a feature

get_task_context — optimal code subgraph in one shot

Agent doesn't know which Vue page a controller renders

routes_to → renders_component → uses_prop edges

"What breaks if I change this model?" — agent guesses

get_change_impact traverses reverse dependencies across languages

Schema? Agent needs a running database

Migrations parsed — schema reconstructed from code

Prop mismatch between PHP and Vue? Discovered in production

Detected at index time — PHP data vs. defineProps


Desktop app

trace-mcp ships with an optional Electron desktop app (packages/app) that gives you a visual surface over the same index the MCP server uses. It manages multiple projects, wires up MCP clients, and provides a GPU-accelerated graph explorer — all without opening a terminal.

Projects & clients. The menu window lists indexed projects with live status (Ready / indexing / error) and re-index / remove controls. The MCP Clients tab detects installed clients (Claude Code, Claw Code, Claude Desktop, Cursor, Windsurf, Continue, Junie, JetBrains AI, Codex, AMP, Warp, Factory Droid) and wires trace-mcp into them with one click, including enforcement level (Base / Standard / Max — CLAUDE.md only, + hooks, + tweakcc & agent-behavior rules; Max-tier features are Claude Code–specific). Warp and JetBrains AI require manual paste in the IDE because their config storage is GUI-only.

Per-project overview. Each project opens in its own tabbed window: Overview (files, symbols, edges, coverage, linked services, re-index), Ask (natural-language query over the index), and Graph. Overview also surfaces Most Symbols files, last-indexed timestamp, and the dependency coverage meter.

GPU graph explorer. The Graph tab renders the full dependency graph on the GPU via cosmos.gl — tens of thousands of nodes/edges at interactive frame rates. Filter by Files / Symbols, overlay detected communities, highlight groups, toggle labels/FPS, and step through graph depth. Good for getting a feel for coupling, hotspots, and how a codebase is actually shaped before you dive into tools.

Install on macOS: Download the .dmg — open it and drag trace-mcp to Applications. The button on the site picks Apple Silicon or Intel for you; if you would rather choose yourself, both builds are on the Releases page. The app is signed with a Developer ID and notarized by Apple, so it opens without a warning — if macOS ever does warn you about a trace-mcp build, that warning is real and the download should not be trusted.

Install on Windows: run trace-mcp.Setup.<version>.exe from Releases.

In-app updater stuck on an old build? App versions 3.10.0 and earlier on macOS/Windows can't update themselves — "Check for updates…" shows Cannot set properties of undefined (setting 'autoDownload') and does nothing, a bug fixed in 3.11.0 that the affected builds can't fetch their own way out of. Reinstall by hand: download the .dmg (macOS) or grab the latest trace-mcp.Setup.<version>.exe from Releases (Windows) — or, if you have the CLI installed, run trace-mcp install-app.

The app talks to the same trace-mcp daemon (http://127.0.0.1:3741) that MCP clients use, so anything you index from the app is immediately available to Claude Code / Cursor / etc. If you only want the MCP server and the CLI, you do not need the app at all — npm install -g trace-mcp is the whole install.


How trace-mcp compares

trace-mcp combines code graph navigation, cross-session memory, and real-time code understanding in a single tool. Most adjacent projects solve one of these — trace-mcp unifies all three and is the only one with framework-aware cross-language edges (88 framework integrations) and code-linked decision memory.

  • vs. token-efficient exploration (Repomix, jCodeMunch, cymbal) — trace-mcp adds framework edges, refactoring, security, and subprojects on top of symbol lookup.

  • vs. session-memory tools (MemPalace, claude-mem, ConPort) — trace-mcp links decisions to specific symbols/files, so they surface automatically in impact analysis.

  • vs. RAG / doc-gen (DeepContext, smart-coding-mcp) — trace-mcp answers "show me the execution path, deps, and tests," not "find code similar to this query."

  • vs. code-graph MCP servers (Serena, Roam-Code) — trace-mcp has the broadest language coverage (81 languages) and is the only one with cross-language framework edges.

Full side-by-side tables with GitHub stars, languages, and per-capability coverage: trace-mcp vs. other code intelligence MCP servers.

Head-to-head: vs Repomix · vs Serena · vs codegraph · vs codebase-memory-mcp · vs Claude Code context mode · vs code-review-graph · Repomix vs codegraph.


Token reduction — what we measured

AI agents burn tokens recomputing what they already discovered last turn — re-reading files, re-traversing dependencies, re-inflating context. trace-mcp replaces that with precision context: only the symbols, edges, and signatures relevant to the query, served from a graph that was computed once.

Start with the measurement that isn't ours. Everything else in this section is trace-mcp measured on trace-mcp's own repository — the first table row against real responses, everything below it by trace-mcp's own synthetic estimators. The PR review context benchmark is the exception: assembling review context for 60 merged pull requests across six open-source repositories — hono, axios, express, requests, flask, got — cost a median 3,291 input tokens against 13,595 for loading the diff plus every file it touches, 72.7% less, counted with gpt-tokenizer rather than estimated. The base and head SHAs are pinned in benchmarks/pr-context/dataset.json, npx tsx scripts/bench-pr-context.ts re-runs it, and the 56 pull requests where the index did not pay off are published alongside the wins — 13 that cost more than reading the files outright, and 42 where the bundle's token budget did not deliver every changed symbol's body, a shortfall the benchmark could not see until this run made it score delivery rather than listing.

What to expect — by workload:

Workload

Typical reduction

Mixed real-world production (measured tool responses vs. the file reads they replace)

68% fewer tokens

Structured code-navigation tasks (symbol lookup, impact analysis, type hierarchy, call graph)

up to 99% less redundant processing — synthetic estimate

Targeted research / planning queries (composite tasks that replace ~10 sequential operations)

up to ~40× on individual calls — synthetic estimate

Non-code workloads (raw text, unstructured data)

Out of scope today

The 68% is the honest number to plan against, and the reason it moved is not that the product got faster. We used to print "~40–50% on average". That figure descended from a counter that scored each call before the tool ranRAW_COST_ESTIMATES[tool] × 0.15, a constant with no variance — which we found and fixed ourselves in #915. The honest replacements read 29.3%, then 21.1%, then 21.0% as coverage grew to 97.2% of recorded calls. Then we found that three tools carrying 76% of the weight were each priced from one sample, and that four defensible ways of choosing those samples price the same build at 21.0%, 30.7%, 56.0% and 67.4%. So the sampling frame is now generated, frozen and committed before the run that uses it, with every claim about how it was built re-checked against the repository in CI (preregistration). 68% is what the registered frame measures; read the jump from 21% as a change of frame, not a change of product. It weights real o200k_base counts of real responses by 18,329 recorded calls from one machine (per-tool table, generated into docs/_data/response_tokens.json). Three caveats travel with it: the baseline half — what a Read/Grep would have cost instead — is still a hand-written estimate; five of the twenty-three tools measured return more tokens than they replace, and the old counter booked a saving for them anyway; and two more tools (register_edit, reindex) replace no file read at all, so they are now credited zero and counted as overhead — with them on the spend side the all-in figure is 67%. The peaks below (up to 99% on individual structured calls) are a synthetic estimate, per-call, not per-session.

Measured at trace-mcp 3.23.2 (fd3cafc6) on 8 September 2026. Its preregistration publishes it as the first pass of the 25% bar we declared before measuring — and says in the same breath that the pass came from registering a sampling frame, not from shipping a faster product. The prediction written before that run named an interval the result landed above; it was wrong and it stays on the page.

Benchmark: trace-mcp's own codebase (694 files, 3,831 symbols → 929 files, 5,197 symbols in v1.30):

Task                    Without trace-mcp    With trace-mcp    Reduction
───────────────────────────────────────────────────────────────────────────
Symbol lookup                42,518 tokens       1,162 tokens       97.3%
File exploration             27,486 tokens         855 tokens       96.9%
Search                       22,860 tokens       8,000 tokens       65.0%
Find usages                  11,430 tokens       1,720 tokens       85.0%
Context bundle               12,847 tokens       3,485 tokens       72.9%
Batch overhead               16,831 tokens       8,299 tokens       50.7%
Impact analysis              49,141 tokens       1,856 tokens       96.2%
Call graph                  178,345 tokens       9,285 tokens       94.8%
Type hierarchy               94,762 tokens         855 tokens       99.1%
Tests for                    22,590 tokens       1,150 tokens       94.9%
Composite task              223,721 tokens      14,245 tokens       93.6%
───────────────────────────────────────────────────────────────────────────
Total                       702,532 tokens      50,812 tokens       92.8%

Across 11 structured task categories, recomputation drops by up to ~99% per call when the agent reuses the graph instead of re-reading files. Read that as a peak structured-task result on a well-supported TS/Vue codebase, not a number you should expect on every project. In production, on mixed workloads, expect 68% — the measured figure above, not this synthetic one. Less noise in context also means fewer hallucinations and better first-response accuracy — a quality benefit you don't see in token counts.

Savings scale with project size — argued, not measured. Without trace-mcp the agent reads more wrong files before finding the right one, while graph traversal stays O(relevant edges) rather than O(total files). We have no per-project-size measurement to put behind that, so this README no longer quotes one; the per-session token figure that used to sit here came from the same pre-#915 estimator as the "40–50%".

Composite tasks deliver the biggest wins. A single get_task_context call replaces a chain of ~10 sequential operations (search → get_symbol × 5 → Read × 3 → Grep × 2). That's one round-trip instead of ten, which is where most of the latency saving comes from.

Run it yourself

npx trace-mcp benchmark .

Per-category token savings against your actual repo in ~5 minutes — no install, no signup, all local. It reads an existing index, so run trace-mcp index . first if the project isn't registered yet. Numbers above are from trace-mcp's own TypeScript/Vue codebase (929 files, 5,197 symbols) under structured benchmarks; production reduction on mixed workloads is lower (68% measured, see above), but the per-task patterns hold for any well-supported stack.

This is a synthetic estimate, not measured savings: the "without trace-mcp" side is computed from file sizes in the index, and the "with trace-mcp" side from per-scenario multipliers — not from actual tool calls. It shows the theoretical ceiling. To measure real savings from your own usage, run trace-mcp for a while, then:

trace-mcp analytics savings   # real sessions: reads vs. what trace-mcp would have cost
trace-mcp analytics optimize  # recommendations based on your actual usage

See Session analytics & token savings tracking for details.

Estimated using benchmark_project — it walks eleven task categories (symbol lookup, file exploration, text search, find usages, context bundle, batch overhead, impact analysis, call graph traversal, type hierarchy, tests-for, composite task context) over the indexed project. No trace-mcp tool is invoked. Every figure on both sides is a scenario-specific synthetic heuristic, and the heuristics differ per scenario. They draw on three kinds of input, mixed differently in each one:

  • Real values from the index — file byte_length, symbol source and signature sizes. These carry the baseline for symbol lookup, file exploration, impact analysis and call graph traversal.

  • Assumed result shapes for operations with no indexed equivalent — e.g. text search and find-usages baselines assume a fixed grep yield (matches × context lines × 80 chars), get_tests_for is assumed to answer in ~400 characters, and the batch-overhead scenario adds fixed per-call MCP framing / hint / metadata token constants.

  • A fixed fraction of the baseline, between 0.05 and 0.45, where neither of the above applies.

Character counts are converted to tokens by an estimator calibrated against cl100k_base when gpt-tokenizer is installed, and by a fixed chars-per-token ratio of 4.0 otherwise. The result is an upper bound on the reduction, not a measurement of it — the same caveats are printed in the tool output and documented at the top of src/analytics/benchmark.ts.

Reproduce it yourself:

# Via CLI (no install)
npx trace-mcp benchmark /path/to/project

# Or via MCP tool
benchmark_project  # runs against the current project

Key capabilities

  • Request flow tracing — URL → Route → Middleware → Controller → Service, across backend frameworks

  • Component trees — render hierarchy with props / emits / slots (Vue, React, Blade)

  • Schema from migrations — no DB connection needed

  • Event chains — Event → Listener → Job fan-out (Laravel, Django, NestJS, Celery, Socket.io)

  • Change impact analysis — reverse dependency traversal across languages, enriched with linked architectural decisions

  • Graph-aware task context — describe a dev task → get the optimal code subgraph (execution paths, tests, types) + relevant past decisions, adapted to bugfix/feature/refactor intent

  • Call graph & DI tree — bidirectional call graphs with 4-tier resolution confidence, optional LSP enrichment for compiler-grade accuracy, NestJS dependency injection

  • ORM model context — relationships, schema, metadata for 7 ORMs

  • Dead code & test gap detection — find untested exports/symbols (with "unreached" vs "imported_not_called" classification), dead code, per-symbol test reach in impact analysis

  • Security scanning — OWASP Top-10 pattern scanning and taint analysis (source→sink data flow). Exportable MCP-server security context for skill-scan

  • Semantic search, offline by default — bundled ONNX embeddings work out of the box, no API keys; switch to Ollama/OpenAI for LLM-powered summarisation

  • Decision memory — mine sessions for decisions, link them to symbols/files, auto-surface in impact analysis

  • Multi-service subprojects — link graphs across services via API contracts; cross-service impact + service-scoped decisions

  • CI/PR change impact reports — automated blast radius, risk scoring, test-gap detection, architecture violations on every PR

Supported stack

Languages: PHP, TypeScript, JavaScript, Python, Go, Java, Kotlin, Ruby, Rust, C, C++, C#, Swift, Objective-C, Objective-C++, Dart, Scala, Groovy, Elixir, Erlang, Haskell, Gleam, Bash, Lua, Perl, GDScript, R, Julia, Nix, SQL, PL/SQL, HCL/Terraform, Protocol Buffers, GraphQL, Prisma, Vue SFC, HTML, CSS/SCSS/SASS/LESS, XML/XUL/XSD, YAML, JSON, TOML, Assembly, Fortran, AutoHotkey, Verse, AL, Blade, EJS, Zig, OCaml, Clojure, F#, Elm, CUDA, COBOL, Verilog/SystemVerilog, GLSL, Meson, Vim Script, Common Lisp, Emacs Lisp, Dockerfile, Makefile, CMake, INI, Svelte, Astro, Markdown, MATLAB, Lean 4, FORM, Magma, Wolfram/Mathematica, Ada, Apex, D, Nim, Pascal, PowerShell, Solidity, Tcl

Frameworks: Laravel (+ Livewire, Nova, Filament, Pennant), Django (+ DRF), FastAPI, Flask, Express, NestJS, Fastify, Hono, Next.js, Nuxt, Rails, Spring, tRPC

ORMs: Eloquent, Prisma, TypeORM, Drizzle, Sequelize, Mongoose, SQLAlchemy

Frontend: Vue, React, React Native, Blade, Inertia, shadcn/ui, Nuxt UI, MUI, Ant Design, Headless UI

Other: GraphQL, Socket.io, Celery, Zustand, Pydantic, Zod, n8n, React Query/SWR, Playwright/Cypress/Jest/Vitest/Mocha

Knowledge vaults: Obsidian, Logseq, plain markdown — [[wikilinks]], ![[embeds]], [text](path.md), frontmatter (YAML), #tags, ATX headings. Each note becomes a note:<basename> symbol with sections nested inside; wikilinks resolve to references / embeds edges between notes. Mix vault and code in one project — point root at a directory that contains both and run a single find_usages across them.

Full details: Supported frameworks · All tools


Quick start

See your waste first — 5 minutes, no setup, no signup:

npx trace-mcp benchmark .

Indexes the project, runs 11 structured task benchmarks (symbol lookup, impact analysis, call graph, type hierarchy, …), and prints estimated per-task token cost — without trace vs. with. You'll see exactly where your agent recomputes work it could reuse. It is a synthetic estimate computed from your index, not a record of real tool calls (see the Methodology block under “Token reduction” above); for measured savings from your own sessions use trace-mcp analytics savings.

Then wire it into your AI agent:

npm install -g trace-mcp
trace init        # one-time global setup (MCP clients, hooks, CLAUDE.md)
trace add         # register current project for indexing
  • init — configures your MCP client (Claude Code, Cursor, Windsurf, Claude Desktop, …), installs the guard hook, adds routing rules to ~/.claude/CLAUDE.md.

  • add — detects frameworks, creates the per-project index, registers the project. Re-run in every project you want trace to understand.

(The npm package is still called trace-mcp — only the command it installs is shortened. trace-mcp init, trace-mcp add, and every other trace-mcp … invocation keep working.)

All state lives in ~/.trace/ (with automatic fallback from ~/.trace-mcp/) — your project directory stays clean unless you opt into .traceignore or .trace/.config.json.

Using Claude Code or Codex CLI? After npm install -g trace-mcp, skip trace init's client-wiring step and install the plugin directly instead — no git clone needed either way:

# Claude Code
claude plugin install @nikolai-vysotskyi/trace-mcp

# Codex CLI
codex plugin marketplace add nikolai-vysotskyi/trace-mcp
codex plugin install trace-mcp@nikolai-vysotskyi-trace-mcp

Both register the trace-mcp MCP server plus the Bash guard hook in one step. Details: .claude-plugin/README.md · .codex-plugin/README.md.

Then in your MCP client:

> get_project_map to see what frameworks are detected
> get_task_context("fix the login bug") to get full execution context for a task
> get_change_impact on app/Models/User.php to see what depends on it

Indexing a markdown vault (Obsidian / Logseq / plain MD). Point trace add at the vault root — .md/.mdx/.markdown are picked up by default. Each note becomes a note:<basename> symbol, headings nest as sections, [[wikilinks]] and ![[embeds]] resolve to graph edges, frontmatter aliases: make alternate names resolvable, and #tags aggregate so every note carrying #sgr is one find_usages away.

> find_usages on note:my-concept     // backlinks across the vault
> find_usages on tag:sgr             // every note tagged #sgr
> get_change_impact on note:legacy   // what breaks if I rename or delete it
> search "schema-guided reasoning"   // PageRank + embeddings over the vault

Prefer a GUI? The desktop app handles install, indexing, MCP-client wiring, and re-indexing without touching a terminal.

Going further: adding more projects / upgrading / manual setup · stdio vs HTTP setup (per-repo or team) · semantic search (local ONNX) · indexing & file watcher · .traceignore.


Migration from trace-mcp to trace

The project is still trace-mcp. The command is now trace. The rename lives at exactly that boundary and nowhere else — the npm package, this repo, the domain, and the registry entry all keep the trace-mcp name. The reason is ergonomics, the same shape as rg for ripgrep or kubectl for kubernetes — not token savings: the measured saving from the shorter MCP tool prefix is real but small, 66–366 tokens per turn depending on tokenizer and preset, 0.74–1.23% of a tool list that already costs 8k–45k tokens.

The npm package name does not change. It is still trace-mcp, and it always will be — trace on npm is an unrelated package by another author. Install with npm install -g trace-mcp or npx -y trace-mcp@latest.

What does change, and what stays:

  • Command nametrace <cmd> is the new spelling. trace-mcp <cmd> stays as an alias permanently — on macOS, /usr/bin/trace is Apple's own trace(1), so keep using trace-mcp in scripts, CI, or any PATH you don't control yourself.

  • MCP client entriestrace init and trace upgrade rename an existing mcpServers["trace-mcp"] entry to mcpServers["trace"] and point it at the new command. Nothing is deleted; an entry left as trace-mcp keeps working, it just costs more tokens.

  • State directory~/.trace/, falling back to ~/.trace-mcp/ when the old one exists and the new one does not. Indexes are not rebuilt.

  • Project config.trace.json is read first, .trace-mcp.json after it. Existing files keep working where they are.

  • Plugin and registry identifiers — unchanged: @nikolai-vysotskyi/trace-mcp for the Claude Code plugin, io.github.nikolai-vysotskyi/trace-mcp in the MCP registry.

One thing init can't do for you. The MCP tool prefix moves too — mcp__trace-mcp__search becomes mcp__trace__search. init migrates the mcpServers entry it owns, but not text you wrote yourself: Claude Code permission allowlists, hook matchers, or your own mcp__trace-mcp__* mentions in CLAUDE.md/AGENTS.md prose. If a hook stops matching or an allowlisted tool starts re-prompting after upgrading, grep your own config for mcp__trace-mcp__ and replace it with mcp__trace__. Everything else above happens automatically the next time you run trace init or trace upgrade — details: Configuration.


Local-first by design

trace-mcp runs entirely on your machine. Nothing about your source code is uploaded, and there is no account to create.

  • Indexing happens locally. The MCP server is a Node process you run yourself — stdio or http://127.0.0.1:3741.

  • Index lives in ~/.trace/ (falling back to ~/.trace-mcp/ if that's what you already have), never inside your project and never uploaded. Your repo directory stays clean unless you opt into .traceignore or .trace/.config.json.

  • Semantic search is offline by default — bundled ONNX embeddings, no API keys, no outbound calls. Switch to Ollama (local) or OpenAI (opt-in) via config.

  • No telemetry about your code, queries, or usage. The only thing that ever leaves your machine is described below and on the privacy page — nothing else is phoned home.

  • What your AI client sees is governed by your AI client. trace-mcp returns graph results over MCP; how Claude Code / Cursor / Codex / Windsurf forward them to a model is up to that client's privacy model.

  • The daemon trusts loopback and nothing else. serve-http is unauthenticated by design: a caller on 127.0.0.1 is already you. A non-loopback --host is therefore refused unless you pass --allow-remote and front the port with your own auth — see Configuration.

  • To wipe everything, delete ~/.trace/ (or ~/.trace-mcp/ on an install that hasn't migrated yet) — that directory is the whole footprint.

Usage telemetry

trace-mcp sends at most one anonymous ping per day, per install, so we can count active installs: version, OS, MCP client, and aggregate counts. No code, no paths, no IP address, and no per-install identifier beyond a UUID generated locally on your machine. It is suppressed in CI, and its GA4 credentials ship as plaintext in the published bundle so you can verify where the ping goes.

Turn it off with TRACE_MCP_TELEMETRY=off, or with "telemetry": { "usage_ping": false } in ~/.trace/.config.json.

The complete field list, both opt-outs and how to delete local state are on the privacy page. Source: src/telemetry/usage-ping.ts.

For security-sensitive environments, review SECURITY.md before use.


Getting the most out of trace-mcp

trace-mcp works on three levels to make AI agents use its tools instead of raw file reading:

Level 1: Automatic (works out of the box)

The MCP server provides instructions and tool descriptions with routing hints that tell AI agents when to prefer trace-mcp over native Read/Grep/Glob. This works with any MCP-compatible client — no configuration needed.

trace-mcp init adds a Code Navigation Policy block to ~/.claude/CLAUDE.md (or your project's CLAUDE.md) that tells the agent which trace-mcp tool to prefer over Read/Grep/Glob for each kind of task. If you skipped init, see System prompt routing for the full block and how to tune enforcement.

Level 3: Hook enforcement (Claude Code only)

For hard enforcement, trace-mcp init installs a PreToolUse guard hook that blocks Read/Grep/Glob on source files and redirects the agent to trace-mcp tools (non-code files, Read-before-Edit, and safe Bash commands pass through). Manage manually with trace-mcp setup-hooks --global / --uninstall. Details: System prompt routing.

Level 4: Max tier — system prompt rewrites + agent behavior rules

Picking Max during trace-mcp init (the default) layers on two more amplifiers:

  • tweakcc system-prompt rewrites patch Claude Code's core tool descriptions so the model internalizes "use trace-mcp search" instead of "use Grep" from the start. Claude Code only.

  • agent_behavior: "strict" ships a compact set of discipline rules via MCP instructions — no flattery, disagree on wrong premises, never fabricate, goal-driven execution, 2-strike session hygiene, no drive-by refactors. Cross-client (Claude Code, Cursor, Codex, Windsurf) and auto-updates on npm upgrade trace-mcp without re-running init.

This is the setup for making the same discipline rules apply to every teammate's agent without asking anyone to configure it. Tune or disable via tools.agent_behavior in ~/.trace/.config.json — see Tool exposure & agent behavior.


Decision memory

Decisions, tradeoffs, and discoveries from AI-agent conversations usually vanish when the session ends. trace-mcp captures them and links each decision to the code it's about — so when someone later runs get_change_impact on src/db/connection.ts::Pool#class, the "we chose PostgreSQL for JSONB" decision surfaces automatically.

  • Minemine_sessions scans Claude Code / Claw Code JSONL logs and extracts decisions via pattern matching (0 LLM calls). Types: architecture, tech choice, bug root cause, tradeoff, convention.

  • Link — each decision attaches to a symbol or file; supports service-scoped decisions for subprojects.

  • Surface — decisions auto-enrich get_change_impact, plan_turn, and get_wake_up. Temporal validity (valid_from/valid_until) makes "what was true on 2025-01-15?" queries possible.

  • Searchquery_decisions (FTS5 + filters) for decisions; search_sessions for raw conversation content across all past sessions.

trace memory mine                           # extract decisions from sessions
trace memory search "GraphQL migration"     # search past conversations
trace memory timeline --file src/auth.ts    # decision history for a file

Full tool list, CLI, temporal validity, service scoping: Decision memory.


Subprojects

A subproject is any repo in your project's ecosystem — microservice, frontend, shared lib, CLI tool. trace links dependency graphs across subprojects: if service A calls an endpoint in service B, changing the endpoint in B shows up as a breaking change for A.

Discovery is automatic. On each index, trace detects subprojects (Docker Compose, flat/grouped workspaces, monolith fallback), parses API contracts (OpenAPI, GraphQL SDL, Protobuf/gRPC), scans code for HTTP client calls (fetch, axios, Http::, requests, http.Get, gRPC stubs, GraphQL ops), and links the calls to known endpoints.

cd ~/projects/my-app && trace add
# → auto-detects user-service (openapi.yaml) and order-service
# → links order-service → user-service via /api/users/{id}

trace subproject impact --endpoint=/api/users
# → [order-service] src/services/user-client.ts:42 (axios, confidence: 85%)

External subprojects can be added manually with trace subproject add --repo=... --project=.... MCP tools: get_subproject_graph, get_subproject_impact, get_subproject_clients, subproject_add_repo, subproject_sync.

Full CLI, detection modes, MCP-tool reference, topology config: Configuration — topology & subprojects.


CI/PR change impact reports

trace ci-report --base main --head HEAD produces a markdown or JSON report per pull request: summary, blast radius (depth-2 reverse dep traversal), test coverage gaps (per-symbol hasTestReach), risk analysis (30% complexity + 25% churn + 25% coupling + 20% blast radius), architecture violations (auto-detects clean / hexagonal presets), and new dead exports.

Use --fail-on high to block merges on high-risk changes. See .github/workflows/ci.yml for a ready-to-use GitHub Action that runs build → test → impact-report and posts a sticky PR comment on every push.


Pilot program — for teams running LLM in production

If you're shipping AI features in production — internal copilots, customer-facing assistants, RAG over a code or knowledge base — and you're hitting cost, latency, or quality ceilings, we'll run a focused pilot with you.

Format: 2–4 weeks. Minimal integration. One or two real production use cases — not a demo.

What we measure (before / after):

  • Tokens per successful answer

  • First-response accuracy (% of queries resolved without retry)

  • Retries and fallback calls

  • End-to-end latency

  • User success rate on a fixed evaluation set

What you get: a clear, before/after report on whether context optimization moves the metrics that matter for your stack — and a path to scale usage with confidence instead of throttling it on cost.

The target is a system that stays predictable as usage grows, not a one-off cost cut: teams usually want to reach reliable production first and expand their LLM footprint after.

Get in touch: open an issue at github.com/nikolai-vysotskyi/trace-mcp/issues tagged pilot, or reach out to @nikolai-vysotskyi.


How it works

Source files (PHP, TS, Vue, Python, Go, Java, Kotlin, Ruby, HTML, CSS, Blade)
    │
    ▼
┌──────────────────────────────────────────┐
│  Pass 1 — Per-file extraction            │
│  tree-sitter → symbols                   │
│  integration plugins → routes,           │
│    components, migrations, events,       │
│    models, schemas, variants, tests      │
└────────────────────┬─────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────┐
│  Pass 2 — Cross-file resolution          │
│  PSR-4 · ES modules · Python modules    │
│  Vue components · Inertia bridge         │
│  Blade inheritance · ORM relations       │
│  → unified directed edge graph           │
└────────────────────┬─────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────┐
│  Pass 3 — LSP enrichment (opt-in)       │
│  tsserver · pyright · gopls ·           │
│  rust-analyzer → compiler-grade         │
│  call resolution, 4-tier confidence     │
└────────────────────┬─────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────┐
│  SQLite (WAL mode) + FTS5               │
│  nodes · edges · symbols · routes       │
│  + embeddings (local ONNX by default)   │
│  + optional: LLM summaries              │
└────────────────────┬─────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────┐
│  Decision Memory (decisions.db)         │
│  decisions · session chunks · FTS5      │
│  temporal validity · code linkage       │
│  auto-mined from session logs           │
└────────────────────┬─────────────────────┘
                     │
                     ▼
          MCP server (stdio or HTTP/SSE)
          182 tools · 10 resources

Incremental by default — files are content-hashed; unchanged files are skipped on re-index.

Plugin architecture — language plugins (symbol extraction) and integration plugins (semantic edges) are loaded based on project detection, organized into categories: framework, ORM, view, API, validation, state, realtime, testing, tooling.

Details: Architecture & plugin system — how indexing works


Documentation

Full docs live at trace-mcp.com (same content as docs/ in this repo).

Document

Description

Supported frameworks

Complete list of languages, frameworks, ORMs, UI libraries, and what each extracts

Tools reference

All 182 MCP tools with descriptions and usage examples

Migrating from 1.x

The seven tools retired in 2.0 (get_dead_exports, get_session_resume, …) and the call that replaces each

Configuration

Config options, AI setup, environment variables, security settings

Architecture

How indexing works, plugin system, project structure, tech stack

Decision memory

Decision knowledge graph, session mining, cross-session search, wake-up context

Analytics

Session analytics, token savings tracking, optimization reports, benchmarks

Quality gates

Complexity, security and coupling thresholds, and how quality_gates.rules overrides the CLI defaults

TOON savings

Measured token savings of the TOON output format on real tool calls

Telemetry

OpenTelemetry-compatible spans for every AI provider call and MCP tool call

System prompt routing

Optional tweakcc integration for maximum tool routing enforcement

Comparisons

Full side-by-side tables vs. other code intelligence / memory / RAG tools

Development

Building, testing, contributing, adding new plugins

Design system

The desktop app's macOS 26 design system — tokens, type, geometry, materials, primitives, accessibility floors


Star History


Project health


License

MIT


Built by Nikolai Vysotskyi

Available Tools

29 tools
batchA
Read-onlyIdempotent

Execute multiple trace-mcp tools in a single MCP request. Dispatches any registered tool by name, including tools this session's preset defers — so a deferred tool is callable here without a load_tools round-trip (tools.exclude stays a hard restriction). Use to reduce round-trips when you need several independent queries (e.g., get_outline for 3 files, or search + get_symbol together). Read-only (delegates to other tools). Returns JSON: { batch_results: [{ tool, result }], total }.

ParametersJSON Schema
NameRequiredDescriptionDefault
callsYesArray of tool calls to execute (max 10)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description explains that the tool delegates to other tools, can invoke deferred tools without load_tools, enforces tools.exclude as a hard restriction, and documents the JSON return shape. This adds meaningful behavioral context not present 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences cover purpose, use case, restrictions, read-only behavior, and return shape. Every sentence earns its place and key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 provides the return format. The schema covers parameter validation, annotations cover safety, and the description covers usage, restrictions, and batching intent. Nothing essential for an agent to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the 'calls' parameter with item schemas and min/max constraints, so the baseline is 3. The description adds value with concrete usage examples and clarifies that deferred tool names are acceptable, going slightly beyond schema-only information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Execute multiple trace-mcp tools in a single MCP request') and distinguishes itself from siblings by enabling batched dispatch, including deferred tools. It is immediately clear what this tool does and how it differs from individual tools like get_outline or search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use to reduce round-trips when you need several independent queries,' gives concrete examples, and clarifies when a tool is still not callable ('tools.exclude stays a hard restriction'). This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_usagesA
Read-onlyIdempotent

Find all references to a symbol or file (imports, calls, renders, dispatches). Use instead of Grep for symbol usages — semantic, not text matches. For raw text use search_text; for a bidirectional call graph use get_call_graph. Weakly-grounded text_matched edges into a name-colliding target are dropped by default (phantom god-node filter); include_ambiguous_text_matched: true keeps them. Read-only. Returns JSON: { references: [{ edge_type, resolution_tier, file, symbol }], total, truncated?, ambiguous_filtered? } — page caps at 50, total counts all.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqnNoFully qualified name to find references for
limitNoMax references returned (default 50).
file_pathNoFile path to find references for
symbol_idNoSymbol ID to find references for
detail_levelNoOutput verbosity. "minimal" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: "default".
include_ambiguous_text_matchedNoKeep text_matched edges whose target name collides with >=3 other symbols (default false — they produce phantom god-nodes).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint, the description adds valuable behavioral context: the phantom god-node filter, how include_ambiguous_text_matched changes behavior, the read-only nature, and the return shape including truncation and total counts. No contradictions 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and routing, then packs behavioral nuances, read-only status, and return format into compact sentences. Every sentence earns its place; nothing is redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, the description fully covers return values, truncation, ambiguous filtering, and page limits. It also addresses key behavioral edge cases and provides enough guidance for correct invocation despite having six optional parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaningful context beyond the schema: it explains the ambiguous text-matching flag's purpose, the pagination cap, and the structure of references. This helps the agent understand the interplay between parameters and results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Find all references to a symbol or file (imports, calls, renders, dispatches)'. It further clarifies semantic vs. text matching and explicitly differentiates itself from siblings like search_text and get_call_graph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use instead of Grep for symbol usages' and gives direct alternatives: 'For raw text use search_text; for a bidirectional call graph use get_call_graph.' This gives the agent clear routing guidance with little left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_call_graphA
Read-onlyIdempotent

Build a bidirectional call graph centered on a symbol (who calls it + what it calls). Each branch keeps its direction: depth 2 = callers of callers, callees of callees. Use to understand control flow through a function. For flat list of all references use find_usages instead. Read-only. Returns JSON: { root: { symbol_id, name, calls: [...], called_by: [...] } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqnNoFully qualified name to center the graph on
depthNoTraversal depth on each side (default 2)
symbol_idNoSymbol ID to center the graph on

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces 'Read-only'. More importantly, it adds non-obvious behavior: branches keep their direction, depth 2 means callers of callers and callees of callees, and the JSON response shape is provided. A small gap is unspecified behavior when neither fqn nor symbol_id is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it opens with the core behavior, immediately explains depth semantics, provides an explicit alternative, and closes with output format. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is well covered: purpose, usage alternative, depth behavior, read-only safety, and return structure are all present, and annotations cover the safety profile. The main omission is that no parameter is required in the schema while the description assumes a symbol is centered, leaving the fqn-or-symbol_id contract implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds useful semantics beyond the schema by explaining what depth means concretely ('callers of callers, callees of callees') and reinforcing the bidirectional traversal. It does not clarify how fqn and symbol_id relate or take precedence, but the main parameter semantics are enriched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is specific: it names the exact operation ('Build a bidirectional call graph centered on a symbol'), clarifies both call directions, and explains depth semantics. It also distinguishes itself from find_usages, making the tool's unique purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool ('Use to understand control flow through a function') and when not to, directing the agent to the correct alternative ('For flat list of all references use find_usages instead'). This is strong routing guidance among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_change_impactA
Read-onlyIdempotent

Full change impact report: risk score + mitigations, breaking change detection, enriched dependents (complexity, coverage, exports), module groups, affected tests, co-change hidden couplings. Pass symbol_ids to scope analysis to changed symbols only. Use before modifying code to understand blast radius. For a quick risk score alone use assess_change_risk; for who-calls-what use get_call_graph. Read-only. Returns JSON: { risk, dependents, affectedTests, breakingChanges, totalAffected }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqnNoFully qualified name to analyze (alternative to symbol_id)
depthNoMax traversal depth (default 3)
file_pathNoRelative file path to analyze
symbol_idNoSymbol ID to analyze
symbol_idsNoDiff-aware: only analyze impact of these specific symbols (e.g. from get_changed_symbols)
max_dependentsNoCap on returned dependents (default 200)
decorator_filterNoFilter dependents to only those with this decorator/annotation/attribute (e.g. "Route", "Transactional", "csrf_protect")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, and non-destructive behavior, and the description reinforces with 'Read-only' and adds the concrete JSON envelope. It also discloses that analysis is scoped only when symbol_ids is passed, which is useful 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences cover what the tool returns, how to scope it, when to use it, alternatives, read-only status, and return shape. 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description summarizes the return envelope and key report contents, plus usage context. It does not describe every parameter, but the 100% schema coverage covers those; the only minor gap is lack of any note about cost or performance for deep traversals.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 each parameter. The description adds useful meaning for symbol_ids ('scope analysis to changed symbols only') but does not add meaning for fqn, depth, max_dependents, or decorator_filter beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'Full change impact report' and enumerates distinct outputs (risk score, breaking change detection, enriched dependents, affected tests, hidden couplings), so an agent knows exactly what the tool returns and can distinguish it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use before modifying code to understand blast radius' and names alternatives: assess_change_risk for a quick risk score and get_call_graph for who-calls-what. This gives direct when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_context_bundleA
Read-onlyIdempotent

Get a symbol's source code + its import dependencies + optional callers, packed within a token budget. Supports batch queries with shared-import deduplication. Use instead of chaining get_symbol calls. For a single symbol without imports, use get_symbol — lighter. Read-only. Returns JSON: { primary: [{ symbol_id, file, source }], imports: [{ file, source }], token_usage }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqnNoAlternative: look up by FQN
symbol_idNoSingle symbol ID
symbol_idsNoBatch: multiple symbol IDs
token_budgetNoMax tokens (default 8000)
output_formatNoOutput format (default json).
include_callersNoInclude who calls these symbols (default false)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint=true and idempotentHint=true, and the description's 'Read-only' agrees with them rather than contradicting them. The description adds genuine behavior beyond annotations: token-budget packing, shared-import deduplication for batch queries, and the exact return shape (primary, imports, token_usage). It loses a point because the 'Returns JSON' claim ignores the markdown output_format option, and truncation/error behavior when the budget is exceeded is undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, each earning its place: function, batch/dedup semantics, routing to the sibling tool, and return shape. The core capability is front-loaded in the first clause with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter read-only tool with no output schema, the description covers the essentials: return shape, token budget behavior, batch semantics, and the lighter alternative. Gaps remain at the edges — the interplay between fqn/symbol_id/symbol_ids and behavior when the token budget is exceeded — but the per-parameter schema descriptions and rich annotations carry much of that load.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 schema already documents all six parameters. The description earns an extra point by adding intent behind key parameters: 'packed within a token budget' clarifies the purpose of token_budget, and 'batch queries with shared-import deduplication' gives symbol_ids behavioral meaning beyond its bare listing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-object pair — 'Get a symbol's source code + its import dependencies + optional callers' — making the tool's function unmistakable. It also explicitly differentiates itself from get_symbol, its closest sibling, by describing what this tool bundles that get_symbol does not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing rules: 'Use instead of chaining get_symbol calls' for import-heavy or batch needs, and 'For a single symbol without imports, use get_symbol — lighter' as the exclusion condition with the alternative named. This is exactly the when/when-not guidance this dimension requires.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_coverage_reportA
Read-onlyIdempotent

Technology profile of the project: detected frameworks/ORMs/UI libs from manifests (package.json, composer.json, etc.), which are covered by trace-mcp plugins, and coverage gaps. Read-only. Returns JSON: { detected, covered, gaps }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior; the description adds value by specifying the data source (manifests), the read-only nature, and the exact return shape { detected, covered, gaps }. This goes beyond the structured 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by the read-only trait and return shape. Every sentence earns its place, with no redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only report with no output schema, the description is complete: it explains what data is gathered, from where, and what the JSON response contains. An agent has enough information to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description provides enough context about the returned fields to make the no-argument call understandable, and there is no parameter documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as producing a technology profile with detected frameworks/ORMs/UI libs and coverage gaps, which is specific and not a tautology. It distinguishes the report's focus on plugin coverage from siblings like get_optimization_report or get_usage_trends, though it does not explicitly name any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than stated: an agent can infer this tool is for inspecting project technology coverage and gaps, but there is no explicit 'use when' guidance or mention of alternatives. No exclusion criteria are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagnosticsA
Read-onlyIdempotent

Execute type-checker (tsc, mypy, pyright) and map errors to enclosing AST symbols. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkerNoChecker (tsc, mypy, pyright)
file_pathNoFilter by file path
max_filesNoMax files reported
timeout_msNoTimeout in ms
max_per_fileNoMax errors per file

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description goes beyond annotations by revealing that the tool invokes external type-checker processes and that its output is a mapping from errors to enclosing AST symbols. It does not mention prerequisites like checker availability or possible slowness, but the core behavioral profile is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence with the action verb front-loaded. Every phrase earns its place: the checker set, the mapping behavior, and the read-only property. No filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description carries the burden of explaining results; 'map errors to enclosing AST symbols' conveys the core return shape. Combined with 100% schema coverage and strong annotations, this is mostly complete, though a hint about failure modes when invoking external checkers would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 5 parameters. The description's mention of the three checkers mirrors the enum and adds no deeper meaning; the filtering and limit parameters are already well-described in the schema. This is the baseline case where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Execute') with a concrete resource ('type-checker (tsc, mypy, pyright)') and a distinctive outcome ('map errors to enclosing AST symbols'). This clearly differentiates it from siblings like get_index_health or get_coverage_report, which target different concerns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to choose this tool over the many related get_* siblings (get_index_health, get_coverage_report, get_optimization_report, etc.). The 'Read-only' tag states a property, not a selection criterion; there is no exclusions or alternatives mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_feature_contextA
Read-onlyIdempotent

Search code by keyword/topic → returns ranked source snippets within a token budget. Use when you need to READ actual code for a concept or feature. For structured task context with tests and entry points use get_task_context instead; for symbol metadata without source use search. Read-only. Returns JSON (default) or Markdown: { items: [{ symbol_id, name, file, source, score }], token_usage } | { content: "...markdown..." }. Supports output_format: "toon". Capped by memory.recall.timeoutMs (default 5000ms); on timeout returns { items: [], token_usage, degraded: true }.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionYesNatural language description of the feature to find context for
detail_levelNoOutput verbosity. "minimal" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: "default".
token_budgetNoMax tokens for assembled context (default 4000)
output_formatNo"json" (default, structured items), "markdown" (fenced code blocks, ~15-20% cheaper), or "toon" (lossless, 30-60% fewer tokens).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite strong annotations (readOnly, idempotent, non-destructive), the description adds meaningful behavioral detail: token budget behavior, output format variants, timeout cap with default value, and a degraded response shape on timeout. It also confirms the read-only nature, aligning with annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded, with the core purpose and usage guidance first. It packs output shapes, timeout behavior, and alternatives into a compact block. Minor redundancy exists ('Read-only' repeats the annotation) and the toon reference is slightly tacked on, but overall every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description properly explains return formats and the degraded timeout case. It covers tool selection, read-only semantics, token budget, and output options. Given the tool's moderate complexity and annotations already handling safety, nothing critical is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents all four parameters, including defaults, enums, and constraints. The description reinforces token budget and output format behavior but does not add substantive per-parameter meaning 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Search code by keyword/topic'), a precise result ('ranked source snippets'), and an explicit constraint ('within a token budget'). It also distinguishes the tool from siblings by naming get_task_context and search as alternatives, so an agent can tell them apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use condition ('when you need to READ actual code for a concept or feature') and clear routing instructions: use get_task_context for structured task context with tests and entry points, and search for symbol metadata without source. This is exactly the kind of differentiation agents need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_index_healthA
Read-onlyIdempotent

Get index status, statistics, health, and pipeline progress (indexing, summarization, embedding). Read-only, no side effects. Use to verify the index is ready before running queries. Returns JSON: { totalFiles, totalSymbols, languages, frameworks, pipelineProgress, embedding }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'Read-only, no side effects' and describes the exact JSON return shape. While annotations already signal read-only/idempotent behavior, the description adds useful context about the response fields and pipeline progress, going beyond what 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose in the first sentence, usage guidance in the second, and return format in the third. Every sentence contributes meaningful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and no output schema, the description is complete: it states purpose, safety, usage timing, and return fields. An agent can invoke this tool confidently without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter documentation burden. The description appropriately focuses on return value semantics instead, which is the relevant information for invoking the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose with a specific verb and resource: 'Get index status, statistics, health, and pipeline progress.' This distinguishes it from sibling tools like get_session_stats or get_coverage_report by focusing on the index health and pipeline state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'Use to verify the index is ready before running queries.' It lacks explicit exclusions or named alternatives, but the usage context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_optimization_reportA
Read-onlyIdempotent

Detect token waste patterns in AI agent sessions: repeated file reads, Bash grep instead of search, large file reads, unused trace-mcp tools. Provides savings estimates. Read-only. For usage/cost overview use get_session_analytics; for A/B savings comparison use get_real_savings. Returns JSON: { patterns: [{ type, description, savings_estimate }], total_waste }.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoTime period (default: week)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety type is covered. The description adds value beyond annotations by describing the JSON return format ({ patterns: [{ type, description, savings_estimate }], total_waste }) and stating it 'Provides savings estimates.' No contradiction 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first names specific waste patterns, the second covers read-only safety and savings estimates, the third gives the return shape and sibling routing. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-optional-parameter tool with no output schema, the description provides the return JSON structure, the tool's scope, and explicit sibling alternatives. Nothing needed 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of the single parameter, including enum values and default. The description does not add any parameter-level detail, so the schema carries the full burden. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 token waste patterns in AI agent sessions,' then lists concrete pattern types (repeated file reads, Bash grep instead of search, large file reads, unused trace-mcp tools). It also provides the return shape and distinguishes itself from siblings by naming their use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to alternatives with conditions: 'For usage/cost overview use get_session_analytics; for A/B savings comparison use get_real_savings.' This tells the agent when not to use this tool and which sibling to pick instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_outlineA
Read-onlyIdempotent

Get all symbols for a file (signatures only, no bodies) — cheaper than Read for understanding a file before editing. Follow up with get_symbol to read one symbol's source. nested: true expands large top-level symbols (default ≥100 LOC) into inner declarations, each carrying parentId + depth (max 3). Read-only. Returns JSON: { path, language, symbols: [{ symbolId, name, kind, signature, lineStart, lineEnd, parentId?, depth? }] }. Supports output_format: "toon".

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative file path
nestedNoWalk the body of each top-level symbol past min_loc_for_nesting and emit inner declarations as extra rows carrying `parentId` + `depth`. Default false.
detail_levelNoOutput verbosity. "minimal" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: "default".
output_formatNo"json" (default) or "toon" (lossless, 30-60% fewer tokens). "markdown" is unsupported here and behaves as json.
min_loc_for_nestingNoMinimum (line_end - line_start) for a top-level symbol to be expanded when nested=true. Default 100.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description adds meaningful behavioral detail: it is signatures-only, cheaper than Read, expands nested declarations with parentId+depth up to max 3, and specifies the exact JSON return shape. No contradiction 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, use case, follow-up, nested behavior, read-only flag, return shape, and format note appear in a logical order. Every sentence earns its place; there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 provides the full JSON return shape and all key behavioral constraints. Parameter semantics are covered by high schema coverage, and usage vs. alternatives is explicit. For a read-only listing tool this is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds value by explaining the nested=true effect (expands large top-level symbols, default ≥100 LOC, max depth 3) and noting output_format 'toon' support, which goes slightly beyond the schema's per-parameter text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('Get all symbols for a file') and immediately clarifies scope ('signatures only, no bodies'). It also distinguishes itself from the sibling get_symbol and from Read by noting it is cheaper for understanding a file before editing, which is strong differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool ('before editing' to understand a file, 'cheaper than Read') and names the follow-up alternative ('get_symbol') for reading a symbol's source. It also explains when nested expansion applies, giving clear practical usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_preset_infoA
Read-onlyIdempotent

Show active tool preset, available presets, which tools are registered in this session, and which are deferred (loadable via load_tools). Read-only. Returns JSON: { active_preset, registered_tools, tool_names, available_presets, deferred_tools }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and non-destructive behavior. The description reinforces this with 'Read-only' and adds the return JSON shape (active_preset, registered_tools, etc.), disclosing what the agent will receive. This extra context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core purpose and followed by a compact JSON key listing. Every sentence adds value; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only introspection tool, the description is complete: it states what the tool reports, the read-only nature, and the exact response fields. There is no output schema, so the description carries the burden of return-value disclosure and does so adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100%. Baseline for zero-parameter tools is 4; the description need not document parameter semantics because there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Show') and enumerates the exact resources: active tool preset, available presets, registered tools, and deferred tools. It clearly differentiates this introspection tool from the many sibling get_* tools and explicitly connects deferred tools to load_tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's context clear: use it to inspect tool registration and preset state. It mentions that deferred tools are loadable via load_tools, providing adjacent guidance, though it does not explicitly state when not to use it or name a directly competing alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_mapA
Read-onlyIdempotent

Get project overview: detected frameworks, languages, file counts, structure. Read-only, no side effects. Call with summary_only=true at session start to orient yourself before diving into code. Use instead of manual ls/find. Returns JSON: { frameworks, languages, fileCount, symbolCount, structure }.

ParametersJSON Schema
NameRequiredDescriptionDefault
summary_onlyNoReturn only framework list + counts (default false)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context beyond that: it confirms 'no side effects', suggests a cheap orientation call pattern, and specifies the return shape. This exceeds the annotation baseline without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences front-load the core behavior and return shape. The 'Read-only, no side effects' clause is slightly redundant with annotations, but the rest earns its place by adding usage guidance and output fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a simple, optional-parameter read-only tool. It names the return JSON fields, gives a recommended invocation, and explains the tool's role. It could mention symbolCount semantics or potential costs, but 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.

Parameters3/5

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 the only parameter. The description adds the session-start use case for summary_only=true, which is helpful, but it does not add meaning beyond what the parameter description already conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('project map') and enumerates contents (frameworks, languages, file counts, structure). It does not explicitly distinguish itself from sibling tools like get_outline or get_context_bundle, but the term 'project map' combined with the described fields is clear enough for an agent to understand what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: call at session start with summary_only=true to orient before diving into code, and use instead of manual ls/find. It does not discuss when not to use it or name alternative tools, but the intended scenario is explicit and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_real_savingsA
Read-onlyIdempotent

A/B comparison: how many tokens could be saved by using trace-mcp instead of raw Read/Bash file reads. Per-file breakdown. Read-only. For pattern-based waste detection use get_optimization_report instead. Returns JSON: { files: [{ file, raw_tokens, compact_tokens, savings }], total_savings }.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoTime period (default: week)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive hints, so the description does not need to repeat safety traits. It adds useful behavioral context by describing the exact return shape: files with raw_tokens, compact_tokens, savings, and total_savings. This is valuable because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then clearly differentiates the tool from a sibling, and finishes with the return JSON shape. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional parameter, the description is complete: it explains what the tool does, when to use it, what it returns, and how it differs from the closest sibling. No important context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the only parameter, period, is fully documented in the schema with an enum and default of 'week'. The description does not add parameter-level meaning beyond the schema, which is expected given high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb and resource: 'A/B comparison: how many tokens could be saved by using trace-mcp instead of raw Read/Bash file reads.' It also specifies the per-file breakdown, making it easy to distinguish from other reporting tools like get_optimization_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly directs when to use this tool versus an alternative: 'For pattern-based waste detection use get_optimization_report instead.' This provides a clear exclusion and alternative, so an agent can route correctly without opening the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_session_analyticsA
Read-onlyIdempotent

Analyze AI agent session logs: token usage, cost breakdown by tool/server, top files, models used. Parses Claude Code JSONL logs automatically. Read-only. For waste detection use get_optimization_report; for cost trends use get_usage_trends. Returns JSON: { sessions, tokens, cost_usd, tools, models, topFiles }.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoTime period (default: week)
session_idNoSpecific session ID to analyze

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and idempotent; the description adds beyond that by noting it 'Parses Claude Code JSONL logs automatically' and specifies the exact return shape. It does not over-disclose or contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, information-dense sentences. The main action is first, then a behavioral note, then alternative routing, then the return format. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only analytics tool with no output schema, the description compensates by stating the return JSON structure and parsing behavior. It lacks explicit prerequisites like 'log files must exist,' but the parameters and routing are sufficiently covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both 'period' and 'session_id' described in the schema. The description does not add parameter-specific semantics, but the schema fully covers it, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Analyze') with a clear resource ('AI agent session logs') and enumerates the concrete outputs (token usage, cost breakdown, top files, models). It also distinguishes itself from sibling tools by naming what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use alternatives: 'For waste detection use get_optimization_report; for cost trends use get_usage_trends.' This gives clear routing guidance and prevents mis-selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_session_statsA
Read-onlyIdempotent

Token savings stats for this session: per-tool call counts, estimated token savings, reduction percentage, dedup savings, and per-tool latency (p50/p95/max/error_rate). Read-only. Returns JSON: { session: { ..., latency_per_tool }, cumulative, dedup_saved_tokens, report }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior, so the description is not burdened with those disclosures. It adds valuable behavioral detail by specifying the returned JSON structure—session with latency_per_tool, cumulative, dedup_saved_tokens, and report—which is especially useful given there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that leads with the purpose and follows with a compact return layout. It contains no filler, though the inline JSON example is somewhat dense and could be slightly clearer as a structured list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only metrics tool, the description covers purpose, scope, and output shape adequately. It does not clarify how 'session' is defined or when a sibling analytics tool would be more appropriate, leaving a small but meaningful gap for an agent selecting among similar tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and the schema coverage is trivially complete, so the baseline is 4. The description reinforces that the tool is parameterless by scoping everything to 'this session,' but it does not need to add more parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource ('this session') and the concrete purpose ('Token savings stats'), and enumerates the metrics returned: per-tool call counts, token savings, reduction percentage, dedup savings, and latency percentiles/error rate. It is clear and specific, but it does not explicitly distinguish itself from overlapping siblings like get_session_analytics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for this session' implies that the tool should be used when an agent wants token-savings metrics for the current session, which provides some usage context. However, the description gives no explicit guidance about when not to use it or how it compares to alternatives such as get_session_analytics, get_optimization_report, or get_real_savings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_symbolA
Read-onlyIdempotent

Look up a symbol by symbol_id or FQN and return its source code. Use instead of Read when you need one specific function/class/method — returns only the symbol, not the whole file. For multiple symbols at once, prefer get_context_bundle. Read-only. Returns JSON: { symbol_id, name, kind, fqn, signature, file, line_start, line_end, source }.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqnNoThe fully qualified name to look up
max_linesNoTruncate source to this many lines (omit for full source)
symbol_idNoThe symbol_id to look up
verify_against_gitNoCompare the indexed source against the current git HEAD slice; mismatches set `git_mismatch: true` in the response (index may be stale). Read-only. Silently skipped when git is unavailable or the file is untracked.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful context beyond annotations: it returns only the symbol rather than the whole file and provides the response shape. It does not mention the verify_against_git comparison behavior or git_mismatch in the return payload, though that is documented in the parameter schema, so this is a minor omission rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. It packs usage guidance, behavioral scope, read-only information, and return shape into three sentences with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides a return shape despite the lack of an output schema and clearly routes between siblings. However, it does not explicitly state that exactly one of symbol_id or fqn is required, and the verify_against_git behavior only lives in the schema. These are real but minor gaps given the otherwise rich annotation and schema context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains each parameter. The description reinforces that either symbol_id or fqn can be used, but it does not add significant meaning beyond the schema for max_lines or verify_against_git. This matches the baseline for fully covered schema parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Look up a symbol by symbol_id or FQN and return its source code.' It clearly distinguishes the tool from Read and get_context_bundle, so an agent can immediately understand what it does and which sibling it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage direction: 'Use instead of Read when you need one specific function/class/method' and 'For multiple symbols at once, prefer get_context_bundle.' This tells the agent when to select this tool and when to select a sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_task_contextA
Read-onlyIdempotent

All-in-one context for starting a dev task: execution paths, tests, entry points, adapted by task type. Use as your FIRST call when beginning any new task — replaces manual chaining of search → get_symbol → Read. For narrower feature-code lookup use get_feature_context instead. Read-only. Returns JSON (default) or Markdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesNatural language description of the task
focusNoContext strategy: minimal (fast, essential only), broad (default, wide net), deep (follow full execution chains)
detail_levelNoOutput verbosity. "minimal" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: "default".
token_budgetNoMax tokens (default 8000)
include_testsNoInclude relevant test files (default true)
output_formatNo"json" (default, structured fields) or "markdown" (single LLM-optimized document with code fences, ~15-20% cheaper).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces these with 'Read-only.' It adds value by disclosing the output formats (JSON default or Markdown) and the adaptive-by-task-type behavior. No contradiction with annotations is present, and the extra output-format detail goes beyond what 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core purpose, the second gives direct usage guidance, and the third handles sibling differentiation. Every sentence earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given six parameters, a rich schema, and no output schema, the description covers the essential call-or-not decision and high-level output shape. It names the context contents (execution paths, tests, entry points) and output formats, though it does not enumerate the exact JSON fields returned; this is a minor gap for an all-in-one context tool but not blocking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains all six parameters, including task, focus, detail_level, token_budget, include_tests, and output_format. The description does not need to compensate for parameter gaps and adds only general context about output format, which is already reflected in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as the all-in-one context for starting a dev task, listing concrete contents (execution paths, tests, entry points) and how it adapts by task type. It also explicitly distinguishes itself from the sibling get_feature_context, so an agent can tell them apart without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use as your FIRST call when beginning any new task' and frames it as a replacement for manually chaining search → get_symbol → Read. It also directs narrower feature-code lookups to get_feature_context, providing a clear alternative and exclusion condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

invalidate_decisionA
Idempotent

Mark a decision as no longer valid. The decision remains in the knowledge graph for historical queries but is excluded from active queries. Use when a decision is superseded or reversed. Mutates the decision store; idempotent. Returns JSON: { invalidated: { id, title, valid_until } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDecision ID to invalidate
valid_untilNoISO timestamp when decision became invalid (default: now)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits beyond annotations: the decision remains for historical queries, is excluded from active queries, mutates the decision store, and is idempotent. It also specifies the return shape. This adds meaningful 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each carrying useful information: the action, the historical/active distinction, the usage condition, and the return format. No filler or redundancy; the most important purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the returned JSON is explicitly stated. The mutation, idempotency, and retention behavior are all covered. The tool's effect on the knowledge graph and query behavior is clear, making it complete for the agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both id and valid_until are documented there. The description itself does not add much parameter-level meaning beyond the schema, but it correctly implies valid_until is part of the return object. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Mark as no longer valid'), names the resource ('decision'), and clearly defines the outcome: the decision stays in the knowledge graph for historical queries but is excluded from active queries. This differentiates it from siblings like remember_decision and query_decisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool: 'Use when a decision is superseded or reversed.' It does not name alternative tools or give when-not-to-use guidance, but the usage context is clear enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_toolsA
Read-onlyIdempotent

Load tools this session's preset deferred, by preset name and/or explicit tool names. Call with no arguments to list what is deferred. Emits notifications/tools/list_changed and returns the loaded tools' schemas, so they are usable even if your client ignores that notification (call them through batch). Returns JSON: { loaded, already_loaded, unknown, blocked, tools, hint }.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolsNoExplicit tool names to load. Unions with `preset` when both are given.
presetNoPreset whose members to load (minimal, standard, review, architecture, full). "full" loads everything deferred.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behavior beyond the annotations: it emits notifications/tools/list_changed, returns loaded tools' schemas, and remains usable even if the client ignores the notification (via batch). It also lists the exact JSON response fields, giving the agent a clear model of side effects and results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: it front-loads the core purpose, then covers invocation modes, side effects, and return shape in a few sentences. No sentence is filler, and the structure makes the most important information immediately visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 names all return fields and explains the notification behavior and batch fallback. Combined with the annotations signaling read-only/idempotent behavior, the description gives the agent enough context to invoke the tool correctly and interpret its response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with 100% coverage, including the union behavior between `tools` and `preset`. The description adds value by specifying the no-arguments listing behavior, which is a parameter-level semantic not captured by the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('load') with a clear resource: deferred tools for the session's preset, by preset name and/or explicit names. It also distinguishes the no-argument listing mode, making the tool's purpose unambiguous and distinct from siblings like get_preset_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: call with no arguments to list deferred tools, or pass preset/tool names to load them. It does not explicitly mention alternatives or when-not-to-use conditions, but the provided context is sufficient for typical invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mine_sessionsA
Idempotent

Mine Claude Code / Claw Code session logs for architectural decisions, tech choices, bug root causes, and preferences. Strategies: "regex" (default, free, ~20-40% recall), "llm" (higher recall, costs tokens), "hybrid" (regex + LLM safety net). Skips already-mined sessions unless force=true. Mutates the decision store; idempotent. Returns JSON: { mined, decisions_extracted, sessions_processed, strategy?, llm_sessions?, llm_decisions_extracted? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoRe-mine already processed sessions (default: false)
strategyNoExtraction strategy: regex (default, free/fast/low recall), llm (AI provider, costs tokens, higher recall), hybrid (regex + LLM safety net). Falls back to regex with a warning if no AI provider is configured.
project_rootNoOnly mine sessions for this project path (default: all projects)
min_confidenceNoLegacy reject floor — drops decisions below this. Superseded by reject_threshold; kept for back-compat.
reject_thresholdNoReject floor (default: config decisions.reject_threshold, fallback 0.45). Decisions in [reject_threshold, review_threshold) queue for review; below it, dropped.
review_thresholdNoAuto-approve cutoff (default: config decisions.review_threshold, fallback 0.75). Decisions ≥ this enter the active graph immediately.
incremental_cursorNoPer-call override for `memory.mining.incrementalCursor`. true (default) reuses byte-offset cursors for appended turns; false falls back to legacy mined/unmined semantics.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states "Mutates the decision store; idempotent," and "Skips already-mined sessions unless force=true." This adds meaningful behavioral context beyond the annotations, specifying exactly what side effect occurs, the idempotency guarantee, and the skip behavior. It aligns with idempotentHint=true and readOnlyHint=false, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and dense: two sentences carrying purpose, strategy tradeoffs, behavioral notes, and return shape. It front-loads the core purpose, uses structured lists for strategies, and contains no filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 optional parameters, no output schema, and moderate complexity, the description supplies the return JSON structure, strategy cost/recall tradeoffs, mutation behavior, and skip logic. Combined with 100% schema coverage, an agent has everything needed to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents all 7 parameters with detailed descriptions, including enum choices, thresholds, and the incremental_cursor override. The description merely summarizes strategy and force, adding no new semantic information beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: "Mine Claude Code / Claw Code session logs for architectural decisions, tech choices, bug root causes, and preferences." This clearly distinguishes it from sibling read/query tools like search and query_decisions by stating it processes session logs and mutates the decision store. The 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on strategy selection (regex vs llm vs hybrid) and explains the skip-already-mined behavior with force=true. However, it never explicitly names alternatives or states when NOT to use this tool (e.g., "use query_decisions instead to read stored decisions"). Context is clear but exclusions are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_turnA
Read-onlyIdempotent

Opening-move router for new tasks. Combines BM25/PageRank search + session journal (negative evidence + focus signals) + framework-aware insertion-point suggestions + change-risk + turn-budget advisor into ONE call. Returns verdict (exists/partial/missing/ambiguous), confidence, ranked targets with provenance, scaffold hints when missing, and recommended next tool calls. Call this FIRST on a new task to break the empty-result hallucination chain. Read-only. For broader task context with source code use get_task_context instead. Returns JSON: { verdict, confidence, targets, scaffoldHints, nextSteps }.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesNatural-language task description (e.g. "add a webhook endpoint for stripe payments")
intentNoOptional intent hint; auto-classified from task if omitted
skip_riskNoSkip change-risk assessment for the top target (default false)
max_targetsNoCap on returned targets (default 5)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this read-only, idempotent, and non-destructive, and the description reinforces this with 'Read-only.' It adds behavioral context by explaining the tool's combined search/journal/risk mechanism and its role in preventing empty-result hallucinations, going beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and mostly front-loaded, starting with the primary purpose and usage call-to-action. The long enumeration of combined capabilities and the slight redundancy between 'Returns...' and 'Returns JSON: {...}' keep it from being perfectly concise, but every sentence contributes needed context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the absence of an output schema, the description states the JSON shape, the verdict values, the provenance of ranked targets, scaffold hints, and recommended next steps. Combined with the explicit usage instruction and alternative tool pointer, an agent has what it needs to invoke the tool correctly on a new task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a clear description with defaults and constraints. The tool description does not meaningfully add parameter-level guidance, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Opening-move router for new tasks' and lists a concrete deliverable set: verdict, confidence, ranked targets with provenance, scaffold hints, and recommended next tool calls. It also explicitly distinguishes itself from get_task_context, so an agent can select it correctly among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use it: 'Call this FIRST on a new task to break the empty-result hallucination chain.' It also names the alternative, get_task_context, and the condition for preferring that instead ('broader task context with source code'), giving clear, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_decisionsA
Read-onlyIdempotent

Query the decision knowledge graph. Filter by type, subproject, code symbol, file path, tag, or time — answers "why was this architecture chosen?" with the actual decision record. Use service_name to scope to a subproject. Defaults to auto+human-approved decisions; use include_pending or review_status for other tiers. Rows carry cluster_ids when part of a topical cluster (see clusters_summary). Read-only. Returns JSON: { decisions: [{ id, title, type, content, tags, review_status, cluster_ids? }], clusters_summary?, total_results }. Supports output_format: "toon". Capped by memory.recall.timeoutMs (default 5000ms); on timeout returns { decisions: [], total_results: 0, degraded: true }.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by tag
typeNoFilter by decision type
as_ofNoOnly decisions active at this ISO timestamp
limitNoMax results (default: 50)
searchNoFull-text search query (FTS5 with porter stemming)
verifyNoStaleness verification (default true). Checks each `symbol_id`-linked decision against the live index + git history; deleted/renamed/materially-changed code is flagged `verification` + `stale: true`. false skips the check.
order_byNoResult ordering: "recency" (default, valid_from DESC), "created_at" DESC, or "heat" (time-decay favoring frequently-recalled + fresh; degrades to recency if disabled in config).
file_pathNoFilter by linked file path
symbol_idNoFilter by linked symbol FQN
git_branchNoBranch filter: "current" (default) = current branch + branch-agnostic; "all" = every branch; any other value = that branch + branch-agnostic.
index_onlyNoProgressive disclosure (default false). true omits full `content` — just id, title, type, anchors, tags, ~1-line `summary`. Pick ids cheaply, then pull full content with `get_decision`.
service_nameNoFilter by subproject name (e.g., "auth-api")
verificationNoFilter by verification verdict (implies verify=true). "stale" = any flagged row; "ok" = verified-fresh only. Omit to return all rows annotated in place.
output_formatNoOutput format. "json" (default), "markdown" (LLM-friendly fenced markdown, tool-specific), or "toon" (Token-Oriented Object Notation — 30-60% fewer tokens on tabular data, lossless).
review_statusNoRestrict to a single review tier (overrides default + include_pending). Use "pending" to fetch the review queue.
include_pendingNoAlso return decisions in the review queue (review_status="pending"). Default: false — only auto-approved and approved rows are returned.
include_invalidatedNoInclude invalidated decisions (default: false)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/destructive annotations by disclosing the default review-tier filter, cluster_ids on clustered rows, the JSON response shape, and the timeout cap with degraded response `{ decisions: [], total_results: 0, degraded: true }`. It also mentions staleness verification and output_format support, giving the agent a realistic picture of behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and filters, then moves through scoping, defaults, return shape, format, and timeout. Every sentence earns its place, and the order is logical—no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description provides the full return contract (`decisions`, `clusters_summary?`, `total_results`) and a timeout edge case. For a complex 17-parameter tool, it covers defaults, scoping, response behavior, and failure mode, leaving only the fine-grained parameter mechanics to the already-detailed schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed descriptions for all 17 parameters, so the baseline of 3 applies. The main description repeats a couple of hints (service_name scoping, review tier defaults) but adds no meaning beyond what the schema already provides for individual parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Query the decision knowledge graph') and anchors it to the concrete question 'why was this architecture chosen?' with the actual decision record. This clearly distinguishes it from sibling mutation tools like remember_decision and invalidate_decision, and from a single-record getter like get_decision.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear invocation context: 'Use service_name to scope to a subproject' and 'Defaults to auto+human-approved decisions; use include_pending or review_status for other tiers.' However, the main description does not explicitly name an alternative tool or state when not to use this tool; the only alternative hint (get_decision) appears in the index_only parameter description rather than the main description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_editA
Idempotent

Notify trace-mcp that a file was edited. Reindexes the single file and invalidates search caches. Call after Edit/Write to keep index fresh — much lighter than full reindex. Also flags duplicate symbols — if _duplication_warnings appears, you may be recreating existing logic; review them. Each one is reported once per file, not on every edit; check_duplication re-asks. Mutates the index; idempotent. Returns JSON: { status, file, totalFiles, indexed, _duplication_warnings? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesRelative path to the edited file

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry idempotentHint=true, readOnlyHint=false, and destructiveHint=false; the description confirms these ('Mutates the index; idempotent') without contradicting them. It adds real value beyond annotations: search-cache invalidation, duplicate-symbol flagging, the once-per-file reporting constraint, and the exact JSON return shape. Minor gap: no mention of error behavior when the file path is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then usage guidance, then the duplication caveat, then the return format. Each sentence earns its place and the information is ordered by importance. Slightly dense, but not padded — no redundancy with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter mutation tool: it covers what happens (reindex, cache invalidation), when to use it (after Edit/Write, lighter than full reindex), its idempotency, a caveat (duplication warnings, reported once per file), and the return structure in the absence of an output schema. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — the single parameter file_path is fully documented as 'Relative path to the edited file.' The description references the file only implicitly through the return JSON ({ file }), adding no semantic detail beyond the schema. Baseline 3 is appropriate since the schema carries the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Notify trace-mcp that a file was edited'), and precisely scopes what happens: reindex the single file and invalidate search caches. It clearly differentiates from the read-oriented siblings (get_index_health, get_symbol, search) by being a mutation, and positions itself as the lightweight single-file counterpart to a full reindex.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance: 'Call after Edit/Write to keep index fresh — much lighter than full reindex.' It names the alternative (full reindex) and the deciding condition. It also routes a follow-up question to a sibling ('check_duplication re-asks'), so an agent knows which tool to pick next.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remember_decisionA
Read-onlyIdempotent

Live agent write into the decision knowledge graph. Confidence-scores the input and routes it through the memoir review queue: high-confidence rows enter the active graph immediately, mid-confidence rows queue for human approval, low-confidence rows are dropped without persistence. Per-session dedup + rate-limit. Use during a session to capture decisions in real time. For manual high-confidence writes use add_decision; for post-hoc extraction from session logs use mine_sessions. Returns JSON: { id, review_status, confidence, deduplicated? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags for categorization (e.g., ["auth", "security"])
typeYesDecision type
titleYesShort summary of the decision
contentYesFull decision text — reasoning, context, tradeoffs
file_pathNoFile path this decision is about
symbol_idNoSymbol FQN this decision is about (e.g., "src/auth/provider.ts::AuthProvider#class")
git_branchNoGit branch this decision belongs to. Omit to auto-detect, or pass null to make it branch-agnostic.
session_idNoSession identifier for dedup/rate-limit (default: "_default")
service_nameNoSubproject name this decision is about (e.g., "auth-api", "user-service")

TDQS

A3.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description contradicts the annotations: it says 'Live agent write into the decision knowledge graph' and discusses persistence, while annotations declare readOnlyHint=true. Per the scoring rule, this contradiction forces a score of 1. The otherwise rich behavioral detail (confidence routing, dedup, rate limit) cannot be trusted alongside contradictory metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, and every sentence contributes useful information: routing behavior, usage context, alternatives, and return shape. The middle sentence is dense but still readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no output schema, the description covers the important non-schema context: confidence tiers, review queue behavior, dedup/rate-limit, and the JSON return shape. It could add permission requirements or rate-limit specifics, but the essentials are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 nine parameters. The description adds almost nothing parameter-specific beyond connecting session_id to dedup/rate-limit behavior, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('write into the decision knowledge graph') and clearly differentiates from siblings by referencing add_decision and mine_sessions. The confidence-routing behavior further clarifies what this tool uniquely does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('during a session to capture decisions in real time') and names two alternatives with their appropriate conditions: add_decision for manual high-confidence writes and mine_sessions for post-hoc extraction. This gives an agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_textA
Read-onlyIdempotent

Full-text search across all indexed files. Supports regex, glob file patterns, language filter. Use for finding strings, comments, TODOs, config values, error messages — anything not captured as a symbol. For symbol search (functions, classes) use search instead. Read-only. Returns JSON: { files: [{ file, language, hits: [{ line, column, match, context }] }], total_matches } — hits grouped per file, so a long path is paid once. Pass grouping: "flat" for the ungrouped matches[] shape.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch string or regex pattern
groupingNoPayload shape. "by_file" (default) groups hits per file, so a long path is paid once; "flat" is a single matches[] array.by_file
is_regexNoTreat query as regex (default false)
languageNoFilter by language (e.g. "typescript", "python")
timeout_msNoWall-clock budget in ms — caps a catastrophic-backtracking regex. Default 2000; 0 disables.
max_resultsNoMax matches to return (default 50)
file_patternNoGlob filter, e.g. "src/**/*.ts"
context_linesNoLines of context before/after each match (default 0 — set higher if you need surrounding code)
case_sensitiveNoCase-sensitive search (default false)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description independently states 'Read-only.' Beyond annotations, it discloses the return JSON shape, grouping behavior, and the cost nuance that 'a long path is paid once.' It doesn't discuss rate limits or indexing freshness, but the description adds meaningful behavioral context beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then adds routing guidance, safety info, return shape, and grouping nuance. It is a bit dense with multiple clauses in one sentence, but every sentence earns its place and the structure is logical. Slightly long but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with 9 well-documented parameters and an explicit return JSON shape, the description covers the key decision factors: what it searches, how to filter, how grouping changes the response, and when to use the sibling. It doesn't cover timeout defaults or max_results limits, but those are in the schema. Given no output schema, the return shape description compensates well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 9 parameters. The description adds some meaning by naming regex/glob/language filter support and explaining the grouping difference between 'by_file' and 'flat', but the schema already carries most of the semantic weight. Baseline 3 is appropriate because the description adds only modest value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states what the tool does: full-text search across indexed files, with explicit support for regex, glob file patterns, and language filtering. It clearly differentiates from the sibling 'search' tool by stating that search_text is for strings/comments/TODOs/config values/error messages, while symbol search (functions, classes) should use 'search' instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it versus the alternative: 'For symbol search (functions, classes) use search instead.' This direct routing to a sibling tool gives the agent clear selection criteria. It also names the read-only nature and describes the return shape, giving the agent enough context to decide whether this tool fits the task.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_queriesA
Read-onlyIdempotent

Onboarding helper: shows top imported files, most connected symbols (PageRank), language stats, and example tool calls. Call this first when exploring an unfamiliar project. For a structured project map use get_project_map instead. Read-only. Returns JSON: { topFiles, topSymbols, languageStats, exampleQueries }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description confirms read-only behavior, consistent with the readOnlyHint/idempotentHint annotations, and adds a concrete response shape even without an output schema. It does not mention edge cases like rate limits or authentication, but these are less critical for a read-only onboarding helper.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the onboarder identity is front-loaded, usage timing is clear, the alternative is named, and the JSON return shape is compactly listed. There is no filler or redundant schema repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with no output schema, the description covers purpose, output fields, usage timing, and the relevant sibling. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100% and the baseline is 4. The description adds no parameter details because there are none; instead it clarifies what the no-input call returns, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('shows') and names the resource types it exposes: top imported files, connected symbols, language stats, and example tool calls. It also explicitly differentiates from get_project_map, so an agent can distinguish it from siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact condition for use — 'Call this first when exploring an unfamiliar project' — and names the alternative, get_project_map, for a structured project map. This gives clear when-to-use and when-not-to-use guidance with an explicit replacement.

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.

  1. 1 tool updatev3.25.0
    • Addedget_diagnostics
  2. 11 tool updatesv3.22.0
    • Changedfind_usages2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max references returned (default 50).",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id",
        -  "fqn",
        -  "file_path"
        -]
    • Changedget_call_graph1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id",
        -  "fqn"
        -]
    • Changedget_change_impact1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "file_path",
        -  "symbol_id"
        -]
    • Changedget_context_bundle1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id",
        -  "fqn"
        -]
    • Changedget_session_analytics1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "session_id"
        -]
    • Changedget_symbol1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id",
        -  "fqn"
        -]
    • Changedload_tools1 field changed
      • removedInput schema / required
        Removed value: -[
        -  "preset"
        -]
    • Changedquery_decisions2 fields changed
      • changedInput schema / properties / output_format / description
        Previous value: -"Output format. \"json\" (default) returns JSON, \"markdown\" returns LLM-friendly fenced markdown (tool-specific), \"toon\" returns Token-Oriented Object Notation — 30-60% fewer tokens on tabular data, fully lossless."New value: +"Output format. \"json\" (default), \"markdown\" (LLM-friendly fenced markdown, tool-specific), or \"toon\" (Token-Oriented Object Notation — 30-60% fewer tokens on tabular data, lossless)."
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id",
        -  "file_path",
        -  "tag",
        -  "as_of"
        -]
    • Changedremember_decision1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "title",
        -  "content",
        -  "type",
        -  "file_path"
        -]New value: +[
        +  "title",
        +  "content",
        +  "type"
        +]
    • Changedsearch1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "query",
        -  "language",
        -  "file_pattern"
        -]New value: +[
        +  "query"
        +]
    • Changedsearch_text3 fields changed
      • changedInput schema / properties / grouping / default
        Previous value: -"flat"New value: +"by_file"
      • changedInput schema / properties / grouping / description
        Previous value: -"Payload shape. \"flat\" (default) is a single matches[] array; \"by_file\" groups hits per file — saves tokens on long paths with many hits."New value: +"Payload shape. \"by_file\" (default) groups hits per file, so a long path is paid once; \"flat\" is a single matches[] array."
      • changedInput schema / required
        Previous value: -[
        -  "query",
        -  "file_pattern"
        -]New value: +[
        +  "query"
        +]
  3. 56 tool updatesv3.3.0
    • Removedapply_codemod
    • Removedassess_change_risk
    • Changedbatch1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedcheck_duplication
    • Removedcheck_quality_gates
    • Removedcheck_rename
    • Removeddetect_antipatterns
    • Changedfind_usages1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_call_graph1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_change_impact1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_changed_symbols
    • Removedget_circular_imports
    • Removedget_complexity_report
    • Removedget_complexity_trend
    • Changedget_context_bundle1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_control_flow
    • Removedget_coupling
    • Removedget_coupling_trend
    • Changedget_coverage_report1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_dead_code
    • Removedget_dead_exports
    • Removedget_env_vars
    • Changedget_feature_context3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / detail_level
        Added value: +{
        +  "description": "Output verbosity. \"minimal\" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: \"default\".",
        +  "enum": [
        +    "minimal",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / output_format / description
        Previous value: -"Output format. \"json\" (default) returns structured items; \"markdown\" returns LLM-friendly fenced code blocks (~15-20% token savings, easier for the model to read); \"toon\" returns Token-Oriented Object Notation — 30-60% fewer tokens, lossless."New value: +"\"json\" (default, structured items), \"markdown\" (fenced code blocks, ~15-20% cheaper), or \"toon\" (lossless, 30-60% fewer tokens)."
    • Removedget_implementations
    • Changedget_index_health1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_optimization_report1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_outline3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / nested / description
        Previous value: -"When true, walks the body of each top-level symbol whose LOC exceeds min_loc_for_nesting and emits inner function-like declarations as additional rows carrying `parentId` + `depth`. Default false — fully backward compatible."New value: +"Walk the body of each top-level symbol past min_loc_for_nesting and emit inner declarations as extra rows carrying `parentId` + `depth`. Default false."
      • changedInput schema / properties / output_format / description
        Previous value: -"Output format. \"json\" (default) returns JSON; \"toon\" returns Token-Oriented Object Notation — 30-60% fewer tokens, lossless. \"markdown\" is unsupported here and behaves as json."New value: +"\"json\" (default) or \"toon\" (lossless, 30-60% fewer tokens). \"markdown\" is unsupported here and behaves as json."
    • Changedget_preset_info1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_project_map1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_real_savings1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_related_symbols
    • Changedget_session_analytics1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_session_resume
    • Changedget_session_stats1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_symbol2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / verify_against_git / description
        Previous value: -"When true, compare the indexed source against the current git HEAD slice for that file and line range. If they differ, the response includes `git_mismatch: true` indicating the index may be stale. Read-only — never writes. Silently skipped when git is unavailable or the file is not tracked."New value: +"Compare the indexed source against the current git HEAD slice; mismatches set `git_mismatch: true` in the response (index may be stale). Read-only. Silently skipped when git is unavailable or the file is untracked."
    • Removedget_symbol_complexity_trend
    • Changedget_task_context3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / detail_level
        Added value: +{
        +  "description": "Output verbosity. \"minimal\" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: \"default\".",
        +  "enum": [
        +    "minimal",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / output_format / description
        Previous value: -"Output format. \"json\" (default) returns structured fields; \"markdown\" returns a single LLM-optimized document with code fences (~15-20% token savings)."New value: +"\"json\" (default, structured fields) or \"markdown\" (single LLM-optimized document with code fences, ~15-20% cheaper)."
    • Removedget_tech_debt
    • Removedget_tests_for
    • Changedget_usage_trends1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedget_workspace_map
    • Changedinvalidate_decision1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Addedload_tools
    • Changedmine_sessions5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / incremental_cursor / description
        Previous value: -"Per-call override for `memory.mining.incrementalCursor`. When true (default), reuse byte-offset cursors so appended turns get re-processed; when false, fall back to legacy binary mined/unmined semantics."New value: +"Per-call override for `memory.mining.incrementalCursor`. true (default) reuses byte-offset cursors for appended turns; false falls back to legacy mined/unmined semantics."
      • changedInput schema / properties / reject_threshold / description
        Previous value: -"Memoir reject floor (default: decisions.reject_threshold from config, fallback 0.45). Decisions in [reject_threshold, review_threshold) go into the review queue; below reject_threshold they are dropped."New value: +"Reject floor (default: config decisions.reject_threshold, fallback 0.45). Decisions in [reject_threshold, review_threshold) queue for review; below it, dropped."
      • changedInput schema / properties / review_threshold / description
        Previous value: -"Memoir auto-approve cutoff (default: decisions.review_threshold from config, fallback 0.75). Decisions ≥ this enter the active knowledge graph immediately."New value: +"Auto-approve cutoff (default: config decisions.review_threshold, fallback 0.75). Decisions ≥ this enter the active graph immediately."
      • changedInput schema / properties / strategy / description
        Previous value: -"Extraction strategy. regex (default): free, fast, low recall. llm: uses AI provider, costs tokens, higher recall. hybrid: regex + LLM safety net (recommended when AI configured). Falls back to regex with a warning if llm/hybrid is requested but no AI provider is configured."New value: +"Extraction strategy: regex (default, free/fast/low recall), llm (AI provider, costs tokens, higher recall), hybrid (regex + LLM safety net). Falls back to regex with a warning if no AI provider is configured."
    • Changedplan_turn1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedpredict_bugs
    • Changedquery_decisions6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / git_branch / description
        Previous value: -"Branch filter. \"current\" (default) → current branch + branch-agnostic decisions. \"all\" → every branch. Any other value → that specific branch + branch-agnostic decisions."New value: +"Branch filter: \"current\" (default) = current branch + branch-agnostic; \"all\" = every branch; any other value = that branch + branch-agnostic."
      • changedInput schema / properties / index_only / description
        Previous value: -"Progressive disclosure (default: false). When true, each decision is returned WITHOUT its full `content` — just id, title, type, code anchors, tags, and a ~1-line `summary`. Pick the relevant ids cheaply, then pull full content with `get_decision`. Pure token-saver."New value: +"Progressive disclosure (default false). true omits full `content` — just id, title, type, anchors, tags, ~1-line `summary`. Pick ids cheaply, then pull full content with `get_decision`."
      • changedInput schema / properties / order_by / description
        Previous value: -"Result ordering. \"recency\" (default): valid_from DESC. \"created_at\": created_at DESC. \"heat\": time-decay scoring biased toward frequently-recalled + fresh decisions. When heat is disabled in config, \"heat\" gracefully degrades to \"recency\"."New value: +"Result ordering: \"recency\" (default, valid_from DESC), \"created_at\" DESC, or \"heat\" (time-decay favoring frequently-recalled + fresh; degrades to recency if disabled in config)."
      • changedInput schema / properties / verification / description
        Previous value: -"Filter by verification verdict (implies verify). \"stale\" returns any flagged row (symbol_missing OR code_changed); \"ok\" returns only verified-fresh rows. Omit to return all rows annotated in place."New value: +"Filter by verification verdict (implies verify=true). \"stale\" = any flagged row; \"ok\" = verified-fresh only. Omit to return all rows annotated in place."
      • changedInput schema / properties / verify / description
        Previous value: -"Staleness verification (default: true). When true, each decision linked to a `symbol_id` is checked against the live index + git history; rows whose code was deleted/renamed or materially changed since `created_at` are flagged with `verification` (\"symbol_missing\" | \"code_changed\") and `stale: true`. Pass false to skip the check entirely."New value: +"Staleness verification (default true). Checks each `symbol_id`-linked decision against the live index + git history; deleted/renamed/materially-changed code is flagged `verification` + `stale: true`. false skips the check."
    • Changedregister_edit1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedreindex
    • Changedremember_decision1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Removedremove_dead_code
    • Removedscan_security
    • Changedsearch14 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / decorator / description
        Previous value: -"Filter to symbols with this decorator/annotation/attribute (e.g. \"Injectable\", \"Route\", \"Transactional\")"New value: +"Filter to symbols carrying this decorator/annotation/attribute"
      • changedInput schema / properties / drill_from / description
        Previous value: -"Drill scope for mode=\"drill\" — a file path or symbol_id. Results are restricted to the subtree rooted here."New value: +"[mode=\"drill\"] File path or symbol_id to restrict results to."
      • changedInput schema / properties / fusion / description
        Previous value: -"Enable Signal Fusion Pipeline — multi-channel WRR ranking across lexical (BM25), structural (PageRank), similarity (embeddings), and identity (exact/prefix/segment match). Produces better results than single-channel search."New value: +"Enable Signal Fusion — multi-channel WRR ranking across lexical (BM25), structural (PageRank), similarity (embeddings), and identity match. Weights come from `tune_weights`."
      • removedInput schema / properties / fusion_debug
        Removed value: -{
        -  "description": "Include per-channel rank contributions in fusion results.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / fusion_weights
        Removed value: -{
        -  "description": "Per-channel weights for fusion (auto-normalized). Defaults: lexical=0.4, structural=0.25, similarity=0.2, identity=0.15.",
        -  "properties": {
        -    "identity": {
        -      "maximum": 1,
        -      "minimum": 0,
        -      "type": "number"
        -    },
        -    "lexical": {
        -      "maximum": 1,
        -      "minimum": 0,
        -      "type": "number"
        -    },
        -    "similarity": {
        -      "maximum": 1,
        -      "minimum": 0,
        -      "type": "number"
        -    },
        -    "structural": {
        -      "maximum": 1,
        -      "minimum": 0,
        -      "type": "number"
        -    }
        -  },
        -  "type": "object"
        -}
      • changedInput schema / properties / fuzzy / description
        Previous value: -"Enable fuzzy search (trigram + Levenshtein). Auto-enabled when exact search returns 0 results."New value: +"Typo-tolerant search. Auto-enabled when exact search returns 0 results."
      • changedInput schema / properties / fuzzy_threshold / description
        Previous value: -"Minimum Jaccard trigram similarity (default 0.3)"New value: +"[fuzzy] Min trigram similarity (default 0.3)"
      • changedInput schema / properties / max_edit_distance / description
        Previous value: -"Maximum Levenshtein edit distance (default 3)"New value: +"[fuzzy] Max edit distance (default 3)"
      • changedInput schema / properties / mode / description
        Previous value: -"Memoir-style retrieval mode: single (default — top-K), tiered (high/medium/low buckets), drill (scoped to drill_from), flat (raw FTS, no PageRank), get (exact lookup). Omit to auto-pick (path-shaped query → get, otherwise → single)."New value: +"single (default): top-K. tiered: high/medium/low buckets. drill: scoped to drill_from. flat: raw FTS, no PageRank. get: exact lookup. Omit to auto-pick."
      • changedInput schema / properties / output_format / description
        Previous value: -"Output format. \"json\" (default) returns JSON; \"toon\" returns Token-Oriented Object Notation — 30-60% fewer tokens, lossless. \"markdown\" is unsupported here and behaves as json."New value: +"\"json\" (default) or \"toon\" (lossless, 30-60% fewer tokens). \"markdown\" behaves as json here."
      • addedInput schema / properties / retriever
        Added value: +{
        +  "description": "Run one named retrieval algorithm instead of the mode dispatcher. Ignores mode/filters/fuzzy/fusion; returns { retriever, items, total }.",
        +  "enum": [
        +    "lexical",
        +    "semantic",
        +    "hybrid",
        +    "summary",
        +    "feeling_lucky",
        +    "graph_completion"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / semantic / description
        Previous value: -"Semantic mode: auto (default — hybrid if AI available), on (force hybrid), off (lexical-only), only (pure vector). Requires AI provider + embed_repo for non-\"off\" modes."New value: +"auto (default): hybrid if AI available. on: force hybrid. off: lexical-only. only: pure vector. Non-\"off\" needs an AI provider + one embed_repo run."
      • changedInput schema / properties / semantic_weight / description
        Previous value: -"Hybrid fusion weight in [0,1]. 0 = lexical only, 0.5 = balanced (default), 1 = semantic only."New value: +"[semantic] 0 = lexical only, 0.5 = balanced (default), 1 = vector only."
    • Changedsearch_text3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / grouping / description
        Previous value: -"Payload shape. \"flat\" returns a single matches[] array (default). \"by_file\" groups hits under each file — saves tokens on long paths with many hits."New value: +"Payload shape. \"flat\" (default) is a single matches[] array; \"by_file\" groups hits per file — saves tokens on long paths with many hits."
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Wall-clock budget in milliseconds. Catastrophic-backtracking regex cannot pin a worker beyond this. Default 2000. Set 0 to disable."New value: +"Wall-clock budget in ms — caps a catastrophic-backtracking regex. Default 2000; 0 disables."
    • Removedself_audit
    • Changedsuggest_queries1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  4. 99 tool updatesv1.47.1
    • Removedadd_decision
    • Removedanalyze_perf
    • Removedapply_move
    • Removedapply_rename
    • Removedapprove_decision
    • Removedaudit_config
    • Removedbenchmark_project
    • Removedbuild_corpus
    • Removedbuild_decision_clusters
    • Removedchange_signature
    • Removedcheck_architecture
    • Removedcheck_claudemd_drift
    • Removedcheck_edit_safe
    • Removedcheck_embedding_drift
    • Removedcompare_branches
    • Removedconsolidate_decisions
    • Removeddelete_corpus
    • Removeddetect_ast_clones
    • Removeddetect_communities
    • Removeddetect_drift
    • Removeddiff_graph_snapshots
    • Removeddiscover_hermes_sessions
    • Removedembed_repo
    • Removedexport_decisions
    • Removedexport_graph
    • Removedexport_security_context
    • Removedextract_function
    • Removedgenerate_docs
    • Removedgenerate_insights_report
    • Removedgenerate_sbom
    • Removedget_api_surface
    • Removedget_artifacts
    • Removedget_cluster_decisions
    • Removedget_co_changes
    • Removedget_code_owners
    • Removedget_communities
    • Removedget_community
    • Removedget_cross_domain_deps
    • Removedget_cross_workspace_impact
    • Removedget_dataflow
    • Removedget_decision
    • Removedget_decision_clusters
    • Removedget_decision_stats
    • Removedget_decision_timeline
    • Removedget_dependency_diagram
    • Removedget_domain_context
    • Removedget_domain_map
    • Removedget_edge_bottlenecks
    • Removedget_file_health_timeline
    • Removedget_git_churn
    • Removedget_graph_timeline
    • Removedget_health_trends
    • Removedget_import_graph
    • Removedget_minimal_context
    • Removedget_package_deps
    • Removedget_pagerank
    • Removedget_plugin_registry
    • Removedget_project_health
    • Removedget_project_memo
    • Removedget_refactor_candidates
    • Removedget_risk_hotspots
    • Removedget_session_journal
    • Removedget_session_snapshot
    • Removedget_suggested_questions
    • Removedget_surprises
    • Removedget_symbol_owners
    • Removedget_type_hierarchy
    • Removedget_untested_exports
    • Removedget_untested_symbols
    • Removedget_wake_up
    • Removedgraph_query
    • Removedindex_sessions
    • Removedlist_bundles
    • Removedlist_corpora
    • Removedlist_graph_snapshots
    • Removedlist_pins
    • Removedpack_context
    • Removedpin_file
    • Removedpin_symbol
    • Removedplan_batch_change
    • Removedplan_refactoring
    • Removedquery_by_intent
    • Removedquery_corpus
    • Removedrefresh_co_changes
    • Removedregenerate_project_memo
    • Removedreject_decision
    • Removedrepair_index
    • Removedscan_code_smells
    • Removedsearch_bundles
    • Removedsearch_sessions
    • Removedsearch_with_mode
    • Removedsnapshot_graph
    • Removedtaint_analysis
    • Removedtraverse_graph
    • Removedtune_decision_weights
    • Removedtune_weights
    • Removedunpin
    • Removedverify_index
    • Removedvisualize_graph
  5. 1 tool updatev1.46.0
    • Changedconsolidate_decisions1 field changed
      • addedInput schema / properties / purge_low_quality
        Added value: +{
        +  "description": "Maintenance mode (no AI required). When true, invalidate active MINED/AUTO decisions that fail the quality gate — truncated mid-sentence titles, single-word or broken-encoding summaries, non-English fragments. Respects dry_run (default true → preview only). Manual decisions are never touched. Use this to clean legacy garbage produced before the extraction gate shipped.",
        +  "type": "boolean"
        +}
  6. 8 tool updatesv1.43.3
    • Changedapply_codemod4 fields changed
      • addedInput schema / properties / engine
        Added value: +{
        +  "description": "Engine: \"auto\" (default — AST for ast-grep patterns on supported code files, else regex), \"ast\" (force ast-grep), \"regex\" (force text regex).",
        +  "enum": [
        +    "auto",
        +    "ast",
        +    "regex"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / multiline / description
        Previous value: -"Enable multiline mode (dot matches newlines, patterns span lines)"New value: +"Regex engine only: multiline mode (dot matches newlines, patterns span lines)"
      • changedInput schema / properties / pattern / description
        Previous value: -"Regex pattern to match (JavaScript regex syntax)"New value: +"Pattern to match. ast-grep pattern (e.g. \"foo($$$ARGS)\", \"console.log($A)\") for the AST engine, or a JavaScript regex for the text engine."
      • changedInput schema / properties / replacement / description
        Previous value: -"Replacement string ($1, $2 for capture groups)"New value: +"Replacement template. AST engine: substitute captured metavariables ($A, $$$ARGS, or positional $1/$2). Regex engine: $1, $2 capture groups."
    • Changedcheck_quality_gates1 field changed
      • addedInput schema / properties / output_format
        Added value: +{
        +  "description": "Output format. \"json\" (default) returns the native gate report; \"sarif\" emits a SARIF 2.1.0 log (only warning/error gates become results) for code-scanning ingestion.",
        +  "enum": [
        +    "json",
        +    "sarif"
        +  ],
        +  "type": "string"
        +}
    • Changeddetect_antipatterns1 field changed
      • addedInput schema / properties / output_format
        Added value: +{
        +  "description": "Output format. \"json\" (default) returns the native finding shape; \"sarif\" emits a SARIF 2.1.0 log for code-scanning ingestion.",
        +  "enum": [
        +    "json",
        +    "sarif"
        +  ],
        +  "type": "string"
        +}
    • Addedget_decision
    • Addedget_file_health_timeline
    • Addedget_graph_timeline
    • Changedquery_decisions3 fields changed
      • addedInput schema / properties / index_only
        Added value: +{
        +  "description": "Progressive disclosure (default: false). When true, each decision is returned WITHOUT its full `content` — just id, title, type, code anchors, tags, and a ~1-line `summary`. Pick the relevant ids cheaply, then pull full content with `get_decision`. Pure token-saver.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / verification
        Added value: +{
        +  "description": "Filter by verification verdict (implies verify). \"stale\" returns any flagged row (symbol_missing OR code_changed); \"ok\" returns only verified-fresh rows. Omit to return all rows annotated in place.",
        +  "enum": [
        +    "ok",
        +    "symbol_missing",
        +    "code_changed",
        +    "stale"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verify
        Added value: +{
        +  "description": "Staleness verification (default: true). When true, each decision linked to a `symbol_id` is checked against the live index + git history; rows whose code was deleted/renamed or materially changed since `created_at` are flagged with `verification` (\"symbol_missing\" | \"code_changed\") and `stale: true`. Pass false to skip the check entirely.",
        +  "type": "boolean"
        +}
    • Changedscan_security1 field changed
      • addedInput schema / properties / output_format
        Added value: +{
        +  "description": "Output format. \"json\" (default) returns the native finding shape; \"sarif\" emits a SARIF 2.1.0 log for GitHub/GitLab/Azure code-scanning ingestion.",
        +  "enum": [
        +    "json",
        +    "sarif"
        +  ],
        +  "type": "string"
        +}
  7. 2 tool updatesv1.43.2
    • Addedcheck_edit_safe
    • Changedget_symbol1 field changed
      • addedInput schema / properties / verify_against_git
        Added value: +{
        +  "description": "When true, compare the indexed source against the current git HEAD slice for that file and line range. If they differ, the response includes `git_mismatch: true` indicating the index may be stale. Read-only — never writes. Silently skipped when git is unavailable or the file is not tracked.",
        +  "type": "boolean"
        +}
  8. 106 tool updatesv1.41.0
    • Addedadd_decision
    • Addedanalyze_perf
    • Addedapply_codemod
    • Addedapply_move
    • Addedapply_rename
    • Addedapprove_decision
    • Addedassess_change_risk
    • Addedaudit_config
    • Addedbatch
    • Addedbenchmark_project
    • Addedbuild_corpus
    • Addedbuild_decision_clusters
    • Addedchange_signature
    • Addedcheck_claudemd_drift
    • Addedcheck_embedding_drift
    • Addedcheck_quality_gates
    • Addedcheck_rename
    • Addedcompare_branches
    • Addedconsolidate_decisions
    • Addeddelete_corpus
    • Addeddetect_antipatterns
    • Addeddetect_ast_clones
    • Addeddetect_communities
    • Addeddetect_drift
    • Addeddiff_graph_snapshots
    • Addeddiscover_hermes_sessions
    • Addedexport_decisions
    • Addedexport_graph
    • Addedexport_security_context
    • Addedextract_function
    • Addedgenerate_docs
    • Addedgenerate_sbom
    • Addedget_artifacts
    • Addedget_changed_symbols
    • Addedget_cluster_decisions
    • Addedget_co_changes
    • Addedget_communities
    • Addedget_community
    • Addedget_complexity_report
    • Addedget_control_flow
    • Addedget_coverage_report
    • Addedget_cross_domain_deps
    • Addedget_cross_workspace_impact
    • Addedget_dataflow
    • Addedget_dead_code
    • Addedget_decision_clusters
    • Addedget_decision_stats
    • Addedget_decision_timeline
    • Addedget_dependency_diagram
    • Addedget_domain_context
    • Addedget_domain_map
    • Addedget_git_churn
    • Addedget_health_trends
    • Addedget_optimization_report
    • Addedget_package_deps
    • Addedget_preset_info
    • Addedget_project_memo
    • Addedget_real_savings
    • Addedget_risk_hotspots
    • Addedget_session_analytics
    • Addedget_session_journal
    • Addedget_session_resume
    • Addedget_session_snapshot
    • Addedget_session_stats
    • Addedget_suggested_questions
    • Addedget_surprises
    • Addedget_tech_debt
    • Addedget_usage_trends
    • Addedget_wake_up
    • Addedget_workspace_map
    • Addedgraph_query
    • Addedindex_sessions
    • Addedinvalidate_decision
    • Addedlist_bundles
    • Addedlist_corpora
    • Addedlist_graph_snapshots
    • Addedlist_pins
    • Addedmine_sessions
    • Addedpack_context
    • Addedpin_file
    • Addedpin_symbol
    • Addedplan_batch_change
    • Addedplan_refactoring
    • Addedplan_turn
    • Addedpredict_bugs
    • Addedquery_by_intent
    • Addedquery_corpus
    • Addedquery_decisions
    • Addedrefresh_co_changes
    • Addedregenerate_project_memo
    • Addedreject_decision
    • Addedremember_decision
    • Addedremove_dead_code
    • Addedscan_code_smells
    • Addedscan_security
    • Addedsearch_bundles
    • Addedsearch_sessions
    • Addedsearch_text
    • Addedsearch_with_mode
    • Addedsnapshot_graph
    • Addedtaint_analysis
    • Addedtraverse_graph
    • Addedtune_decision_weights
    • Addedtune_weights
    • Addedunpin
    • Addedvisualize_graph
  9. 44 tool updates
    • Addedcheck_architecture
    • Addedcheck_duplication
    • Addedembed_repo
    • Addedfind_usages
    • Addedgenerate_insights_report
    • Addedget_api_surface
    • Addedget_call_graph
    • Addedget_change_impact
    • Addedget_circular_imports
    • Addedget_code_owners
    • Addedget_complexity_trend
    • Addedget_context_bundle
    • Addedget_coupling
    • Addedget_coupling_trend
    • Addedget_dead_exports
    • Addedget_edge_bottlenecks
    • Addedget_env_vars
    • Addedget_feature_context
    • Addedget_implementations
    • Addedget_import_graph
    • Addedget_index_health
    • Addedget_minimal_context
    • Addedget_outline
    • Addedget_pagerank
    • Addedget_plugin_registry
    • Addedget_project_health
    • Addedget_project_map
    • Addedget_refactor_candidates
    • Addedget_related_symbols
    • Addedget_symbol
    • Addedget_symbol_complexity_trend
    • Addedget_symbol_owners
    • Addedget_task_context
    • Addedget_tests_for
    • Addedget_type_hierarchy
    • Addedget_untested_exports
    • Addedget_untested_symbols
    • Addedregister_edit
    • Addedreindex
    • Addedrepair_index
    • Addedsearch
    • Addedself_audit
    • Addedsuggest_queries
    • Addedverify_index
  10. 142 tool updatesv1.38.0
    • Removedadd_decision
    • Removedanalyze_perf
    • Removedapply_codemod
    • Removedapply_move
    • Removedapply_rename
    • Removedapprove_decision
    • Removedassess_change_risk
    • Removedaudit_config
    • Removedbatch
    • Removedbenchmark_project
    • Removedbuild_corpus
    • Removedchange_signature
    • Removedcheck_architecture
    • Removedcheck_claudemd_drift
    • Removedcheck_duplication
    • Removedcheck_embedding_drift
    • Removedcheck_quality_gates
    • Removedcheck_rename
    • Removedcompare_branches
    • Removeddelete_corpus
    • Removeddetect_antipatterns
    • Removeddetect_ast_clones
    • Removeddetect_communities
    • Removeddetect_drift
    • Removeddiff_graph_snapshots
    • Removeddiscover_hermes_sessions
    • Removedembed_repo
    • Removedexport_graph
    • Removedexport_security_context
    • Removedextract_function
    • Removedfind_usages
    • Removedgenerate_docs
    • Removedgenerate_insights_report
    • Removedgenerate_sbom
    • Removedget_api_surface
    • Removedget_artifacts
    • Removedget_call_graph
    • Removedget_change_impact
    • Removedget_changed_symbols
    • Removedget_circular_imports
    • Removedget_co_changes
    • Removedget_code_owners
    • Removedget_communities
    • Removedget_community
    • Removedget_complexity_report
    • Removedget_complexity_trend
    • Removedget_context_bundle
    • Removedget_control_flow
    • Removedget_coupling
    • Removedget_coupling_trend
    • Removedget_coverage_report
    • Removedget_cross_domain_deps
    • Removedget_cross_workspace_impact
    • Removedget_dataflow
    • Removedget_dead_code
    • Removedget_dead_exports
    • Removedget_decision_stats
    • Removedget_decision_timeline
    • Removedget_dependency_diagram
    • Removedget_domain_context
    • Removedget_domain_map
    • Removedget_edge_bottlenecks
    • Removedget_env_vars
    • Removedget_feature_context
    • Removedget_git_churn
    • Removedget_health_trends
    • Removedget_implementations
    • Removedget_import_graph
    • Removedget_index_health
    • Removedget_minimal_context
    • Removedget_optimization_report
    • Removedget_outline
    • Removedget_package_deps
    • Removedget_pagerank
    • Removedget_plugin_registry
    • Removedget_preset_info
    • Removedget_project_health
    • Removedget_project_map
    • Removedget_real_savings
    • Removedget_refactor_candidates
    • Removedget_related_symbols
    • Removedget_risk_hotspots
    • Removedget_session_analytics
    • Removedget_session_journal
    • Removedget_session_resume
    • Removedget_session_snapshot
    • Removedget_session_stats
    • Removedget_suggested_questions
    • Removedget_surprises
    • Removedget_symbol
    • Removedget_symbol_complexity_trend
    • Removedget_symbol_owners
    • Removedget_task_context
    • Removedget_tech_debt
    • Removedget_tests_for
    • Removedget_type_hierarchy
    • Removedget_untested_exports
    • Removedget_untested_symbols
    • Removedget_usage_trends
    • Removedget_wake_up
    • Removedget_workspace_map
    • Removedgraph_query
    • Removedindex_sessions
    • Removedinvalidate_decision
    • Removedlist_bundles
    • Removedlist_corpora
    • Removedlist_graph_snapshots
    • Removedlist_pins
    • Removedmine_sessions
    • Removedpack_context
    • Removedpin_file
    • Removedpin_symbol
    • Removedplan_batch_change
    • Removedplan_refactoring
    • Removedplan_turn
    • Removedpredict_bugs
    • Removedquery_by_intent
    • Removedquery_corpus
    • Removedquery_decisions
    • Removedrefresh_co_changes
    • Removedregister_edit
    • Removedreindex
    • Removedreject_decision
    • Removedremember_decision
    • Removedremove_dead_code
    • Removedrepair_index
    • Removedscan_code_smells
    • Removedscan_security
    • Removedsearch
    • Removedsearch_bundles
    • Removedsearch_sessions
    • Removedsearch_text
    • Removedsearch_with_mode
    • Removedself_audit
    • Removedsnapshot_graph
    • Removedsuggest_queries
    • Removedtaint_analysis
    • Removedtraverse_graph
    • Removedtune_weights
    • Removedunpin
    • Removedverify_index
    • Removedvisualize_graph
  11. 8 tool updatesv1.36.1
    • Changedaudit_config2 fields changed
      • addedInput schema / properties / drift_only
        Added value: +{
        +  "description": "E14 — restrict output to drift-class categories only (dead_path + dead_*_ref + oversized_section). Implies include_drift. Use when you only care about agent-config drift.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_drift
        Added value: +{
        +  "description": "E14 — add CLAUDE.md drift detection (dead_tool_ref, dead_skill_ref, dead_command_ref, oversized_section). Default false for back-compat.",
        +  "type": "boolean"
        +}
    • Addedcheck_claudemd_drift
    • Addedlist_pins
    • Addedpin_file
    • Addedpin_symbol
    • Addedremember_decision
    • Addedsearch_with_mode
    • Addedunpin
  12. 135 tool updatesv1.35.1
    • Changedadd_decision3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / git_branch
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 256,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Git branch this decision belongs to. Omit to auto-detect from the project root, or pass null to make the decision branch-agnostic (visible from every branch)."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "title",
        -  "content",
        -  "type"
        -]New value: +[
        +  "title",
        +  "content",
        +  "type",
        +  "file_path"
        +]
    • Addedanalyze_perf
    • Changedapply_codemod1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedapply_move2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "source_file",
        +  "new_path"
        +]
    • Changedapply_rename1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedapprove_decision
    • Changedassess_change_risk2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "file_path",
        +  "symbol_id"
        +]
    • Changedaudit_config1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedbatch3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / calls / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / calls / items / properties / args / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedbenchmark_project3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / seed / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / seed / minimum
        Added value: +-9007199254740991
    • Addedbuild_corpus
    • Changedchange_signature7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / properties / add_param / additionalProperties
        Removed value: -false
      • addedInput schema / properties / changes / items / properties / add_param / properties / position / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / changes / items / properties / add_param / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "name",
        +  "type",
        +  "default_value"
        +]
      • removedInput schema / properties / changes / items / properties / remove_param / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / properties / rename_param / additionalProperties
        Removed value: -false
    • Changedcheck_architecture2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / layers / items / additionalProperties
        Removed value: -false
    • Changedcheck_duplication1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedcheck_embedding_drift
    • Changedcheck_quality_gates7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / config / additionalProperties
        Removed value: -false
      • removedInput schema / properties / config / properties / rules / additionalProperties / additionalProperties
        Removed value: -false
      • addedInput schema / properties / config / properties / rules / additionalProperties / properties / threshold / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / config / properties / rules / additionalProperties / properties / threshold / type
        Removed value: -[
        -  "number",
        -  "string"
        -]
      • addedInput schema / properties / config / properties / rules / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "since"
        +]
    • Changedcheck_rename1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedcompare_branches2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "branch"
        -]New value: +[
        +  "branch",
        +  "base"
        +]
    • Addeddelete_corpus
    • Changeddetect_antipatterns2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / category / items / enum
        Previous value: -[
        -  "n_plus_one_risk",
        -  "missing_eager_load",
        -  "unbounded_query",
        -  "event_listener_leak",
        -  "circular_dependency",
        -  "missing_index",
        -  "memory_leak"
        -]New value: +[
        +  "n_plus_one_risk",
        +  "missing_eager_load",
        +  "unbounded_query",
        +  "event_listener_leak",
        +  "circular_dependency",
        +  "missing_index",
        +  "memory_leak",
        +  "god_class",
        +  "long_method",
        +  "long_parameter_list",
        +  "deep_nesting"
        +]
    • Addeddetect_ast_clones
    • Changeddetect_communities2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / seed
        Added value: +{
        +  "description": "PRNG seed for the Leiden node-shuffle. Same seed reproduces identical community IDs across runs. Default 0.",
        +  "maximum": 4294967295,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddetect_drift2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / since_days / maximum
        Added value: +9007199254740991
    • Addeddiff_graph_snapshots
    • Removeddiscover_claude_sessions
    • Addeddiscover_hermes_sessions
    • Changedembed_repo1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedexport_graph
    • Addedexport_security_context
    • Changedextract_function3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / end_line / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / start_line / maximum
        Added value: +9007199254740991
    • Changedfind_usages4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail_level
        Added value: +{
        +  "description": "Output verbosity. \"minimal\" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: \"default\".",
        +  "enum": [
        +    "minimal",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / include_ambiguous_text_matched
        Added value: +{
        +  "description": "Keep text_matched edges whose target name collides with >=3 other symbols (default false — they produce phantom god-nodes).",
        +  "type": "boolean"
        +}
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn",
        +  "file_path"
        +]
    • Changedgenerate_docs2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "path"
        +]
    • Addedgenerate_insights_report
    • Changedgenerate_sbom1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedget_api_contract
    • Changedget_api_surface1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_artifacts2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "query"
        +]
    • Changedget_call_graph2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn"
        +]
    • Changedget_change_impact2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "file_path",
        +  "symbol_id"
        +]
    • Changedget_changed_symbols2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "until"
        +]
    • Changedget_co_changes2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / min_count / maximum
        Added value: +9007199254740991
    • Changedget_code_owners1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_community2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
    • Changedget_complexity_report2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / min_cyclomatic / maximum
        Added value: +9007199254740991
    • Changedget_complexity_trend1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_context_bundle2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn"
        +]
    • Removedget_contract_drift
    • Removedget_contract_versions
    • Changedget_control_flow2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn"
        +]
    • Changedget_coupling1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_coupling_trend2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / since_days / maximum
        Added value: +9007199254740991
    • Changedget_cross_domain_deps2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "domain"
        +]
    • Removedget_cross_service_impact
    • Changedget_cross_workspace_impact1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_dataflow2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "fqn"
        +]
    • Changedget_dead_code1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_dead_exports1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_decision_timeline1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_dependency_diagram1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_domain_context1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_domain_map1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedget_edge_bottlenecks
    • Changedget_env_vars2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "file"
        +]
    • Changedget_feature_context2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / output_format
        Added value: +{
        +  "description": "Output format. \"json\" (default) returns structured items; \"markdown\" returns LLM-friendly fenced code blocks (~15-20% token savings, easier for the model to read).",
        +  "enum": [
        +    "json",
        +    "markdown"
        +  ],
        +  "type": "string"
        +}
    • Changedget_git_churn2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / since_days / maximum
        Added value: +9007199254740991
    • Changedget_health_trends2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "file_path",
        +  "module"
        +]
    • Changedget_implementations1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_import_graph1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedget_minimal_context
    • Changedget_optimization_report1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_outline2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail_level
        Added value: +{
        +  "description": "Output verbosity. \"minimal\" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: \"default\".",
        +  "enum": [
        +    "minimal",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedget_package_deps1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_pagerank1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_project_map1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_real_savings1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_refactor_candidates3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / min_callers / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / min_cyclomatic / maximum
        Added value: +9007199254740991
    • Changedget_related_symbols1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_risk_hotspots3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / min_cyclomatic / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / since_days / maximum
        Added value: +9007199254740991
    • Removedget_service_deps
    • Removedget_service_map
    • Changedget_session_analytics2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "session_id"
        +]
    • Changedget_session_resume1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_session_snapshot1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedget_subproject_clients
    • Removedget_subproject_graph
    • Removedget_subproject_impact
    • Addedget_suggested_questions
    • Addedget_surprises
    • Changedget_symbol2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn"
        +]
    • Changedget_symbol_complexity_trend2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / since_days / maximum
        Added value: +9007199254740991
    • Changedget_symbol_owners1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_task_context2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / output_format
        Added value: +{
        +  "description": "Output format. \"json\" (default) returns structured fields; \"markdown\" returns a single LLM-optimized document with code fences (~15-20% token savings).",
        +  "enum": [
        +    "json",
        +    "markdown"
        +  ],
        +  "type": "string"
        +}
    • Changedget_tech_debt1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_tests_for2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "fqn",
        +  "file_path"
        +]
    • Changedget_type_hierarchy1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_untested_exports1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_untested_symbols1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_usage_trends1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_wake_up1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_workspace_map1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgraph_query1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedindex_sessions1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinvalidate_decision2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
    • Addedlist_corpora
    • Addedlist_graph_snapshots
    • Changedmine_sessions4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / min_confidence / description
        Previous value: -"Minimum confidence threshold for extracted decisions (default: 0.6)"New value: +"Legacy reject floor — drops decisions below this. Superseded by reject_threshold; kept for back-compat."
      • addedInput schema / properties / reject_threshold
        Added value: +{
        +  "description": "Memoir reject floor (default: decisions.reject_threshold from config, fallback 0.45). Decisions in [reject_threshold, review_threshold) go into the review queue; below reject_threshold they are dropped.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / review_threshold
        Added value: +{
        +  "description": "Memoir auto-approve cutoff (default: decisions.review_threshold from config, fallback 0.75). Decisions ≥ this enter the active knowledge graph immediately.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedpack_context2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "scope"
        -]New value: +[
        +  "scope",
        +  "path",
        +  "query"
        +]
    • Changedplan_batch_change2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "package"
        -]New value: +[
        +  "package",
        +  "from_version",
        +  "to_version"
        +]
    • Changedplan_refactoring10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / properties / add_param / additionalProperties
        Removed value: -false
      • addedInput schema / properties / changes / items / properties / add_param / properties / position / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / changes / items / properties / add_param / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "name",
        +  "type",
        +  "default_value"
        +]
      • removedInput schema / properties / changes / items / properties / remove_param / additionalProperties
        Removed value: -false
      • removedInput schema / properties / changes / items / properties / rename_param / additionalProperties
        Removed value: -false
      • addedInput schema / properties / end_line / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / start_line / maximum
        Added value: +9007199254740991
      • changedInput schema / required
        Previous value: -[
        -  "type"
        -]New value: +[
        +  "type",
        +  "new_name",
        +  "target_file",
        +  "source_file",
        +  "new_path",
        +  "file_path",
        +  "function_name"
        +]
    • Changedplan_turn1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedpredict_bugs1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedquery_by_intent1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedquery_corpus
    • Changedquery_decisions5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / git_branch
        Added value: +{
        +  "description": "Branch filter. \"current\" (default) → current branch + branch-agnostic decisions. \"all\" → every branch. Any other value → that specific branch + branch-agnostic decisions.",
        +  "maxLength": 256,
        +  "type": "string"
        +}
      • addedInput schema / properties / include_pending
        Added value: +{
        +  "description": "Also return decisions in the review queue (review_status=\"pending\"). Default: false — only auto-approved and approved rows are returned.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / review_status
        Added value: +{
        +  "description": "Restrict to a single review tier (overrides default + include_pending). Use \"pending\" to fetch the review queue.",
        +  "enum": [
        +    "pending",
        +    "approved",
        +    "rejected"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "symbol_id",
        +  "file_path",
        +  "tag",
        +  "as_of"
        +]
    • Changedrefresh_co_changes1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedregister_edit1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedreindex2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / postprocess
        Added value: +{
        +  "description": "Postprocess level. full = everything (default). minimal = skips LSP/env/snapshots. none = also skips edge resolution.",
        +  "enum": [
        +    "full",
        +    "minimal",
        +    "none"
        +  ],
        +  "type": "string"
        +}
    • Addedreject_decision
    • Changedremove_dead_code1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedrepair_index
    • Changedscan_code_smells3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / category / items / enum
        Previous value: -[
        -  "todo_comment",
        -  "empty_function",
        -  "hardcoded_value"
        -]New value: +[
        +  "todo_comment",
        +  "empty_function",
        +  "hardcoded_value",
        +  "debug_artifact"
        +]
      • addedInput schema / required
        Added value: +[
        +  "scope"
        +]
    • Changedscan_security2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / required
        Previous value: -[
        -  "rules"
        -]New value: +[
        +  "scope",
        +  "rules"
        +]
    • Changedsearch6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail_level
        Added value: +{
        +  "description": "Output verbosity. \"minimal\" returns ~40-60% fewer tokens (drops scores, fqn, signatures, summaries — keeps name/file/line). Use when you only need to pick a candidate before drilling in with get_symbol. Default: \"default\".",
        +  "enum": [
        +    "minimal",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / drill_from
        Added value: +{
        +  "description": "Drill scope for mode=\"drill\" — a file path or symbol_id. Results are restricted to the subtree rooted here.",
        +  "maxLength": 512,
        +  "type": "string"
        +}
      • removedInput schema / properties / fusion_weights / additionalProperties
        Removed value: -false
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "Memoir-style retrieval mode: single (default — top-K), tiered (high/medium/low buckets), drill (scoped to drill_from), flat (raw FTS, no PageRank), get (exact lookup). Omit to auto-pick (path-shaped query → get, otherwise → single).",
        +  "enum": [
        +    "single",
        +    "tiered",
        +    "drill",
        +    "flat",
        +    "get"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "query"
        -]New value: +[
        +  "query",
        +  "language",
        +  "file_pattern"
        +]
    • Changedsearch_bundles1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsearch_sessions1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsearch_text3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / timeout_ms
        Added value: +{
        +  "description": "Wall-clock budget in milliseconds. Catastrophic-backtracking regex cannot pin a worker beyond this. Default 2000. Set 0 to disable.",
        +  "maximum": 30000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "query"
        -]New value: +[
        +  "query",
        +  "file_pattern"
        +]
    • Addedsnapshot_graph
    • Removedsubproject_add_repo
    • Removedsubproject_sync
    • Changedtaint_analysis2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / required
        Added value: +[
        +  "scope"
        +]
    • Addedtraverse_graph
    • Addedtune_weights
    • Addedverify_index
    • Changedvisualize_graph2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / include_bottlenecks
        Added value: +{
        +  "description": "Annotate edges with bottleneckScore/isBridge and nodes with isArticulation (file granularity only). Default false.",
        +  "type": "boolean"
        +}
    • Removedvisualize_subproject_topology

TDQS

A3.8/5.0

Scored across 29 tools

Disambiguation3/5

There is meaningful overlap among the code-lookup tools (search, search_text, find_usages, get_feature_context, get_task_context, plan_turn), and among analytics tools (get_session_stats, get_session_analytics, get_optimization_report, get_real_savings, get_usage_trends). The descriptions do include cross-references that help disambiguate, but an agent could still misroute a request between several context-gathering tools.

Naming Consistency3/5

The naming follows a mostly understandable convention: get_* for retrievals and verb_noun for mutations/actions. However, it is mixed: search and search_text sit alongside find_usages, plan_turn, batch, and load_tools, so there is no single consistent verb_noun or get_* pattern throughout the set.

Tool Count2/5

With 29 tools, the surface is above the 25-tool threshold for 'too many' and spans several distinct subdomains: code intelligence, context retrieval, decision memory, session analytics, and tool management. Each tool may have a purpose, but the set would be easier to navigate if split into focused servers or trimmed.

Completeness4/5

The tool surface is broad and covers code lookup, symbol relationships, context assembly, diagnostics, edit reindexing, change impact, decision memory, session analytics, and tool loading. Minor gaps exist, such as not every mentioned helper (e.g., assess_change_risk, add_decision) being a directly exposed tool, but agents can accomplish the core workflows without dead ends.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Cross-repository code knowledge graph MCP server for Java, Kotlin, JavaScript, and TypeScript. Indexes source code into embedded KuzuDB via tree-sitter and exposes 30+ tools for call-flow tracing, multi-hop taint analysis (OWASP/CWE/PCI/STIG), entry-point reachability filtering, performance hotspot detection, and license compliance — without reading source files. 95% fewer tokens vs source-read
    33
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A persistent code-intelligence MCP server that builds a queryable knowledge graph of your codebase, enabling AI assistants to perform cross-file structural reasoning, dependency analysis, and blast radius detection.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Multi-language code intelligence MCP server providing structured code analysis including symbol search, references, hierarchies, and change impact. Supports 25 languages with persistent indexing and LSP integration.
    45 npm
    MIT