Answers with receipts, or a plain "not covered."
Ask RFP-O-Matic anything about an RFP and its amendments. You get a short answer and the exact clause behind it, or a plain "not covered." Pure Python, nothing to install. It runs on your machine as an MCP server for Claude Code or Claude Desktop.
Full walkthrough, 2:52. In the video the engine goes by RFP-O-Matic.
How it works
- Parse with rules, not a model. Clauses are numbered; an amendment that revises 7.1 is recorded as superseding it.
- Find clauses by keyword search with stemming and a small glossary.
- Ask a model to pick clauses and write one sentence, then check it in code before anyone sees it.
Try it
The code is public: github.com/flashesofbrilliance/rfp-engine.
git clone https://github.com/flashesofbrilliance/rfp-engine.git cd rfp-engine python3 mcp/eval_via_mcp.py --provider mock --compare-direct claude mcp add rfp-intelligence -e MODEL_PROVIDER=mock -- python3 "$PWD/mcp/server.py"
Then ask: "Using rfp-intelligence, what is the bid deposit?" The RFP here is fictional. This demo runs on a mock model, so no API key is needed.
status answered answer the bid deposit is increased from $20,000 to $35,000 cites RFP 7.1 + Amendment No. 1 A1.2 notes 7.1 is superseded in part by A1.2; the amended value governs gate fast path: verbatim governing text, no model call
Six rules, enforced in code
Shows its source
Every answer points to the clause it came from.
Numbers match
Amounts, dates and percentages match the text exactly.
Latest wins
If an amendment changed it, you get the new value.
"Not covered" counts
If the RFP doesn't say, it tells you so.
Facts, not decisions
It won't write your bid or tell you whether to bid.
No guessing
Without a model, you get the clauses, not a summary.
Example: with MOCK_FAULT=invent the model claims "$80,000 or 12%". Neither figure is in the cited clause, so the summary is withheld:
gate verbatim FAILED: ['12%', '$80,000']
What was measured, 2026-10-29 and 10-30
The first three ran on the mock model, the same one "Try it" uses. The next two ran on a real model, once, on 24 questions.
The bench, 2:15: how the 24 questions were scored, and where the model stops and the code checks.
One of the 3 withheld answers that were right, and why the check held it back. 0:51.
Not proven yet
- No calibrated confidence score; results are categorical.
- Keyword retrieval, no embeddings.
- Figures are checked; meaning is not.
- Plain text in one numbering style; PDFs need an ingest step.
- Built for RFPs; contract clause types such as indemnity get no special handling.
How it was built
The engine and its videos were built with Claude Code agents. Every correction became a check that now runs on each change, so the next change is checked for that mistake too.
Making the videos, 2:23: each correction became a check that runs on every cut.
For agents
llms.txt indexes this tool for language models. AGENTS.md tells a coding agent how to run it, check it, and which rules must not change. The repo adds notes for each harness: Claude Code, Hermes (untested) and OpenAI Agents (untested). Paste this into Claude Code from the engine's folder:
Read AGENTS.md in this folder, run the mock check it names, then register mcp/server.py as an MCP server and ask it what the bid deposit is.
Source on GitHub · Zach Harris · ARCS public goods · site llms.txt · site AGENTS.md



