Skip to main content
Glama
jaysinailabs

aperture-mcp

by jaysinailabs

Aperture

A commitment tripwire  ·  git hook · CI · CLI · MCP

Did an agent quietly drop a commitment from your spec — and no one noticed?

PyPI MCP License status

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.


What it is (and what it is not)

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:

  • git pre-commit hook / CI check — the deterministic form. Fires on the commit / PR event with no model in the loop, and blocks (or warns) automatically.

  • aperture check CLI — run the same check by hand between any two git states.

  • MCP server — so an agent can call the check while it edits (weaker as a tripwire, since it only runs if the agent chooses to call it — but useful mid-task).

What the engine does and doesn’t do:

  • It does: flag when a commitment you listed verbatim is present in version A and gone from version B — across commits, sessions, or authors. It returns a structured, comparable result with its own blind spots written on the label.

  • It does not: understand meaning. It matches text as a case-insensitive substring, so it misses a commitment that was reworded / softened / paraphrased (it looks dropped-free even though the promise weakened); it declines/abstains on a commitment that was merely translated (it can’t compare verbatim across scripts, so it returns 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.


Related MCP server: openclaw-output-vetter-mcp

Quickstart (≈2 minutes)

pip install aperture-mcp   # installs the `aperture` CLI + the MCP server (wire the CLI as a git hook — see below)

The PyPI package is named aperture-mcp because the bare name aperture was already taken on PyPI. The -mcp suffix is a historical package-name artifact — the product is Aperture, and MCP is only one of its surfaces. One pip install gives you all three below.

1. The deterministic tripwire — git pre-commit hook / CI (no LLM, offline)

Create a .aperture.toml — a watchlist of the commitments that must not silently vanish, per file:

fail_on_drop = true

[[watch]]
path = "CHARTER.md"
commitments = ["never train on your data", "data stays on the device"]

aperture check compares two git states and flags any watched commitment that disappeared verbatim:

aperture check                                    # HEAD vs working tree (default)
aperture check --staged                           # HEAD vs the staged index — for a pre-commit hook
aperture check --ref-a origin/main --ref-b HEAD   # any two refs — for CI on a PR

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

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/jaysinailabs/aperture-mcp
    rev: v0.2.0
    hooks:
      - id: aperture-commitment-drift

…or as a standalone .git/hooks/pre-commit:

#!/bin/sh
exec aperture check --staged

…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):

- uses: actions/checkout@v4
  with: { fetch-depth: 0 }
- run: pip install aperture-mcp
- run: aperture check --ref-a ${{ github.event.pull_request.base.sha }} --ref-b ${{ github.sha }}

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.

2. Mid-task, from an agent — the MCP server

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

{
  "mcpServers": {
    "aperture-mcp": { "command": "aperture-mcp" }
  }
}

Prefer zero-install? Point the client at uvx instead: { "command": "uvx", "args": ["aperture-mcp"] }.

3. Or from your own Python

from aperture import compare, Anchor, AnchorKind

result = compare(
    state_a="We commit to: ci-gates-green before release; data-never-leaves-device.",
    state_b="We commit to: data-never-leaves-device.",
    anchors=[Anchor(kind=AnchorKind.COMMITMENT, id="ci-gates-green")],
)
print(result.status)            # DROPPED_SILENTLY
print(result.anchor_violations) # the commitment that vanished

A scene you’ll recognize

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.


What trips it — and what slips past

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 productrecall 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-green style the quickstart teaches) is treated as translation-stable — Aperture keeps checking it across languages, so if that exact token disappears it still flags DROPPED_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.

Why not just git diff / grep? You can reproduce the core check by hand. What Aperture adds is that it’s wired to fire on the commit / PR event (as a hook or CI check) and callable mid-task by an agent (over MCP); it returns a structured, directional result (ok / degraded / DROPPED_SILENTLY / …); and it reports its own blind spots in the result so a human can audit the gaps. It’s ergonomics + honesty around a simple, legible check — not a smarter detector.


