rei-checker
rei-checker-mcp
Formaler Verifikations-Checker MCP v0.1.0a1 — Nimmt eine Zeile entgegen, gibt wahr/falsch zurück. Nicht mehr und nicht weniger.
Three-valued verdict (VALID / INVALID / UNDECIDED). No LLM in the judgment path. Every UNDECIDED carries a reason code and lands in an append-only refutation ledger.
License: AGPL-3.0-or-later Spec: CHECKER_SPEC_v0.md Design invariants: CLAUDE.md
In 5 Minuten zum Laufen
Python 3.9+ genügt. Keine externen Abhängigkeiten (nur stdlib).
git clone https://github.com/fc0web/rei-checker-mcp.git
cd rei-checker-mcp
python -m rei_checker verify "1 + 1 = 2"Erwartete Ausgabe:
{
"verdict": "VALID",
"elapsed_ms": 0,
"checker_version": "rei-checker-mcp/0.1.0a1+spike-2026-08-22"
}Bei unentscheidbarer Eingabe wird „nicht entscheidbar" zurückgegeben (Spec §1.2):
python -m rei_checker verify "some unknown thing"{
"verdict": "UNDECIDED",
"elapsed_ms": 0,
"checker_version": "rei-checker-mcp/0.1.0a1+spike-2026-08-22",
"reason_code": "OUT_OF_SCOPE",
"detail": "MockBackend has no rule for this expression"
}Exit-Code: 0 = entscheidend (VALID/INVALID), 2 = UNDECIDED. In Shell-Skripten kann direkt darauf verzweigt werden, ob eine Entscheidung möglich war.
Related MCP server: rei-verify
Ledger-Akkumulation und Stats
Jeder verify-Aufruf wird als eine Zeile an ledger.jsonl angehängt (Spec §4).
python -m rei_checker verify "1 + 1 = 2"
python -m rei_checker verify "1 + 1 = 3"
python -m rei_checker verify "<axiom-test>"
python -m rei_checker stats{
"total": 3,
"valid": 1,
"invalid": 1,
"undecided": 1,
"decision_rate": 0.6666666666666666,
"reason_breakdown": {
"MISSING_AXIOM": 1
}
}decision_rate ist die einzige Kennzahl (Spec §3). Ein Anfangswert von 0,1 ist in Ordnung — messbar zu werden ist die Erfolgsbedingung.
Der Speicherort des Ledgers kann über die Umgebungsvariable $REI_CHECKER_LEDGER überschrieben werden. Standard = ledger.jsonl im aktuellen Verzeichnis.
Als MCP-Server verwenden
In Claude Desktop registrieren:
{
"mcpServers": {
"rei-checker": {
"command": "python",
"args": ["-m", "rei_checker", "mcp"],
"cwd": "C:/path/to/rei-checker-mcp",
"env": {
"REI_CHECKER_LEDGER": "C:/path/to/ledger.jsonl"
}
}
}
}Es gibt nur zwei MCP-Tools (Spec §2, bewusst minimal):
verify(expression, context?, timeout_ms?)→{ verdict, reason_code?, detail?, elapsed_ms, checker_version }stats()→{ total, valid, invalid, undecided, decision_rate, reason_breakdown }
Was „nicht gebaut" ist (Spec §2, explizit)
Folgendes sind Nicht-Ziele von v0. Wenn du versuchst, es zu implementieren, halte inne und prüfe:
UI / Web-Frontend
Benutzerregistrierung, Authentifizierung, Abrechnung
Gamification, Fortschrittsverwaltung, Lernverlauf
Dialog- und Erklärungsgenerierung in natürlicher Sprache
Unterstützung mehrerer Backends (nur Lean 4; der v0-Spike läuft mit Mock-Backend)
Abhängigkeit von Claude-spezifischen Funktionen
Status von v0 (ehrlicher Umfang, Spike vom 2026-08-22)
✅ Schema (3 Werte + 6 Reason-Codes) vollständig implementiert
✅ Mock-Backend (Wahrheitstabelle für Tests + alle Reason-Code-Trigger)
✅ Ledger (append-only JSONL, UTF-8, Überspringen fehlerhafter Zeilen)
✅ stats()-Aggregat (decision_rate + reason_breakdown)
✅ MCP-stdio-Server (initialize + tools/list + tools/call)
✅ CLI (Unterbefehle verify / stats / mcp / version)
⚠ Lean-4-Backend ist ein Stub (Kandidat für v0.2, Implementierung in lean_backend/ geplant)
⚠ Timeout-Durchsetzung ist soft (Überwachung der verstrichenen Zeit; harter Prozess-Kill in v0.2)
„Zuerst genutzt werden" hat Priorität (Spec §1.3, §6.6). Nach Fertigstellung des Lean-4-Harness kann das Backend ausgetauscht werden und die echte Verifikation läuft. Die API-Oberfläche ändert sich nicht.
Phase 2 (nicht beginnen, bis v0 abgeschlossen ist)
Die in Spec §9–13 definierte dreischichtige Struktur:
Schicht 1: Checker (verify / stats) ← v0, das hier
Schicht 2: Education (locate_first_error / boundary_report / escalate)
Schicht 3: Harness (calibration / regression / transfer)
Implementierungsreihenfolge: Schicht 1 → Schicht 3② Calibration-Harness → Schicht 2. Details in Spec §9–13.
Tests
python -m unittest tests.test_all -vGemäß Spec §7 haben Tests für Fälle, die UNDECIDED zurückgeben sollen, Priorität (einzelne Tests für alle reason_codes + Happy Path für VALID/INVALID).
Beziehung zum Rei-Stack (Vermeidung von Verwechslungen)
Dieses Repo ist bewusst unabhängig. Abgrenzung zu benachbarten Tools:
rei-verify (PyPI 0.1.0a1) = Widerlegungsmaschine mit 4-Werte-Verdikt, refutation-first als Hauptachse. Dieses Repo ist 3-Werte verification-first — eine andere Designphilosophie.
grounded-check = Zitier-Grounding-Check für LLM-Ausgaben, andere Domäne.
rei-preregister = SHA256-Siegel für Vorhersagen, Vorregistrierungs-Tool.
discovery-worker = Gegenbeispiel-Jäger, andere Schicht.
Eine Integration gibt es derzeit nicht, da sie Spec §5 („Unterstützung mehrerer Backends ist kein Ziel") widersprechen würde.
Beiträge / Meldungen
Bitte befolge die 4 Prinzipien aus Spec §8:
Wenn du unsicher bist, ob du eine Funktion hinzufügen sollst: füge sie nicht hinzu
Wenn du unsicher bist, ob du „wahrscheinlich richtig" zurückgeben sollst: gib UNDECIDED zurück
Wenn du unsicher bist, ob du Theorie in die API aufnehmen sollst: nimm sie nicht auf
Nicht hetzen, langsam vorgehen
Available Tools
2 toolsstatsA
Return aggregate stats from the refutation ledger. Includes decision_rate = (VALID + INVALID) / total, the sole metric of project success (spec §3), plus reason_breakdown that drives what the next sprint implements (spec §4).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It clearly states this is a read-style 'Return' operation with no side effects implied meetabst, and it specifies what data is included (decision_rate and reason_breakdown). It doesn't explicitly state it's non-destructive or need auth, but the context implies a read-only stats query. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and two key outputs. Efficient.
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?
No output schema, so description explains the two things returnedches. It references spec sections, which is helpful. It's sufficient for the tool's simple scope, though it doesn't detail the exact breakdown structure. Minor 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?
No parameters exist threre, so this dimension is trivially satisfied. The description explains what the output contains (decision_rate, reason_breakdown) which helps the agent understand what the tool will produce, but doesn't add parameter meaning since there are none.
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?
Clear verb+resource: 'Return aggregate stats', specifies two concrete outputs (decision_rate and reason_breakdown) with explicit formulas, and references project specs. It distinguishes from the sole sibling 'verify' by being stats-focused, not per-item verification.
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?
Justifies use by linking decision_rate to 'sole metric of project success' and reason_breakdown to 'drives what the next sprint implements,' giving clear contexts for calling. It doesn't explicitly say when not to use or contrast with the sibling 'verify', but the purpose is specific enough that an agent can decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verifyA
Verify one expression. Returns a three-valued verdict (VALID / INVALID / UNDECIDED) with a reason_code when UNDECIDED. No LLM anywhere on the judgment path (spec §1.1). The expression is normalized and recorded in the append-only refutation ledger (spec §4).
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional context (axioms, imports, prior definitions). Backend-defined semantics. | |
| expression | Yes | The expression to judge. | |
| timeout_ms | No | Hard timeout in milliseconds. Overrun → UNDECIDED/TIMEOUT. Default: 5000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the three-valued return, conditional reason_code, the no-LLM guarantee, and the side effect of recording in an append-only refutation ledger. This is strong transparency, though it omits details like idempotency or error 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?
Three dense sentences with no filler. The verdict behavior is front-loaded, and the side-effect and no-LLM guarantees are stated efficiently. Every sentence earns its place.
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?
There is no output schema, but the description adequately explains return values and side effects. The input schema covers parameters. The only notable gap is the lack of explicit routing guidance relative to the sibling tool, but the core information needed to call and interpret the tool is present.
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 the schema already documents all three parameters. The description adds the fact that the expression is normalized, but it does not provide additional parameter-level guidance beyond what the schema already states.
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 action ('Verify one expression') and clearly defines the output (VALID / INVALID / UNDECIDED with reason_code). It is easily distinguishable from the sibling 'stats' tool, though it does not explicitly name or contrast that sibling.
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 implies this tool is for judging a single expression, but it gives no explicit guidance on when to choose it over 'stats' or any other alternative. There are no stated exclusions or conditions, leaving the usage context to inference.
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.
2 tool updates
v0.1.0- First observed
stats - First observed
verify
TDQS
Scored across 2 tools
stats and verify are completely distinct: one provides aggregate metrics, the other checks individual expressions. There is no overlap in purpose, so an agent can easily select the correct tool.
Both tool names are short, lowercase single words. While stats is a noun and verify is a verb, the naming style is consistent and clear, with no mixed conventions or confusing patterns.
With only 2 tools, the server feels slightly thin, but the domain appears narrow (validation and ledger statistics). The count is borderline below the typical 3-15 range but not extreme enough to be a major issue.
The tools cover the core functions: verifying expressions and retrieving statistics. Missing operations like listing ledger entries or resetting data are not obvious gaps given the stated purpose, though a 'list' or 'detail' tool could be useful.
Maintenance
Related MCP Connectors
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Free MCP tools: the only MCP linter, health checks, cost estimation, and trust evaluation.
Physics-based validation of simulation results: receipts with per-check verdicts, via MCP.
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that gives small LLMs verified symbolic-math & logic tools.623 PyPI2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA verification infrastructure and MCP server that specializes in refutation (negation) rather than generation, providing tools for counterexample search, Lean verification, and audit chains with a 4-value verdict system.MIT
- AlicenseNot gradedqualityAmaintenanceProvides deterministic decision and constraint evaluation for AI agents. Supports ruleset validation, fact evaluation, and constraint checking via MCP tools.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables mathematical proof exploration and verification over MCP, where each result includes a certificate that can be checked independently without trusting the solver.564 PyPI1MIT