PrufGate MCP
OfficialClick 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., "@PrufGate MCPaudit my last commit for fabricated fallbacks and hollow tests"
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.
Linters check that code compiles. PrufGate looks for code that compiles, passes review at a glance and still does not do the job. This is the kind of code an AI coding agent (or a hurried human) writes to make a task look finished:
a
catchblock that returns a hard-coded success object;a click handler that does nothing;
a test that asserts
true, or mocks the very function it tests;a
.skip,@ts-ignoreor lowered coverage threshold slipped into a diff;an import of a package that is not declared anywhere;
an API route that loads a record by ID without checking who owns it.
PrufGate is deterministic: plain Python, no network calls and no LLM unless you ask for one. It runs in seconds on a pull request, and writes SARIF for code scanning and Markdown for humans. It is meant to sit next to your linters and SAST tools, not replace them.
The six engines
# | Engine | What it catches |
1 | Anti-fabrication ( | Canned success on error paths, simulated return values, |
2 | Test integrity ( | Tests with no assertions, assertions that cannot fail, tests that mock the unit under test, swallowed exceptions, assertions deleted or weakened in a diff, test files deleted or test cases removed in a diff, production code special-casing a test's literal input. |
3 | Diff guard ( | Skips and focus ( |
4 | Contract guard ( | Imports not declared in |
5 | BOLA / IDOR ( | Route handlers that look up a record by a client-supplied ID with no auth guard or no tenant/owner scoping, across Express, Next.js, NestJS, FastAPI, Flask, Django, Go (net/http, Gin, Echo, Chi), Spring, Rails and Laravel. Optional live two-token probing of a running service you own. |
6 | Diff reviewer ( | High-precision rules on changed lines (SQL built from strings, shell injection, disabled TLS verification, hard-coded credentials, unsanitised HTML, ignored Go errors, credential logging), GitHub suggestion blocks, and optional delegation to an AI CLI or API you choose. |
Details, rule IDs, supported languages and known limits for each engine: docs/ENGINES.md.
PrufGate uses pattern and structure heuristics, not a full parser for every language. It will miss things and it will sometimes flag correct code. Every finding names its rule, and inline prufgate-ignore: rule -- reason comments, exemptions and baselines let you record why.
Related MCP server: system-brain-mcp
Quick start
PrufGate needs Python 3.9 or newer and Git.
pipx install prufgate # or: pip install prufgate (the `prufgate` and `prufgate-mcp` commands)
prufgate --self-check # every engine against its built-in fixtures
uvx prufgate --version # or run it without installing, with uvOr download one file, prufgate.pyz, from the latest release (releases after 1.0.0). It is a zipapp with PyYAML (pure Python) inside, so it needs nothing but Python 3.9 or newer:
curl -LO https://github.com/GuardianVigil-Labs/Prufgate/releases/latest/download/prufgate.pyz
curl -LO https://github.com/GuardianVigil-Labs/Prufgate/releases/latest/download/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
gh attestation verify prufgate.pyz --repo GuardianVigil-Labs/Prufgate
python3 prufgate.pyz --self-check
python3 prufgate.pyz check .The hooks that prufgate init --hooks writes call prufgate on PATH, so for them install the file as a command: install -m 755 prufgate.pyz ~/.local/bin/prufgate. The zipapp runs every command a pip install has except mcp (use pipx install prufgate for the MCP server). Like a pip install, it does not include the shell batteries (./prufgate.sh fast / full with ast-grep, gitleaks and zizmor); prufgate.pyz fast and full run the Python engines only. For the full battery use the container image or a checkout. There are no native per-OS binaries: they would need a build on three operating systems for every release, and the zipapp covers the same need. python3 scripts/build_pyz.py builds the same file from a checkout; it downloads the hash-locked PyYAML sdist from PyPI and refuses one that does not match requirements.txt.
Or run the signed container image, which adds the full gate with ast-grep, gitleaks and zizmor:
docker run --rm -v "$PWD:/workspace" ghcr.io/guardianvigil-labs/prufgate:1.2.0 # the fast gate on this repository
docker run --rm -v "$PWD:/workspace" ghcr.io/guardianvigil-labs/prufgate:1.2.0 prufgate check .Or add the GitHub Action to a pull-request workflow, pinned to the commit SHA of the v1.2.0 tag (full example):
- uses: actions/checkout@<commit-sha>
with: { fetch-depth: 0, persist-credentials: false }
- run: python3 -m pip install "PyYAML>=6.0"
- uses: GuardianVigil-Labs/Prufgate@<commit-sha-of-v1.2.0>Every release is signed and carries build provenance and an SBOM: Verify a release.
Or add it to your pre-commit configuration, .pre-commit-config.yaml (details):
repos:
- repo: https://github.com/GuardianVigil-Labs/Prufgate
rev: v1.2.0
hooks:
- id: prufgate # changed files, on every commit
- id: prufgate-full # whole repository, before a push (pre-commit install --hook-type pre-push)Then, in your project:
prufgate check . # engines 1-5 on the whole repository
prufgate check --changed --base origin/main # only what this branch changed
prufgate init --hooks # starter config + coding-agent hooksExit codes are the same everywhere: 0 clean, 1 blocking findings (P0/P1), 2 PrufGate could not run (bad config, bad base ref, unreadable file, engine crash). A crash never reads as a pass.
Ways to run it
Want | Use |
A quick check while coding |
|
Findings inline in VS Code | The VS Code extension (source): runs |
One engine |
|
The full gate with SARIF and Markdown reports |
|
A pull-request gate on GitHub | The composite action in this repository: docs/CI_INTEGRATION.md |
A coding agent sent back to fix its findings before it stops |
|
A coding agent stopped from skipping hooks, force-pushing or deleting tests and CI config |
|
Base-branch tests run against the head code (executes repository tests: sandbox or CI only, opt-in) |
|
Mutation smoke test on the changed lines with an installed mutmut, Stryker, PIT, gremlins, go-mutesting or cargo-mutants (executes repository tests: opt-in) |
|
PrufGate as a Claude Code plugin (hooks plus a |
|
Other agents and AI reviewers (Cursor Bugbot, Copilot review) told to use PrufGate's findings |
|
An AI second opinion on PrufGate's own low-confidence findings only (opt-in, sends a few lines of code to a provider you choose) |
|
Tools for an agent over MCP |
|
A service that scans on webhook |
|
The full command and option reference is in docs/GETTING_STARTED.md, and every configuration key is in docs/CONFIGURATION.md.
Configuration in one look
PrufGate works without configuration. To tune it, add .prufgate/config.yaml:
version: 1
packs: [core, web-ui, ai-safety] # cti is an opt-in domain pack
exclude: ["dist/**", "vendor/**"]
auth_guards: [requireUser, get_current_user]
tenant_keys: [organization_id, account_id]
exempt:
src/legacy/adapter.ts:
route-canned-fallback: "#104: legacy fallback until the payments API migration"
known_debt:
stub-click-handler: 0 # a ceiling that can only go downIn a pull request (any run with a base ref) PrufGate reads this file as it is on the base branch, so configuration changes take effect after merge: a change cannot exempt its own findings.
AI adjudication
PrufGate is deterministic by default and sends nothing anywhere. Two opt-in modes use an AI provider you choose (a claude CLI, OPENAI_API_KEY, ANTHROPIC_API_KEY or OLLAMA_HOST; --ai-provider names another):
prufgate review --aiasks the model to review the whole diff.ai_adjudicate: truein the configuration (read at the base ref in a pull request, byprufgate checkand theprufgate.shgate;--ai-adjudicatealone does nothing without it) asks one yes/no question per low-confidence finding (mediumtoo if configured): is this real? The prompt holds the rule, the finding message and a few redacted lines around it, never whole files.
An adjudication verdict can only hide noise. A finding judged not real stops blocking and moves to an "AI-dismissed" list with the model's reason: a section of prufgate check output and of the Markdown report, and a SARIF suppressions entry of kind external (AI-dismissed: <reason>). High-confidence findings are never sent; nothing is ever added or raised. A provider error, a timeout, a reply that is not exactly {"real": true|false, "reason": "..."}, a run over its budget, or code that addresses the judge (a comment naming the AI, LLM, judge, reviewer or PrufGate) keeps the finding as it would be without AI. Verdicts are cached outside the repository. Settings: docs/CONFIGURATION.md.
Documentation
Getting started: install, commands, reports, exit codes
Configuration reference: every key, suppressions, environment variables
The engines: rules, languages and limits
CI and agent integration: GitHub Action, other CI, agent hooks, MCP, REST API
Custom rules: your own ast-grep rules and hooks
Benchmark: measured precision and recall on a labelled corpus, and how to add a case
Contributing and security
Contributions are welcome: see CONTRIBUTING.md and the maintainer guide AGENTS.md. Please report vulnerabilities privately, as described in SECURITY.md.
PrufGate is published by GuardianVigil under the Apache License 2.0. The name and logo are trademarks: see TRADEMARKS.md.
Available Tools
9 toolsprufgate_anti_fabricationCRead-onlyIdempotent
Engine 1: canned fallbacks, simulated return values, stub handlers and other fabricated production logic.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| changed_only | No | Scan only changed files | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds useful detection categories, but it does not explain what the output looks like, where findings are reported, or how the scan is scoped beyond the parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted clauses, and the detection categories are front-loaded. However, the cryptic 'Engine 1:' prefix does not help an agent select the tool, and the fragment lacks a clear action verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a scan tool with eight siblings and no output schema, the definition is too thin. It omits the action performed, expected results, how findings are surfaced, and when this tool should be chosen over the other prufgate engines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and all three parameters are documented in the schema with clear descriptions. The tool description adds no parameter-specific meaning, which is acceptable at full schema coverage but earns only the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the domain as fabricated production logic and lists concrete detection targets (canned fallbacks, simulated return values, stub handlers), which lets an agent infer an anti-fabrication scan. However, it never states the action with a verb such as detect, scan, or report, and it does not distinguish itself from the many sibling prufgate scan tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus prufgate_fast_scan, prufgate_full_scan, prufgate_test_audit, or the other siblings. No prerequisites, exclusions, or workflow context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_bola_checkBRead-onlyIdempotent
Engine 5: routes and queries without auth or tenant scoping; the live two-token probe runs only when target_url is set.
| Name | Required | Description | Default |
|---|---|---|---|
| target_url | No | Live http(s) URL for the two-token BOLA probe. The probe runs only when this is set. | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, open-world, idempotent behavior. The description adds that an active two-token probe against a live URL is gated on target_url — meaningful context about outbound network activity — but says nothing about what gets reported, credentials required for the two tokens, or rate limits. With annotations carrying the safety profile, this partial addition earns a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight clauses with no filler, and the conditional probe behavior is stated directly. The leading 'Engine 5:' label is the only noise, contributing nothing an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only scanner with no output schema, the description should convey what findings look like or what the check surface covers. It covers the gating condition but leaves the agent unsure whether this is a static repo scan, a live probe, or both, and what result to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already fully documented, and the description only restates the target_url gating condition verbatim from the schema. No added syntax, format, or example information beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resource being checked (routes and queries lacking auth or tenant scoping), which is specific, but there is no verb describing the action — is it a scan, a report, a probe? 'Engine 5' is opaque internal jargon that does not identify the operation, so an agent must infer it is the BOLA-specific check from the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'the live two-token probe runs only when target_url is set' gives one useful conditional, implying the workspace scan is the default and the live probe is opt-in. However, nothing says when to choose this over prufgate_fast_scan, prufgate_full_scan, or prufgate_contract_check, all of which likely overlap in security-scan territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_contract_checkCRead-onlyIdempotent
Engine 4: undeclared or hallucinated imports, undocumented environment variables and frontend/backend route mismatches.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| changed_only | No | Scan only changed files | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and a closed-world scan, so the safety profile is covered elsewhere. The description's added value is naming the three detection categories, which is genuine behavioral content; it says nothing about output shape, failure on a bad ref, or whether findings are advisory or blocking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler, and the detection categories are front-loaded. The only waste is the 'Engine 4' ordinal, which consumes prime position with information an agent cannot use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Three optional parameters and no output schema mean the description could stay short, but for a multi-engine analysis suite the agent still needs to know what a run produces and how this check differs in depth from full_scan. Those gaps keep it at minimum-viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with base_ref, changed_only and workspace_path each documented in the schema. The description adds no parameter meaning beyond that, which is acceptable at full coverage but earns only the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete things being detected (undeclared/hallucinated imports, undocumented env vars, frontend/backend route mismatches), which is a real resource scope rather than a tautology. However there is no verb at all and the leading label 'Engine 4' is opaque without product context, so an agent must infer that this is a static-analysis check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to run this versus prufgate_full_scan, prufgate_anti_fabrication, or prufgate_diff_guard, even though several siblings plausibly overlap on import/route analysis. Nothing tells the agent what prerequisite state (a git repo, a configured baseline) is expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_diff_guardCRead-onlyIdempotent
Engine 3: skipped tests, suppression comments, unsafe casts and weakened lint/CI config added in the diff.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description's added value is the diff-scoping behavior (it analyzes changes against a base ref rather than the whole repo) and the specific defect classes flagged, but it says nothing about output shape, severity levels, or whether it blocks/fails. That is useful but thin additional context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with no filler in the detection list, which is good. However it is a noun-phrase fragment rather than a front-loaded statement of purpose, and the leading 'Engine 3:' token consumes prime space with information an agent cannot act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two well-documented parameters and no output schema, the definition should carry more weight: what a finding looks like, whether results are per-file or aggregated, and how it relates to the eight sibling checks. The description provides a detection list but no return-value or routing context, leaving an agent unable to predict the response or choose it over prufgate_test_audit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with base_ref and workspace_path both documented in the schema, so the baseline is 3. The description reinforces that this is a differential scan against a base ref but adds no format details, defaults, or edge-case behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete set of things it looks for (skipped tests, suppression comments, unsafe casts, weakened lint/CI config) scoped to the diff, which is more specific than the name alone. But it never states a verb or that this is a scan/detection tool, and the 'Engine 3:' prefix is opaque internal jargon. An agent can guess it flags diff-introduced quality regressions but not with confidence against siblings like prufgate_test_audit or prufgate_full_scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus prufgate_test_audit (overlapping skipped-test detection) or prufgate_fast_scan/prufgate_full_scan (whole-repo vs diff scope). The 'added in the diff' phrasing implies diff-scoped usage, but no prerequisites, exclusions, or alternative routing are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_fast_scanARead-onlyIdempotent
Run engines 1-5 (anti-fabrication, test integrity, diff guard, contract guard, static BOLA) on changed files.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful context by listing the five engines and changed-file scope, but it does not explain report format, failure behavior, or what the scan returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the engines and scope with no wasted text. It is compact and directly useful for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The read-only scan has full schema coverage and annotations that cover safety, but there is no output schema and the description does not explain the return value or failure semantics. That leaves an important gap for an agent deciding what to expect from the scan.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description only reinforces the changed-file scope and adds no additional meaning for base_ref or workspace_path beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ('Run') and names the exact engines included, plus scopes the scan to changed files. It is clear what the tool does, though it does not explicitly contrast itself with prufgate_full_scan or the individual engine tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'fast_scan' name and 'changed files' scope imply a quick targeted scan, but there is no explicit guidance on when to use this versus prufgate_full_scan or individual engine tools. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_full_scanARead-onlyIdempotent
Run engines 1-5 on the whole workspace plus the diff reviewer; adds the live BOLA probe only when target_url is set.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| target_url | No | Live http(s) URL for the two-token BOLA probe. The probe runs only when this is set. | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the conditional probe behavior, but omits the traits that most distinguish a 'full scan' — expected runtime, cost, and why it is heavier than the fast variant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the primary scope comes first and the conditional clause follows. Nothing is repeated or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description says nothing about what a scan returns or how results are surfaced, and it never explains the 'engines 1-5' concept. For a heavy composite scan tool, that leaves real gaps for an agent deciding whether to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are documented in the schema with examples and defaults. The description only echoes the target_url condition already stated in the schema, adding no new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (run engines 1-5 plus the diff reviewer over the whole workspace) and a conditional extra (BOLA probe when target_url is set), which contrasts implicitly with prufgate_fast_scan and prufgate_bola_check. However 'engines 1-5' is unexplained jargon, so an agent cannot tell exactly which checks are bundled.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'whole workspace' scope and the target_url conditional give some usage context, but there is no explicit guidance on when to pick this over prufgate_fast_scan, prufgate_bola_check, or prufgate_review. The choice is left to inference from the word 'full'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_reviewCRead-onlyIdempotent
Engine 6: deterministic review of the diff against base_ref (default: resolved like prufgate check --changed).
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavior: the review is deterministic and base_ref is resolved the way 'prufgate check --changed' resolves it. It never says what the review produces (findings list, severities, exit status), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no padding, and the core object (diff against base_ref) is front-loaded. The only wasted token is the meaningless 'Engine 6:' prefix, which also front-loads jargon instead of intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a review/analysis tool with no output schema, the description leaves the agent unable to predict the result: no mention of what a 'review' returns, whether it blocks, what categories of issues it checks, or how it relates to the sibling check tools. Two optional params keep the surface small, but the missing return semantics is a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema; baseline is 3. The description adds only a little beyond that: the defaulting/derivation behavior for base_ref. workspace_path is not discussed at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a verb ('deterministic review') and a resource ('the diff against base_ref'), so the rough shape is clear. But 'Engine 6' is opaque internal jargon and 'review' is never defined (lint? findings? pass/fail?), and the description does not differentiate it from the sibling prufgate_diff_guard, which sounds like it covers the same ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the parenthetical 'default: resolved like prufgate check --changed', which implies a CI-style changed-files workflow but is stated as a default-resolution detail rather than a when-to-use rule. There is no statement of when to pick this over prufgate_diff_guard, prufgate_fast_scan, or prufgate_full_scan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_summaryARead-onlyIdempotent
Read the last SARIF/Markdown report written by ./prufgate.sh without running a scan.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds a crucial nuance the annotations don't: it reads a previously-written artifact from ./prufgate.sh, so results can be stale and no scan cost is incurred. It does not state what happens when no report exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no waste; the no-scan constraint is front-loaded where an agent will see it immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-param read tool with rich annotations this is close to sufficient, but with no output schema the description should indicate what is returned (raw SARIF vs. Markdown text) and the failure mode when no prior report exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the single optional workspace_path fully documented, so the description adds nothing about parameters. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Precise verb+resource: 'read the last SARIF/Markdown report'. It implicitly contrasts with the scan siblings by stating 'without running a scan', though it never names them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without running a scan' implies the retrieval use case versus the prufgate_*_scan siblings, but there is no explicit 'use this when you already have a report; use prufgate_full_scan to produce a fresh one' routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prufgate_test_auditCRead-onlyIdempotent
Engine 2: zero-assertion tests, tautologies, self-mocked units and weakened assertions.
| Name | Required | Description | Default |
|---|---|---|---|
| base_ref | No | Base git ref to diff against, e.g. origin/main | |
| changed_only | No | Scan only changed files | |
| workspace_path | No | Path to the repository to scan | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the detection categories, which hints at what findings come back, but says nothing about result volume, whether it executes tests, or how findings are reported.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short fragment, so there is no waste, but it is not front-loaded with the most important information: 'Engine 2' leads while the actual subject (scanning test integrity in a repository) is never stated. Brevity here reflects under-specification rather than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a parametrized scanner with no output schema, so the description should explain what a run returns (findings list? score? file locations?). It also leaves ambiguous the default behavior when no base_ref is supplied. Given a 3-parameter tool in a family of nine, this is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all three parameters fully described (base_ref, changed_only, workspace_path), so the schema carries the load. The description adds no semantics about how these parameters interact with the engine, e.g. that base_ref only matters when changed_only is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific defect classes the engine detects (zero-assertion tests, tautologies, self-mocked units, weakened assertions), which does separate it from sibling engines like prufgate_bola_check or prufgate_contract_check. However, it never states the action: there is no verb indicating it scans/audits a repository's test suite, and 'Engine 2' is opaque without outside context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to run this engine versus the eight sibling prufgate tools, no prerequisites, and no mention of whether it should follow prufgate_fast_scan or feed into prufgate_review. The agent must infer the workflow entirely.
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.
9 tool updates
v0.1.0- First observed
prufgate_anti_fabrication - First observed
prufgate_bola_check - First observed
prufgate_contract_check - First observed
prufgate_diff_guard - First observed
prufgate_fast_scan - First observed
prufgate_full_scan - First observed
prufgate_review - First observed
prufgate_summary - First observed
prufgate_test_audit
TDQS
Scored across 9 tools
Each engine (1-6) has a dedicated tool with a specific purpose, and fast_scan vs. full_scan differ clearly by scope (changed files vs. whole workspace). Minor ambiguity remains between running an individual engine tool and the aggregate fast_scan/full_scan, and between prufgate_review and the diff-related engines, but descriptions clarify the boundaries.
All tools share a consistent prufgate_ prefix and snake_case suffixes, which is predictable and readable. However, the suffixes are feature/engine nouns (anti_fabrication, test_audit, summary) rather than a uniform verb_noun pattern, so it falls slightly short of a strict convention.
Nine tools is well-scoped for a scanner with six engines plus summary and aggregate scan modes, and each tool earns its place with a distinct granularity (single engine, fast, full, summary).
The surface covers the full scan lifecycle: individual engines, changed-file and full-workspace scans, diff review, and reading the last report. Gaps include no tools for configuring thresholds/rules, managing baselines, or retrieving individual findings structurally, but core workflows are covered.
Maintenance
Related MCP Connectors
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Run verified read-only code tools: quant diagnostics + agent-ops preflight, no source exposure.
Security tools for coding agents: dependency advisory audits and evidence for remediation.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to scan code for security and quality issues and receive machine-readable reports with suggested fixes and verification criteria.53 npm2MIT
- AlicenseAqualityDmaintenanceRead-only MCP tools for coding agents to audit deployment targets, detect fabricated code, review backlog, database schema, analytics, ML models, architecture docs, and decision lenses.115 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to safely inspect a local repository's code and metadata while blocking private data from leaving the machine, providing read-only tools for search, change tracking, and integrity verification.MIT
- AlicenseNot gradedqualityCmaintenanceExposes repository reconnaissance tools — file listing and verbatim reading, regex search, dependency-tree parsing across Python/Node/Rust/Go, and test-coverage ingestion — so agents can gather line-numbered evidence from real source files. This lets an audit pipeline physically re-verify every claim and drop findings that cannot be located in the code.MIT