Skip to main content
Glama

English | 简体中文


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.
                                  # (add model-written docs any time with: repowise generate)
repowise serve                    # dashboard + MCP server (needs Node 20+; first run downloads the UI)

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 points the global repowise MCP entry here. 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 distill trims 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.md and AGENTS.md current from the index.

  • See your own savings. repowise saved and 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, # WHY: comments, commit and PR history and your agent sessions, each tied to the code it governs and flagged when it goes stale. Decisions

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.md and AGENTS.md from 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 pytest keeps every failure and drops the noise, and nothing is lost: an expand command 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 ok, attention or unknown, with an in-toto export. Change Records

Can CI hold changes to our payment code to a higher bar?

Rules in .repowise/policies.yaml, matched to components by name, tag or criticality and evaluated by repowise check, with SARIF or JUnit output. Change policy

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 tier

Code 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? repowise workspace check gates CI.

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 (npm ci), 89% for git log, 86% for git diff, no error line lost

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 CLAUDE.md / AGENTS.md

✅

❌

❌

❌

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 require() resolution, Rojo and .luaurc aware. Razor: component symbols, @code and component-tag call edges, C# health markers; no import resolution yet

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

get_overview()

Architecture summary, module map, entry points, git health. The first call on an unfamiliar codebase.

get_answer(question)

Hybrid retrieval (full-text plus vector), graph expansion and one cited answer with a single calibrated confidence. Search, read and reason in a single round-trip.

get_context(targets, include?)

Triage card for files, modules or symbols: summary, signatures, hotspot flag, governing decisions, symbol ids. include opens callers, callees, ownership and metrics. Batch many targets in one call.

get_symbol("file.py::Name")

One indexed symbol's source with exact line bounds.

search_codebase(query)

Hybrid search over code and docs, by symbol, path or concept.

get_risk(targets?, changed_files?)

Hotspots, dependents, co-change partners, ownership, test gaps, bug history. Pass changed_files for PR mode and get a directive back.

get_change_risk(revspec)

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.

get_why(query?, targets?)

Architectural decisions with their verbatim evidence. Falls back to git archaeology when no decision exists.

get_dead_code(...)

Unreachable code by confidence tier, with cross-repo consumers in workspace mode.

get_health(targets?, include?)

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 (pip install repowise)

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: repowise report changes

A software inventory review (PCI DSS 6.3.2)

Components with owner teams, languages, entry points and the packages they import: repowise report inventory

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: repowise packages where

An acquirer, a board or a migration committee

Component posture, hotspots, bus factor, dead code, test reach and contracts: repowise report assessment

An incident review

The recent changes to read first, with the signals behind each: repowise suspects

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 with repowise 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]  # write wiki pages with a model, on demand
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 left

Every 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 tools
get_answerA
Read-only

Answer a how, where, or why question in one evidence-grounded call.

High confidence is content-grounded and may be used directly. Medium
confidence keeps the smallest verification evidence; low confidence leads
with an actionable local conclusion and ranked evidence. ``candidate_files``
ranks the files worth opening that the citations do not name. Provider keys and
network access are optional: local source, symbols, FTS, rationale, and
data-shape evidence remain usable when embeddings or synthesis fail.

Responses fit 24,000 serialized characters. Pass ``include=["evidence"]``
for the deduplicated expanded projection, capped at 32,000. Reductions carry
totals, emitted counts, reasons, and a recovery: the same call with that include.

Args:
    question: Developer question.
    scope: Optional repository-relative path prefix.
    repo: Usually omitted; a workspace alias when needed.
    include: Optional ``["evidence"]`` expanded projection;
        ``["diagnostics"]`` adds ``retrieval_quality``.
NameRequiredDescriptionDefault
repoNo
scopeNo
includeNo
questionYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: it explains confidence tiers and how to treat each, that medium confidence retains verification evidence, that candidate_files ranks files not named in citations, and that the tool degrades gracefully when embeddings or synthesis fail. It also discloses hard output limits (24,000 serialized chars, 32,000 with evidence) and that reductions carry totals, counts, reasons, and a recovery call.

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

Conciseness4/5

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

Front-loads the core purpose, then layers confidence semantics, limits, and a structured Args section. Some sentences are telegraphic to the point of ambiguity ('Reductions carry totals, emitted counts, reasons, and a recovery'), but little is wasted.

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

Completeness4/5

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

With an output schema present, the description appropriately focuses on behavior, truncation, and degradation rather than return values, and it documents all four parameters. It stops short of stating relationship to sibling tools, which is the main remaining ambiguity for an agent choosing between them.

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

Parameters4/5

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

Schema coverage is 0%, so the Args block is doing essential work: it defines scope as a repository-relative path prefix, tells the agent repo is usually omitted, and enumerates the meaningful include values (evidence, diagnostics) with their effects. Only gap is no guidance on question phrasing or scope format examples.

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

Purpose4/5

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

States a concrete verb+resource+scope: answer a how/where/why question over a repository with grounded evidence in one call. It is distinguishable from search_codebase (retrieval) and get_symbol (lookup), though it overlaps noticeably with the sibling get_why without acknowledging the distinction.

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