Why this exists

Long-running and multi-agent workflows drift. A constraint set in turn 3 / session 1 / by agent A gets quietly edited away forty turns later, in another session, by agent B — and nobody notices until it ships. Aperture is a preflight you can put on the documents agents maintain: name the commitments that must not silently vanish, and get a tripwire when one does — ideally on the commit itself, before the drop ever lands.

It is deliberately small and legible. It is not an AI that decides for you; it is a signal that helps you stay consistent with yourself.


Who it’s for

Teams and builders who (a) let AI agents edit repo-resident decision documents — specs, plans, ADRs, charters, and AGENTS.md files — and (b) keep those documents under version control. If your agents touch text that encodes promises, Aperture gives you a cheap, honest tripwire — on the commit, in CI, or mid-task — on the ones you can’t afford to lose silently.


Privacy

  • Opt-in and local. Aperture runs on your machine — the git-hook, the CLI, and the MCP server alike. It makes no network calls.

  • Never trains on your data. Your decision text is yours; it never leaves your process.

  • Usage logging is off by default and, when enabled, records only metadata (timestamp, tool, status, counts) — never your decision text or commitment wording.


Honesty about the demo

The repository ships a small hand-authored fixture ADR (a before/after pair under examples/git_decision_drift/fixtures/), where Aperture correctly flags a commitment we deliberately retired and stays quiet on one we kept. It is a faithful illustration of the mechanism — but it is a sample of one that we author and judge ourselves. It demonstrates how the tripwire works, not that the signal is strong. For the latter, see the measured per-family numbers above and in docs/measured-limits.md. We have zero external adopters yet — if you run Aperture on your own decision docs, we’d love to hear what it caught and what it missed.


Project status

Early, pre-1.0, not yet a production gate. The compare contract (v0.2) is frozen and covered by a conformance suite; the package API may still move. See VERSIONING.md for the compatibility policy and CHANGELOG.md for changes.

Hit a miss? Help it improve

Aperture will miss things — that's by design (it's blind to reworded, softened, and translated commitments, on every surface). When it misses a drift you cared about, or false-flags a rewrite, telling us is the single most valuable contribution:

  • ~30 seconds, no account/usage data, your wording is optionalopen a drift-case report.

  • Real misses tell us which blind spot to fix next, and — only if you choose to share the wording — can become cases in the gold corpus that keeps the numbers in docs/measured-limits.md honest.

We never auto-collect anything (see Privacy); this happens only when you choose to share. Questions, or "is this the right tool for my case?" → GitHub Discussions.

More ways to help: CONTRIBUTING.md.

License

Apache-2.0.

Available Tools

5 tools
compareA

Surface drift between two text states of the SAME decision object (state_a = earlier, state_b = later). Pass anchors=[{kind, id}] to track specific constraints/goals/commitments/baselines — an id present in state_a but missing from state_b reads as violated (directional; an id absent from state_a does not trigger), and the id must appear VERBATIM (case-insensitive substring) to match — so RE-STATE tracked anchors verbatim in state_b (a constraint you kept but did not re-state still reads as violated). Returns an 8-value status (only 4 are emitted on this surface) + violations + reason. Heuristic, not a semantic judge; a drift signal, not a sole gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorsNo
state_aYes
state_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavioral traits: directional violation detection (only missing from state_b triggers), verbatim case-insensitive substring matching, return of 8-value status (only 4 emitted), and heuristic nature. No contradictions.

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 description is comprehensive but slightly verbose (5 sentences). Each sentence adds value, but some pruning (e.g., combining anchor rules) could improve conciseness while maintaining clarity.

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?

Given complexity (anchor tracking, directional violations, heuristic nature), the description covers key aspects. Output schema exists but is not shown; however, the description mentions return values sufficiently. The remaining 4 status values are not explained, but this is likely covered by output schema.

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

