Skip to main content
Glama

debt-mcp

An MCP server that finds TODO / FIXME / HACK / XXX / BUG markers and other cheap tech-debt signals in a repository and tells you how old each one is and who added it, using real git blame. Read-only.

What is different from other TODO scanners and TODO MCP servers (for example tododebt, codescan-mcp, and CLI tools such as todo-age): the scanner is comment-aware, not grep. A small tokenizer understands strings, comments and regex literals in 27 language families, so "TODO", '# FIXME', http://x/TODO, TODOS, todo_list and Mastodon are not reported. On top of age and author it adds three things most scanners lack: stale in a hot file vs stale in a dead file (git log activity), debt x churn hotspots (git numstat), and suppression counts (# noqa, @ts-ignore, #[allow(...)], ...) by directory. Ages come from blame -w -M, so re-indenting and moving a line within a file does not reset its age; todo_history additionally tells you when the marker text first appeared, even if a later commit reworded the line.

Install

Requires Python 3.10+ and git on PATH.

Claude Code:

claude mcp add debt -- uvx debt-mcp --dir /path/to/your/project

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "debt": {
      "command": "uvx",
      "args": ["debt-mcp", "--dir", "C:\Users\you\code\myproject"]
    }
  }
}

--dir is repeatable. It is the sandbox: the server reads nothing outside the directories you list (default: the current directory). Tools take an optional repo argument, a directory inside the sandbox; without it the first --dir is used. repo may be a subdirectory of a git repository.

Related MCP server: promptpack

Tools

Tool

What it answers

debt_summary

Counts by marker, directory, language; 5 oldest; top authors; markers added per quarter; ticketed vs orphan; median age

list_todos

Every marker, oldest first, with file:line, text, parsed tickets, added date, age in days, author, commit. Filters: markers, path glob, author, older_than (90d, 12w, 6m, 2y), has_ticket, limit

stale_todos

Old markers split into hot (file still edited), cooling, dead (file untouched)

todo_history

For path:line or a text: last-touching commit, blame origin with copy detection, first appearance via git log -S (or -G)

hotspot_debt

Files ranked by debt (markers + suppressions) times churn over a window

large_files_and_complexity

Long files and functions, deep nesting, commented-out code, suppression counts by kind and directory