Usage Guidelines3/5

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

Implies when to use it (how/where/why questions, single-call evidence-grounded answers) but never says when NOT to use it or names an alternative. The existence of a sibling named get_why makes an explicit routing statement the obvious missing piece.

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

get_change_riskA
Read-only

Review a commit, base..head range, or uncommitted work.

Leads with ``directive`` (what to do) and ``health_delta`` (what this
change newly made worse). Findings are reported only when the diff explains
them, name their ``attribution`` basis, and sort change-written above
pre-existing.

``directive.status`` is the verdict; ``partial`` health means code files
were skipped. ``risk_percentile`` and ``diff_shape`` measure diff size
only, not danger.

``impacted_tests`` is the ``impacted-tests`` selection; read ``status``.
``patch_coverage`` is the share of changed executable lines stored coverage
ran; ``hints`` name tests to extend. ``fix_history`` is the changed files'
bug-fix record, ``overlap`` the past fixes on these exact lines,
``branch_overlap`` other branches editing them. An empty diff returns
``status: "nothing_to_score"``.

Args:
    revspec: Commit or ``base..head`` range. Omit to review uncommitted
        work, or ``HEAD`` when the tree is clean.
    repo: Repository alias in workspace mode; omit for the default.
    extensions: File suffixes to count, e.g. ``[".py", ".ts"]``.
    exclude_patterns: Gitignore-style paths to omit, e.g. ``["tests/"]``.
    include_paths: Gitignore-style paths to keep, as a list or one
        comma-separated string, e.g. ``"src/api/,src/db/"``. Omit for all.
    baseline: Recent commits sampled for percentile ranking; 0 disables it.
    include: ``"findings"``, ``"diagnostics"`` (raw mechanics),
        ``"scales"``, ``"evidence"`` or ``"tests"`` (why each runs).
    finding_id: Expand one ``health_delta`` finding by its id.
NameRequiredDescriptionDefault
repoNo
includeNo
revspecNo
baselineNo
extensionsNo
finding_idNo
include_pathsNo
exclude_patternsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, yet the description adds substantial interpretation context the agent could not otherwise know: risk_percentile and diff_shape measure size not danger, partial health means code files were skipped, findings sort change-written above pre-existing, and an empty diff returns status "nothing_to_score". These are genuine behavioral disclosures beyond the annotation layer, not restatements.

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

Conciseness3/5

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

Purpose and args are front-loaded and the paragraph/Args layout is clean, but roughly half the text explains output fields (directive, health_delta, impacted_tests, patch_coverage, fix_history, overlap, branch_overlap) despite an output schema already existing. Some of that interpretation is valuable, but much of it is redundancy that crowds out the more useful scoping and routing information.

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

Completeness4/5

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

For an 8-parameter, output-schema-backed read tool, coverage is strong: every param is documented, edge cases (empty diff, clean tree, partial health) are handled, and the read-only nature is clear. The one gap is that it never positions itself against the sibling get_risk, which shares the risk vocabulary and is the most likely source of mis-selection.

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

Parameters5/5

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: all eight params are explained, including non-obvious details such as include_paths accepting either a list or a single comma-separated string, baseline's default of 200 and that 0 disables percentile ranking, and what finding_id expands. This is meaning well beyond the bare JSON schema types.

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

Purpose4/5

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

The first sentence gives a specific verb and resource ("Review a commit, base..head range, or uncommitted work") and the scope is clearly change-level rather than repo-level. It does not, however, name or distinguish itself from the sibling get_risk, leaving the agent to infer how change-scoped risk differs from whatever get_risk reports.

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

Usage Guidelines3/5

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

Usage is implied through the args ("Omit to review uncommitted work, or HEAD when the tree is clean", "0 disables" baseline), which is real operational guidance for calling it. But there is no explicit statement of when to pick this over get_risk or get_health, and no prerequisites or exclusions, so the agent still has to infer sibling routing.

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

get_contextA
Read-only

Triage card for files / modules / symbols — relationships, not source bytes.

Returns title, summary, signatures with lines, hotspot bit and
decision_record titles. A symbol row without symbol_id is path::name.
fix_history (count, age, bug_magnet) appears only on files with counted
bug fixes; hotspot is churn. Either is a cue to call get_risk. episodes
counts the dated records bound to a target (absent at zero); get_why serves
the bodies. A symbol target counts as its file; a module aggregates all
beneath it. Batch targets in one call. No source bytes by default:
include=["skeleton"] gives the whole file body-elided and line-verified in
ONE call, or Read it. Do not call get_symbol per signature.
For a rename or update-all-callers task, include=["references"] is the
whole edit set when complete.

Defaults fit 24,000 serialized chars; nonempty ``include`` uses
32,000. Reductions carry counts and ``_meta.omitted`` recovery refs;
``_meta.recovery_unavailable`` names a storage failure.
Include-gated blocks are projections, not omissions.

Args:
    targets: paths, "path::Symbol" ids, "component:<name>",
        "change:<id>" (pr-123 or a sha), "package:<name>".
    include: opt-in blocks: full_doc | ownership | last_change | callers
        | callees | references | metrics | community | decisions | skeleton
        | skeleton+ | health | doc_drift (docs naming it) | symbols
        (all, not top 15) | changes | provenance | suspects.
    compact: False adds structure+imports+docstrings.
    repo: usually omitted.
    symptom: issue text, error or stack trace suspects ranks on.