Parameters5/5

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

Despite 0% schema coverage, the description adds rich meaning: state_a is earlier, state_b later; anchors track specific items with detailed matching rules and violation semantics. This fully compensates for the schema's lack of parameter descriptions.

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 description clearly states the tool's purpose: 'Surface drift between two text states of the SAME decision object.' It distinguishes from sibling tools like compare_stance and compare_commitment by focusing on text state comparison and anchor tracking.

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?

Provides context on when to use (detecting drift between same object) and how anchors work. Implicitly advises not to treat as sole gate via 'Heuristic, not a semantic judge; a drift signal, not a sole gate.' However, no explicit when-not-to-use or alternative recommendations beyond siblings listed.

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

compare_commitmentA

compare specialized for a COMMITMENT: checks ONLY commitment anchors; flags a promise present in state_a but gone from state_b as DROPPED_SILENTLY. Caveat: cannot distinguish a FULFILLED commitment from an abandoned one — that disposition is the caller's to decide.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorsNo
state_aYes
state_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses the tool's behavior: it only checks commitment anchors, flags dropped promises, and acknowledges the limitation in distinguishing fulfilled from abandoned commitments.

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

Conciseness5/5

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

The description is concise, with two sentences plus a caveat. It is front-loaded, providing immediate clarity about the tool's purpose and limitations without extraneous text.

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?

Given the output schema exists, return values need not be described. However, the parameters lack explanation. For a specialized tool with a caveat, the description provides sufficient context for usage, but the missing parameter semantics slightly reduce completeness.

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

Parameters2/5

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

Schema description coverage is 0%, but the description does not explain the parameters (state_a, state_b, anchors) beyond the generic input schema. It adds no detail about their meaning, format, or usage, leaving ambiguity for the agent.

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 description clearly states it is a compare specialized for commitments, focusing only on commitment anchors, and introduces the DROPPED_SILENTLY flag. It effectively differentiates from sibling compare tools by specifying its scope.

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?

The description explicitly limits usage to commitment anchors and mentions the caveat about fulfilled vs abandoned. While it doesn't list when-not-to-use or alternatives, the context and sibling names imply the specialization.

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

compare_proposalA

compare specialized for a PROPOSAL: also flags strength regression (strong→weak wording) as degraded — but ONLY for a narrow FIXED keyword set (English modals + 必须/务必/应当/确保→应该/也许); most reworded/softened wording falls outside this list and is MISSED. Checks ONLY constraint/goal anchors (other kinds silently ignored) for presence in state_b.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorsNo
state_aYes
state_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing behavior. It transparently describes the limited keyword set, that most softened wording is missed, and that it only checks constraint/goal anchors. However, it does not explicitly state whether the tool is read-only or has side effects, though 'compare' suggests read-only.

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

Conciseness3/5

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

The description is several sentences long and includes specific details, but it could be more concise. It front-loads the purpose but then adds caveats that could be reorganized. Overall, it is adequate but not extremely efficient.

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

Completeness2/5

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

Given the complexity and 0% schema coverage, the description should cover operation and inputs comprehensively. It explains the special behavior but does not mention what the tool returns (output schema exists but not described), nor does it reinforce that both states are required. The description is incomplete for a 3-parameter tool with no schema descriptions.

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

Parameters2/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. It adds context about the 'anchors' parameter (checks constraint/goal anchors) but does not explain 'state_a' or 'state_b' at all. The description only partially covers the semantics of the parameters.

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 description clearly states it is a specialized compare for proposals, distinguishing it from sibling tools like compare_stance or compare_commitment. It specifies the unique behavior: flags strength regression for a fixed keyword set and checks constraint/goal anchors. This provides a specific verb and resource with differentiation.

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 description implies the tool is for proposals, but does not explicitly state when to use it versus alternatives. It mentions limitations (narrow keyword set, missed wording) but no direct guidance on when to choose this over compare_stance or compare_commitment.

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

