Deterministic cross-repo contract analysis for AI agents: frontend calls vs backend endpoints.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Your AI coding agent can't read your whole codebase. zzop reads it β and answers the same way every time.
Point zzop at one repository, or at your frontend and backend together, and it returns a single JSON document describing what is actually there: which frontend calls reach which backend routes and which reach nothing, what looks risky, what is dead, where to refactor first β and what this run could not see. An agent starts from that instead of guessing from the handful of files it had room to open.
zzop does not write code. It makes the understanding a code generator works from accurate and repeatable β same commit in, byte-identical findings out β so what your agent writes rests on what your code does rather than on what it inferred from a partial read. The thing being improved is comprehension, not capability.
Break a route is the whole product in one change: rename one backend route in a frontend/backend pair that share no code and no types. The frontend still compiles, its tests still pass β and zzop names both ends of the break, file and line (abridged here; the demo page shows the run's own format):
That page is a narrated walkthrough: every command and the output it produced are written out, so it
reads end to end without you running anything. The script behind it, docs/demo/break-a-route.sh, is a
maintainer tool rather than a first-run command β it builds a cargo example (so it needs a source
checkout, not a released binary) and analyzes two repositories you supply at
corpus/oss/fe-vite and corpus/oss/be-express. corpus/oss/ is gitignored and nothing in this repo
ships those trees β they are third-party checkouts, not ours to redistribute; see
CONTRIBUTING.md on bringing your own corpus. (The synthetic corpus we did write
is committed, at cases/ β every file of it but one, a fixture
that has to carry a live vendor-token literal and so cannot be committed at all; its README says what
that costs the benchmark score.)
zzop ships as two Node-free binaries. Decide which one you need before you install anything:
| If you want | Use | How you drive it |
|---|---|---|
| An AI agent (Claude Code, Claude Desktop, any MCP client) to answer questions about your repos | zzop-mcp β an MCP server over stdio | Install the plugin or the .mcpb bundle and the agent calls the tools. You run no commands. β Use in Claude Code |
| To run analyses yourself β a terminal, a CI job, a script | zzop β a plain CLI | zzop init once per tree, then zzop analyze . or zzop cross --config β¦. JSON to stdout. β Use in a terminal or CI |
Both binaries dispatch to the same shared handlers over the same engine, so a tool call and a CLI run against the same path give the identical answer. Neither one makes a network request of any kind β they carry no HTTP dependency at all (privacy).
site-src/, generated by scripts/gen-site.mjs; site/ is the committed output β a guard rejects hand edits to it)docs/README.mddocs/ARCHITECTURE.mddocs/NORMALIZED_AST.mdNeither binary needs Node.js, npm, or a compiler. Get them one of four ways:
zzop-cli-<platform>[.exe] (CLI) and/or zzop-mcp-<platform>[.exe]
(MCP server) assets for your platform from GitHub Releases
and run them directly, or put them on PATH. Each release also carries a SHA256SUMS asset covering
every one of those assets β from v0.30.0 onward; releases up to and including v0.29.1 do not have
one, so on an older pin check that the file is there before relying on it. Verify with
sha256sum -c SHA256SUMS --ignore-missing, or shasum -a 256 -c SHA256SUMS --ignore-missing on a
macOS box that has no sha256sum. Its scope is narrow and worth stating: it catches a corrupted
download, and it is a hook for anyone who obtained the digest through another channel. It does
not defend against a compromised release origin β an attacker who can swap an asset can swap
SHA256SUMS beside it β and TLS already refuses MITM./plugin marketplace add eezz4/zzop, then /plugin install zzop@zzop β
see Use in Claude Code below. (Windows: the install hook needs a
POSIX shell β Git for Windows is the supported path; details in
packages/README.md.).mcpb bundle (drag-and-drop install) β what an installer should
know BEFORE installing (updates are manual; on macOS the unsigned binary is expected to hit
Gatekeeper; the privacy statement) is packages/mcpb/BUNDLE-README.md β
bundles from releases after v0.32.0 carry that file as their own README; bundles up to and
including v0.32.0 ship without it, which is exactly why the pre-install pointer here matters.
Packaging internals: packages/mcpb/README.md.npm i -g @zzop/cli installs the exact same zzop binary above, fetched for your platform
as an npm dependency β every subcommand zzop help lists, byte-for-byte the
same output, no Node runtime involved beyond a tiny launcher script and no separate JS implementation
that could drift from the native binary. Convenient when a project already manages its toolchain
through npm. See packages/cli/README.md.The agent-facing lane. zzop-mcp is a self-contained binary with an MCP server built in; you install it
once and then ask questions in plain language β the agent picks the tool.
/plugin marketplace add eezz4/zzop β then /plugin install zzop@zzop (two separate steps).PATH. That first session does not list the zzop tools yet β the tool list is settled
before the download finishes β so restart Claude Code once and they appear (the hook says so on
stdout too). Once installed, a newer release is reported to you, never installed behind your back.The server exposes the tools analyze_repo, cross_repo, check_file, check_endpoint,
analyze_envelope, validate_envelope, validate_rule_pack β plus the zzop://contract/* resources
carrying the authoring contracts (among them the envelope schema, the DSL reference, the rule catalog,
the config surface and an annotated starter config), so an adapter or rule pack can be written with
nothing but the binary. zzop-mcp itself takes no analysis subcommands: bare or mcp serves stdio,
and version/help are the only other forms.
See packages/README.md for the full install/tool/resource reference, and docs/modules/mcp.md for exact argument shapes.
zzop CLI)The human-facing lane. Write a zzop.config.jsonc and run it, ESLint-style. A config is required β
every analysis lane refuses a tree that has none, on both binaries alike, because the names zzop would
otherwise guess about your project (what you call your auth guards, which banners mark your generated
files) live in that file, and a key you do not declare is a judgment zzop does not make:
zzop --help is the canonical subcommand list β this README does not repeat it.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/zzop)<a href="https://allmcps.com/mcp/zzop"><img src="https://allmcps.com/api/badge/zzop?style=directory" alt="Zzop on AllMCPs" /></a>