NameRequiredDescriptionDefault
repoNo
compactNo
includeNo
symptomNo
targetsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the read-only annotation, the description discloses important operational behavior: no source bytes by default, char budgets of 24,000/32,000, reduction metadata and recovery refs, and storage-failure signaling via _meta.recovery_unavailable. It also clarifies absence semantics (episodes absent at zero), aggregation rules, and how include-gated projections differ from omissions.

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

Conciseness4/5

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

The description is information-dense and front-loads purpose and behavior before the Args section, with little wasted text. However, the shorthand-heavy, multi-idea lines and long include list make it less scannable than ideal for an agent under time pressure.

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

Completeness5/5

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

Given five parameters, no schema descriptions, and an output schema, the description covers the missing semantic and behavioral pieces needed to call the tool correctly. It explains return-shape cues, include opt-ins, budget behavior, and alternatives, so an agent has enough context to select and invoke it appropriately.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates thoroughly with an Args section explaining each parameter. It documents accepted target formats ('path::Symbol', 'component:<name>', 'change:<id>', 'package:<name>'), the include block list, compact=False behavior, repo omission, and symptom usage.

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

Purpose5/5

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

The description states a specific resource and scope: a 'triage card for files / modules / symbols — relationships, not source bytes.' It further distinguishes itself from siblings by telling the agent not to call get_symbol per signature and by routing source-body needs to Read or get_why.

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

Usage Guidelines5/5

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

It gives explicit when-to-use and when-not-to-use guidance: fix_history/hotspot is 'a cue to call get_risk,' get_why serves bodies, and symbol signatures should not be fetched one-by-one via get_symbol. It also names task-specific alternatives, such as using include=["references"] for rename or update-all-callers work.

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

get_dead_codeA
Read-only

Unused exports, unreachable files, zombie packages — tiered by confidence.

Run before a cleanup sprint, not a targeted fix. Findings tier
high/medium/low with per-directory and per-owner rollups; workspace
mode withdraws safety on findings other repos may use.

Args:
    repo: usually omitted.
    kind: unreachable_file | unused_export | unused_internal | zombie_package.
        An unrecognised value is dropped and named in ignored_arguments,
        never applied as a filter that matches nothing.
    min_confidence: floor, default 0.4 (0.7 = cleanup-ready only). Also
        accepts a tier name: "high" | "medium" | "low".
    safe_only: deletion-ready findings only (no runtime-load risk).
    limit: max findings per tier (clamped to 25).
    tier: "high" | "medium" | "low", banded as min_confidence.
    directory: path-prefix filter.
    owner: primary-owner filter.
    group_by: "directory" | "owner" rollup.
    include_internals: also scan private symbols (more false positives).
    include_zombie_packages: monorepo package findings (default true).
    no_unreachable: skip file-level reachability findings.
    no_unused_exports: skip public-export findings.
    include_unverified: also show provisional kinds and languages held
        back pending verification (``summary.gated`` counts them).
    finding_id: stable ``id`` emitted by a dead-code finding.
NameRequiredDescriptionDefault
kindNo
repoNo
tierNo
limitNo
ownerNo
group_byNo
directoryNo
safe_onlyNo
finding_idNo
min_confidenceNo
no_unreachableNo
include_internalsNo
no_unused_exportsNo
include_unverifiedNo
include_zombie_packagesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses several non-obvious behaviors: workspace mode withdraws safety on findings other repos may use, an unrecognized kind is dropped and reported in ignored_arguments rather than silently matching nothing, limit is clamped to 25, include_internals raises false positives, and include_unverified corresponds to the summary.gated count. These are exactly the operational details an agent cannot get from structured fields.

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

Conciseness4/5

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

Front-loaded purpose sentence, then usage, then behavior, then a scannable args block — the structure is easy for an agent to parse. A minor redundancy exists in restating tier-name acceptance under both min_confidence and tier, and the arg list is long, though justified by 15 undocumented parameters.

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

Completeness5/5

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

With 15 optional parameters and 0% schema coverage, this description is complete enough to call the tool correctly on the first attempt, including output-shape hints (per-directory/per-owner rollups, summary.gated) even though an output schema already exists. No parameter or major behavior is left unexplained.

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

Parameters5/5

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: every one of the 15 parameters is explained with defaults, accepted values, and edge semantics (min_confidence takes both a numeric floor and a tier name; tier bands as min_confidence; repo is usually omitted; finding_id is the stable emitted id). This is well beyond what the bare schema conveys.

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

Purpose4/5

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

The opening line names the concrete resource class — unused exports, unreachable files, zombie packages — and adds the confidence-tiering angle, so the tool's function is unmistakable. It does not name any sibling tool to contrast against, so an agent must infer the boundary with get_health or get_risk 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.

Usage Guidelines4/5

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

