repowise
Repowise is a read-only codebase-intelligence MCP server that lets an agent search, understand, assess risk, and plan fixes using an index of code, git history, docs, tests, and decisions.
Answer codebase questions with cited, confidence-rated responses.
Search code and docs by concept, symbol, path, or identifier.
Get repository overviews, architecture summaries, entry points, and top actions.
Retrieve triage cards for files, modules, or symbols, including relationships, ownership, decisions, and metrics.
Read indexed symbol source with verified line ranges.
Assess file/PR risk using hotspots, dependents, co-change, ownership, tests, and bug history.
Review commits, ranges, or uncommitted changes for change risk and impacted tests.
Analyze code health, findings, refactoring plans, coverage, trends, and performance.
Find dead/unreachable code and unused exports or packages by confidence.
Explain why code is shaped that way using decision records and git archaeology.
Query workspace repositories via repo aliases.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@repowiseshow the dependency graph for the auth module"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Set it up in one line
Open Claude Code, Codex, Cursor or any MCP-capable agent in your repository and paste:
Read https://docs.repowise.dev/setup.md and set up Repowise in this repository.The agent installs Repowise, indexes the repo with no API key, connects itself to the index, and asks you before anything costs money. To do it by hand:
uv tool install repowise # or: pipx install repowise / pip install repowise
cd /path/to/your/repo
repowise init --yes --no-prose # graph, git, health, dead code, docs. No key, no spend.
# answers and docs: run repowise generate (one command, no re-index)
repowise serve # dashboard + MCP server (needs Node 20+; first run downloads the UI)serve opens the dashboard in your browser. After a first index it starts with a short
guided tour, and Setup is where you connect agents, turn on sync and add coverage or a model.
Restart Claude Code or run /mcp, then ask "What breaks if I change
src/auth.py?" or "Use Repowise get_overview to summarize this repository."
init wires Claude Code for this repo and adds the global repowise MCP entry
when there is none; it never moves one that serves another repo. Full setup for every agent →
Related MCP server: CodeGraph
Your agent stops guessing
Without an index, an agent rediscovers your codebase on every task: grep, open a file, open three more, grep again. Repowise answers those questions ahead of time, so the agent asks once and gets on with the work.
In a measured run on django/django, an agent with Repowise made 3.8 tool calls
instead of 7.2, opened 3.0 files instead of 7.2 and wrote 31.6% less, with
answers just as good. That is the largest saving of the five context tools we
tested. On a small local model the output cut reaches 47.9%.
How it was measured →
Your agent gets ten task-shaped MCP tools. Ask about several files at once and get callers, risk, tests, owners and the reasons behind the code in one answer. The tool list ↓
Up to 99% less command noise.
repowise distilltrims test, install and git output before the agent reads it and keeps every error line. Distill →Context before the agent asks. Optional hooks warn it off fragile files and stale paths, and Repowise keeps your
CLAUDE.mdandAGENTS.mdcurrent from the index.See your own savings.
repowise savedand the dashboard's Usage and savings page count the tokens your agent no longer has to read.
What it does
One index of your code, its history and its decisions, used three ways: to understand the code, to change it safely, and to keep improving it.
Understand the code
You ask | Repowise gives you |
How does checkout work in this repo? | A cited answer built from the call graph and the generated docs, in one call. Search and answers |
What calls this function, and what does it call? | A call graph across 28 parsed languages, every edge stamped with how it was resolved and how far to trust it, plus traced execution flows from each entry point. The graph |
Can I get docs for this codebase? | A wiki for every module and file, rendered from the code's structure with no key, or written by a model when you choose. It updates incrementally after each commit. Docs |
Which of our docs are wrong? | Markdown checked against the tree: every reference to a file or symbol the code no longer has, with the line to edit. Doc drift |
Why is it built this way? | Decisions mined from ADRs, |
Who knows this code? | Owners, bus factor, fading ownership when the main author goes quiet, and suggested reviewers. Ownership |
Can I see the architecture? | An explorable dependency map, C4 views, and a Structurizr export, no model involved. Dashboard |
Change it safely
You ask | Repowise gives you |
What breaks if I change this? | Symbol-level blast radius: the callers of what you changed, the files that historically change with it but are missing from your diff, and the tests that reach it. Change risk |
How risky is this PR? | Where the change ranks against your repository's own recent commits, with the reasons, as a directive your agent can act on. Change risk |
Which tests should run? | The tests a diff actually exercises, from a coverage report if you have one and from the call graph if you do not. Test intelligence |
Did this PR add untested lines? | Patch coverage, branch coverage on changed lines and path-scoped gates in CI, on GitHub, GitLab or any runner. CI gates |
Will this API change break another repo? | HTTP, gRPC, topic and OpenAPI contracts matched across repositories, with a breaking-change guard and the consumer files it affects. Workspaces |
Is anyone else editing these files? | Other open branches touching the same files or their co-change partners, each with the reason it is listed. Branch overlap |
Did we just commit a secret? | Keys, tokens and risky calls found in the working tree and in full git history, with a pre-commit check and a CI gate. Security signals |
Improve it continuously
You ask | Repowise gives you |
What should we fix first? | A ranked queue weighing impact against effort, using churn, fan-in, coverage and bug history. Fix first |
Where is the debt? | A 1 to 10 score for every file from 53 deterministic detectors, split into defect risk, maintainability and performance, validated against real bug history. Code health |
Why is this slow? | N+1 queries, I/O in loops, blocking calls inside async code and quadratic loops, traced across function and file boundaries. Performance |
How do I break this up safely? | Concrete refactoring plans: Extract Method, Extract Class, Move Method, Split File, Break Cycle, with the exact symbols that move and what moves with them. Ready to hand to an agent. Refactoring |
What can we delete? | Unreachable files, unused exports and unused packages, each with a confidence tier and the evidence behind it. Dead code |
Where do bugs keep landing? | Bug-fix commits traced to files and symbols, and a warning when your agent edits a bug magnet. Bug history |
Are our tests testing anything? | Tests with no assertions, tests that only check their own mocks, and untested hotspots. Test-quality smells |
Test coverage without running coverage. Most repositories never produce a coverage report. Repowise answers "is this tested, and by what" from the import and call graph, and labels every answer measured or inferred.
It checks its own health score on your repository. After each index it reports how many of the lowest-scoring files actually had bug fixes in your recent history, so a bad score on your codebase is visible to you.
It learns from your agent sessions. With transcript capture on, the corrections you keep repeating ("use the shared HTTP client") become tracked decisions it feeds back to the agent later. Transcripts never leave your machine.
It writes your
CLAUDE.mdandAGENTS.mdfrom the real index and keeps them current, so even an agent with no MCP support starts informed.It shrinks command output before your agent reads it.
repowise distill pytestkeeps every failure and drops the noise, and nothing is lost: anexpandcommand restores any cut.New git worktrees start indexed. A linked worktree seeds its index from the base checkout instead of starting cold.
It knows which external systems you depend on. Package manifests across PyPI, npm, Cargo, Go, NuGet, Maven and CMake feed a map of the services and libraries the code reaches.
Hosted, and Foresight
Everything above runs free on your own machine. repowise.dev runs it for you, private repos included, and is where Foresight arrives first: models trained on years of real commits and fixes that rank the files a fix will touch, name what a change forgot, and explain every answer, with no LLM. What Foresight does →
Already indexed locally? repowise publish puts the repo on repowise.dev in one
command. It indexes your GitHub remote, so nothing is uploaded from your machine.
Public repos are free.
Know what breaks before you merge
All of this comes from the graph and git history, with no LLM, so the same diff always gets the same answer.
Change risk. Score any commit or branch 0 to 10 against your repository's own recent commits, with what it may break, the companion files it forgot, the tests it is missing and the tests to run.
repowise risk main..HEAD(reference)Tests without a coverage run. Which tests reach a file and which ones a diff exercises, from a coverage report when you have one and from the call graph when you do not: 97.5% correct on which tests to run.
repowise impacted-tests main..HEAD(reference)Bug magnets. Which files keep getting bug fixes, with a warning when your agent edits one. (reference)
Branch overlap. Other open branches editing the same files.
repowise overlap(reference)In CI. Patch coverage, doc drift, security and change risk as gates through the GitHub Action, a GitLab template or plain CLI, with SARIF output. No API key. Repowise in CI →
On every pull request. The free Repowise PR Bot posts one comment, edited in place on every push, with the callers outside the PR, the tests and companion files it is missing, and its change risk. A green PR gets no comment at all.
A real comment on a real PR: repowise-dev/repowise#1204 · its analysis page → · install the PR bot →
Every change, with its evidence
Each merged PR or commit becomes a Change Record: what it touched, who owns it, the tests that reach it, the contracts and decisions it crosses, and what happened after it landed. No forge API is called.
You ask | Repowise gives you |
What landed in this PR, and what backs it up? | The change's evidence checklist, each item |
Can CI hold changes to our payment code to a higher bar? | Rules in |
Something broke. Which change do we read first? | Recent changes ranked against an error, a stack trace or an issue. On 43 real regressions, the change a later revert or fix named was in the top 5 for 67% of them, against 28% for ranking by shared files. Suspects |
Who owns this, and are they still working on it? | Backstage-shaped components with owners from your catalog and CODEOWNERS, compared with the last 90 days of commits. Components |
Can we show an auditor or an acquirer where we stand? | Evidence packs: a repository assessment, a change report for a period and a component inventory, as JSON, Markdown, HTML or CSV. Reports |
Know exactly what to fix
Every file gets a 1 to 10 score from 53 deterministic detectors, read three ways: defect risk, maintainability and performance. Performance findings such as N+1 queries and I/O in loops are traced across functions and files.
The score is checked against real bugs. On 21 open-source projects, ranking by Repowise found 2.3x as many later-buggy files as CodeScene in the same review budget. It also checks itself on your repository after every index: "16 of the 20 lowest-health files had a bug fix in the last 6 months, 3.3x the 24% baseline."
Then it names the fix: Extract Method, Extract Class, Move Method, Split File or Break Cycle, with the exact symbols that move, ranked so a fix on a central file comes before the same fix on a leaf. Each plan has a copy-to-agent button.
repowise next # what to fix first, ranked by impact and effort
repowise health --refactoring-targets # concrete plans
repowise dead-code # what can go, by confidence tierCode health · Refactoring · Dead code · How it was validated →
Across your repositories
Real systems are more than one repository, and the expensive failures live between them. Change a backend contract and Repowise names the frontend calls that consume it, the services downstream, and the architecture rule the new dependency breaks, before it ships.
Workspace intelligence | What it answers |
Contract map | Which services provide and consume each HTTP, gRPC, event, socket and data contract? Links keep their exact or candidate confidence and the source evidence. |
Cross-repo blast radius | If this provider changes, which downstream services are in structural reach, and which may drift through historical co-change? |
Breaking-change guard | Was an endpoint removed or an OpenAPI, proto or signature shape changed incompatibly, and which consumer files are linked to that contract? |
Test impact | Which tests in the consumer repos should run for this provider change, measured from coverage or inferred from the call graph? |
Architecture as code | Does the live system graph violate declared dependency rules or contain cycles? |
Architecture health | How coupled is the estate? Propagation cost, the cyclic core, service roles and a deterministic 1-10 architecture score. |
Federated context | One dashboard and one MCP server answer across every repository while keeping repo-level evidence. |
Workspace guide and support matrix → · Keeping the index fresh →
Measured against the field
The same repositories, commits and questions for every tool, each given its full advertised surface, against answer keys we did not write.
Result | |
Work saved in an agent loop | 3.8 tool calls instead of 7.2, 3.0 files opened instead of 7.2, 31.6% less output. The best of five context tools. n=43, p<0.0001 |
Finding the right files | 0.876 of the files a fix needed, against 0.610 for the next tool, on a sealed set. n=42, p=0.00004 |
Command output | Up to 99.5% smaller ( |
Call graph the compiler agrees with | 93.8% to 99.8% precision on Go, TypeScript, Dart, C and Python, graded by each language's own toolchain. Against four other tools, none that finds as much of the graph gets more of it right, in 7 of 7 cells |
Health that predicts bugs | 2.3x CodeScene's recall of later-buggy files at the same review budget. 2,770 files, p=0.003 |
Scale | 15 million lines (dotnet/runtime) on one laptop. Building the call graph takes 75 MB, 10x less than the next tool |
Every result, in plain English, with the method → · The research it is built on →
No single product competes with all of this, so there is no single table. Rows marked measured are head-to-head numbers that link to docs/BENCHMARKS.md, where the sample sizes, the tests and the rows we lose live. Unmarked rows are capability presence, not measurements.
As an agent context layer
repowise | CodeGraph | Serena | DeepWiki | |
Self-hostable, open source | ✅ AGPL-3.0 | ✅ | ✅ | ❌ cloud only |
Private repo, no cloud | ✅ | ✅ | ✅ | ❌ OSS forks only |
MCP tools served | 10 default + 7 opt-in | 1 | 29 | 3 |
Finds the gold files (measured, n=42 sealed) | ✅ 0.876 | 0.610 | not in this run | not measured |
Output tokens vs a bare agent (measured, n=43) | ✅ -31.6% | -24.4% | -14.8% | not measured |
Memory to build the graph (measured, 5 tools, 35 repos) | ✅ 75 MB, lowest on 35 of 35 | 757 MB | not measured | n/a, cloud |
Time to build the graph (measured, same run) | 2.77s, fastest on 14 of 35 | 3.65s, fastest on 16 | not measured | n/a, cloud |
Time to build the full index, django (measured) | ⚠️ 366.8s, slowest here | ✅ 16.4s | not measured | n/a, cloud |
Call-edge precision, judged by a compiler (measured, 5 tools, 7 cells) | ✅ nothing that finds as much gets more of it right, 7 of 7 | lower precision in 7 | not measured | not measured |
Generated documentation | ✅ | ❌ | ❌ | ✅ |
Proactive agent hooks | ✅ Claude + Codex | ❌ | ❌ | ❌ |
Generated | ✅ | ❌ | ❌ | ❌ |
Command-output distillation | ✅ reversible | ❌ | ❌ | ❌ |
Architectural decision records | ✅ | ❌ | ❌ | ❌ |
Multi-repo workspace intelligence | ✅ contracts, co-change, federated MCP | ❌ | ❌ | ❌ |
The two cost rows answer different questions. Building the call graph, we are the lightest tool measured, about ten times lighter than the next, and roughly as fast as the fastest. Building the whole index, CodeGraph is 22x faster than we are, because by then we have also built the git-history layer, the wiki, the decisions and the health pass. If a call graph is all you need, that is the right trade and you should take it. With model-written prose on, it is 135x.
Competitors measured at CodeGraph 1.5.0, Graphify 0.9.31, Serena 1.6.2.dev0 and
code-review-graph 2.3.7 in August 2026. Repowise compiler-graded figures are from main
on 2026-10-03; the other Repowise rows are from 081a59fa, August 2026.
As a code health tool
repowise | CodeScene | |
Self-hostable, open source | ✅ AGPL-3.0 | ⚠️ on-prem Docker, proprietary |
Code health score (1-10) | ✅ 53 detectors, 25 scoring | ✅ 25-30 |
Brain Method / LCOM4 / god class | ✅ | ✅ |
Defects found at a 20% review budget (measured, 2,770 files) | ✅ 0.173 | 0.074 |
Effort-aware ranking, Popt (measured, p=0.003) | ✅ 0.607 | 0.462 |
Precision at that budget (measured) | 0.580 | ✅ 0.636, a shorter list |
Discrimination, ROC AUC (measured, paired) | 0.731 | 0.705, p=0.054, not significant |
Business impact (resolution time) | ❌ we could not replicate this on open data | ✅ Code Red study |
Git intelligence (hotspots, ownership, co-change) | ✅ | ✅ |
Pre-merge change-risk scoring | ✅ 0-10 + directives | ✅ |
Concrete cross-file refactoring plans | ✅ graph-aware + blast radius | ⚠️ within-function only |
Test-coverage intelligence | ✅ LCOV/Cobertura/Clover/JaCoCo/Go | ❌ |
Dead code detection | ✅ | ❌ |
Serves it to an AI agent over MCP | ✅ | ✅ |
CodeScene is the only other vendor in this category with a published empirical defect study, which is why it is the one we ran head to head. It flags about 27 files where we flag 132, so if you want a short list to act on, its threshold is the better fit.
Documentation generators
DeepWiki, Google Code Wiki and Swimm generate documentation from a repository, which overlaps one of our layers. We have not measured against them, so there is no table here.
The PR bot, against LLM review bots
Repowise PR Bot | CodeRabbit | Greptile | |
LLM calls per PR | ✅ zero | ❌ every review | ❌ every review |
Same diff, same review | ✅ deterministic | ❌ sampled output | ❌ sampled output |
Your code sent to a model provider | ✅ never | ❌ yes | ❌ yes |
Symbol-level blast radius | ✅ call graph | ❌ | ⚠️ prose, from context |
Co-change partners missing from the PR | ✅ git history | ❌ | ❌ |
Change risk vs the repo's own history | ✅ 0-10 + percentile | ❌ | ❌ |
Silent on a clean PR | ✅ by default | ⚠️ configurable | ⚠️ configurable |
An LLM reviewer is a different product: it can read intent, and it can be wrong in a new way on every run. This one does set arithmetic over a call graph and a git history, so pushing the same diff twice gives the same review twice. Full side-by-side comparisons: repowise.dev/compare →
Supported languages
28 languages parsed to an AST, 42 on a five-rung ladder, framework-aware where an ecosystem handler exists. Every language ships in the open-source distribution.
Rung | Languages | What you get |
Full (15) | Python · TypeScript · JavaScript · Svelte · Vue · Astro · Java · Kotlin · Go · Rust · C++ · C# · Scala · Ruby · Apex (Salesforce) | The whole pipeline: AST symbols, import resolution, a resolved call graph, heritage, docstrings, framework edges and code-health markers |
Good (11) | C · Swift · PHP · Dart · Object Pascal · COBOL · GDScript · VB.NET · Elixir · F# · Objective-C | All of the above except the full health suite, within the language-specific ceilings in the full matrix |
Partial (2) | Luau / Roblox · Razor / Blazor | Luau: AST symbols and |
Lightweight (6) | Clojure · Haskell · Lean 4 · Erlang · HTML · QML | A real file-to-file import graph, and no symbol-level claims |
Structural (8) | R · Zig · Julia · Elm · OCaml · Crystal · Nim · D | Git history: blame, hotspots, co-change, ownership, bug history |
SQL and dbt projects get ref() / source() lineage, shell scripts get function-level
symbols, HTML pages contribute their <script src> and <link href> dependencies, and
OpenAPI, Protobuf, GraphQL, Dockerfile, Terraform and similar formats get dedicated
handlers. Anything else is still tracked through git history.
Every call edge is stamped with how it was resolved and how much to trust it, from
same_file at 0.95 down to a repo-wide name match at 0.50, labelled as the guess it
is. Accuracy per language, graded against each language's own compiler:
docs/BENCHMARKS.md#accuracy-by-language.
Full matrix: docs/layers/LANGUAGE_SUPPORT.md → · adding a language takes five small steps and no changes to the parser core: docs/architecture/language-support.md → · languages moving up the ladder: roadmap →
Supported agents and editors
Eight agents wired end to end · two at the Full tier · every other MCP host one paste away.
Full is every surface Repowise has: MCP tools, skills, slash commands, a managed
instructions file, hook-level interception of tool calls, and transcript mining after
the session. Good is MCP tools plus an instructions file or skills, without transcript mining
(hooks only where the matrix says). Basic is the MCP config alone. Anything else that speaks MCP is one snippet away:
repowise agents print-config claude-code prints a server entry for Cline, Windsurf,
Zed, Gemini CLI or any host that reads mcpServers.
Integration matrix →
In VS Code, the Repowise extension shows what your change breaks before you push (riskiest files, what is downstream, forgotten companion files, missing tests, suggested reviewers), health in the gutter and status bar, callers and ownership on hover, and refactoring plans as CodeLens. One install also registers the MCP server, so the same index serves you and your agent. Install from the Marketplace or Open VSX and run Repowise: Set Up This Repository. VS Code guide →
In Claude Code, Lens ships inside the Repowise plugin and shows you what the index
knows while Claude works: the file it is on and how many files depend on it, a change
review after a turn that edits files (code health, tests to run, other branches on the
same files), and /lens, a pane with Flow (what to check before accepting each turn),
a map of the repo lit by what Claude searched, opened and edited and what its edits
reach, Ask, and a session recap. Nothing reaches Claude unless you press a button, and
Lens makes no model calls of its own. It needs Claude Code 2.1.287 or later, and the
map needs repowise serve --no-ui running. Lens guide →
The ten MCP tools
Every response carries a _meta envelope with the indexed commit, the index age and a
stale warning when the index has fallen behind your checkout, so your agent always
knows how much to trust what it just read.
Tool | What only this tool answers |
| Architecture summary, module map, entry points, git health. The first call on an unfamiliar codebase. |
| Hybrid retrieval (full-text plus vector), graph expansion and one cited answer with a single calibrated |
| Triage card for files, modules or symbols: summary, signatures, hotspot flag, governing decisions, symbol ids. |
| One indexed symbol's source with exact line bounds. |
| Hybrid search over code and docs, by symbol, path or concept. |
| Hotspots, dependents, co-change partners, ownership, test gaps, bug history. Pass |
| What a commit, range or uncommitted change made worse across defect risk, maintainability and performance, the tests that touch it, and how the diff ranks against recent commits. |
| Architectural decisions with their verbatim evidence. Falls back to git archaeology when no decision exists. |
| Unreachable code by confidence tier, with cross-repo consumers in workspace mode. |
| Health scores and findings across all three lenses, Fix first, coverage, trends, doc drift and refactoring plans. |
Ten is a deliberate ceiling: a small, task-shaped surface is easier for an agent to choose from than a large one. Seven more tools (dependency paths, execution flows, refactoring code generation, finding triage, and three workspace architecture tools) are opt-in. Parameters, examples and when to use which: docs/agent/MCP_TOOLS.md →
For teams and enterprises
AI makes producing a change cheaper. It does not make understanding its consequences cheaper. Repowise gives developers, agents, reviewers and platform teams the same evidence about what exists, what depends on it, what is risky and what will break, from one index, in place of a separate health tool, dead-code tool, code-search layer for agents, docs generator and test-impact service.
Deployment | Where your code is read | What leaves your network |
Self-hosted, open source ( | your machine | anonymous CLI telemetry you can switch off, and your own LLM provider only if you turn prose on |
Self-hosted, commercial | your VPC or an air-gapped network | nothing at all in air-gapped mode |
Hosted (repowise.dev) | our managed indexer | your code goes to the platform |
Graph, git, health, change risk, tests, dead code and PR review make zero LLM calls, and raw source is never stored. Prose is optional and runs on your own provider or fully offline through Ollama.
Evidence you can hand to someone else.
Who is asking | What Repowise produces |
An auditor reviewing change management (SOC 2 CC8.1, ISO 27001 A.8.32, PCI DSS 6.5) | Every change in the period with its review record, reaching tests, policy verdict and later outcome: |
A software inventory review (PCI DSS 6.3.2) | Components with owner teams, languages, entry points and the packages they import: |
A security team asking which of your code uses a package | Import sites with component, owner team and reachability, plus a CycloneDX 1.6 usage export: |
An acquirer, a board or a migration committee | Component posture, hotspots, bus factor, dead code, test reach and contracts: |
An incident review | The recent changes to read first, with the signals behind each: |
Any git host works, because indexing reads a local checkout: GitHub (PR bot, Action, webhooks), GitLab (CI template, webhooks), Bitbucket and others through the CLI, and plain directories or Perforce and SVN exports for every layer except history.
Commercial licences come per seat, per indexed repository or enterprise-wide, with a named contact, an SLA and a quarterly architecture review. Using Repowise inside your company under the AGPL creates no obligation to publish your own code.
Commercial detail and capability status · Security review pack · Evaluating it for your company · hello@repowise.dev
Privacy
Deterministic or offline mode: with
--no-prose, code-derived content stays on your infrastructure. The CLI reports anonymous, opt-out usage telemetry (command names and coarse environment only); turn it off withrepowise telemetry disable,DO_NOT_TRACK=1, or by running fully offline. What's collected →Optional LLM features: generated prose, decision extraction and refactoring code generation send code-derived prompts directly to the provider configured with your own key. Repowise does not proxy those calls.
What's stored: the graph, embeddings, generated wiki pages and git metadata. Raw source is processed transiently and never persisted.
Fully offline: Ollama plus a local embedding model means zero external calls.
Doing a security review? docs/business/SECURITY_COMPLIANCE.md →
CLI
repowise init [PATH] # index a codebase (plan screen; --yes --no-prose needs no key)
repowise generate [PATH] # answers and docs with a model, on an existing index (no re-index)
repowise serve [PATH] # MCP server + local dashboard
repowise update [PATH] # incremental update (--workspace for every repo)
repowise watch # re-index on file change
repowise search "<q>" # hybrid search (fulltext / semantic / symbol / path)
repowise ask "<q>" # a synthesized answer with citations
repowise context <files> # triage card: layer, hotspot, fix history, freshness
repowise symbol <id> # one symbol's body, with verified line bounds
repowise why <q|path> # decisions, rationale, git archaeology
repowise next # what to fix first
repowise health # code-health KPIs and lowest-scoring files
repowise risk main..HEAD # score a branch or PR range
repowise overlap # other branches editing the same files
repowise impacted-tests # only the tests a diff exercises
repowise changes show ID # one merged change and its evidence checklist
repowise check # evaluate .repowise/policies.yaml against a change
repowise suspects # recent changes ranked against a symptom
repowise components # declared and derived components, owners vs activity
repowise packages where # where a third-party package is imported
repowise report # assessment, change evidence and inventory packs
repowise dead-code # unreachable code by confidence tier
repowise doc-drift # documentation the code no longer supports
repowise security # secrets and risky patterns, tree or full history
repowise decision list # architectural decisions
repowise export --format structurizr # the architecture as Structurizr DSL
repowise distill pytest # compact, errors-first, reversible command output
repowise saved # tokens and dollars saved by distillation
repowise workspace add # multi-repo workspace management
repowise doctor # check setup, API keys, index drift
repowise publish # put this repo on repowise.dev (indexed from GitHub; public repos free)
repowise uninstall # remove what repowise wrote, and say what it leftEvery command and flag: docs/reference/CLI_REFERENCE.md · config: docs/reference/CONFIG.md · something not working: docs/start/TROUBLESHOOTING.md · all docs: docs/README.md
Contributing
git clone https://github.com/repowise-dev/repowise
cd repowise
uv sync --all-packages
uv run repowise --version
uv run pytest tests/unit/New here? You do not have to read 3,000 files to start. We keep a public index of this repository built by Repowise itself, re-indexed on every push: explore repowise with repowise → (architecture, hotspots, ownership, decisions, and a ranked refactoring backlog you are welcome to pick from).
Full guide, including how to add languages and LLM providers: CONTRIBUTING.md · architecture: docs/architecture/
License
AGPL-3.0. Free for individuals, teams and companies using Repowise internally.
For commercial licensing (the enterprise security and compliance layer, SSO/SCIM, RBAC, workflow integrations, priority support and SLA, or embedding Repowise in a product without AGPL obligations), see docs/business/COMMERCIAL.md or contact hello@repowise.dev.
Built for engineers who got tired of watching their AI agent cat the same file for the fourth time.
Available Tools
10 toolsget_answerARead-only
Answer a how, where, or why question in one evidence-grounded call.
High confidence may be used directly; medium and low lead with the
evidence to verify. ``candidate_files`` ranks files worth opening that
the citations do not name.
Args:
question: One question about one subject. Split "where is X and
when does Y run" into two calls; do not paste a whole
multi-part task.
scope: repository-relative path prefix.
repo: usually omitted.
include: ``["evidence"]`` expanded evidence; ``["diagnostics"]``
adds ``retrieval_quality``.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| scope | No | ||
| include | No | ||
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses the confidence-tiering behavior and how medium/low results are presented (leading with evidence to verify), plus that `candidate_files` surfaces files the citations don't name. That is real behavioral context an agent could not infer from annotations alone; it stops short of describing failure modes or latency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the confidence contract in the first two lines, then a compact Args block. Every sentence carries operational information; there is no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still adds the interpretive layer (confidence meaning, `candidate_files`, `retrieval_quality`) that the schema alone would not convey. The only real gap is the missing routing guidance among the many sibling retrieval tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden, and it largely does: `question` is constrained to one question about one subject with an explicit anti-pattern, `scope` is defined as a repository-relative path prefix, `repo` is marked as usually omitted, and `include` gives concrete values with the effect of `diagnostics`. `repo` remains thin (no format guidance) and `include` gives examples rather than the full accepted set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — answering a how/where/why question in one evidence-grounded call — and clarifies the confidence contract. It does not differentiate itself from the sibling `get_why`, which by name appears to answer overlapping 'why' questions, leaving an ambiguity an agent must resolve on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives useful in-call guidance: split multi-part questions into separate calls, don't paste whole tasks, and treat high confidence as usable vs. medium/low as needing evidence verification. However, it never says when to prefer this over `search_codebase`, `get_context`, or especially `get_why`, so tool selection among siblings is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_change_riskARead-only
Review a commit, base..head range, or uncommitted work.
Leads with ``directive`` (verdict in ``status``) and ``health_delta``
(what this change newly made worse). ``risk_percentile`` and
``diff_shape`` measure diff size, not danger. ``impacted_tests`` names
the tests to run.
Args:
revspec: commit or ``base..head``. Omit for uncommitted work, or
``HEAD`` when the tree is clean.
per_commit: with a range, one compact row per commit (up to 30).
include: ``"findings"``, ``"diagnostics"``, ``"scales"``,
``"evidence"``, ``"tests"`` (why each runs).
finding_id: expand one ``health_delta`` finding.
extensions: file suffixes to count, e.g. ``[".py"]``.
exclude_patterns, include_paths: gitignore-style paths to omit, keep
(include_paths also takes one comma-separated string).
baseline: commits sampled for the percentile; 0 disables it.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| include | No | ||
| revspec | No | ||
| baseline | No | ||
| extensions | No | ||
| finding_id | No | ||
| per_commit | No | ||
| include_paths | No | ||
| exclude_patterns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only, closed-world operation, and the description adds real substance on top: it says the response leads with directive/status and health_delta, that risk_percentile and diff_shape measure diff size rather than danger, and that impacted_tests names tests to run. That clarification of misleading-looking metrics is exactly the kind of context annotations cannot convey; only rate limits or cost would add more.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the scope and the key output semantics before a tidy Args list, and nearly every line earns its place. The prose section is slightly dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not enumerate return values, yet it usefully explains the two most easily misread ones and covers all nine parameters with their defaults and formats. An agent has everything needed to call this correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 9 parameters, so the description carries the entire burden, and it documents every one of them in a structured Args block, including defaults (baseline samples with 0 disabling), accepted values for include, and the comma-separated string form of include_paths. This is meaning the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb (review) and resource/scope (a commit, a base..head range, or uncommitted work), which is concrete and actionable. It does not explicitly contrast with the sibling get_risk, so an agent must infer that this tool is change-scoped while get_risk is presumably broader.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context on when to omit revspec (uncommitted work, or HEAD when the tree is clean) and when to set per_commit (with a range). It does not name alternatives such as get_risk or get_health, nor state exclusions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextARead-only
Triage card for files / modules / symbols — relationships, not source bytes.
Returns summary, signatures with lines, hotspot, fix_history and
decision titles; either risk cue means get_risk. Batch targets in one
call. Whole file, body-elided and line-verified: include=["skeleton"]
in ONE call, or Read it; do not call get_symbol per signature. Rename:
include=["references"] is the whole edit set when ``complete``. Which
files in a directory lack tests: include=["files"] on it.
Args:
targets: paths, "path::Symbol", "component:<name>",
"change:<id>" (pr-123 or a sha), "package:<name>".
include: callers | callees | references | skeleton | skeleton+
| files | symbols (all, not top 15) | decisions | full_doc
| ownership | last_change | metrics | community | health
| doc_drift | changes | provenance | suspects.
compact: False adds structure, imports, docstrings.
symptom: issue text or stack trace to rank ``suspects`` on.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| compact | No | ||
| include | No | ||
| symptom | No | ||
| targets | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries most of the load and does add real behavioral context: results are body-elided and line-verified, compact=False adds structure/imports/docstrings, and risk cues imply escalation to get_risk. It stops short of covering pagination, result-size limits, or failure behavior for bad targets, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded, fragment-dense, and almost every clause carries routing or semantic information. Minor cost: the long pipe-delimited include enumeration is a wall of terms and 'skeleton+' / 'skeleton' distinction is never clarified, which slightly hurts parseability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, multi-mode tool with an output schema (so return values need not be explained), the description covers the calling patterns, batching, elision behavior and sibling routing well. Remaining shortfall is per-value meaning for most include modes and no note of defaults, which an agent must infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description does heavy lifting: it documents target syntax ("path::Symbol", "component:<name>", "change:<id>" as pr/sha, "package:<name>") and explains compact and symptom. The gap is the include list — a long enumeration where only skeleton, references, files and symbols get any meaning, leaving metrics, community, doc_drift, provenance, suspects and 'skeleton+' opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete role — a triage card for files/modules/symbols that returns relationships rather than source bytes — and enumerates the concrete payload (summary, signatures with lines, hotspot, fix_history, decision titles). It explicitly distinguishes itself from get_symbol and get_risk, so an agent can choose between them without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: 'either risk cue means get_risk', 'Batch targets in one call', and 'do not call get_symbol per signature' with the skeleton-or-Read alternative. It also supplies scenario recipes — rename via include=["references"], missing tests via include=["files"] — which is the strongest form of when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dead_codeARead-only
Unused exports, unreachable files, zombie packages — tiered by confidence.
For a cleanup sweep, not a targeted fix.
Args:
kind: unreachable_file | unused_export | unused_internal | zombie_package.
min_confidence: default 0.4 (0.7 = cleanup-ready), or a tier name.
tier: "high" | "medium" | "low".
safe_only: deletion-ready findings only.
limit: max findings per tier (up to 25).
directory, owner: path-prefix or primary-owner filter.
group_by: "directory" | "owner".
include_internals: also scan private symbols.
include_zombie_packages, no_unreachable, no_unused_exports,
include_unverified: switch finding kinds on or off.
finding_id: one finding by its ``id``.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| repo | No | ||
| tier | No | ||
| limit | No | ||
| owner | No | ||
| group_by | No | ||
| directory | No | ||
| safe_only | No | ||
| finding_id | No | ||
| min_confidence | No | ||
| no_unreachable | No | ||
| include_internals | No | ||
| no_unused_exports | No | ||
| include_unverified | No | ||
| include_zombie_packages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered structurally. The description adds real behavioral context — confidence tiering, the meaning of safe_only (deletion-ready) and the 25-findings-per-tier cap — but says nothing about scan cost, latency, or how tiering interacts with min_confidence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A two-line headline states what it finds and how to think about it, then a dense arg list. No filler sentences, and the most decision-relevant point (sweep vs targeted fix) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all 15 parameters are addressed. What's missing is guidance on how filters compose (e.g., passing kind alongside the no_* toggles, or tier vs min_confidence precedence) and any note on scan scope cost for a 15-parameter repository tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 15 parameters, the description carries the entire burden and largely discharges it: kind's four values, min_confidence accepting either a number or a tier name with its 0.4 default, limit's ceiling, filter semantics for directory/owner, and explicit meaning for finding_id and repo. The bundled boolean toggles are described collectively rather than individually, which is a minor compression but still understandable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names the exact finding types the tool produces (unused exports, unreachable files, zombie packages) and frames them as confidence-tiered, which is far more specific than the name alone. It does not name a sibling tool to contrast with (get_health or get_risk could plausibly overlap), so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For a cleanup sweep, not a targeted fix" plus the min_confidence hint (0.7 = cleanup-ready) and safe_only as deletion-ready give a clear picture of when this tool applies. It never names an alternative tool for the targeted-fix case, so the exclusion half of the guidance is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_healthARead-only
Code-health scores and findings from stored analysis.
No ``targets``: a dashboard led by ``fix_first``. Never recomputes:
commit, then run ``repowise update``. Every block and accepted value:
docs/agent/MCP_TOOLS.md.
Args:
targets: file paths or ``module:<name>``.
include: ``biomarkers``|``refactoring``|``trend``|``coverage``|
``accuracy``|``signals``|``churn_complexity``|``doc_drift``|
``semantics``|``recipe``|``what_if``, or a dimension.
only: keys to keep. ``biomarkers``/``accuracy``/``refactoring``
alias their block; ``performance``/``defect``/``maintainability``
do not.
limit: rows per ranked list (default 20, 0 for none); cursor: offset.
fix_id/finding_id/plan_id/opportunity_id: expand one item by ``id``.
refactoring_*/performance_*: queue filters.
scope: ``production`` drops non-production code.
counts: ``code_shape`` drops the git-derived half of the score.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| only | No | ||
| repo | No | ||
| limit | No | ||
| scope | No | all | |
| counts | No | everything | |
| cursor | No | ||
| fix_id | No | ||
| include | No | ||
| plan_id | No | ||
| targets | No | ||
| finding_id | No | ||
| opportunity_id | No | ||
| performance_sort | No | ||
| performance_view | No | ||
| refactoring_type | No | ||
| refactoring_view | No | diversified | |
| refactoring_scope | No | ||
| refactoring_effort | No | ||
| performance_context | No | ||
| performance_boundary | No | ||
| performance_confidence | No | ||
| refactoring_confidence | No | ||
| performance_actionability | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely non-obvious behavior: it never recomputes and requires an external `repowise update` to refresh, scope='production' drops non-production code, and counts='code_shape' removes the git-derived half of the score. Those are exactly the side effects and data caveats an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key statement about dashboard-vs-targets and the never-recomputes caveat are front-loaded, and the Args block is terse with one line per parameter group. Some density is unavoidable at 23 parameters, though the repeated rST double-backtick noise and the pointer to docs/agent/MCP_TOOLS.md for 'every block and accepted value' push explanation out of the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes need not be described, and the description covers the remaining essentials: freshness workflow, scoping options, default list size, and item-expansion IDs. It is only incomplete for the enumerated queue-filter values, which are deferred to an external document.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 23 parameters, so the description carries the full burden and largely does: it enumerates the accepted include values, explains aliasing nuances for only (biomarkers/accuracy/refactoring alias their block, performance/defect/maintainability do not), and states limit defaults and cursor offset. The refactoring_*/performance_* filters are lumped together as 'queue filters' with no per-parameter meaning, which is the main gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific resource and source: 'Code-health scores and findings from stored analysis.' The 'No targets: a dashboard led by fix_first' clause clarifies what the tool returns in its default shape. It does not name siblings like get_overview or get_risk, so the boundary with them is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real usage context: omit targets for a dashboard view, and the data is stale unless you commit and run `repowise update`. However it never says when to prefer this over get_overview, get_risk, or get_dead_code in the sibling set, so routing between tools is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overviewARead-only
Orientation for an unfamiliar repo: packages, entry points, riskiest files, top actions.
Once per session; then use ``get_context`` or ``get_answer``. Compact by
default; other blocks ship on request, named in ``more``.
Args:
repo: alias, path or ID; ``"all"`` for cross-repo links.
include: ``content`` (full essay), ``outline``, ``tour``,
``decisions``, ``graph``, ``ownership``, ``components``,
``changes``, ``tools``, ``actions``, ``scope``.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| include | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true and openWorldHint=false, the description discloses output shape behavior: results are 'compact by default' with additional blocks available on request and discoverable via a `more` field. That is real behavioral context an agent cannot get from annotations. It stops short of saying anything about size, latency, or whether requesting many blocks is expensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the routing rule, then parameter detail — every sentence carries information. Slightly clipped prose ('named in ``more``') and the double-backtick markup make a couple of lines harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter orientation tool with an output schema, the essentials are present: what it returns, how to expand it, when to call it, and how to scope by repo. The remaining gap is that the mechanics of requesting extra blocks (via `include` versus via `more`) and the meaning of each block are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and largely meets it: `repo` accepts an alias, path, or ID, and the special value 'all' for cross-repo links; `include` enumerates eleven valid block names. What it does not do is explain what each block contains or confirm these are the only accepted values, so the agent must guess at the cost of requesting each one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (a repo) and enumerates the concrete payload — packages, entry points, riskiest files, top actions — so the agent knows exactly what it gets. It also explicitly contrasts itself with get_context and get_answer, making it separable from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Orientation for an unfamiliar repo' plus 'Once per session; then use get_context or get_answer' gives both the triggering condition and the named follow-up alternatives. The recursion/frequency limit (once per session) is stated outright, which is unusually strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_riskARead-only
What history says about touching these files — bug fixes, churn, owners.
Fuses git signals (``hotspot_score``/``owner_pct`` 0-1, trend, bus
factor) with graph reach. ``dependents`` and ``co_change_partners`` are
a floor and correlation, not proof of runtime breakage. Pass
``changed_files`` for PR mode: the response leads with ``directive``
(may_break, missing_cochanges, missing_tests, tests_to_run); read it
first. ``directive.reach`` is never a breakage probability. For a
commit or range use ``get_change_risk``.
Args:
targets: file paths; defaults to changed_files.
changed_files: PR-changed files for PR mode.
include: "graph", "churn", "owners", "scales" (units, calibration),
"changes"; with changed_files only: "tests" (typed test rows), "blast".
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | ||
| include | No | ||
| targets | No | ||
| changed_files | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the interpretive burden is on the description — and it delivers: dependents/co_change_partners are 'a floor and correlation, not proof of runtime breakage', and directive.reach is 'never a breakage probability'. These are exactly the misinterpretation traps an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The punchy first line front-loads the purpose, and the caveats follow in a logical order (signals → caveats → PR mode → alternatives → args). It is dense but not padded, though the docstring-style Args block and reST literals make it read more like source documentation than agent-facing prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return fields, and it wisely spends its words on mode selection, directive field names, and interpretation caveats instead. The only thin spot is default behavior when both targets and changed_files are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all parameter meaning, and it largely does: targets defaults to changed_files, include enumerates valid values ('graph', 'churn', 'owners', 'scales', 'changes') plus mode-gated ones ('tests', 'blast') with brief meanings, and repo is 'usually omitted'. It stops short of stating path format (repo-relative vs. absolute) or what each include value returns in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line ('What history says about touching these files — bug fixes, churn, owners') plus the git-signal list makes the resource clear: a history-based risk read for a set of files. It explicitly distinguishes itself from the sibling get_change_risk ('For a commit or range use get_change_risk'), though the verb is implied by the name rather than stated outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the two operating modes (targets-only vs. PR mode via changed_files) and the exact conditions that select them, and routes commit/range lookups to get_change_risk by name. It also tells the agent what to read first in PR mode ('the response leads with directive ... read it first').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbolARead-only
Follow-up read of one symbol whose id another response already gave you.
**Not an entry point.** ``get_answer`` ships ``symbol_bodies``; for a
whole file ``get_context(include=["skeleton"])`` or a Read is one call.
Never walk a file symbol by symbol. Returns verified, line-numbered
source; a truncated result carries the ``continuation`` to pass back.
Args:
symbol_id: "path/to/file.py::Name", "path/to/file.py:140-180" for a
live range, or an omission ref. A bare file path is not an id.
depth: 1 (default) is this symbol alone; 2-3 also returns the bodies
it calls, transitively, in ``callee_bodies``.
context_lines: extra lines before/after (0-50).
query: regex/substring filter on an omission ref's lines.
id, reference: aliases for ``symbol_id``.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| repo | No | ||
| depth | No | ||
| query | No | ||
| reference | No | ||
| symbol_id | No | ||
| context_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, but the description still adds real behavior: results are "verified, line-numbered source" and a truncated result carries a continuation to pass back. That truncation/continuation contract is not derivable from annotations. It stops short of the full picture (e.g. what happens when the id is stale or ambiguous), so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and well organized: the core statement comes first, routing second, then an Args block, which is easy to scan. Minor overhead from backtick-heavy markup and the "Args:" label on a description that is already structured, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read tool with an output schema and safety annotations, everything an agent needs to call it correctly is present: purpose, routing, id format, depth semantics, and truncation handling. Return-value detail is correctly left to the output schema rather than duplicated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: it gives accepted symbol_id formats (path::Name, path:140-180 range, omission ref), rules out bare file paths, explains depth=1 vs 2-3 returning transitive callee_bodies, bounds context_lines to 0-50, describes query as a regex/substring filter on omission refs, and flags id/reference as aliases and repo as usually omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource ("Follow-up read of one symbol") and pins the input to an id obtained elsewhere. It explicitly contrasts itself with get_answer and get_context, so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strongest part of the definition: "Not an entry point" plus concrete routing to get_answer (for symbol_bodies), get_context with include=["skeleton"], or a plain Read, and an explicit anti-pattern ("Never walk a file symbol by symbol"). That is when-to-use, when-not-to-use, and named alternatives all at once.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_whyARead-only
Why this code is shaped this way — decision records + evidence commits.
Call before a refactor or pattern divergence. Query: a question, a file
path, a question with ``targets``, or nothing (decision dashboard).
Falls back to git archaeology, never empty. ``authority: accepted``
means somebody signed the decision; ``answer_basis`` names the strongest
evidence lane, and only ``decision`` is a ruling.
Args:
query: question, file/module path, or omit for the dashboard.
targets: file paths to anchor the search.
id: decision or ``ev_...`` evidence id from any tool.
reference: structured evidence reference.
repo: usually omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| repo | No | ||
| query | No | ||
| targets | No | ||
| reference | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), yet the description adds real behavioral context: it falls back to git archaeology rather than returning empty, and it explains how to read results via ``authority: accepted`` and ``answer_basis``. That is genuine disclosure beyond structured fields, though it stops short of describing result shape or latency/cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and activation trigger are front-loaded, and the Args block is compact. The doubled-backtick markup is noisy and the query/shape guidance is repeated between the body and Args, but nothing is badly padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, all-optional tool with zero schema descriptions and an output schema, the description supplies the missing decision rules (which input combos are legal, what the fallback is, how to interpret authority). The gap is the undocumented ``reference`` object and how ``id`` interacts with ``query`` when both are supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does document all five args at a surface level, including the useful ``ev_...`` id hint and the "omit for the dashboard" default. However, ``reference`` is dismissed as "structured evidence reference" with no shape at all despite being a free-form object, and ``repo: usually omitted`` gives no guidance on when it is not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names both the resource (decision records + evidence commits) and the question it answers ("why this code is shaped this way"), which is a distinct job from siblings like get_health or get_dead_code. It doesn't explicitly name a sibling it is not, so it falls short of a 5, but the purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call before a refactor or pattern divergence" gives a concrete activation trigger, and the description enumerates the accepted input shapes (question, path, question+targets, or nothing for the dashboard). It never states when to prefer get_answer or get_context instead, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codebaseARead-only
Find code by concept, symbol, or path — hybrid codebase search.
For a how/where/why question call get_answer. Use this to enumerate
matches, resolve an identifier to a symbol_id, or find files for
get_context. Identifier or literal queries return `lines` (path, line,
kind, text; definitions first) read from live files; when `complete` is
true they are every match, so no grep is needed. `candidates` lists
distinct files to Read, best first.
Args:
query: identifier, path, or natural language.
limit: max results (default 5).
mode: auto (by query shape) | symbol | path | concept | hybrid.
kind: implementation | test | config | doc.
symbol_kind: function | class | method | ...
page_type: file_page | module_page.
repo: alias, or "all" for workspace-wide.
pattern: alias for query.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| mode | No | auto | |
| repo | No | ||
| limit | No | ||
| query | No | ||
| pattern | No | ||
| page_type | No | ||
| symbol_kind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest: it discloses that identifier/literal queries return `lines` read from live files with definitions first, that `complete=true` means no grep is needed, and that `candidates` is ordered best-first. That is real behavioral context beyond the annotations, though the existence of an output schema means some of it is reinforcement rather than new information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and exclusion before any detail, then a compact behavior sentence, then a structured Args block. Every clause adds routing or invocation value; nothing is repeated from the annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Eight optional parameters, zero schema descriptions, and an output schema — the description covers all parameters, the return-shape routing (`lines` vs `candidates`), and the completeness guarantee. An agent has everything needed to choose the right mode and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema declares no enums, so the description does all the work — and it does it: every one of the eight parameters gets meaning, including the mode enum (auto/symbol/path/concept/hybrid), kind values, symbol_kind, page_type, `repo` accepting "all" for workspace-wide, and `pattern` as an alias for query. This fully compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a concrete verb (find) and resource (code) and scopes it three ways: concept, symbol, path, plus 'hybrid codebase search'. It immediately distinguishes itself from the sibling get_answer, so an agent can pick between them without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'For a how/where/why question call get_answer' states when NOT to use this tool, and the three named use cases (enumerate matches, resolve identifier to symbol_id, find files for get_context) cover when to use it. Both alternatives are named directly.
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.
10 tool updates
v0.60.1- Changed
get_answer8 fields changed- removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / question / titleRemoved value: -"Question" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / scope / defaultRemoved value: -null - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - removed
Input schema / titleRemoved value: -"get_answerArguments"
- Changed
get_change_risk17 fields changed- removed
Input schema / properties / baseline / titleRemoved value: -"Baseline" - removed
Input schema / properties / exclude_patterns / defaultRemoved value: -null - removed
Input schema / properties / exclude_patterns / titleRemoved value: -"Exclude Patterns" - removed
Input schema / properties / extensions / defaultRemoved value: -null - removed
Input schema / properties / extensions / titleRemoved value: -"Extensions" - removed
Input schema / properties / finding_id / defaultRemoved value: -null - removed
Input schema / properties / finding_id / titleRemoved value: -"Finding Id" - removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / include_paths / defaultRemoved value: -null - removed
Input schema / properties / include_paths / titleRemoved value: -"Include Paths" - added
Input schema / properties / per_commitAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / revspec / defaultRemoved value: -null - removed
Input schema / properties / revspec / titleRemoved value: -"Revspec" - removed
Input schema / titleRemoved value: -"get_change_riskArguments"
- Changed
get_context9 fields changed- removed
Input schema / properties / compact / titleRemoved value: -"Compact" - removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / symptom / defaultRemoved value: -null - removed
Input schema / properties / symptom / titleRemoved value: -"Symptom" - removed
Input schema / properties / targets / titleRemoved value: -"Targets" - removed
Input schema / titleRemoved value: -"get_contextArguments"
- Changed
get_dead_code23 fields changed- removed
Input schema / properties / directory / defaultRemoved value: -null - removed
Input schema / properties / directory / titleRemoved value: -"Directory" - removed
Input schema / properties / finding_id / defaultRemoved value: -null - removed
Input schema / properties / finding_id / titleRemoved value: -"Finding Id" - removed
Input schema / properties / group_by / defaultRemoved value: -null - removed
Input schema / properties / group_by / titleRemoved value: -"Group By" - removed
Input schema / properties / include_internals / titleRemoved value: -"Include Internals" - removed
Input schema / properties / include_unverified / titleRemoved value: -"Include Unverified" - removed
Input schema / properties / include_zombie_packages / titleRemoved value: -"Include Zombie Packages" - removed
Input schema / properties / kind / defaultRemoved value: -null - removed
Input schema / properties / kind / titleRemoved value: -"Kind" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / min_confidence / titleRemoved value: -"Min Confidence" - removed
Input schema / properties / no_unreachable / titleRemoved value: -"No Unreachable" - removed
Input schema / properties / no_unused_exports / titleRemoved value: -"No Unused Exports" - removed
Input schema / properties / owner / defaultRemoved value: -null - removed
Input schema / properties / owner / titleRemoved value: -"Owner" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / safe_only / titleRemoved value: -"Safe Only" - removed
Input schema / properties / tier / defaultRemoved value: -null - removed
Input schema / properties / tier / titleRemoved value: -"Tier" - removed
Input schema / titleRemoved value: -"get_dead_codeArguments"
- Changed
get_health43 fields changed- removed
Input schema / properties / counts / titleRemoved value: -"Counts" - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - removed
Input schema / properties / finding_id / defaultRemoved value: -null - removed
Input schema / properties / finding_id / titleRemoved value: -"Finding Id" - removed
Input schema / properties / fix_id / defaultRemoved value: -null - removed
Input schema / properties / fix_id / titleRemoved value: -"Fix Id" - removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / limit / defaultRemoved value: -null - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / only / defaultRemoved value: -null - removed
Input schema / properties / only / titleRemoved value: -"Only" - removed
Input schema / properties / opportunity_id / defaultRemoved value: -null - removed
Input schema / properties / opportunity_id / titleRemoved value: -"Opportunity Id" - removed
Input schema / properties / performance_actionability / defaultRemoved value: -null - removed
Input schema / properties / performance_actionability / titleRemoved value: -"Performance Actionability" - removed
Input schema / properties / performance_boundary / defaultRemoved value: -null - removed
Input schema / properties / performance_boundary / titleRemoved value: -"Performance Boundary" - removed
Input schema / properties / performance_confidence / defaultRemoved value: -null - removed
Input schema / properties / performance_confidence / titleRemoved value: -"Performance Confidence" - removed
Input schema / properties / performance_context / defaultRemoved value: -null - removed
Input schema / properties / performance_context / titleRemoved value: -"Performance Context" - removed
Input schema / properties / performance_sort / defaultRemoved value: -null - removed
Input schema / properties / performance_sort / titleRemoved value: -"Performance Sort" - removed
Input schema / properties / performance_view / defaultRemoved value: -null - removed
Input schema / properties / performance_view / titleRemoved value: -"Performance View" - removed
Input schema / properties / plan_id / defaultRemoved value: -null - removed
Input schema / properties / plan_id / titleRemoved value: -"Plan Id" - removed
Input schema / properties / refactoring_confidence / defaultRemoved value: -null - removed
Input schema / properties / refactoring_confidence / titleRemoved value: -"Refactoring Confidence" - removed
Input schema / properties / refactoring_effort / defaultRemoved value: -null - removed
Input schema / properties / refactoring_effort / titleRemoved value: -"Refactoring Effort" - removed
Input schema / properties / refactoring_scope / defaultRemoved value: -null - removed
Input schema / properties / refactoring_scope / titleRemoved value: -"Refactoring Scope" - removed
Input schema / properties / refactoring_type / defaultRemoved value: -null - removed
Input schema / properties / refactoring_type / titleRemoved value: -"Refactoring Type" - removed
Input schema / properties / refactoring_view / titleRemoved value: -"Refactoring View" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - removed
Input schema / properties / targets / defaultRemoved value: -null - removed
Input schema / properties / targets / titleRemoved value: -"Targets" - removed
Input schema / titleRemoved value: -"get_healthArguments"
- Changed
get_overview5 fields changed- removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / titleRemoved value: -"get_overviewArguments"
- Changed
get_risk9 fields changed- removed
Input schema / properties / changed_files / defaultRemoved value: -null - removed
Input schema / properties / changed_files / titleRemoved value: -"Changed Files" - removed
Input schema / properties / include / defaultRemoved value: -null - removed
Input schema / properties / include / titleRemoved value: -"Include" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / targets / defaultRemoved value: -null - removed
Input schema / properties / targets / titleRemoved value: -"Targets" - removed
Input schema / titleRemoved value: -"get_riskArguments"
- Changed
get_symbol13 fields changed- removed
Input schema / properties / context_lines / titleRemoved value: -"Context Lines" - removed
Input schema / properties / depth / titleRemoved value: -"Depth" - removed
Input schema / properties / id / defaultRemoved value: -null - removed
Input schema / properties / id / titleRemoved value: -"Id" - removed
Input schema / properties / query / defaultRemoved value: -null - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / reference / defaultRemoved value: -null - removed
Input schema / properties / reference / titleRemoved value: -"Reference" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / symbol_id / defaultRemoved value: -null - removed
Input schema / properties / symbol_id / titleRemoved value: -"Symbol Id" - removed
Input schema / titleRemoved value: -"get_symbolArguments"
- Changed
get_why11 fields changed- removed
Input schema / properties / id / defaultRemoved value: -null - removed
Input schema / properties / id / titleRemoved value: -"Id" - removed
Input schema / properties / query / defaultRemoved value: -null - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / reference / defaultRemoved value: -null - removed
Input schema / properties / reference / titleRemoved value: -"Reference" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / targets / defaultRemoved value: -null - removed
Input schema / properties / targets / titleRemoved value: -"Targets" - removed
Input schema / titleRemoved value: -"get_whyArguments"
- Changed
search_codebase14 fields changed- removed
Input schema / properties / kind / defaultRemoved value: -null - removed
Input schema / properties / kind / titleRemoved value: -"Kind" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - removed
Input schema / properties / page_type / defaultRemoved value: -null - removed
Input schema / properties / page_type / titleRemoved value: -"Page Type" - removed
Input schema / properties / pattern / defaultRemoved value: -null - removed
Input schema / properties / pattern / titleRemoved value: -"Pattern" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / repo / defaultRemoved value: -null - removed
Input schema / properties / repo / titleRemoved value: -"Repo" - removed
Input schema / properties / symbol_kind / defaultRemoved value: -null - removed
Input schema / properties / symbol_kind / titleRemoved value: -"Symbol Kind" - removed
Input schema / titleRemoved value: -"search_codebaseArguments"
4 tool updates
v0.59.0- Changed
get_context1 field changed- added
Input schema / properties / symptomAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Symptom" +}
- Changed
get_dead_code1 field changed- added
Input schema / properties / include_unverifiedAdded value: +{ + "default": false, + "title": "Include Unverified", + "type": "boolean" +}
- Changed
get_health3 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +null - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
search_codebase3 fields changed- added
Input schema / properties / patternAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pattern" +} - added
Input schema / properties / query / defaultAdded value: +"" - removed
Input schema / requiredRemoved value: -[ - "query" -]
3 tool updates
v0.55.0- Changed
get_change_risk1 field changed- added
Input schema / properties / include_pathsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Include Paths" +}
- Changed
get_health2 fields changed- added
Input schema / properties / fix_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Fix Id" +} - added
Input schema / properties / refactoring_scopeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Refactoring Scope" +}
- Changed
get_risk5 fields changed- added
Input schema / properties / targets / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / targets / defaultAdded value: +null - removed
Input schema / properties / targets / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / targets / typeRemoved value: -"array" - removed
Input schema / requiredRemoved value: -[ - "targets" -]
1 tool update
v0.53.0- Changed
get_health1 field changed- added
Input schema / properties / performance_actionabilityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance Actionability" +}
1 tool update
v0.50.0- Changed
get_health2 fields changed- added
Input schema / properties / countsAdded value: +{ + "default": "everything", + "title": "Counts", + "type": "string" +} - added
Input schema / properties / scopeAdded value: +{ + "default": "all", + "title": "Scope", + "type": "string" +}
8 tool updates
v0.48.0- Changed
get_answer1 field changed- added
Input schema / properties / includeAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Include" +}
- Changed
get_change_risk2 fields changed- added
Input schema / properties / finding_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Finding Id" +} - added
Input schema / properties / includeAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Include" +}
- Changed
get_dead_code1 field changed- added
Input schema / properties / finding_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Finding Id" +}
- Changed
get_health13 fields changed- added
Input schema / properties / cursorAdded value: +{ + "default": 0, + "title": "Cursor", + "type": "integer" +} - added
Input schema / properties / finding_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Finding Id" +} - added
Input schema / properties / opportunity_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Opportunity Id" +} - added
Input schema / properties / performance_boundaryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance Boundary" +} - added
Input schema / properties / performance_confidenceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance Confidence" +} - added
Input schema / properties / performance_contextAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance Context" +} - added
Input schema / properties / performance_sortAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance Sort" +} - added
Input schema / properties / performance_viewAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Performance View" +} - added
Input schema / properties / plan_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Plan Id" +} - added
Input schema / properties / refactoring_confidenceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Refactoring Confidence" +} - added
Input schema / properties / refactoring_effortAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Refactoring Effort" +} - added
Input schema / properties / refactoring_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Refactoring Type" +} - changed
Input schema / properties / refactoring_view / defaultPrevious value: -"canonical"New value: +"diversified"
- Changed
get_risk1 field changed- added
Input schema / properties / includeAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Include" +}
- Changed
get_symbol1 field changed- added
Input schema / properties / referenceAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Reference" +}
- Changed
get_why2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / referenceAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Reference" +}
- Removed
list_repos
1 tool update
v0.45.0- Changed
get_health1 field changed- added
Input schema / properties / refactoring_viewAdded value: +{ + "default": "canonical", + "title": "Refactoring View", + "type": "string" +}
2 tool updates
v0.44.0- Changed
get_change_risk3 fields changed- added
Input schema / properties / revspec / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / revspec / defaultPrevious value: -"HEAD"New value: +null - removed
Input schema / properties / revspec / typeRemoved value: -"string"
- Changed
get_dead_code2 fields changed- added
Input schema / properties / min_confidence / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +] - removed
Input schema / properties / min_confidence / typeRemoved value: -"number"
1 tool update
v0.41.0- Changed
get_symbol1 field changed- added
Input schema / properties / depthAdded value: +{ + "default": 1, + "title": "Depth", + "type": "integer" +}
5 tool updates
v0.39.0- Added
get_answer - Changed
get_dead_code1 field changed- changed
Input schema / properties / min_confidence / defaultPrevious value: -0.5New value: +0.4
- Changed
get_health1 field changed- added
Input schema / properties / onlyAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Only" +}
- Added
list_repos - Added
search_codebase
5 tool updates
v0.33.0- Removed
generate_refactoring_code - Removed
get_answer - Added
get_change_risk - Removed
list_repos - Removed
search_codebase
1 tool update
v0.31.0- Changed
get_symbol5 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / symbol_id / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / symbol_id / defaultAdded value: +null - removed
Input schema / properties / symbol_id / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "symbol_id" -]
11 tool updates
v0.1.0- First observed
generate_refactoring_code - First observed
get_answer - First observed
get_context - First observed
get_dead_code - First observed
get_health - First observed
get_overview - First observed
get_risk - First observed
get_symbol - First observed
get_why - First observed
list_repos - First observed
search_codebase
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes, but there are a few subtle overlaps: get_answer also handles why questions that get_why specializes in, and get_context can return symbol-level information while get_symbol is the dedicated symbol reader. The descriptions explicitly clarify these boundaries, so misselection is possible but not likely.
Nine of ten tools follow the get_<noun> pattern in snake_case, which is highly predictable. search_codebase is the only deviation, but it remains readable and clearly action-oriented.
Ten tools is well-scoped for a repository intelligence server. Each tool covers a distinct analysis need, and there is no obvious padding or missing core capability.
The surface covers orientation, search, Q&A, context, symbol reading, risk, change risk, health, dead code, and decision archaeology, which is a strong lifecycle for codebase understanding. Minor gaps remain around explicit repository listing or analysis refresh, but agents can work around these via existing parameters and external commands.
Maintenance
Related MCP Connectors
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Codebase knowledge graph — architectural awareness for AI coding agents via MCP
Codebase intelligence for agents: 152 structured artifacts across 21 programs, one call.
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenancePersistent codebase knowledge layer for AI agents. Pre-digests codebases into structured knowledge (symbols, dependency graphs, co-change patterns, architectural decisions) and serves via MCP. 28 languages, 14 tools, ~85% token reduction.3 npm10MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search code by meaning, explore codebase structure, store and query knowledge with temporal facts, and read source code through a set of MCP tools.290 npm7MIT
- AlicenseNot gradedqualityCmaintenanceProvides code intelligence for AI coding agents by indexing repositories into a hybrid knowledge graph, enabling agents to query dependencies, impact, and context through 28 MCP tools.4Apache 2.0
- AlicenseNot gradedqualityAmaintenanceProvides AI agents with a function-level dependency graph of the codebase through 30 MCP tools, enabling structural queries about code dependencies, callers, and impact analysis.2,803 npm99Apache 2.0