vibecheck
vibecheck is an MCP server that acts as an external completion gate for AI coding agents, judging finished work against git, static analysis, and an AI decision model before the agent may say "done".
submit_for_review — submits a task for review: collects the real git change set, runs deterministic analysis, scores 8 quality dimensions, and returns a verdict (
approved,needs_fixes,max_retries_exceeded,review_unavailable,needs_clarification) plus a specific, evidence-cited fix list, retry count, and next action.configure_project — writes/updates
.vibecheck.jsonto set presets (lenient/balanced/strict), per-dimension thresholds/weights/toggles, retry limits, convention sampling, scope, judge provider/model, hard gates, budgets, dry-run previews, and attempt resets.get_review_log — reads recent review history for a project: verdicts, dimension scores, fired gates, judge used, and per-task retry attempts, without consuming a retry.
Hard-gate enforcement — fails on failing tests, committed secrets, or claimed changes git cannot confirm; it never invents findings and only reports what was actually measured.
Request clarification / retry budget handling — refuses to judge unverifiable requests (
needs_clarification) and tells the agent to stop and report when retries are exhausted.Works with git or without — uses git-derived change sets by default, falls back to submitted
changed_filesoutside a repo, and supports optional test results, notes, and per-file diffs/content.Pluggable judging — uses TypeSafe AI's Jev when a key is available, otherwise a clearly-labeled offline heuristic mock for plumbing/demos.
Tunable via CLI inspection scripts —
scripts/inspect.tslets you review real repos or demo fixtures and watch verdicts change after fixes.
Click 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., "@vibecheckreview my changes and tell me what's blocking approval"
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.
vibecheck
An external "done" gate for AI coding agents — judged by TypeSafe AI's Jev.
Your agent thinks it's finished. vibecheck disagrees, lists exactly what to fix, and only then lets it say the word "done".
The problem it solves
AI coding agents decide for themselves when a task is complete. That judgment is exactly what fails in practice: partial implementations get reported as done, scope balloons, conventions get ignored, error handling is skipped, and tests are trivial. The agent is never wrong on purpose — it just has no external criterion to check against.
vibecheck is that criterion. It's an MCP server any MCP-compatible agent (Claude Code, Cursor, Codex, …) calls at the "I think I'm done" moment. Instead of trusting the agent's self-assessment, it:
Gathers the real change set from git — not from what the agent claims it changed
Measures it deterministically — casing vs. the repo's own conventions, hardcoded values, unhandled failures, leftover TODOs, assertion-free tests
Asks Jev — a fast, non-generative decision model that returns calibrated probability scores over 8 quality dimensions, all in one cheap call (~70–500 ms)
Returns a verdict —
approved, or a specific, file-and-line fix list the agent must work through and resubmit against
Bring your own key: vibecheck calls the Jev API with your key, and carries no inference cost of its own.
Related MCP server: phionyx-pipeline-mcp
What a verdict looks like
follows_conventions scoring 0.30 in a snake_case repo doesn't come back as a number. It comes back as this:
Naming does not match the repository Rename the identifiers below to snake_case. The repository's own declarations are the reference: snake_case naming (75% of 8 declarations), 4-space indent, double quotes.
app/reports.py:8—getUserDatais camelCase but the repo uses snake_case; rename toget_user_data
app/reports.py:14—formatReportis camelCase but the repo uses snake_case; rename toformat_report
And error_handling_present at 0.33 becomes:
A fallible call has no failure handling Wrap each call below in explicit failure handling:
app/reports.py:9ingetUserData()— fallible call with no try/except:response = requests.get(f"{REPORT_API}/{userId}")
app/reports.py:26inexportReport()— fallible call with no try/except:with open(destination, "w", encoding="utf-8") as handle:
Every instruction cites evidence that was actually measured. Nothing is invented.
Quick start
1. Get the server
git clone https://github.com/<owner>/vibecheck-mcp.git
cd vibecheck-mcp
npm install && npm run build2. Get a Jev key
Join the early-access waitlist at typesafe.ai, open the console at console.typesafe.ai, and create a key under API Keys. Then either:
put it in a
.envfile in this directory (copy.env.example), orpass it via your client's
envblock (next step).
Without a key, vibecheck falls back to a built-in offline heuristic judge — fine for plumbing and demos, but it is not a real review and every verdict it issues says so.
3. Register it with your agent
Claude Code — one command:
claude mcp add vibecheck --scope user -- node /absolute/path/to/vibecheck-mcp/dist/index.jsOr .mcp.json in any project (works in Claude Code and Cursor):
{
"mcpServers": {
"vibecheck": {
"command": "node",
"args": ["/absolute/path/to/vibecheck-mcp/dist/index.js"],
"env": { "TYPESAFE_API_KEY": "your-key-here" }
}
}
}4. Make the agent actually call it
Registering the tool doesn't make the agent use it — paste the standing rule from examples/agent-instructions.md into your CLAUDE.md, a Cursor rule, or AGENTS.md. Keep it in version control so the gate doesn't silently vanish for the next contributor.
That's it. From now on, every "I'm done" goes through the gate first.
How the loop works
agent finishes a task
│
▼
submit_for_review ──► collect real change set (git-authoritative)
│ │
│ deterministic analysis (measured facts)
│ │
│ Jev: 8 scoring + 8 diagnostic questions, one call
│ │
▼ ▼
verdict ◄───────── thresholds + hard gates
│ │
│ └─ needs_fixes ──► specific fix list ──► agent fixes, resubmits
│ (retry budget: default 10, counted server-side)
└─ approved ──► agent may now tell the user it's doneA request the gate cannot check is sent back for acceptance criteria rather than scored. When the retry budget is exhausted, the agent is told to stop and report the outstanding issues to the user — never to loop forever, and never to describe the task as finished.
The tools
submit_for_review
Input | Required | Meaning |
| ✔ | The user's original request, verbatim. Judged against it — a favourable paraphrase weakens the review. |
| Absolute path to the repo. Locates config, conventions, and git. | |
| Required outside git repos. In a repo, git supplies the change set — but listing the files still helps: a file git can't place inside the reviewed range widens that range to include it. Report the whole change, not one file from it. | |
| Raw output or | |
| Context the diff can't show — e.g. why an apparent shortcut is deliberate. |
Returns verdict, per-dimension scores, an ordered feedback list (title, instruction, evidence, files, severity), attempts_remaining, and a next_action instruction the agent can act on directly.
Five verdicts: approved · needs_fixes · max_retries_exceeded · review_unavailable (the judge couldn't be reached) · needs_clarification (the request states nothing checkable — see below). The last two are not verdicts on the change and consume no retry.
configure_project
Writes/updates .vibecheck.json: presets, per-dimension thresholds and toggles, retry limit, convention sampling mode, review scope, judge settings. Supports dry_run and reset_attempts.
get_review_log
Recent submissions and verdicts for a project — attempt numbers, scores, which gates fired, which judge answered, and which dimensions fail most often. Reading never consumes a retry.
Configuration
.vibecheck.json at the project root. Everything is optional; absent values come from the preset (lenient · balanced · strict).
{
"preset": "balanced",
"maxRetries": 10,
"conventions": { "mode": "auto", "sampleSize": 8 },
"questions": {
"follows_conventions": { "enabled": true, "threshold": 0.7, "weight": 2 },
"test_coverage_adequate": { "enabled": false }
},
"judge": { "provider": "auto", "model": "jev-latest", "diagnostics": true },
"hardGates": { "failingTests": true, "committedSecret": true, "submissionMismatch": true },
"scope": { "mode": "auto", "maxCommits": 20, "maxAgeHours": 12 },
"intent": { "onUnverifiableRequest": "clarify" }
}Ready-made examples in examples/: a strict production config, a lenient prototype config, and a style-guide config.
Review scope
How much of the repository a review covers, on the occasions when git can't infer it from a branch.
Setting | Default | Meaning |
|
|
|
| 20 | Hard cap on how many commits one review may span |
| 12 | How far back a commit may be and still count as task work. A file you explicitly report changing is reached regardless of age, within |
Raise maxAgeHours for long sessions, or maxCommits if a task legitimately spans many commits. If a verdict warns that a file you reported was "reported as changed, but its last change is commit abc1234 ... outside the reviewed range", one of those two is set too low for that session.
Requests that cannot be judged
The gate is only as good as the request it judges against. make it better and better defines no done, so satisfies_request has no determinate answer — and both available failure verdicts would be untrue: approved would certify work nobody defined, and needs_fixes would send the agent after defects that were never identified.
So the request is assessed before it is judged. A request that states no checkable requirement comes back as needs_clarification, with the reason and what to add:
### The request itself
This request states nothing checkable, so no verdict was given. The change was not judged and no retry was used.
- rests on judgement words rather than a requirement: better, best
- names no file, symbol, command, endpoint or behaviour to check againstNothing else changes: the change set, the scope, and every other dimension are as usual. It costs no retry, because the agent has nothing to fix — the request does. And the loop closes: pass the acceptance criteria in notes and the same submission is judged normally.
Setting | Default | Meaning |
|
|
|
The check is deliberately conservative — a false "too vague" asks a user to restate a request they already stated clearly, which is worse than missing a vague one. Anything concrete counts: a file, a symbol, a backticked name, a command-line flag, an endpoint, a measured quantity, a named behaviour ("the tests", "the build"), or a stated outcome ("so a user can…", "without changing…").
Default thresholds
Dimension | Kind | Weight | lenient | balanced | strict |
| yes/no probability | 3 | 0.50 | 0.70 | 0.85 |
| yes/no probability | 2 | 0.45 | 0.60 | 0.75 |
| yes/no probability | 2 | 0.50 | 0.65 | 0.80 |
| yes/no probability | 2 | 0.45 | 0.60 | 0.75 |
| yes/no probability | 2 | 0.55 | 0.70 | 0.85 |
| 4-level scale | 1.5 | 0.50 | 0.62 | 0.75 |
| 4-level scale | 2.5 | 0.50 | 0.62 | 0.75 |
| 4-level scale | 1.5 | 0.45 | 0.60 | 0.75 |
Weight orders the fix list; it never gates on its own, so raising a weight can't let a genuine failure through.
Hard gates — facts, not opinions
Checked directly, failed immediately, sorted above every scored dimension:
Failing tests — the supplied test output reports failures
A credential in the added lines — the raw value is redacted before it reaches the verdict or the log
A file claimed as changed that git has no record of — the review ran against reality, so the claim is wrong either way. A file git can see but places outside the reviewed range is reported as a warning instead, because that is a scope problem, not a false claim
Where the change set comes from
The server asks git rather than trusting the agent's summary, and then states exactly which commits it looked at:
A branch with a base — everything since the merge-base with the default branch, plus untracked files
No base to compare against (an agent working straight on
main, or a one-branch repo) — the trailing run of commits that plausibly belongs to the task: those inside the scope window, plus the commit that last touched any file the agent reported changingUncommitted work — always included, whatever else is in scope
Outside a git repository — the submitted
changed_files, marked agent-reported
The chosen range is printed in every verdict (Reviewed scope: recent-commits, 3 commit(s) — the last 3 commit(s) (a1b2c3..d4e5f6)), recorded in the log, and handed to the judge, so a review can never quietly cover a fraction of the task.
Two rules keep it honest:
A root commit is never treated as the change set. It has no "before" to diff against, so including it would present the whole repository as the task — and the convention baseline would be sampled from the change itself. A repository with a single commit therefore has no committed scope.
A report can widen the scope, never narrow it. "You changed nothing" is the one answer the server must never invent.
Why Jev (and why the deterministic analyzer)
Three properties make Jev the right judge for a gate that runs on every "I think I'm done" moment:
Speed and cost — ~70–500 ms end-to-end, $0.042 per million input tokens, output effectively free. A gate has to be cheap enough that the agent never learns to skip it.
Typed output — Jev never generates text. Answers are constrained to the declared questions and options, so a verdict cannot be a hallucinated string.
One call — all 16 questions (8 scoring + 8 diagnostics) run in parallel against the same state. The diagnostics ("which convention diverges?", "what kind of shortcut is this?") are what turn a score into a specific instruction.
The one thing Jev can't do is explain itself — it cannot generate prose. That's why the deterministic analyzer exists: it measures the facts (naming, formatting, hardcoded values, unhandled failures, debt markers, test quality), and the feedback layer combines those measurements with Jev's typed diagnostics into instructions with file, line, and evidence. Never state anything that was not measured.
What is measured
Supported for TypeScript/JavaScript and Python:
Naming and style — declared names classified by casing, compared against the repo's own baseline (sampled from neighbouring files, cached in
.vibecheck/)Formatting — quotes, indent unit, semicolons, line length, nesting depth
Risk markers —
TODO/FIXME/HACK,@ts-ignore,eslint-disable, strayconsole.log/print,debugger, skipped/focused tests, looseanyHardcoded values — endpoint URLs, credentials, ports, absolute paths, magic numbers (named constants and test-assertion literals are exempt — naming a value is the fix, and expected values in tests aren't configuration)
Failure handling — fallible calls with no
try/catch, discarded promises, and whether the enclosing function rethrows (propagating a failure is legitimate design and isn't counted against the change)Structure — functions over 60 lines or 15 branch points
All of it is heuristic and written to under-claim: an ambiguous signal is dropped rather than asserted. Where a diff exists, findings are restricted to added lines — the agent is judged only on what it touched.
Tuning for your repo
# Review a real repo against a real request, verdict rendered as the agent sees it
TYPESAFE_API_KEY=... npx tsx scripts/inspect.ts --root /path/to/repo --task "..." --provider typesafe
# Demo: a deliberately messy fixture, then the fixes applied — watch the verdict flip
npx tsx scripts/inspect.ts --demo python --fix
npx tsx scripts/inspect.ts --demo ts --fixRun it over a week of real agent sessions and watch two failure modes: noise (fails changes you'd happily merge) and misses (problems you catch in review that the tool passed). Raise thresholds for the first, lower for the second — get_review_log gives you the per-dimension counts to do it from data. Then pin the model version ({"judge": {"model": "jev-1.13.0"}}) so verdicts stay reproducible.
Logs
Append-only JSONL at .vibecheck/reviews.jsonl (gitignored): one record per submission with scores, gates, provider, model, latency, and token usage. Plain grep/jq, or get_review_log.
Limits, honestly
The offline judge is not a review — it scores from static analysis only, cannot read intent, and says so on every verdict
The analyzer is heuristic, not a compiler — no type resolution or data flow; designed to under-report rather than accuse wrongly
Two stacks — TypeScript/JavaScript and Python. Other languages are judged from the diff alone, with no deterministic signals behind the feedback
Default thresholds are a starting point — calibrated against this repo's fixtures, not a corpus of real sessions (see Tuning)
The gate is advisory — it can't force an agent that ignores the verdict; it makes ignoring it explicit in the transcript, and logs it
Large change sets are truncated — the budget is enforced and the verdict lists what was omitted
Development
npm run typecheck # tsc, no emit
npm run build # emit to dist/
npm test # node:test over test/ — analyzer, patterns, feedback, config, MCP contract, full loop
npm run dev # run the server on stdioNon-goals
No GUI/dashboard — the JSONL log and get_review_log are the interface. No mid-task interception — vibecheck judges only at the "I think I'm done" checkpoint. No shallow support for every language — two stacks done properly beats ten done generically.
License
Available Tools
3 toolsconfigure_projectConfigure vibe-check for a projectB
Write or update .vibecheck.json in the project root.
Use preset to select a baseline posture - lenient for prototypes and spikes, balanced (default) for everyday application code, strict for production services and libraries - then override individual dimensions as needed.
Thresholds are normalised 0-1 where 1 is always good.
For the graded dimensions (readability, error_handling_present, test_coverage_adequate) the raw scale has four levels, so 0.33 means 'level 1 of 3' and 0.67 means 'level 2 of 3'.
Judge credentials are never stored here: the API key is read from the server's environment.
| Name | Required | Description | Default |
|---|---|---|---|
| judge | No | ||
| budget | No | ||
| preset | No | ||
| dry_run | No | Show what would be written without writing it. | |
| questions | No | Per-dimension overrides. | |
| hard_gates | No | ||
| conventions | No | ||
| max_retries | No | Maximum submissions per task before escalating to the user. Default 3. | |
| project_root | No | Project root. Defaults to the server's working directory. | |
| reset_attempts | No | Clear the retry budget for this project's tasks, or for a single task if task_description and changed_files are also given. | |
| task_description | No | With reset_attempts, narrows the reset to this one request instead of every request in the project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses the core side effect (writes/updates .vibecheck.json) and adds a useful behavioral note that judge credentials are never stored. Still, it does not say whether the file is fully overwritten or merged, whether existing settings are preserved, or what the tool returns after writing.
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 compact and front-loaded: it begins with the key action and file, then explains preset choices, threshold normalization, the graded scale, and credential handling. Each sentence adds value and there is no filler or repetition of schema details.
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?
Given the tool's complexity (11 parameters, nested objects, no annotations, no output schema), the description covers the core concepts well but leaves several important options undocumented at the description level. There is also no mention of the return value or post-write effects, which creates a noticeable gap for an agent deciding how to use the result.
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 55%, so the description must compensate for the uncovered parameters. It does add real meaning for preset (lenient/balanced/strict), normalized thresholds, and the graded-dimension raw scale. But many nested parameters such as hard_gates, conventions, budget, and reset_attempts are not addressed in the description and rely on schema descriptions or inference.
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 first sentence is specific: it names the exact file (.vibecheck.json), the action (write or update), and the location (project root). It does not explicitly contrast with sibling tools, but the resource and action make the configuration-vs-review distinction clear.
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 explicit 'use this when...' or 'use for X, not Y' guidance. However, the description gives clear context and even maps presets to project types (prototypes, everyday code, production services), implying when each configuration choice is appropriate. No alternatives or exclusions are stated relative to submit_for_review or get_review_log.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_review_logRead the review log for a projectA
Return recent reviews and verdicts for a project, so you can see why an agent looped or what was still failing at the end. Each entry records the attempt number, the verdict, every dimension score, which gates fired, and which judge produced the verdict. Reading the log never consumes a retry.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent entries to return. Default 10. | |
| verdict | No | Only return entries with this verdict. | |
| project_root | No | Project root. Defaults to the server's working directory. | |
| task_description | No | Filters the log to a single request. Retry budgets are keyed on the request wording alone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does so well by disclosing that reading the log never consumes a retry. It also explains what each entry contains, helping the agent understand the tool's output. It does not mention auth or rate limits, but those are less critical for a read-only log.
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?
Three focused sentences: purpose, content, and a key behavioral guarantee. It is front-loaded with the use case and contains no filler.
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 description is complete for a read-only tool with optional filters: it explains the purpose, the entry fields, and the retry-budget side effect. There is no output schema, but the description enumerates the important return fields, so an agent can infer the shape.
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 each parameter already meaningfully described, so the bar is lowered. The description adds general context about entries but does not add significant per-parameter semantics beyond what the schema provides.
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 clearly states the tool returns recent reviews and verdicts for a project, with a specific diagnostic purpose. This distinguishes it from siblings configure_project and submit_for_review, which are write-oriented configuration actions.
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 description gives explicit context for when to use the tool: to understand why an agent looped or what was still failing at the end. It does not explicitly contrast with alternatives or state when not to use it, but the diagnostic use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_for_reviewSubmit work for completion reviewA
Call this when you believe a task is complete, before telling the user you are finished.
An external judge (TypeSafe AI's Jev decision model) scores the change against eight dimensions and returns a verdict.
If the verdict is needs_fixes, address every item in feedback in order and call this tool again.
If it is max_retries_exceeded, stop: report to the user that the change did not pass review, and list the outstanding issues.
The review is performed against git's view of the repository when project_root is a git repository, so the change set does not depend on this argument being complete.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Anything the judge should know that is not visible in the diff, such as why an apparent shortcut is deliberate. | |
| project_root | No | Absolute path to the project. Defaults to the server's working directory. Used to find .vibecheck.json, sample conventions, and read git. | |
| test_results | No | Output from the test run, or an object such as {passed, failures, output}. Failing tests are a hard gate, so include this when you ran tests. | |
| changed_files | No | The files you changed. Required when project_root is not a git repository; otherwise used to cross-check git's view. | |
| attempt_number | No | Which attempt this is. Advisory only: the server counts attempts itself from its own log. | |
| task_description | Yes | The user's original request, as close to verbatim as possible. This is what 'satisfies the request' is judged against, so do not summarise it into a favourable paraphrase. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that an external model scores the change on eight dimensions, that the review uses git's view of the repository, that the server independently counts attempts, and that max_retries_exceeded means the agent should stop and report outstanding issues. This is thorough and non-obvious behavior.
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 compact and front-loaded: it opens with the trigger condition, then organizes the verdict outcomes and the git-scoping caveat. Every sentence earns its place, and there is no filler or redundancy.
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 tool with no output schema and no annotations, the description covers call timing, judge behavior, retry policy, terminal failure handling, and git interaction, while the schema thoroughly documents all parameters. The only minor gap is that the successful verdict state is implied rather than explicitly named, but the overall guidance is sufficient for an agent to use the tool correctly.
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 the baseline is 3. The description adds useful cross-parameter meaning beyond the schema, such as the fact that the change set is determined from git and therefore changed_files need not be complete when project_root is a git repository. It also reinforces that task_description is judged verbatim, which clarifies how the parameter will be 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 clearly states what the tool does: 'Call this when you believe a task is complete, before telling the user you are finished,' and it explains that an external judge returns a verdict. It does not explicitly contrast the tool with the sibling tools (configure_project, get_review_log), so it is clear but lacks sibling differentiation.
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 description gives explicit call timing ('when you believe a task is complete, before telling the user you are finished') and detailed branch handling for needs_fixes and max_retries_exceeded. It does not name alternative tools or exclusion conditions, but the core when-to-call and retry/stop logic is well specified.
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.
3 tool updates
v0.1.0- First observed
configure_project - First observed
get_review_log - First observed
submit_for_review
TDQS
Scored across 3 tools
Each tool has a distinct purpose: configure_project handles setup, submit_for_review performs the review, and get_review_log retrieves historical results. There is no overlap or ambiguity between them.
All three tool names follow a consistent verb_noun pattern: configure_project, submit_for_review, get_review_log. This creates a predictable and clear naming convention.
Three tools is slightly on the lower end but appropriate for the server's narrow scope of code review configuration and execution. Each tool covers a necessary step without redundancy.
The tool surface covers the core lifecycle: configuration, submission, and log retrieval. Minor gaps exist, such as no explicit way to read the current configuration or delete it, but these do not hinder the primary workflow.
Maintenance
Related MCP Connectors
Agentic code review, no signup to try: reality gates + frontier-model review, with veto.
Preflight QA for AI-agent deliverables with structured verdicts and repair guidance.
Versioned artifact review for people and AI agents, with contextual comments and human control.
Pre-execution governance for AI agents. Deterministic PASS/FAIL/REVIEW verdicts, replayable proof.
Related MCP Servers
FlicenseAqualityDmaintenanceEnables AI agents to review code diffs for bugs, security issues, and bad patterns, and generate fixes.4-- AlicenseAqualityAmaintenanceEnables verification of AI coding agent self-reports against git diff truth and a deterministic gate, producing pass/regenerate/reject directives to ensure claimed work matches actual changes.6AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceCoordinates multiple AI systems and human reviewers using Git as an inspectable record, providing tools for task management, evidence tracking, and independent review.1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to scout, rank, and preflight software work before implementation, returning evidence-backed ACT, VERIFY, or SKIP decisions for issues and pull requests.59 npm2MIT