compare_stanceB

compare specialized for a STANCE: also flags polarity reversal (support↔oppose) as degraded. Checks ONLY goal/baseline anchors (other kinds silently ignored) in state_b.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorsNo
state_aYes
state_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, description discloses important behaviors: polarity reversal flagged as degraded, non-goal/baseline anchors silently ignored. This adds transparency beyond typical expectations.

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?

Two sentences, front-loaded with key information. Could be more structured but overall efficient.

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?

Description covers behavior and constraints on anchors, but lacks explanation of state parameters and what 'degraded' means for output. Output schema exists but still feels incomplete for full understanding.

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

Parameters2/5

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

Schema coverage is 0%, so description must explain parameters. It gives meaning to 'anchors' (filters to goal/baseline) but does not explain 'state_a' or 'state_b' beyond being string states, leaving 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?

Description clearly states it is a specialized compare for stance, with unique behavior (flags polarity reversal). It implies distinction from sibling tools but does not explicitly name them.

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?

Description specifies that only goal/baseline anchors are checked and others are ignored, providing context for when to use. However, it lacks explicit guidance on when not to use or alternatives among sibling tools.

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

healthA

Liveness check; returns status + name + version.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description bears full burden. It indicates a read-only, non-destructive operation (liveness check), but doesn't disclose failure behavior, latency, or other edge cases. Lacks thoroughness but not misleading.

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

Conciseness5/5

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

The description is exceptionally concise—a single sentence that clearly states purpose and output. No wasted words, and the most important information is front-loaded.

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?

Given the tool's simplicity (no parameters, straightforward liveness check), the description is nearly complete. The output schema exists and likely covers return values, so the description doesn't need to elaborate further.

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?

The tool has zero parameters, so schema coverage is 100% and the description carries no parameter burden. Per scoring guidelines, 0 parameters warrants a baseline of 4.

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 description clearly states it performs a 'liveness check' and returns specific fields (status, name, version). This verb+resource combination is unambiguous and distinct from sibling tools which are all 'compare' variants.

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 description implies use for verifying service health ('Liveness check'), but provides no explicit context on when to use vs alternatives, nor when not to use. For a simple health check, this is minimally adequate.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.2.0
    • First observedcompare
    • First observedcompare_commitment
    • First observedcompare_proposal
    • First observedcompare_stance
    • First observedhealth

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation3/5

Tools are specialized but overlap with the generic `compare` tool, which can also handle stance, commitment, and proposal anchors. The specialized tools add narrow features but cause ambiguity in tool selection.

Naming Consistency4/5

Four tools follow `compare_*` pattern, but `health` breaks the convention. The naming is mostly consistent with one clear outlier.

Tool Count4/5

Five tools is slightly below what the domain might warrant (e.g., missing a baseline-specific comparison), but still reasonable and not too few.

Completeness3/5

Covers common comparison types but has gaps: missing a dedicated baseline comparison, and each specialized tool ignores certain anchor types. The generic `compare` has strict verbatim matching that may miss semantic equivalences.

Maintenance

ActivityStale
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    AI Constraint Engine that enforces CLAUDE.md, .cursorrules, and AGENTS.md rules as laws. 51 MCP tools for semantic conflict detection, patch review, drift scoring, pre-commit hooks, and Guardian Mode. Catches euphemisms, temporal evasion, and hidden violations that keyword matching misses.
    263
    25
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for verifying AI agent claims vs reality — single-transcript inline grounding-check that flags when an agent's response states facts not in the input context, when its code silently swallows exceptions and substitutes mock data, or when its multi-turn transcript contains contradictions or unverified completion claims. Sub-second, local, free, no API calls.
    4
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that performs independent verification of artifacts against criteria using a different AI model lineage (codex, OpenAI, or Gemini) to catch defects that same-family checks might miss.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jaysinailabs/aperture-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server