"Run before a cleanup sprint, not a targeted fix" gives a clear when-to-use and an explicit when-not-to-use condition, which is unusually direct for a codebase-analysis tool. It stops short of naming the sibling (e.g. get_symbol or get_why) that should handle a targeted lookup instead.

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

get_healthA
Read-only

Code-health scores and findings from stored analysis.

No ``targets``: a dashboard led by ``fix_first``, what to fix first;
targets rank files and findings.
Never recomputes: commit, then run ``repowise update``.
Every block and accepted value: docs/agent/MCP_TOOLS.md.

Args:
    targets: file paths or ``module:<name>``; misses land in ``unresolved``.
    include: ``biomarkers``|``refactoring``|``trend``|``coverage``|
        ``accuracy``|``signals``|``churn_complexity``|``doc_drift``|
        ``semantics``|``recipe``|``what_if``, or a dimension incl. ``advisory``;
        ``performance`` and ``refactoring`` add queues.
    only: keys to keep; identity, totals, recovery survive.
        ``biomarkers``/``accuracy``/``refactoring`` alias their block key;
        ``performance``/``defect``/``maintainability``/``advisory``
        do not: they filter rows into ``unknown_only_keys``.
    repo: usually omitted.
    limit: max rows per ranked list (default 20), ``0`` for none.
    cursor: offset into a ranked list.
    fix_id/finding_id/plan_id: stable ``id``: item or ``act_``, finding, plan.
    opportunity_id: ``perf...``/``refop...``: the unit, its steps or
        plan, evidence paged by ``only=["*_evidence"]``.
    refactoring_view: ``diversified`` (default)|``canonical``|
        ``file_spread``; _type/_confidence/_effort/_scope filter.
    performance_view/_context/_boundary/_confidence/_actionability/_sort:
        queue filters.
    scope / counts: default ``all``/``everything``. ``production`` drops
        test files; ``code_shape`` drops git-derived score and findings.
NameRequiredDescriptionDefault
onlyNo
repoNo
limitNo
scopeNoall
countsNoeverything
cursorNo
fix_idNo
includeNo
plan_idNo
targetsNo
finding_idNo
opportunity_idNo
performance_sortNo
performance_viewNo
refactoring_typeNo
refactoring_viewNodiversified
refactoring_scopeNo
refactoring_effortNo
performance_contextNo
performance_boundaryNo
performance_confidenceNo
refactoring_confidenceNo
performance_actionabilityNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover read-only and closed-world, so the bar is lower, and the description still adds real behavior: it never recomputes, requires a prior update run, returns a fix_first-led dashboard absent targets, routes misses into unresolved, and explains that only-keys like performance/defect get filtered into unknown_only_keys. That is meaningful beyond the annotations.

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

Conciseness3/5

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

The front-loading is correct — purpose, then workflow, then args — and there is little outright filler for 23 parameters. However the Args block is a compressed wall of double-backtick fragments, and it defers the authoritative detail ('Every block and accepted value') to an external doc file the agent may not be able to read, which undercuts the description's self-sufficiency.

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

Completeness4/5

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

With an output schema present, return values need no prose, and the description covers the mutation-free behavior, the freshness prerequisite, and most parameters of a 23-arg tool. The remaining shortfall is the vague filter families, acceptable given the tool's breadth but not complete.

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

Parameters4/5

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

Schema description coverage is 0% across 23 parameters, so the description carries the full burden and largely does: targets, include (with the full enumerated list), only, limit/cursor semantics, the three id types, opportunity_id, and scope/counts defaults are all explained. Gaps remain for the queue filter params, which are dismissed collectively as 'queue filters' without listing accepted values.

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

Purpose4/5

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

Opens with a concrete statement of the resource: code-health scores and findings from stored analysis, plus the key constraint that it never recomputes. This separates it from write/index siblings, though it never explicitly contrasts itself with get_overview, get_risk, or get_dead_code, 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.

Usage Guidelines3/5

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

It does explain two usage modes (no targets = dashboard led by fix_first; with targets = ranked files/findings) and states the stale-data workflow (commit, then run repowise update). But there is no guidance on when to pick this over sibling tools like get_overview or get_risk, and exclusions are absent.

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

get_overviewA
Read-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: ``content_md`` is the essay's summary section and
``next_actions`` the week's top three; other blocks ship on request,
named in ``more``.

Defaults fit 24,000 chars; nonempty ``include`` uses 32,000. Reductions
carry counts and recovery status in ``_meta``.
Include-gated blocks are projections, not omissions.

In a workspace, omit ``repo`` for the default repo, ``repo='<alias>'`` for
another, ``repo='all'`` for cross-repo links.

Args:
    repo: Repository alias, path, or ID, or ``"all"``.
    include: Opt-in extras, any combination of:
        ``"content"`` — the full overview essay instead of its summary.
        ``"outline"`` — the stored wiki page tree, two rungs deep.
        ``"tour"`` — ``guided_tour`` + ``reading_order`` onboarding walks.
        ``"decisions"`` — ``key_decisions``; ``get_why`` is richer.
        ``"graph"`` — ``community_summary``, code-community clusters.
        ``"ownership"`` — ``knowledge_map``: top 3 owners by files owned.
        ``"components"`` — component list with file counts.
        ``"changes"`` — changes by category, week and source, with coverage.
        ``"tools"`` — ``tool_surface``: enabled tools, opt-ins, recipes.
        ``"actions"`` — ``next_actions`` for the quarter too, with ``done_when``.
        ``"scope"`` — the whole ``_meta.index_scope`` (provider, coverage).
