reforge-mcp
reforge-mcp is an MCP server that analyzes a codebase for quality problems and gives an agent the tools to inspect, fix, verify, and commit changes.
Scan a repo (
scan_repo, takesroot_path, optionallanguages/include_tests) — reports dead-code candidates, duplicate functions, god files, the dependency graph with cycles, and monorepo subprojects with suggested test commands. Large lists are capped and flagged viatruncated;summarystays complete.Read source precisely (
get_chunk) — pull an inclusive 1-indexed line range from a UTF-8 file to confirm findings before editing.Apply patches safely (
write_fix) — apply a unified diff to one file, optionally run an allowlisted test command, and auto-rollback to a byte-exact backup on mismatched hunks or failing tests; rejects stale diffs wholesale.Commit changes (
git_commit) — stage named files and create an atomic commit, with optional branch creation, a per-repo session budget andconfirm_everycheckpoints; does not push.Score health and trend it (
get_health_score) — 0–100 score from duplicate/dead-code/god-file/circular-dep deductions, appended tohealth_history.Estimate change risk (
score_risk) — 0–100 risk for a symbol based on referencing files, test coverage, file size and cycles, with a per-factor breakdown and recommendation.Infer architecture (
infer_architecture) — detect the likely pattern (REST API, CLI, library, frontend), entry points and modules, saving anarchitecture_hypothesis.Persist memory (
read_memory/write_memory) — store and retrieve top-level values inreforge-state.jsonacross sessions (fix log, pending work).Generate a changelog (
generate_changelog) — writeREFORGE_CHANGES.mdwith score deltas, applied fixes and pending items.
Heads-up: all findings and scores are name-based heuristics that need human review — notably Go dependency graphs are only ~1% resolved, and dead-code detection misses rather than invents.
Provides tools for staging and committing changes in a Git repository, including optional branch creation, session budgets, and confirmation checkpoints.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@reforge-mcp scan my repo at /home/me/myproject and fix the top issues"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Also available as an agent skill on Agensi. The skill teaches your agent the full reforge workflow (scan → score → plan → fix → commit). Install reforge-mcp first, then add the skill.
Available on Glama - https://glama.ai/mcp/servers/Codewithaiyan/reforge-mcp
reforge-mcp
An MCP server that gives Claude Code structured tools over your codebase — dead code, duplicates, god files, the dependency graph — and tells you what it could not read.
Reports expose their limits: the health result's coverage is the fraction of counted source files analysed, summary.parse_failures counts files the parser could not read, and dep_graph.unresolved_relative_imports counts unresolved relative imports of supported source files. get_health_score returns score: null when no files were analysed. Coverage is not test coverage, and unsupported source extensions are counted from a fixed list.
The skill source is in skills/reforge/SKILL.md.
What it does
Repos built quickly with AI can accumulate unused functions, copied logic, oversized modules and circular imports. reforge-mcp gives Claude Code structured findings so it can inspect the source, prioritize changes, apply patches with optional tests, and create local Git commits. Findings and risk scores are heuristics that need review before deleting or changing code.
The 10 MCP tools
These are the exact registered MCP names; Python wrapper functions have a _tool suffix.
Registered tool | What it does | File effects |
| Reports dead-code candidates, duplicates, oversized modules, dependencies and subprojects for supported source files. | Read-only |
| Reads an inclusive, 1-indexed line range from a UTF-8 file. | Read-only |
| Computes health and analysis coverage, then appends a timestamped history entry. | Writes state and backups |
| Patches one existing file, optionally runs tests, and attempts rollback if the patch or tests fail. | Writes source and recovery backups; tests may write files |
| Stages named files and commits the index within session budgets and confirmation checkpoints. | Writes Git index/history; may switch branches and run hooks |
| Infers a likely pattern, entry points and modules, then saves | Writes state and backups |
| Reads a top-level state value, with defaults when state is missing or unreadable. | Read-only |
| Creates or replaces a top-level state value through a staged write. | Writes state and backups |
| Estimates change risk from symbol-name references, referencing tests, file size and cycles. | Read-only |
| Writes a timestamped Markdown report from saved health history, fixes and pending work. | Overwrites |
State lives in reforge-state.json. State writes rotate up to five timestamped
backups. infer_architecture is a writing tool despite doing analysis first.
The server entry point also adds Reforge entries to .gitignore and removes
top-level *.tmp files in its working directory at startup.
Status
Verified against 21 open-source repositories across three validation sweeps — django, flask, fastapi, scrapy, pydantic, requests, express, axios, react, vue, svelte, zod, nest, cobra, gin, caddy, prometheus, okhttp, ktor, nowinandroid and ripgrep. Those sweeps found and closed 17 defects, including two languages whose tree-sitter queries had never compiled at all and a Python dependency graph that had been mostly missing for nine releases. Every one is reproduced and documented in IMPROVEMENTS.md.
CI runs lint and the test suite on Linux and Windows with Python 3.11, 3.12 and 3.14.
What is still true, and worth knowing before you trust a number:
A Go dependency graph is roughly 1% resolved. Go imports are module paths that need
go.modto resolve; caddy reports 31 edges from 3,321 imports. Treat Go dependency and risk results as incomplete.A whole-repo scan of a large project is summarised, not complete. Long lists are capped to reduce the context needed — a 3,000-file repository comes back around 170 KB instead of 1.2 MB. Every count stays exact, and
truncatednames each list that was shortened with its real length, so a short list is never mistaken for a complete one.Dead-code detection is name-based, with no type resolution. It is deliberately biased toward missing a finding rather than inventing one, because the advice is "delete this".
Successful patches preserve recovery information.
write_fixrejects mismatched diff hunks and keeps a byte-exact.reforge-bakcopy after a successful patch when the file was modified, untracked or outside Git. When Git already holds the original contents,backupis null.
Also included
Health score trending — every
get_health_scorecall appends tohealth_historyso you can chart improvement over timePersistent memory —
reforge-state.jsonsurvives across Claude Code sessions; stores the architecture hypothesis, fix log and pending workMonorepo support —
scan_repofinds subprojects frompyproject.toml,setup.py,package.json,tsconfig.jsonandgo.mod. It suggests a conventional test command; it does not verify that command or detect Kotlin/Gradle subprojects. When markers overlap, the first matching marker wins.Changelog generation —
REFORGE_CHANGES.mdis written on demand with score deltas, applied fixes, and pending items
Related MCP server: codex-dobby-mcp
Installation
Prerequisites: Python 3.11+, Git, and Claude Code or Claude Desktop.
API keys: Reforge does not require ANTHROPIC_API_KEY or another model API
key. Its analysis and state tools run locally without calling an external
model; Claude Code or Claude Desktop manages its own model access. Test commands
launched by write_fix and Git hooks invoked by git_commit may have their own
network activity.
Claude Code
pip install reforge-mcp
claude mcp add reforge-mcp -- reforge-mcpRun claude mcp list to check that reforge-mcp is registered, then start a
new session to use its ten tools. The executable must be on the client's PATH.
To request an upgrade, run pip install --upgrade reforge-mcp; the selected
version also depends on your Python version and configured package index.
Claude Desktop
pip install reforge-mcpAdd this to claude_desktop_config.json, merging it with any existing
mcpServers entries:
{
"mcpServers": {
"reforge-mcp": {
"command": "reforge-mcp",
"args": []
}
}
}The config is in ~/Library/Application Support/Claude/ on macOS or
%APPDATA%\Claude\ on Windows. Restart Claude Desktop after saving. Its process
must be able to find reforge-mcp on PATH; a terminal's activated virtualenv
does not automatically change a desktop application's environment.
From source
git clone https://github.com/Codewithaiyan/reforge-mcp
cd reforge-mcp
python3 -m venv venv
source venv/bin/activate # PowerShell: .\venv\Scripts\Activate.ps1
pip install -e .For a source install in a virtualenv, the executable is venv/bin/reforge-mcp
(Windows: venv\Scripts\reforge-mcp.exe). If the client cannot find it, use its
absolute path as the Claude Desktop command or after -- in the Claude Code
registration command. which reforge-mcp (PowerShell: Get-Command reforge-mcp)
shows the executable from an activated environment.
Usage
Example session with Claude Code
Illustrative session; the counts and commit hash below are examples.
You: Use reforge-mcp to scan my repo at /home/me/myproject and fix the top issues.
Claude: I'll start with a full scan.
[calls scan_repo("/home/me/myproject")]
The scan found:
- 14 dead functions across 6 files
- 3 duplicate implementations of `calculate_discount`
- 1 god file: src/api/handlers.py (847 lines, 23 exports)
- 1 circular dependency: auth → middleware → auth
[calls get_health_score(repo_path="/home/me/myproject")]
Health score: 47/100
Let me fetch the duplicate implementations to confirm they're identical.
[calls get_chunk(file_path="/home/me/myproject/src/billing/utils.py", repo_root="/home/me/myproject", start_line=12, end_line=28)]
[calls get_chunk(file_path="/home/me/myproject/src/cart/helpers.py", repo_root="/home/me/myproject", start_line=5, end_line=21)]
Confirmed — identical bodies. I'll keep the one in src/billing/utils.py and have
src/cart/helpers.py import it.
[calls write_fix(file_path="/home/me/myproject/src/cart/helpers.py", repo_root="/home/me/myproject", diff_str="...", test_command="pytest")]
[calls git_commit("/home/me/myproject", files=["src/cart/helpers.py"], message="refactor: drop duplicate calculate_discount")]
Committed: a3f91c2. Running next fix...Sample scan_repo output
Illustrative excerpt from a four-file repository; additional summary and graph
diagnostics are omitted here for brevity. The example has
calculate_discount copy-pasted into src/pricing.py and src/cart.py, an
unused parse_legacy_csv and _old_validate, and auth.py and middleware.py
importing each other.
{
"summary": {
"total_files": 4,
"total_functions": 7,
"total_classes": 0,
"total_imports": 3,
"total_lines": 41,
"languages_detected": ["python"]
},
"dead_code": [
{ "symbol": "_old_validate", "file": "auth.py", "line": 8 },
{ "symbol": "checkout", "file": "src/cart.py", "line": 10 },
{ "symbol": "parse_legacy_csv", "file": "src/pricing.py", "line": 7 }
],
"duplicates": [
{
"hash": "0a764010605b675494ce6d70c89bb5da7bf02f63589dd69d232c1b057c76569f",
"locations": [
{ "file": "src/cart.py", "line": 4, "name": "calculate_discount" },
{ "file": "src/pricing.py", "line": 1, "name": "calculate_discount" }
]
}
],
"god_files": [],
"dep_graph": {
"nodes": ["auth.py", "middleware.py", "src/cart.py", "src/pricing.py"],
"edges": [
{ "from": "auth.py", "to": "middleware.py" },
{ "from": "middleware.py", "to": "auth.py" }
],
"circular": [["auth.py", "middleware.py", "auth.py"]]
},
"subprojects": []
}checkout is a dead-code candidate because nothing in those four files references
its name. A finding is a question for Claude to check, not a deletion instruction.
On a monorepo, subprojects fills in from
the marker files it finds:
{
"subprojects": [
{ "root": "frontend", "language": "javascript", "test_command": "npm test" },
{ "root": "services/worker", "language": "go", "test_command": "go test ./..." }
]
}Paths use your platform's separator, so they come back with backslashes on Windows.
Sample REFORGE_CHANGES.md
# Reforge Changes
*Generated: 2025-05-02T14:33:00+00:00*
**Health score:** 73.5 (+26.5 from previous scan)
## Fixes Applied
- refactor: consolidate duplicate calculate_discount
- fix: remove dead parse_legacy_csv from src/importers/csv.py
- refactor: split handlers.py into auth_handlers.py and order_handlers.py
## Pending Fixes
- resolve circular dep: src/auth/__init__.py ↔ src/middleware/auth.py
- remove _old_validate from src/models/user.pyHow it works
Reforge works in three phases:
1. Scan
scan_repo walks the repository with parse_directory, feeding each source file to the appropriate tree-sitter adapter (Python, JavaScript/TypeScript, Go or Kotlin). Tree-sitter builds a full AST — unlike regex, it understands nested scope, decorators, arrow functions, and generics. The adapters extract functions, classes, and imports into typed dataclasses.
When Git reports a nonempty tracked-file list, only those files are analysed;
outside Git or with an empty index, all eligible files are analysed. languages
can filter supported languages. include_tests is currently accepted but does
not filter test files, whether true or false.
A missing root or a root that is a file returns an explicit error report.
Existing directories without Git are still supported, including empty directories
and extracted source archives.
Each parsed file also collects reference names from the AST while skipping each definition's own name and the contents of comments and strings. From the parse results, three analyses run:
Dead code — functions whose name appears in nobody's reference set. Matching is by name, not resolved symbol, so a repo-wide name collision hides a finding: a missed one costs nothing, a wrong one costs you working code. Exempt: dunder methods, conventional entry points,
test_*, anything listed in__all__, and anything carrying a decorator that is not a pure modifier like@property— a framework calls its registered functions without naming them anywhere a parser can seeDuplicates — functions whose normalised bodies share the same SHA-256 hash. One-line methods that several classes implement identically are treated as interface conformance, not copy-paste
God files — non-test files over 500 lines or with more than 10 top-level definitions. Methods do not count towards that total
A dependency graph is built from resolved imports — from x import y, bare import x, relative from ..pkg import y, and JS/TS ./path forms — and checked for cycles with DFS. Imports that resolve outside the repository are external and get no edge. Monorepo subprojects are discovered by scanning subdirectories for marker files (pyproject.toml, package.json, go.mod, tsconfig.json).
2. Plan
Claude Code receives the structured scan report and uses get_chunk to read specific line ranges before deciding what to fix and in what order. infer_architecture saves its hypothesis, and get_health_score appends history. The agent must use write_memory to maintain its fix log and pending queue; patches and commits do not update those lists automatically. read_memory retrieves saved values in later sessions.
3. Fix
write_fix validates a unified diff before writing the target:
Creates a unique byte-for-byte backup ending in
.reforge-bakbeside the existing target fileParses the diff into hunks and checks every hunk's context and removed lines against the file at the position its header claims
Applies the hunks with line-offset tracking — or, if any hunk failed that check, writes nothing at all
Runs the optional test command (validated against the allowlist)
On a mismatched diff or test failure, attempts to restore the backup and returns
rolled_back: true. This flag records the rollback path, not independent verification that restoration succeeded; filesystem failures can prevent recovery.
git_commit stages the listed files and commits the Git index via GitPython.
It returns an error when the staged index has no changes to commit; a refused
empty commit does not consume the session budget.
Previously staged changes are also included, so review the index first;
files_committed echoes the requested file list, not the full commit contents.
The tool reads session_budget and confirm_every from reforge.toml: commits
are blocked when the budget is reached, and the next call after each
confirm_every group returns needs_confirmation: true until retried with
confirmed: true. The count is held per repository for the life of the server
process, so restarting the server starts a new session. This tool does not push.
Security
Boundary | Mechanism |
Source-file boundaries | Parsing, |
File guards | Parsing skips configured binary/lock/minified files and files over 500 KiB. |
Test command injection |
|
Staged state writes | State is serialized to |
Mismatched diffs |
|
Runaway test commands | The test command runs with no shell, with |
Local analysis | Reforge's analysis and state tools make no outbound API calls. The AI client's model requests, user-supplied test commands and Git hooks have their own network behavior |
Contributing
# Clone and install
git clone https://github.com/Codewithaiyan/reforge-mcp
cd reforge-mcp
python3 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
# Run the full test suite
pytest
# Run with coverage
pytest --cov=src --cov-report=term-missingProject structure
reforge-mcp/
├── src/reforge_mcp/
│ ├── server.py # FastMCP server — registers all 10 tools
│ ├── tool_results.py # TypedDict output schemas for MCP results
│ ├── tools/
│ │ ├── scan.py # scan_repo, get_health_score, monorepo detection
│ │ ├── chunk.py # get_chunk — line-range file reads
│ │ ├── fix.py # write_fix — diff apply + rollback
│ │ └── git.py # git_commit — atomic commits with budget enforcement
│ ├── scanner/
│ │ ├── parser.py # tree-sitter adapters (Python, JS/TS, Go, Kotlin) + reference collection
│ │ ├── dead_code.py # unreferenced symbol detection
│ │ ├── duplicates.py # body-hash duplicate detection
│ │ ├── architecture.py # project-shape inference
│ │ ├── risk.py # per-symbol change risk
│ │ └── adapters/ # per-language project-detection stubs
│ └── utils/
│ ├── state.py # reforge-state.json load/save, gitignore, changelog
│ ├── security.py # path validation, file guard, command allowlist
│ └── diff.py # unified diff parser and applier
├── tests/ # one file per module, plus test_end_to_end.py
│ ├── test_parser.py # which drives scan -> fix -> commit for real
│ ├── test_dead_code.py
│ ├── test_duplicates.py
│ ├── test_dep_graph.py
│ ├── test_god_files.py
│ ├── test_diff.py
│ ├── test_fix.py
│ ├── test_git.py
│ ├── test_chunk.py
│ ├── test_memory.py
│ ├── test_monorepo.py
│ ├── test_scanner.py
│ └── test_security.py
├── pyproject.toml
└── reforge.toml # optional per-repo configreforge.toml reference
[scan]
ignore = ["generated", "vendor"] # added to the built-in skip list
[fix]
confirm_every = 5 # pause for confirmation every N commits
session_budget = 20 # max commits per session, per repo, before a hard stopThose three keys are the whole file. Every one of them is read.
Changelog
See CHANGELOG.md. If you used any earlier version, re-scan. Three validation sweeps changed what the analyses report: TypeScript and Go parsed nothing at all before 0.3.0, Python dependency graphs were mostly missing before 0.4.0, and dead-code findings in Go, Kotlin and TypeScript included whole classes of false positive.
License
MIT — see LICENSE.
Available Tools
10 toolsgenerate_changelogA
Write REFORGE_CHANGES.md from saved health history, fixes and pending work. Use when: you need a human-readable report of state recorded during cleanup. Don't use when: you only need one raw saved state value (use read_memory instead).
Returns {success, path}, with error if the Markdown file could not be written. Reads health_history, fix_log and pending_fixes; it does not rescan, infer fixes from Git or populate those lists. Overwrites the report with a fresh UTC generation timestamp, so repeated calls are not idempotent.
Inputs: repo_path (required). Returns: path, error, success
get_chunkARead-onlyIdempotent
Read an inclusive line range from a UTF-8 file without modifying it. Use when: you need to inspect a finding or obtain context for a patch. Don't use when: you need repository-wide findings (use scan_repo instead).
Returns {source, language, start_line, end_line, total_lines} on success, or {error} on failure. Source joins the selected lines with newlines; start_line/end_line report the clamped inclusive range. Large files can be read in slices; binary, lock and minified-file guards still apply.
Inputs: file_path (required), end_line, repo_root, start_line. Returns: error, source, end_line, language, +2 more
get_health_scoreA
Compute repository health from scan metrics and append a timestamped state entry. Use when: you need a before/after health metric and persisted history. Don't use when: you only need findings without writing state (use scan_repo instead).
Returns {score, coverage, breakdown, scan_summary}, plus caveat for limited coverage or parse failures. score is 0-100 (higher is healthier), or null when no files were analysed. coverage is the analysed fraction (0-1, three decimal places), not test coverage. Breakdown contains dead_code_ratio, duplicate_ratio (fractions rounded to three decimals), god_file_count and circular_count. Deductions cap at 30/30/20/20 points respectively; only Python/JS/TS-sensitive cycles reduce health. The history entry is appended on every call, so repeated calls are not idempotent.
Inputs: repo_path (required). Returns: score, caveat, coverage, breakdown, +1 more
git_commitADestructive
Stage the named files and create a Git commit within the session budget. Use when: edits have been reviewed and should be recorded in local Git history. Don't use when: you need to apply or test a patch first (use write_fix instead).
Returns {success, commit_hash, branch, files_committed, error}. A checkpoint additionally returns needs_confirmation=true and message; retry with confirmed=true after approval. files_committed echoes the requested list, not an inventory of the commit: previously staged changes are also committed. Refuses an empty commit when the staged index matches HEAD; refusals do not consume the session budget. Initial commits with staged content are allowed. May create/check out a branch and invoke Git hooks; does not push.
Inputs: files (required), repo_path (required), branch, message, +2 more. Returns: error, branch, message, success, +3 more
infer_architectureA
Infer a repository's architectural pattern and save its hypothesis to reforge-state.json. Use when: you need an initial map of the project's likely shape and entry points. Don't use when: you only need the previously saved hypothesis (use read_memory instead).
Returns {pattern, evidence, entry_points, inferred_modules, confidence, hypothesis}. Pattern is REST API, CLI tool, web frontend, library or unknown; confidence is a heuristic fraction from 0 to 1. Classification uses imported modules, with filename-based entry-point/module guesses. Scans without an external model, then writes architecture_hypothesis and rotates state backups.
Inputs: repo_path (required). Returns: pattern, evidence, confidence, hypothesis, +2 more
read_memoryARead-onlyIdempotent
Read one top-level value from persisted repository state without writing files. Use when: you need a saved hypothesis, fix queue, fix log or health history. Don't use when: you need to replace a stored value (use write_memory instead).
Returns {key, value, found}; an unknown key returns value=null and found=false. Built-in default keys may return found=true even when no state file exists.
Inputs: key (required), repo_path (required). Returns: key, found, value
scan_repoARead-onlyIdempotent
Scan source files for dead code, duplicates, oversized modules, and dependencies. Use when: you need repository-wide findings before planning changes. Don't use when: you only need source lines from a known file (use get_chunk instead).
Returns {summary, dead_code, duplicates, god_files, dep_graph, subprojects}. Summary includes file/symbol/line counts, languages, parse_failures and unscanned-source counts. Findings carry file paths and 1-indexed lines; dep_graph has nodes, {from, to} edges, circular paths, external_imports, unresolved_relative_imports and package_imports counts. A missing/non-directory root or a path-validation failure returns error, empty findings/graph and a zero summary, without subprojects. Lists are capped at 200 items, duplicate groups at 50 and their locations at 10; shortened lists gain _total, with truncated listing shortened top-level/graph lists. Summary counts remain complete. In a nonempty Git index, only tracked files are analysed; outside Git, all eligible files are.
Inputs: root_path (required), languages, include_tests. Returns: error, summary, dead_code, dep_graph, +8 more
score_riskARead-onlyIdempotent
Estimate the risk of changing one symbol on a heuristic 0-to-100 scale. Use when: you need to prioritize a specific proposed change before patching. Don't use when: you need an overall repository health trend (use get_health_score instead).
Returns {score, breakdown, basis, referenced_by, recommendation}. Breakdown contains point contributions: inbound_refs (0-30), has_tests (0 or 20 for no referencing test), lines_changed (5/10/17/25 based on file length, not patch size), is_circular (0 or 25). basis is symbol, or file when reference sets are unavailable. referenced_by contains at most 10 sorted paths. Recommendation is safe to fix (<=30), fix with caution (<=60), or manual review recommended (>60); this is not a guarantee of correctness or coverage.
Inputs: file (required), symbol (required), repo_path (required). Returns: basis, score, breakdown, referenced_by, +1 more
write_fixADestructive
Apply a unified diff to one file, optionally run tests, and attempt rollback on failure. Use when: you have reviewed the source and prepared a specific patch. Don't use when: you only need to record existing edits in Git (use git_commit instead).
Returns {success, test_output, error, rolled_back}. Successful patches also return git_state (clean, modified, untracked or no_repo) and backup (null when Git holds the original, otherwise a retained .reforge-bak path). Tests are optional; success without test_command does not mean tests ran. No commit is created. Reapplying the same diff is not idempotent.
Inputs: diff_str (required), file_path (required), repo_root, test_command, +1 more. Returns: error, backup, success, git_state, +2 more
write_memoryA
Create or replace one top-level value in reforge-state.json via a staged write. Use when: you need to persist a hypothesis, fix log or pending work across sessions. Don't use when: you only need to inspect a stored value (use read_memory instead).
Returns {success, key, previous_value}, with error on an OSError while saving. previous_value is null for an absent key or a previously null value. Repeated calls can change previous_value and rotate timestamped state backups, so this is not idempotent even when the supplied value is unchanged.
Inputs: key (required), value (required), repo_path (required). Returns: key, error, success, previous_value
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Every tool has an explicit 'Use when' / 'Don't use when' clause that names the alternative tool to use instead, e.g. scan_repo vs get_chunk, write_fix vs git_commit, read_memory vs write_memory, score_risk vs get_health_score. Boundaries are crisp even for near-neighbors like infer_architecture (which writes state) and read_memory (which only reads it).
Names overwhelmingly follow a snake_case verb_noun pattern (scan_repo, get_chunk, write_fix, read_memory, score_risk, generate_changelog). The only minor deviation is git_commit, which uses a resource prefix rather than a leading verb, but it remains readable and predictable.
Ten tools is well within the ideal range and each maps to a distinct step in a repo-cleanup workflow (scan, inspect, patch, commit, persist state, infer, score, report). No tool feels redundant or padded.
The surface covers the full lifecycle: scan_repo discovers findings, get_chunk inspects, write_fix patches, git_commit records, memory tools persist, and scoring/reporting tools close the loop. Minor gaps exist — no standalone test-runner or revert/undo tool, and tests only run bundled inside write_fix — but agents can work around these.
Maintenance
Related MCP Connectors
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
An MCP server that gives your AI access to the source code and docs of all public github repos
FixMyPrompt is a remote MCP server for coding agents. It saves the steps your agent worked out as project memories and fetches them in later sessions, scores and rewrites prompts, and checks CLAUDE.md and AGENTS.md files. Works with Claude Code, Codex and Cursor. Free plan available.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that connects Gemini 2.5 Pro to Claude Code, enabling users to generate detailed implementation plans based on their codebase and receive feedback on code changes.514-
- AlicenseAqualityCmaintenanceA local MCP server that lets Claude delegate scoped work to Codex with structured results and guardrails, supporting planning, code review, build, reverse engineering, and long-running background tasks.1144 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides agentic code review powered by OpenAI-compatible models, designed for use with Claude Code.1MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives Claude Code cross-session memory persisted to a plain .claude-memory.md file in your repo.MIT