rei-checker
This server exposes a minimal formal-verification checker with two tools: verify and stats.
verify(expression, context?, timeout_ms?): Submit one expression and receive a three-valued verdict (VALID, INVALID, or UNDECIDED), elapsed time, and checker version.
UNDECIDED results include a reason_code (e.g., OUT_OF_SCOPE, MISSING_AXIOM, TIMEOUT) and a detail message, enabling automated triage of unprovable/unfalsifiable inputs.
Optional context: Pass axioms/imports/prior definitions to influence backend semantics.
Hard timeout: Set a per-call timeout (default 5000 ms); overruns become UNDECIDED/TIMEOUT and kill hanging backends.
stats(): Get ledger aggregates: total checks, counts by verdict, decision_rate, and reason_breakdown — useful for measuring progress and deciding next work.
Every verify call is recorded in an append-only ledger (ledger.jsonl), enabling auditing and historical analysis.
No LLM dependency: The judgment path is deterministic, so results are reproducible and trustworthy.
MCP stdio integration: Works as a Model Context Protocol server (e.g., with Claude Desktop), exposing exactly two tools for intentional minimalism.
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., "@rei-checkerverify the expression: (P and not P)"
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.
rei-checker-mcp
Formal verification checker MCP v0.1.0a1 — Takes one line, returns true/false. Nothing more, nothing less.
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
Run in 5 minutes
Python 3.9+ is all you need. No external dependencies (stdlib only).
git clone https://github.com/fc0web/rei-checker-mcp.git
cd rei-checker-mcp
python -m rei_checker verify "1 + 1 = 2"Expected output:
{
"verdict": "VALID",
"elapsed_ms": 0,
"checker_version": "rei-checker-mcp/0.1.0a1+spike-2026-08-22"
}Inputs that cannot be decided return "cannot decide" (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 = decisive (VALID/INVALID), 2 = UNDECIDED. You can branch directly in shell scripts on whether a decision was reached.
Related MCP server: Chiasmus
Ledger accumulation and stats
Every verify call appends one line to ledger.jsonl (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 is the only metric (spec §3). An initial value of 0.1 is fine — being in a measurable state is the success condition.
The ledger location can be overridden with the $REI_CHECKER_LEDGER env var. Default = ledger.jsonl in the current directory.
Using as an MCP server
Register with Claude Desktop:
{
"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"
}
}
}
}There are only 2 MCP tools (spec §2, intentionally minimal):
verify(expression, context?, timeout_ms?)→{ verdict, reason_code?, detail?, elapsed_ms, checker_version }stats()→{ total, valid, invalid, undecided, decision_rate, reason_breakdown }
What is "not built" (explicit in spec §2)
The following are non-goals for v0. If you're tempted to implement any of them, stop and confirm first:
UI / web frontend
User registration, authentication, billing
Gamification, progress tracking, learning history
Natural language dialogue / explanation generation
Multi-backend support (Lean 4 only; v0 spike runs on Mock backend)
Dependence on Claude-specific features
v0 status (honest scope, 2026-08-22 spike)
✅ Schema (3 values + 6 reason codes) fully implemented
✅ Mock backend (truth table for tests + all reason code triggers)
✅ Ledger (append-only JSONL, UTF-8, malformed row skip)
✅ stats() aggregate (decision_rate + reason_breakdown)
✅ MCP stdio server (initialize + tools/list + tools/call)
✅ CLI (verify / stats / mcp / version subcommands)
⚠ Lean 4 backend is a stub (v0.2 candidate, planned for lean_backend/ dir)
⚠ Timeout enforcement is soft (elapsed monitoring; hard process kill in v0.2)
"Being used first" is the priority (spec §1.3, §6.6). Once the Lean 4 harness is complete, swapping in the backend enables real verification. The API surface does not change.
Phase 2 (do not start until v0 is complete)
Three-layer structure defined in spec §9-13:
Layer 1 checker (verify / stats) ← v0, this
Layer 2 education (locate_first_error / boundary_report / escalate)
Layer 3 harness (calibration / regression / transfer)
Implementation order: Layer 1 → Layer 3② calibration harness → Layer 2. Details in spec §9-13.
Testing
python -m unittest tests.test_all -vPer spec §7, prioritize tests for cases that should return UNDECIDED (individual tests for all reason_codes + VALID/INVALID happy paths).
Relationship to the Rei stack (avoiding confusion)
This repo is intentionally independent. Distinctions from adjacent tools:
rei-verify (PyPI 0.1.0a1) = refutation machine, 4-value verdict, refutation-first focus. This repo is 3-value verification-first — different design philosophy.
grounded-check = citation grounding check for LLM output, different domain.
rei-preregister = predictive SHA256 seal, pre-registration tool.
discovery-worker = counterexample hunter, different layer.
No integration at this time, as it would violate spec §5 "multi-backend support is a non-goal".
Contributing / Reporting
Please follow the 4 principles of spec §8:
If you're unsure whether to add a feature, don't add it
If you're unsure whether to return "probably correct", return UNDECIDED
If you're unsure whether to expose theory in the API, don't
Don't rush; go slowly
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.
Conformance checker for MCP servers. Free, no key, verdicts recomputable and re-measured daily.
Physics-based validation of simulation results: receipts with per-check verdicts, via MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that gives small LLMs verified symbolic-math & logic tools.61Apache 2.0
- AlicenseNot gradedqualityAmaintenanceMCP server that gives LLMs access to formal verification via Z3 and SWI-Prolog, plus tree-sitter-based source code analysis. Translates natural language problems into formal logic using a template-based pipeline, verifies results with mathematical certainty, and analyzes call graphs for reachability, dead code, and impact analysis.79210Apache 2.0
- FlicenseNot gradedqualityCmaintenanceMCP server that exposes the DALI2-Agent-Brain symbolic verification system as tools, allowing MCP clients to submit reasoning problems for formal Prolog-based verification.-
- 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