NameRequiredDescriptionDefault
repoNo
includeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real operational context: default 24,000-char budget rising to 32,000 with a nonempty include, plus reduction counts and recovery status reported in _meta, and the note that include-gated blocks are projections rather than omissions. It does not describe error behavior or how long an initial index takes, so it stops short of full disclosure.

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

Conciseness4/5

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

Front-loaded with purpose, then cadence, then budget, then parameter detail — a sensible ordering. The Args block restates the schema parameters, which is defensible given 0% schema coverage, but the budget/reduction sentences are dense and slightly repetitive with the 'compact by default' framing.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and the description still covers what each include block adds, what the defaults return, token budgets, and _meta reporting. Nothing needed to call it correctly is missing.

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

Parameters5/5

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 does: repo is documented as alias/path/ID/'all' with default-repo semantics, and include is enumerated with a one-line meaning for each of the ten block names and pointers to richer siblings (get_why for decisions). This is exactly what the schema lacks.

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

Purpose5/5

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

Opening line states the specific job — orientation for an unfamiliar repo — and enumerates the concrete payload (packages, entry points, riskiest files, top actions). It explicitly differs from siblings by naming get_context and get_answer as the follow-on tools.

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

Usage Guidelines5/5

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

"Once per session; then use get_context or get_answer" gives an explicit when and names the alternatives with their selection condition. It also covers the workspace/no-repo case (omit repo, use an alias, or 'all'), so an agent knows which invocation mode applies.

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

get_riskA
Read-only

What history says about touching these files — bug fixes, churn, owners.

Fuses git temporal signals (``hotspot_score``/``owner_pct`` are 0-1; trend;
bus factor) with graph topology. ``dependents`` are directed structural
reach (source depends on target), ``consumers`` require typed contract links,
and ``co_change_partners`` are historical correlation only. Those counts
are a floor over the indexed graph. Structural reach is not proof of
runtime breakage. Security findings are included. Pass changed_files for PR mode: the response leads with
``directive`` (may_break, missing_cochanges, missing_tests,
tests_to_run, tests_to_update) — read it first. ``tests_to_run_basis`` says
measured or inferred. To score a commit or ``base..head`` range instead,
use ``get_change_risk``.

``directive.reach`` (localized, moderate, broad) bands import-graph reach:
uncalibrated, never a breakage probability.
``include=["blast"]`` adds ``pr_blast_radius``; its raw
``structural_impact_score`` appears only with ``include=["blast", "scales"]``.

Default responses fit 24,000 serialized chars; nonempty ``include`` uses
32,000. Reductions carry counts and ``_meta.omitted`` recovery refs;
``_meta.recovery_unavailable`` names a storage failure.
Include-gated blocks are projections, not omissions.

Args:
    targets: file paths to assess; defaults to changed_files.
    repo: usually omitted.
    changed_files: PR-changed files for blast-radius mode.
    include: opt-in blocks - "graph", "churn", "owners", "tests" (typed test
        rows), "blast", "scales" (units, calibration), "changes".
NameRequiredDescriptionDefault
repoNo
includeNo
targetsNo
changed_filesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and closed-world, but the description adds substantial context: response size budgets (24k default, 32k with include), reduction counters with _meta.omitted, _meta.recovery_unavailable on storage failure, and that structural reach is not proof of runtime breakage. The only shortfall is that include-gated versus omitted blocks are described abstractly rather than operationally.

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

Conciseness4/5

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

The first line front-loads the core purpose and the key sibling routing appears early, which is good. The middle is dense with parenthetical jargon and near-duplicative caveats (counts are a floor; structural reach is not proof; blocks are projections not omissions), which cost readability without adding much.

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

Completeness4/5

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

An output schema exists so return values needn't be spelled out, yet the description still explains the directive fields and tests_to_run_basis, which is necessary for correct invocation. Coverage is strong; the main gap is that repo's role and the interplay between include values remain under-specified.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry all parameter meaning; it defines targets (defaults to changed_files), changed_files for blast mode, and enumerates the include blocks (graph, churn, owners, tests, blast, scales, changes). However repo is dismissed as 'usually omitted' with no explanation of what supplying it does, and the blast/scales coupling is only partially explained.

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

Purpose5/5

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

States a concrete resource and verb: it reports history (bug fixes, churn, owners) fused with graph topology for given files. It explicitly distinguishes itself from the sibling get_change_risk, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit mode selection: pass changed_files for PR mode, and use get_change_risk instead to score a commit or base..head range. It also warns that directive.reach is uncalibrated and not a breakage probability, which is a usage constraint.

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

get_symbolA
Read-only

Follow-up read of one symbol whose id another response already gave you.

**Not an entry point.** ``get_answer`` already ships ``symbol_bodies``, and
for a whole file ``get_context(include=["skeleton"])`` or a plain Read is
one call instead of many. Reach here for a body that was elided, or for a
``continuation`` / omission ref. Never walk a file symbol by symbol.