Marker syntax understood: TODO, TODO: text, TODO(alice): text, FIXME[JIRA-9], HACK @carol, TODO(bob, #123), tickets as ABC-123, #123 or an /issues/123 URL. A marker must be the first word of a comment line, so prose such as "see the TODO list" is not a finding. Markers are case-sensitive; pass markers=["TODO","NOTE"] to customise.

Handled: .gitignore (via git ls-files; a plain walk with default ignores outside git), untracked files (age "uncommitted"), submodules and symlinks (skipped), binary / minified / vendored / lock files (skipped), non-UTF-8 and UTF-16 files, BOMs, CRLF, 300 KB lines, mailmap, shallow clones (warned, ages marked as lower bounds), repos with no commits.

Limits worth knowing: at most 10,000 files per call (the reply says when it stops early), files over 1 MB are skipped, HTML <script> blocks are not parsed as JavaScript, function and nesting measures are line-counting heuristics.

Try asking

  • "How much tech debt does this repo have? Who owns most of it?"

  • "List the TODOs older than a year that have no ticket."

  • "Which stale TODOs are in files we still edit every week?"

  • "When was the TODO at src/api/client.py:212 added, and was it moved from another file?"

  • "Where do debt and churn overlap? Which files should we clean up first?"

  • "Which directories rely most on # type: ignore / eslint-disable?"

  • "Are there big blocks of commented-out code?"

Security

  • Read-only: only git ls-files, blame, log, rev-parse run (always as argument lists, never through a shell, with GIT_OPTIONAL_LOCKS=0 so the index is never refreshed). Tests assert that a repository is byte-identical (every file under .git too) after every tool.

  • Path sandbox via --dir; repo, todo_history locations and symlinks are resolved and checked, .. escapes are refused.

  • Tool arguments are never passed to git as options: search text is bound to -S<text> as one argument.

  • git itself reads the repo's own configuration (including diff drivers), so point this at repositories you would run git blame in.

  • Output contains file paths, comment text and author names from the repository.

Development

uv sync --extra test
uv run pytest
uv run ruff check src tests && uv run mypy --strict src

Set DEBT_MCP_TEST_REPO to a local git repository to also run the read-only real-repo test.

MIT licensed.

Available Tools

6 tools
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 git blame --porcelain -w -M on the marker lines. Default markers: TODO FIXME HACK XXX BUG; pass markers=["TODO","NOTE"] to change. Only real comments count: markers in strings, URLs, regexes and identifiers like TODOS or todo_list are ignored. include_docstrings=True also reads Python triple-quoted docstrings. dir_depth sets how many path components group the by_directory counts.

NameRequiredDescriptionDefault
repoNo
markersNo
dir_depthNo
include_docstringsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses the data source for age/author (`git blame --porcelain -w -M`), the false-positive filtering rule (markers in strings, URLs, regexes, identifiers like TODOS or todo_list are ignored), and what dir_depth actually groups. Remaining gaps are the `repo` argument's accepted form and whether a git checkout is required.

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?

Purpose is front-loaded and the sentences progress from outputs to methodology to parameter behavior with no filler. The parenthetical marker examples (TODO(alice): ..., FIXME[JIRA-9], #123) are dense and slightly cryptic, but they carry real information about ticket-reference detection.

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 shape need not be described, and the description instead covers methodology and filtering, which is the right allocation of effort. The one substantive hole is the `repo` parameter, whose format and default behavior an agent needs in order to call the tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does for three of four parameters: markers (default list plus an override example), include_docstrings (scoped to Python triple-quoted docstrings), and dir_depth (path components used for by_directory grouping). The `repo` parameter is never explained — its type, expected path form, and what a null default means are all left unstated.

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 opening clause 'One-page tech-debt overview of a repo' names a specific verb-like action and resource, then enumerates the exact aggregates produced (marker counts, oldest 5, top authors, per-quarter trend, median age, ticket-linked vs orphan). That enumeration makes it distinguishable from list_todos and stale_todos 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 Guidelines3/5

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

It gives conditional guidance for parameters ('pass markers=["TODO","NOTE"] to change', 'include_docstrings=True also reads...'), which is usage guidance for options. But it never states when to pick this tool over siblings like stale_todos, todo_history, or hotspot_debt, so the routing decision is left to inference.

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

hotspot_debtA

Files where debt and churn coincide: debt items (markers + lint/type suppressions) combined with commits and lines changed over the since window (from git log --numstat), ranked by a score (formula in the reply) with debt per 1000 lines. These are the places where debt costs the most because people keep working there. Needs a git repository.

NameRequiredDescriptionDefault
repoNo
limitNo
sinceNo1y
markersNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations at all, the description carries the full behavioral burden and does reasonably well: it discloses the data provenance (git log --numstat), the ranking mechanism and that the formula is returned in the reply, and the per-1000-lines normalization. It does not mention that the operation is read-only or that scanning full history can be expensive on large repos, which is the main remaining gap for an unannotated tool.

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?

Three sentences, front-loaded with the core definition and ending with the hard prerequisite. Dense but every clause carries information; the parenthetical about markers and --numstat is justified because it defines what is counted. Minor redundancy between the opening and closing framing of churn.

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

Completeness3/5

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

An output schema exists, so the description need not explain the return payload, and it correctly notes the scoring formula appears in the reply. However, for a four-parameter tool with zero schema description coverage, the definition leaves input formats and defaults undocumented, so an agent must guess how to set `since`, `limit`, and `markers`.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate and it only partially does. It adds meaning for `since` (the churn window the commit/line counts cover), `markers` (the debt markers scanned alongside lint/type suppressions), and `repo` (must be a git repository), but says nothing about the accepted `since` format (default "1y"), the `limit` default of 15, or how a repo is specified.

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

Purpose4/5

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

The description names a specific analytical artifact: files where debt items (markers plus lint/type suppressions) coincide with churn (commits and lines changed from git log --numstat), ranked by a composite score. An agent can distinguish this from siblings like debt_summary (aggregate) or stale_todos (age-based) without opening a schema. It stops short of explicitly naming those siblings, so it does not reach a 5.

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

Usage Guidelines3/5

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

The only usage guidance is the prerequisite "Needs a git repository", which usefully tells the agent a required environment. There is no explicit statement of when to prefer this over debt_summary or large_files_and_complexity, nor when not to use it (e.g. non-git workspaces, very large histories). Usage is implied by the ranked-hotspot framing rather than stated.

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

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). path is a glob filter.

NameRequiredDescriptionDefault
pathNo
repoNo
limitNo
dir_depthNo
max_file_linesNo
max_nesting_depthNo
max_function_linesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full load, and it does disclose useful behavior: line counters are heuristics that do not parse code, commented-out code requires 3+ consecutive code-shaped comment lines, and suppression counting is broken down by kind and directory. It omits read-only nature, result ordering, and what limit/dir_depth actually do to output. Genuinely informative but with gaps for a no-annotation tool.

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 single dense paragraph is front-loaded with the primary signals and avoids filler. The long enumeration of twelve suppression directives is borderline verbose but earns its place by defining exactly what is counted. Minor structural weakness is that the path note trails after the list.

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

Completeness3/5

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

For a 7-parameter, zero-annotation tool with an output schema, the description explains the core analysis semantics well and need not describe return values. It stops short on limit, dir_depth, and repo behavior, and gives no indication of cost or output volume, so an agent cannot fully predict the call's effect.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate across 7 parameters. It clarifies path (glob filter), max_nesting_depth (indent levels or brace depth), and the meanings of the two line thresholds, which is real added value. But repo, limit, and dir_depth are never explained, leaving nearly half the parameters undocumented in both schema and prose.

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

Purpose4/5

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

The description names the specific signals the tool measures: files over max_file_lines, functions over max_function_lines, deepest nesting, commented-out code blocks, and suppression counts. The verb is only implied ('cheap debt signals without git'), but the resource and metrics are concrete enough to distinguish it from debt_summary or hotspot_debt. Sibling differentiation is absent.

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?

'Cheap debt signals without git' hints that this is the fast, git-free alternative for size/complexity checks, which is a usable context cue. However, it never says when to prefer it over debt_summary or hotspot_debt, nor any exclusions or prerequisites. Usage is implied rather than stated.

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

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.

NameRequiredDescriptionDefault
pathNo
repoNo
limitNo
authorNo
markersNo
has_ticketNo
older_thanNo
include_docstringsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations supplied, the description carries the full burden and does well: it discloses sort order (oldest first), the git-blame/mailmap provenance and the 'uncommitted' sentinel, the default limit of 50, and that the reply reports total matches. It does not state read-only safety, truncation semantics when limit is hit, or what happens with no repo context — gaps that keep it from a 5.

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

Conciseness4/5

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

Front-loaded with the result shape, then a compact one-line filter catalogue with inline examples — dense but every clause carries information. Minor cost: the filter list is packed into a run-on sentence that is harder to scan than a short bulleted form.

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

Completeness3/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 explained, and the behavioral context is strong. But with 8 parameters, zero schema descriptions and no annotations, the two undocumented parameters (repo, include_docstrings) leave an agent guessing about repository scoping and whether docstring TODOs are included — material omissions for a core listing tool.

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% across 8 parameters, so the description must compensate, and it does for six of them: markers (example ["FIXME"]), path (glob examples "src/**/*.py", "*.ts"), author (substring of name/email or the (name) in TODO(name)), older_than ("90d","12w","6m","2y"), has_ticket (true=ticketed, false=orphans), and limit (default 50). The repo and include_docstrings parameters are entirely undocumented, leaving real gaps.

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

Purpose4/5

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

States a specific verb and resource (list markers/TODOs) plus the ordered result shape: file:line, text, parsed tickets, date added, age, author, blame commit. An agent knows exactly what comes back. It does not name or differentiate itself from the sibling stale_todos, which presumably overlaps on the age filter, so it falls short of a 5.

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 filter set (e.g. older_than for aging debt, has_ticket for orphans), but there is no explicit when-to-use guidance and no routing to siblings such as stale_todos, debt_summary or todo_history. The agent must infer which tool to pick from the sibling names alone.

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

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.

NameRequiredDescriptionDefault
repoNo
limitNo
markersNo
older_thanNo180d
min_commitsNo
active_windowNo90d

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose real behavior: the classification rules that map results to min_commits and active_window, and the hard prerequisite that a git repository is required. It does not state read-only/safety profile or how results are ordered/limited, but the core behavioral contract (how items are bucketed) is unusually well exposed.

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 definition is front-loaded with the central idea and the classification scheme, then the format rule and the git prerequisite. The long parenthetical is slightly run-on, but every clause conveys substantive information with no filler.

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

Completeness3/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 explained, and the bucketing semantics are covered well. But for a six-parameter tool with zero annotation and zero schema-description coverage, the undefined markers, repo, and limit parameters leave an agent guessing on inputs it must supply.

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

Parameters3/5

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

Schema description coverage is 0% across six parameters, so the description must compensate. It explains the duration syntax (90d/12w/6m/2y) for older_than and active_window, and implicitly defines min_commits via the 'hot' rule, but leaves markers (which marker strings?), repo (path vs. default), and limit entirely undefined.

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

Purpose4/5

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

The description gives a specific resource and operation: old markers (TODOs) classified by whether their file is still active, with three named buckets ('hot', 'cooling', 'dead'). It is reasonably distinct from a plain listing, but it never names or contrasts itself with siblings like list_todos or todo_history, so an agent must infer the boundary from the name alone.

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 rather than stated: the parentheticals ('fix or delete it', 'candidate for removal') tell the agent what each bucket means actionably, which helps interpret results. However, there is no explicit statement of when to call this instead of list_todos, todo_history, or hotspot_debt, and no exclusions or prerequisites beyond 'Needs a git repository'.

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

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.

NameRequiredDescriptionDefault
repoNo
textNo
limitNo
regexNo
locationNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With zero annotations the description carries the full burden, and it does well: it names the underlying git mechanics (blame -w -M, copy detection via -C -C, log -S / -G for regex), notes the repository prerequisite, and explains the subtle first_appearance behavior when a line was reworded later. It does not characterize read-only safety, error behavior when the repo is missing, or how limit affects results.

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?

Dense and front-loaded, with the core action first, then the two input modes, then the returned semantics. The parenthetical git flags are terse and informative rather than padding, though the single long paragraph could be split for readability.

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

Completeness4/5

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

The tool is moderately complex (5 params, git-dependent behavior), but an output schema exists so return values need no explanation, and the description covers the hard parts: input formats, first-appearance semantics, and the repo requirement. Missing details are minor: which repo the repo param resolves to, what limit caps, and whether location and text can be combined.

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 description must compensate, and it adds real meaning for three of five params: the exact location format "src/app.py:42", a text example, and the regex=true switch tied to git -G instead of -S. The repo and limit parameters (defaults null and 20) are left entirely unexplained, which is the main gap.

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?

"Trace one TODO through history" states a specific verb and resource, and the description immediately pins down the two ways to identify the TODO (a working-tree line vs. a text string searched across history). That distinguishes it clearly from siblings like list_todos or stale_todos, which enumerate rather than trace a single item.

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?

It gives explicit mode selection: use location= for a line in the working tree, text= for a string searched in all history, each with a concrete example. It also states the prerequisite "Needs a git repository." It does not name sibling tools or say when to prefer them over this one, which keeps it short of a 5.

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

Tool Schema Changelog

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

  1. 6 tool updatesv0.1.0
    • First observeddebt_summary
    • First observedhotspot_debt
    • First observedlarge_files_and_complexity
    • First observedlist_todos
    • First observedstale_todos
    • First observedtodo_history

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency3/5

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).

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to scan code for TODO, FIXME, XXX issues via MCP, providing prioritized findings in table, JSON, or SARIF format.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to scan codebases for prioritized findings (TODO, FIXME, XXX) and retrieve results in table, JSON, or SARIF format via MCP.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to scan codebases for TODO/FIXME/XXX patterns and get prioritized results over MCP, supporting CI gates and multiple output formats.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables scanning a repository for TODO, FIXME, HACK, and XXX markers, returning counts, file and line findings, severities, and git blame ages as JSON through the scan_todo_debt tool.
    235 npm
    MIT