Flag when a tracked commitment vanishes verbatim between two versions. A signal, not a judge.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag — we're steadily working through the catalog.
💡 Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Did an agent quietly drop a commitment from your spec — and no one noticed?
English · 简体中文
AI agents now rewrite the documents that govern your work — specs, plans, ADRs, charters,
AGENTS.md files. Somewhere in the edit, a constraint you set earlier can quietly disappear.
Aperture is a commitment tripwire. You name the commitments you care about; it flags — word for word — when one of them vanishes between two versions of a decision document.
Catching "a commitment silently vanished" is a tripwire job: it should fire on an event, deterministically, without asking permission. So Aperture ships that check on the surface that fits it best first — a git pre-commit hook / CI check that runs with no LLM, offline — and also as a CLI and an MCP server for agents to call mid-task. MCP is one adapter, not the whole product.
A signal, not a judge. It trips; you investigate. Opt-in · runs locally · never trains on your data.
Aperture compares two text states of the same decision — an earlier version and a later one — and surfaces a narrow, specific kind of decision drift: when a tracked commitment’s exact text disappeared. One engine, several surfaces:
aperture check CLI — run the same check by hand between any two git states.What the engine does and doesn’t do:
degraded rather than false-flag); and it
can still false-flag a commitment that was merely reformatted (the words moved, the meaning
didn’t). It does not rank options, score quality, or tell you a change was wrong. That judgment
stays with you. Moving to the deterministic git-hook makes the check fire reliably — it does
not widen what it can see. Same narrow, verbatim signal.If you want one sentence: Aperture is grep for vanished commitments, wired to fire on commit —
and honest enough to admit what it can’t see.
The PyPI package is named
aperture-mcpbecause the bare nameaperturewas already taken on PyPI. The-mcpsuffix is a historical package-name artifact — the product is Aperture, and MCP is only one of its surfaces. Onepip installgives you all three below.
Create a .aperture.toml — a watchlist of the commitments that must not silently vanish, per file:
aperture check compares two git states and flags any watched commitment that disappeared
verbatim:
Exit code 1 blocks the commit when a watched commitment dropped (the default);
--warn-only prints the finding but never blocks. It’s stdlib-only, makes no network calls, and runs
no model.
Wire it as a pre-commit hook — either through the pre-commit framework
(uses this repo’s .pre-commit-hooks.yaml):
…or as a standalone .git/hooks/pre-commit:
…or run it in CI as a GitHub Action on every PR (needs fetch-depth: 0 so both
sides are available — see examples/github-action/aperture-check.yml):
Kick the tires first with the bundled fixture (clone the repo): it trips on a dropped commitment against checked-in before/after docs, no setup, fully offline —
python3 examples/git_decision_drift/git_decision_drift.py.
The same check, callable by an agent while it edits. (An MCP tool only fires if the agent chooses to call it — a weaker delivery for a tripwire than the git-hook, but handy mid-task.)
Prefer zero-install? Point the client at
uvxinstead:{ "command": "uvx", "args": ["aperture-mcp"] }.
On a long task, your agent keeps rewriting the doc it works from — a plan, a spec — across sessions and edits. And every so often, a line that mattered just… vanishes.
“Always ask before you delete anything.” Gone. “User data never leaves the device.” Gone. “The free tier stays free.” Gone.
Nobody meant to drop them; nobody reads all 400 lines of the diff.
Aperture watches the exact lines you name. Put it on the commit — a hook that fires before the drop lands — and it won’t try to understand the doc or judge it; it just tells you which promise was there, word for word, and now isn’t. A tripwire, not a judge — and honest about the rest: soften a line, reword it, or change a number instead of deleting it, and it’ll slip past. Better you hear that now.
Aperture is a heuristic. We measured it on our own gold corpus and we publish the numbers instead of a single flattering score, because knowing where it’s blind is the product — recall 0.400, precision 0.667 on a 100-case corpus, labeled by an isolated LLM-judge panel (it catches 26 of 65 real drifts; ~1 flag in 3 is noise), full breakdown in docs/measured-limits.md:
| Kind of change | Does Aperture flag it? |
|---|---|
| A watched commitment deleted verbatim | ✅ Reliably — this is the one thing it’s good at (24 of 24 in the corpus) |
| A commitment reworded / softened (“must” → “should”) | ❌ Missed — the text still “matches” |
| A commitment paraphrased / restructured | ❌ Missed |
| A number / scope / negation quietly changed | ❌ Missed |
| A commitment translated to another language | ⚠️ Declines (abstains) for a natural-language anchor — it can’t compare verbatim across scripts, so it returns degraded rather than false-flag (a commitment dropped and translated is missed) |
The deterministic surface doesn’t widen the aperture. The git-hook fires reliably — but it still only catches verbatim deletion. Every ❌ / ⚠️ row above is exactly as blind through the hook as through MCP. What you gain is when it checks (on the commit, without anyone remembering to ask), not what it can see.
Anchor style matters for that last row: the abstain applies to a natural-language anchor. A code-identifier anchor (the
ci-gates-greenstyle the quickstart teaches) is treated as translation-stable — Aperture keeps checking it across languages, so if that exact token disappears it still flagsDROPPED_SILENTLY(usually what you want for a stable identifier).
Takeaway: treat every flag as “look here,” never as “this is wrong” — and never assume silence means nothing drifted. Aperture catches the verbatim disappearance case well and is honest that it catches little else. That narrow, reliable signal is useful precisely because it doesn’t pretend to be more.
Hit one of those misses on your own docs? That's the single most useful thing you can send us — report it in ~30s (your wording is optional). Real misses guide what we fix next.
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/aperture-mcp)<a href="https://allmcps.com/mcp/aperture-mcp"><img src="https://allmcps.com/api/badge/aperture-mcp?style=directory" alt="Aperture MCP on AllMCPs" /></a>