Returns verified, line-numbered source for one indexed symbol, live range,
or omission ref. Ambiguity returns every candidate; an index miss returns
live fallback lines. A truncated result carries the exact continuation to
pass straight back.

Args:
    symbol_id: "path/to/file.py::Name", "path/to/file.py:140-180" for a
        live range, or an omission ref.
    context_lines: extra lines before/after (0-50).
    repo: usually omitted.
    query: omission refs only, regex/substring filter on lines. With
        no id given, it is read as ``symbol_id``.
    id: accepted alias for ``symbol_id``.
    depth: 1 (default) is this symbol alone; 2-3 also returns the bodies
        it calls, transitively, in ``callee_bodies``.
    reference: structured source reference emitted by this tool. Its id
        and repository are accepted together without caller translation.
NameRequiredDescriptionDefault
idNo
repoNo
depthNo
queryNo
referenceNo
symbol_idNo
context_linesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already establish this as a safe, closed read (readOnlyHint=true, openWorldHint=false), so the description is not obligated to cover safety. It nonetheless discloses beyond-annotation behavior an agent must plan around: ambiguity returns every candidate, index misses fall back to live lines, truncated results carry the exact continuation to pass straight back, and depth 2-3 populates callee_bodies.

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

Conciseness4/5

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

Front-loaded with the routing constraint before any mechanics, and the Args block is long but earns its length given 0% schema coverage. Minor redundancy in re-explaining the reference parameter's purpose in two places keeps it from a perfect score.

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

Completeness5/5

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

An output schema exists and the description still usefully characterizes return shape (verified line-numbered source, candidate lists on ambiguity, live fallback on index miss, continuation on truncation), which is more than required. Combined with full parameter documentation and explicit sibling routing, an agent has everything needed to invoke it correctly.

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

Parameters5/5

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 the Args block documents all seven parameters including the accepted id/symbol_id alias, the 0-50 bound on context_lines, the depth 1-vs-2-3 distinction, the omission-ref-only restriction on query, and the fallback rule that query is read as symbol_id when no id is given.

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

Purpose5/5

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

States a specific verb and resource ('follow-up read of one symbol whose id another response already gave you') and immediately demarcates it from siblings by declaring 'Not an entry point' and naming get_answer, get_context, and plain Read as the entry paths. An agent can distinguish this from the nine sibling tools without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('Reach here for a body that was elided, or for a continuation / omission ref') and explicit when-not ('Not an entry point', 'Never walk a file symbol by symbol'), each paired with the named alternative that should be used instead. There is no inference required to route correctly.

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

get_whyA
Read-only

Why this code is shaped this way — decision records + evidence commits.

Call before refactors or pattern divergences. Query modes: a question
("why is auth using JWT?"), a file path (governing decisions + origin
story + alignment score), a question anchored to targets, or no query
(decision health dashboard). Falls back to git archaeology when no
decisions exist for a path — never empty. Evidence-bearing rows carry an
explicit ``provenance`` and self-contained ``evidence_refs``; matching ids
mean shared evidence, not independent corroboration. Every decision row
carries ``authority``: ``accepted`` means somebody signed it, ``candidate``
means nobody has yet. ``answer_basis`` names the strongest lane the response
rests on (decision, episode, rationale, archaeology, documentation,
candidate); only ``decision`` is a ruling, and ``candidate`` is the weakest
-- it means nothing cleared that bar.

Args:
    query: question, file/module path, or omit for the dashboard.
    targets: optional file paths to anchor the search, or to ask about on
        their own when there is no query.
    repo: usually omitted.
    id: decision or ``ev_...`` evidence id emitted by this or another tool.
    reference: structured evidence reference. Its id and repository are
        accepted together without caller translation.
NameRequiredDescriptionDefault
idNo
repoNo
queryNo
targetsNo
referenceNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile, but the description adds real behavior: a git-archaeology fallback that is 'never empty', and interpretation rules for `authority`, `answer_basis`, and `provenance` (matching ids are shared evidence, not corroboration). That epistemic caveat is genuinely useful context an agent could not infer from the schema.

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

Conciseness4/5

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

Front-loaded with the purpose and the call trigger, then progressively more detailed semantics. The authority/answer_basis paragraph is dense and slightly repetitive ('candidate is the weakest' restated), and the reStructuredText double-backtick markup is noise, but almost every sentence carries information.

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

Completeness4/5

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

An output schema exists, so return values need not be spelled out, yet the description still explains how to read the key fields and what the weakest answer basis means — covering a five-parameter tool with no documented params. Minor gap: no guidance on combining id/reference with query or targets.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the load, and it does: query, targets, repo ('usually omitted'), id (decision or ev_ id), and reference are each explained in behavioral terms. The `reference` entry stays abstract — 'structured evidence reference' with no shape given — which keeps it from a 5.

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

Purpose4/5

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

The first line names the specific resource — decision records plus evidence commits — and the retrieval intent (explaining why code is shaped as it is), which separates it from peers like get_symbol or search_codebase. It never names a sibling directly, so the differentiation is inferred rather than explicit.

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

