debt-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Find tech debt in a source tree and say how old it is and who added it (real git blame). Start with debt_summary for the overall picture, then list_todos (filter by marker, path glob, author, age, ticket), stale_todos (old markers in hot vs dead files), todo_history (when a specific TODO was introduced and whether it moved), hotspot_debt (debt x churn) and large_files_and_complexity (long files/functions, deep nesting, commented-out code, lint suppressions). All tools are read-only. repo is a directory inside the allowed roots (default: the first root); it may be a subdirectory of a git repository. Markers inside string literals are ignored; a marker must be the first word of a comment.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| debt_summaryA | One-page tech-debt overview of a repo: marker counts (by marker, directory, language),
the 5 oldest markers, top authors, markers added per quarter (trend), median age, and how many
reference a ticket (TODO(alice): ..., FIXME[JIRA-9], #123) versus orphans. Age and author come
from |
| list_todosA | List markers oldest first, each with file:line, text, parsed tickets, the date it was added, its age in days, the author and the commit (from git blame, mailmap applied; lines not yet committed say "uncommitted"). Filters: markers (e.g. ["FIXME"]), path (glob such as "src/**/.py" or ".ts"), author (substring of name or email, or the (name) in TODO(name)), older_than ("90d", "12w", "6m", "2y"), has_ticket (true = only ticketed, false = only orphans). limit caps the output (default 50); the reply says how many matched in total. |
| stale_todosA | Old markers split by whether their file is still alive. 'hot': the file had >= min_commits commits in the last active_window (people keep editing next to a stale TODO - fix or delete it); 'cooling': 1 commit; 'dead': untouched (forgotten, candidate for removal). older_than and active_window accept 90d / 12w / 6m / 2y. Needs a git repository. |
| todo_historyA | Trace one TODO through history. Give location="src/app.py:42" (a line in the working tree) or text="TODO: remove after v2" (searched in all history). Reports the commit that last touched the line (blame -w -M), the blame origin with copy detection (-C -C: moved from another file?), and the commit where that text FIRST appeared (git log -S, or -G when regex=true) with later commits that changed its occurrence count. If a later commit only reworded or reformatted the line, first_appearance shows the true age. Needs a git repository. |
| hotspot_debtA | Files where debt and churn coincide: debt items (markers + lint/type suppressions) combined
with commits and lines changed over the |
| large_files_and_complexityB | Cheap debt signals without git: files over max_file_lines, functions over max_function_lines,
deepest nesting (indent levels or brace depth), commented-out code blocks (3+ consecutive code-shaped
comment lines), and suppression counts by kind and directory (# noqa, type: ignore, pylint: disable,
@ts-ignore, @ts-expect-error, eslint-disable, #[allow(...)], @SuppressWarnings, nolint, rubocop:disable,
shellcheck disable ...). Line counters are heuristics (they do not parse code). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 6 tools
Each tool occupies a fairly clear niche: list_todos (flat listing), stale_todos (liveness-split listing), debt_summary (aggregate overview), todo_history (single-marker forensics), hotspot_debt (debt×churn), and large_files_and_complexity (non-git heuristics). The main risk is list_todos vs stale_todos vs debt_summary, which all report marker counts and could be confused, though the detailed descriptions do enough to separate them.
All names are snake_case and descriptive, which keeps things readable. However, the conventions are mixed: only list_todos follows a verb_noun pattern, while the rest are noun phrases (debt_summary, todo_history, hotspot_debt) or adjective-led (stale_todos, large_files_and_complexity).
Six tools is well within the sweet spot, and each one covers a distinct analysis angle (listing, staleness, aggregation, history, churn correlation, non-git signals). No tool feels redundant or like filler.
Coverage of the debt-analysis domain is strong: detection, aging, ownership, trend, hotspots, and non-git complexity signals are all present, and the surface is read-only by design so no CRUD gaps matter. Minor gaps remain, such as diff/PR-scoped debt detection or exporting a report, but agents can work around these by combining tools.