Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
ABC complexity gate for AI-written code with an MCP inspection tool.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
The maker has not listed install details in the registry. See the maker’s README below.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account adrianov, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.23.0) reached the registry 14 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Rust on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Tools MCP
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Web production tools for AI agents: contrast, JP text, WebP, JSON-LD, slugs, dates and 40+ more
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A must-have gate for AI-written code. Agents ship faster than humans can re-read; abcop keeps that code *understandable* by gating function and module ABC complexity so every unit fits a human head and an LLM context window. Diagnostics are also a hook for automated refactoring — extract a method, split a module — so CI rejects bad growth *and* points agents at concrete maintainability fixes.
One self-contained binary across Ruby, Rust, Python, Go, PHP, Java, C#, Dart, JavaScript, TypeScript, C, C++, Objective-C, Swift, Solidity, Zig and Haskell — no runtimes, no plugins, no per-language installs. Written in Rust for speed: one parse per file, one walk per metric, grammars compiled in; whole trees in milliseconds.
brew install adrianov/abcop/abcop
cargo install abcop
macOS (.tar.gz from GitHub Releases; binary + man):
# Apple Silicon — use the *-x86_64-apple-darwin.tar.gz asset on Intel Macs
curl -LO https://github.com/adrianov/abcop/releases/download/v0.23.0/abcop-0.23.0-aarch64-apple-darwin.tar.gz tar -xzf abcop-0.23.0-aarch64-apple-darwin.tar.gz sudo cp abcop-0.23.0-aarch64-apple-darwin/abcop /usr/local/bin/ sudo mkdir -p /usr/local/share/man/man1 sudo cp abcop-0.23.0-aarch64-apple-darwin/abcop.1 /usr/local/share/man/man1/
Ubuntu / Debian (.deb from GitHub Releases; amd64, Ubuntu 22.04+ / Debian bookworm+):
# example for v0.23.0 — use the asset name from the release page
curl -LO https://github.com/adrianov/abcop/releases/download/v0.23.0/abcop_0.23.0-1_amd64.deb sudo dpkg -i abcop_0.23.0-1_amd64.deb man abcop
lib/sinatra/base.rb:1254:0: C: Metrics/AbcSize: Assignment Branch Condition size for `error_block!` is too high. [<7, 14, 9> 18.06/17]
src/main.rs: W: Metrics/ModuleAbcSize: Assignment Branch Condition size for module is too high. [<80, 200, 60> 228.04/120] -- extract a coherent subunit 132 files analysed in 0.09s, 7 abc offenses, 0 used-once offenses, 0 never-used warnings, 14 module-abc warnings
Line counts lie. The ABC metric (Jerry Fitzpatrick, *C++ Report*, June 1997) counts what does work — assignments (A), branches (B), conditions (C) — as sqrt(A² + B² + C²). Fitzpatrick defined both method and module scope; abcop gates both:
| Rule | Severity | Meaning |
|---|---|---|
Metrics/AbcSize | C | function ABC above --max-abc (default 17). A normal scan reports a rise vs HEAD; --full and --everything report every function over the ceiling |
Metrics/ModuleAbcSize | W | module ABC above --max-module-abc (default 120). A normal scan reports a rise vs HEAD; --full and --everything report every production module over the ceiling |
UsedOnce | W | local written once and read once, inside a function the edit changed. --full and --everything report every such local |
NeverUsed | W | local written and never read, inside a function the edit changed. Same whole-tree switch as UsedOnce |
A sparse wrapper and a dense god-object can share a line count; ABC separates them. Complexity is the gate — never a line budget. UsedOnce / NeverUsed are secondary.
1 plus stable JSON/JSONL diagnostics (rule, score, vector, message) feed agents and scripts: split oversized modules, extract hot methods. Each finding is an actionable maintainability step, not a style nit.--max-abc and --max-module-abc. --full and --everything report every hit, not only the current edit.abcop --mcp is the best way to use abcop from an agent: the model gets offenses as soon as it writes, so it can fix complexity and dead locals in the same turn and ship effective code right away — not after a later CLI/CI pass. Official Rust rmcp SDK; tool abcop_inspection. Listed on the MCP Registry as io.github.adrianov/abcop (crates.io package + each GitHub v* tag).Inspired by RuboCop (Ruby AbcSize parity and # rubocop:disable directives) and lizard (one tool, many languages). Ruby method counting matches RuboCop 1.89 byte-for-byte (scripts/compare_parity.py). A block outside a method (match do, before do, a class-level each) is its own unit; each / map / select still roll into the block that contains them.
rubocop --only Metrics/AbcSize (cache off), ~140× a full rubocop run.cache.redb) compiled in; works on clean CI images with no language toolchains.--sort-by-score buffers for worst-first emit.abcop [OPTIONS] PATH...
| Option | Default | Meaning | ||
|---|---|---|---|---|
[PATH]... | auto | targets; omitted → scope selection | ||
--max-abc N | 17 | function ABC ceiling | ||
--max-module-abc N | 120 | module ABC ceiling | ||
| `--only abc\ | used-once\ | never-used` | all | single check |
--full | off | whole production tree, and every function over the ceiling plus every local (default skips stay on) | ||
--everything | off | no gitignore / hidden / vendored pruning (ignore in the user config still applies); same full report as --full | ||
| `--format text\ | json\ | jsonl` | text | CI-friendly output |
--sort-by-score | off | highest ABC first | ||
--mr | off | MR scope (uncommitted + branch vs base) | ||
--uncommitted | off | working-tree + index + untracked vs HEAD only | ||
--no-cache | off | skip on-disk cache | ||
--mcp | off | MCP server on stdio (for AI clients) | ||
--dump-tree FILE | — | debug syntax tree |
Exit codes: 0 clean, 1 findings, 2 usage error.
abcop app lib # two trees; rises and edited functions only
abcop --format jsonl lib > abcop.jsonl # streaming CI / agent input abcop --only used-once src # inline candidates in edited functions abcop --max-abc 12 --only abc lib # stricter function budget abcop --full lib # every function over the ceiling, every local abcop --everything lib # same report, with no default pruning abcop --max-module-abc 80 lib # stricter module budget abcop --sort-by-score --only abc lib # worst first abcop --uncommitted # pre-commit; rises and edited functions only abcop --mr --only abc # branch files; still only ABC rises vs HEAD abcop --mcp # MCP server on stdio (for AI clients)
JSON diagnostics include file, line, column, severity, rule, message, plus score / vector for ABC rules:
{"rule":"Metrics/AbcSize","score":10.0,"vector":"<6, 8, 0>"}
{"rule":"Metrics/ModuleAbcSize","score":120.5,"vector":"<40, 100, 40>"}
Named paths — those targets only. Findings still follow the edit filter below.
Omitted — narrowest useful scope, announced on stderr:
HEAD if the tree is dirty--mr forces this)Default walks prune test/fixture trees, vendored/build output (vendor/, node_modules/, target/, …), db/migrate/, route tables (config/routes.rb, config/routes/*.rb), and generated names (*.min.js, *_pb.go, …). Name a path explicitly to scan it anyway. Rails schema dumps (db/schema.rb, db/*_schema.rb, db/schema_*.rb) are never scanned, even when named. Third-party, route-table, and fixture paths are never scoped review surface — a diff through vendor/ or tests/fixtures/ does not make that material owned code.
On a dirty tree the bare default is uncommitted-only; --mr takes the full branch union. Commits straight to main use a 36-hour window when no branch base applies. --uncommitted fails outside a repository instead of silently widening.
Every scan except --full and --everything compares the working tree to HEAD:
--max-abc only when its score is strictly higher than the same method in HEAD (same name, source order). A score that stayed the same or fell stays quiet, including a legacy method that was already over the ceiling. A method that exists only in the working tree counts as an increase. The message asks to return to the previous score when that score was already over the ceiling (rose from 20 to 21 -- back to 20 or below). When HEAD was under the ceiling, the target is the ceiling (rose from 16.28 to 21.28 -- back to 17 or below).HEAD. A local in a function the edit did not touch stays quiet. Locals outside any function still report.--max-module-abc only when its whole-file score is strictly higher than that file in HEAD. A score that stayed the same or fell stays quiet, including a legacy module already over the ceiling. A file that does not exist in HEAD is held to the ceiling. The message asks to return to the previous score when that score was already over the ceiling (rose from 200 to 210 -- back to 200 or below). When HEAD was under the ceiling, the target is the ceiling.--uncommitted and --mr also drop function and local findings on lines the diff did not touch.
--full and --everything report every method over --max-abc, every local, and every production module over --max-module-abc. ModuleAbcSize still exempts test trees on those runs. --full keeps the default skips. --everything lifts gitignore, hidden directories, and vendored/generated/test pruning. ignore in the user config still applies to both.
One file holds user options. It is $XDG_CONFIG_HOME/abcop when that variable is set, otherwise ~/.config/abcop. $ABCOP_CONFIG replaces the path. Nothing is written into the project.
ignore is a gitignore pattern, one option per line, applied in every project relative to that project's root. A directory pattern covers everything inside it. Naming the path, --full, and --everything do not bring a match back. An MCP inspection of a matched path is empty.
ignore = app/services/legacy/
ignore = lib/old.rb
Everywhere except Rust, RuboCop-style # / // suppressions work (trailing and block; bare Metrics allowed). rubocop:disable-next is ignored, matching rubocop.
def legacy_path # rubocop:disable Metrics/AbcSize
... end
Preferred for LLM / agent workflows. Wire abcop as an MCP server so the model can call abcop_inspection while it edits: feedback arrives in the
Only the beginning is shown; read the rest in the repo