Usage Guidelines4/5

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

Gives a clear trigger ('Call before refactors or pattern divergences') and enumerates four concrete query modes, including the no-query dashboard case, so the agent knows how to start. It stops short of stating when to prefer a different tool or when this tool is unnecessary.

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

search_codebaseA
Read-only

Find code by concept, symbol, or path — hybrid codebase search.

For questions (how/where/why), call get_answer instead: it runs this
retrieval internally and returns a cited answer. Use this for raw
ranked hits: enumerating matches, resolving an identifier to a symbol_id,
or scoping get_context.

mode="auto" routes by query shape: identifiers search symbols (symbol_id,
path, line bounds for get_symbol), paths resolve files (for get_context),
prose runs wiki-semantic search, and mixed queries run hybrid (symbol hits,
then file-backed pages only). Decision records rank below file pages
unless the query is why-shaped.

Rows naming a file carry `path`; concept pages add `symbols`
(name:line) the query matches; the top 3 add `matched_lines`
(line, text), sample lines sharing its words. `candidates` lists up to `limit`
distinct files to Read, best first. Identifier or literal queries also
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.

Args:
    query: identifier, path, or natural language.
    limit: max results (default 5); distinct files outside mode="symbol"
        (same-file symbols in `symbols`).
    page_type: file_page (per-file docs) or module_page (subsystem
        pages); any stored page type filters.
    kind: implementation | test | config | doc (concept/symbol modes).
    repo: alias, or "all" for workspace-wide.
    mode: auto | concept | symbol | path | hybrid.
    symbol_kind: filter symbol hits (function|class|method|...).
    pattern: alias for query.
NameRequiredDescriptionDefault
kindNo
modeNoauto
repoNo
limitNo
queryNo
patternNo
page_typeNo
symbol_kindNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond, disclosing ranking behavior (decision records rank below file pages unless why-shaped), which row fields appear under which conditions (`path`, `symbols`, `matched_lines`, `candidates`, `lines`), and the important `complete` flag meaning no further grep is needed.

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

Conciseness4/5

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

Front-loaded with purpose and the get_answer exclusion, then progressively deeper detail. The returns paragraph is dense but nearly every clause carries actionable information; a sentence or two could be tightened, but nothing is padding for its complexity level.

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

Completeness5/5

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

For an 8-parameter, 5-mode hybrid search tool with 0% schema coverage, the description covers purpose, routing, per-mode behavior, parameter semantics, and return shape. An agent has everything needed to choose a mode and call it correctly despite an output schema and annotations that alone would be insufficient.

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

Parameters5/5

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

Schema coverage is 0% and all eight parameters are documented in the Args block with meaning the schema lacks: limit counted as distinct files except in symbol mode, page_type values, kind enum values, repo='all', the mode enum with its dispatch semantics, and pattern as an alias for query.

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

Purpose5/5

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

Opens with a specific verb and resource ('Find code by concept, symbol, or path — hybrid codebase search') and immediately contrasts itself with get_answer ('runs this retrieval internally and returns a cited answer'). An agent can distinguish this from every sibling without reading the schema.

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

Usage Guidelines5/5

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

