gavel-mcp
gavel-mcp
Das gavel-Akzeptanz-Orakel als MCP-Server: ein Werkzeug, das das „done“ eines Agenten in eine Quittung verwandelt. gavel_acceptance führt einen Befehl kalt aus und meldet den Exit-Code. Nur Exit-Code 0 zählt als bestanden.
Einrichtung
1. Erstellen
Erfordert Node ≥ 20 und git.
cd gavel-mcp
npm install
npm run build # → dist/index.jsdist/ ist gitignoriert – jeder frische Klon benötigt diesen Schritt, bevor der Server starten kann.
2. In ZCode einbinden
Zwei Ebenen; beide verbinden sich automatisch beim Sitzungsstart.
Workspace-Ebene – versioniert mit dem Repo, mit dem Team geteilt. Erstelle <repo>/.zcode/config.json:
{
"mcp": {
"servers": {
"gavel": {
"command": "node",
"args": ["/ABS/PATH/TO/gavel-mcp/dist/index.js"]
}
}
}
}Benutzer-Ebene – gilt für jeden Workspace. Lege dasselbe mcp.servers-Objekt in ~/.zcode/cli/config.json ab und kombiniere es mit der Akzeptanzregel (Abschnitt 5) in ~/.zcode/AGENTS.md, damit jede Sitzung weiß, wann sie das Werkzeug aufrufen soll – nicht nur wie.
Eine Installation auf Benutzer-Ebene bindet jeden Workspace an den Build dieser Maschine:
Nach Änderungen an
src/führenpm run buildaus – andere Sitzungen laden weiterhin das altedist/, bis du das tust.Das Verschieben oder Löschen des Repo-Verzeichnisses bricht jede Sitzung auf einmal.
Funktioniert heute über ein Git-Remote – keine Registry nötig. Das prepare-Skript baut dist/ bei der Installation, sodass npx den Rest erledigt:
{
"command": "npx",
"args": ["-y", "github:newlix/gavel-mcp#v0.5.0"]
}Pinne einen Tag (#v0.5.0), um den npx-Cache stabil zu machen; ohne einen solchen folgst du dem Standard-Branch, und die Cache-Aktualisierung liegt im Ermessen von npx. Der erste Start auf einer Maschine kostet einen einmaligen Clone + Install + Build. Sobald es auf npm veröffentlicht ist, ist ["-y", "gavel-mcp"] gleichwertig und überspringt die Git-Anforderung. Jeder andere MCP-Host funktioniert ebenfalls; nur die Form der Konfiguration unterscheidet sich.
3. Sitzung neu starten
MCP-Server verbinden sich beim Sitzungsstart. Eine bereits laufende Sitzung nimmt den Server nicht mehr auf.
4. Überprüfen
ZCode: Einstellungen → MCP zeigt
gavelverbunden.Oder bitte den Agenten einfach,
gavel_acceptancemitcmd: "test -d ."aufzurufen – erwarteverdict=pass exit=0.
5. Die Regel (AGENTS.md)
Das Werkzeug ist die Struktur; die Regel sagt dem Agenten, wann er es verwenden soll. Lege dies in <repo>/AGENTS.md ab:
## Acceptance
- Done = `gavel_acceptance` returned exit 0. One self-contained
command, cold from the repo root; report the verdict and the
command itself — never a paraphrase of test results.
- The command asserts intent (what should happen), not the
implementation.
- `refused` means it never ran. Report it verbatim.Bei Installationen auf Benutzer-Ebene kommt derselbe Block stattdessen in ~/.zcode/AGENTS.md – Benutzeranweisungen werden zuerst geladen, sodass ein repo-eigenes AGENTS.md die Regel weiterhin pro Projekt einschränken kann.
Related MCP server: Spec Kit Acceptance Gate MCP
Der Vertrag
Das Orakel vertraut nie einem paraphrasierten Ergebnis – es führt den Befehl selbst aus, sodass eine rote Akzeptanz nicht als grün erzählt werden kann. Zwei strukturelle Ebenen, zuerst die kostengünstigste:
Lint (
src/lint.ts): Ein Befehl, der nicht fehlschlagen kann (true,exit 0, bloßes echo/printf,x && trueohne echte Prüfung), wird vor der Ausführung abgelehnt –passed: false,refused: <reason>, keine Quittung wird ausgestellt. Die Syntax- und Destruktivmuster-Prüfungen des Go-Linters wurden bewusst entfernt: Syntax schlägt bei der Ausführung identisch fehl, und gefährliche Befehle zu überwachen ist Aufgabe der Host-Berechtigungsebene, nicht der Urteilsebene.Kaltlauf (
src/runner.ts): Der Befehl läuft über die Plattform-Shell aus dem Projektstamm; Exit-Code 0 ist der einzige Erfolg. Signaltode werden als 128+Signal gemeldet, Spawn-Fehler als -1, Befehl-nicht-gefunden als 127.
Quittungs-Semantik: refused = nie ausgeführt. Melde es unverändert.
Werkzeuge
gavel_acceptance(cmd, cwd?, timeout_sec?)
→ { passed, exit_code, duration_ms, refused, output }
output: zusammengeführte stdout+stderr, roh; Anfang und Ende mit einem Marker, wenn länger als ~20 KB.Ein Timeout beendet den gesamten Prozessbaum und lässt den Lauf fehlschlagen.
Fehlerbehebung
Server nicht verbunden (Einstellungen → MCP zeigt einen Fehler): Der dist-Pfad ist falsch oder
npm run buildwurde übersprungen. Der Pfad muss absolut sein und aufdist/index.jszeigen.exit_code: 127: Der Akzeptanzbefehl selbst wurde nicht gefunden.
Entwicklung
npm install
npm test # node:test via tsx (24 tests)
npm run build # tsc → dist/Aufbau: src/index.ts ist der schlanke Stdio-Bootstrap; die MCP-Oberfläche (buildServer) lebt in src/server.ts, sodass Tests sie prozessintern über InMemoryTransport steuern können; dazu kommt ein Kaltlauf-Stdio-Smoke-Test via tsx. Der manuelle Smoke-Test unten ist derselbe Austausch, den der Stdio-Test ausführt.
Manueller Smoke-Test (MCP-stdio ist zeilengetrenntes JSON):
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"gavel_acceptance","arguments":{"cmd":"test -d ."}}}' \
| node dist/index.jsAvailable Tools
1 toolgavel_acceptanceA
Run an acceptance command cold and report the mechanical verdict. The command must be one self-contained shell command; it runs from the project root via the platform shell. Exit code 0 is the only passing verdict — never paraphrase or pre-empt it. Signal deaths report 128+signal; a spawn failure reports -1; 127 means the command was not found. Output is raw merged stdout+stderr (head+tail when truncated).
| Name | Required | Description | Default |
|---|---|---|---|
| cmd | Yes | Self-contained acceptance command, e.g. `go test ./...` or `make check`. Must assert intent, not recapitulate the implementation. | |
| cwd | No | Absolute working directory. Default: the server's cwd (hosts spawn it at the workspace root). | |
| timeout_sec | No | Kill the run after this many seconds (default 600). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly. It discloses exit-code semantics (0 = pass, 128+signal = signal death, -1 = spawn failure, 127 = not found), raw merged stdout+stderr, truncation behavior, and the 'cold'/mechanical nature of the run. This goes well beyond a generic 'run a command' statement.
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 dense but well-organized and front-loaded: the core action appears first, followed by the necessary command constraint, verdict semantics, and output details. Every sentence earns its place; there is no filler or repetition.
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?
Despite having no output schema and no annotations, the description fully covers what an agent needs to invoke the tool correctly: command format, working directory, exit-code interpretation, and output shape. It is complete for the tool's complexity and parameter set.
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 every parameter (cmd, cwd, timeout_sec) is already documented in the schema with type, constraints, and defaults. The tool description mainly reinforces that the command must be self-contained, which adds marginal value but does not improve on the schema's parameter-level explanations.
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 states a specific verb and resource: 'Run an acceptance command cold and report the mechanical verdict.' It makes clear this is a command-execution tool focused on acceptance verification, and the absence of sibling tools means there is no risk of confusion with alternatives.
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 concrete usage constraints: the command must be a single self-contained shell command, runs from the project root, and the agent must not paraphrase or pre-empt the exit-code verdict. With no sibling tools listed, there is no alternative-routing guidance needed, but the when-and-how guidance is otherwise strong.
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.
1 tool update
v0.5.0- First observed
gavel_acceptance
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of an agent confusing it with another. Its purpose is clearly distinct by default.
With a single tool there are no conflicting conventions to penalize. The name gavel_acceptance is clear and follows snake_case, though it is noun-oriented rather than a verb_noun pattern.
One tool is minimal, but the server appears purpose-built for a single acceptance action, so the count is slightly under the typical range yet reasonable for the stated scope.
The tool fully covers the server's apparent purpose: running an acceptance command and returning a mechanical verdict with well-specified exit-code and output handling. No obvious operations are missing for this narrow domain.
Maintenance
Related MCP Connectors
Proof of delivery for agent work: verify countersigned receipts and deliverable hashes. Free.
Agent completion verification with defects, corrections, and evidence receipts.
Hand off AI work with a signed Verification Receipt — an independent verifier proves it runs.
Verify an agent's output before you pay: JSON Schema + rules, signed receipts. Free during launch.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables acceptance gates for AI coding-agent runs by recording evidence, running deterministic validation, applying a quality gate, and rendering auditable outcomes.744 PyPIApache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables spec-driven development acceptance gate with structured receipts, audit logs, and reviewer-ready evidence.-
- FlicenseNot gradedqualityDmaintenanceEnables coding agents to submit a public preview URL and acceptance stories for independent QA, returning pass/fail evidence packs with screenshots and supporting human notes on failures.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to verify claims against evidence through MCP tools, returning approved, rejected, or needs_review verdicts with replayable receipts.MIT