Explicitly states when to route elsewhere (question-shaped queries → get_answer) and when to use this tool (enumerating matches, resolving an identifier to a symbol_id, scoping get_context). It even explains how mode='auto' dispatches by query shape, which is the core routing decision an agent must make.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.59.0
    • Changedget_context1 field changed
      • addedInput schema / properties / symptom
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Symptom"
        +}
    • Changedget_dead_code1 field changed
      • addedInput schema / properties / include_unverified
        Added value: +{
        +  "default": false,
        +  "title": "Include Unverified",
        +  "type": "boolean"
        +}
    • Changedget_health3 fields changed
      • addedInput schema / properties / limit / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +null
      • removedInput schema / properties / limit / type
        Removed value: -"integer"
    • Changedsearch_codebase3 fields changed
      • addedInput schema / properties / pattern
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Pattern"
        +}
      • addedInput schema / properties / query / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
  2. 3 tool updatesv0.55.0
    • Changedget_change_risk1 field changed
      • addedInput schema / properties / include_paths
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Include Paths"
        +}
    • Changedget_health2 fields changed
      • addedInput schema / properties / fix_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fix Id"
        +}
      • addedInput schema / properties / refactoring_scope
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Refactoring Scope"
        +}
    • Changedget_risk5 fields changed
      • addedInput schema / properties / targets / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / targets / default
        Added value: +null
      • removedInput schema / properties / targets / items
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / targets / type
        Removed value: -"array"
      • removedInput schema / required
        Removed value: -[
        -  "targets"
        -]
  3. 1 tool updatev0.53.0
    • Changedget_health1 field changed
      • addedInput schema / properties / performance_actionability
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance Actionability"
        +}
  4. 1 tool updatev0.50.0
    • Changedget_health2 fields changed
      • addedInput schema / properties / counts
        Added value: +{
        +  "default": "everything",
        +  "title": "Counts",
        +  "type": "string"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "default": "all",
        +  "title": "Scope",
        +  "type": "string"
        +}
  5. 8 tool updatesv0.48.0
    • Changedget_answer1 field changed
      • addedInput schema / properties / include
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Include"
        +}
    • Changedget_change_risk2 fields changed
      • addedInput schema / properties / finding_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finding Id"
        +}
      • addedInput schema / properties / include
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Include"
        +}
    • Changedget_dead_code1 field changed
      • addedInput schema / properties / finding_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finding Id"
        +}
    • Changedget_health13 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "default": 0,
        +  "title": "Cursor",
        +  "type": "integer"
        +}
      • addedInput schema / properties / finding_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finding Id"
        +}
      • addedInput schema / properties / opportunity_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Opportunity Id"
        +}
      • addedInput schema / properties / performance_boundary
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance Boundary"
        +}
      • addedInput schema / properties / performance_confidence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance Confidence"
        +}
      • addedInput schema / properties / performance_context
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance Context"
        +}
      • addedInput schema / properties / performance_sort
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance Sort"
        +}
      • addedInput schema / properties / performance_view
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Performance View"
        +}
      • addedInput schema / properties / plan_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Plan Id"
        +}
      • addedInput schema / properties / refactoring_confidence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Refactoring Confidence"
        +}
      • addedInput schema / properties / refactoring_effort
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Refactoring Effort"
        +}
      • addedInput schema / properties / refactoring_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Refactoring Type"
        +}
      • changedInput schema / properties / refactoring_view / default
        Previous value: -"canonical"New value: +"diversified"
    • Changedget_risk1 field changed
      • addedInput schema / properties / include
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Include"
        +}
    • Changedget_symbol1 field changed
      • addedInput schema / properties / reference
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Reference"
        +}
    • Changedget_why2 fields changed
      • addedInput schema / properties / id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Id"
        +}
      • addedInput schema / properties / reference
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Reference"
        +}
    • Removedlist_repos
  6. 1 tool updatev0.45.0
    • Changedget_health1 field changed
      • addedInput schema / properties / refactoring_view
        Added value: +{
        +  "default": "canonical",
        +  "title": "Refactoring View",
        +  "type": "string"
        +}
  7. 2 tool updatesv0.44.0
    • Changedget_change_risk3 fields changed
      • addedInput schema / properties / revspec / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / revspec / default
        Previous value: -"HEAD"New value: +null
      • removedInput schema / properties / revspec / type
        Removed value: -"string"
    • Changedget_dead_code2 fields changed
      • addedInput schema / properties / min_confidence / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / min_confidence / type
        Removed value: -"number"
  8. 1 tool updatev0.41.0
    • Changedget_symbol1 field changed
      • addedInput schema / properties / depth
        Added value: +{
        +  "default": 1,
        +  "title": "Depth",
        +  "type": "integer"
        +}
  9. 5 tool updatesv0.39.0
    • Addedget_answer
    • Changedget_dead_code1 field changed
      • changedInput schema / properties / min_confidence / default
        Previous value: -0.5New value: +0.4
    • Changedget_health1 field changed
      • addedInput schema / properties / only
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Only"
        +}
    • Addedlist_repos
    • Addedsearch_codebase
  10. 5 tool updatesv0.33.0
    • Removedgenerate_refactoring_code
    • Removedget_answer
    • Addedget_change_risk
    • Removedlist_repos
    • Removedsearch_codebase
  11. 1 tool updatev0.31.0
    • Changedget_symbol5 fields changed
      • addedInput schema / properties / id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Id"
        +}
      • addedInput schema / properties / symbol_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / symbol_id / default
        Added value: +null
      • removedInput schema / properties / symbol_id / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "symbol_id"
        -]
  12. 11 tool updatesv0.1.0
    • First observedgenerate_refactoring_code
    • First observedget_answer
    • First observedget_context
    • First observedget_dead_code
    • First observedget_health
    • First observedget_overview
    • First observedget_risk
    • First observedget_symbol
    • First observedget_why
    • First observedlist_repos
    • First observedsearch_codebase

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation4/5

The tools have mostly distinct purposes, and descriptions explicitly route agents: get_answer for questions, search_codebase for raw hits, get_context for triage, get_symbol only as a follow-up. Some boundaries still require careful reading, especially between get_health, get_risk, get_context, and get_overview, but overlap is limited and documented.

Naming Consistency5/5

All tool names follow a clear snake_case verb_noun pattern: get_dead_code, get_health, get_overview, get_symbol, get_why, get_risk, get_answer, get_change_risk, get_context, plus search_codebase. The single search_ verb is still predictable and semantically appropriate.

Tool Count5/5

Ten tools is well within the ideal range for a repository-intelligence server. Each tool maps to a distinct analysis workflow, from orientation and search to dead code, risk, change review, and rationale.

Completeness4/5

The surface covers the core read/analysis lifecycle well: overview, search, Q&A, context, symbols, health, dead code, historical risk, change risk, and rationale. Minor gaps exist around index/update management and explicit repository/workspace listing, which agents may need to work around.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Persistent 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 npm
    10
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    203 npm
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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.
    4
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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.
    1,321 npm
    99
    Apache 2.0