Req Engine
FreeNot checkedZero-LLM verb-based requirements store — Rust + SQLite state machine, MCP discuss/build seats, Windows WebView2 board. The engine never calls a model.
About
Zero-LLM verb-based requirements store — Rust + SQLite state machine, MCP discuss/build seats, Windows WebView2 board. The engine never calls a model.
README
English · 简体中文
A Zero-LLM verb-based requirements store. Rust + SQLite enforce the lifecycle. A Windows WebView2 board is the human seat. MCP disc_ / build_ pair codes bind coding agents to one project and one role. The engine never calls a model.
Who it is for. People who run local coding-agent hosts (Cursor, Claude Desktop, Codex, Grok, …) and want a board those agents cannot rewrite. Humans who decide done.
What it is not. Not an agent runtime, worker pool, or IDLE scheduler. Not a cloud SaaS. Not a model wrapper — Zero LLM inside the engine is the contract. Not a free-form Kanban you can PATCH into consistency. demo/*.html files are static mocks, not the runtime UI. MCP --role + token is a debug back door; do not ship it.
Start here
Windows is the official path. You need Rust and the WebView2 Runtime (already on most Win10/11).
- Double-click 启动需求引擎.bat (or 启动需求引擎.vbs once a binary exists). First run builds
target/release/req-engine.exeif needed, then starts a hidden-console desktop on--home req-engine/data --port 7420. - Or from a terminal:
cd req-engine
cargo run -- desktop --home ./data
That opens a native WebView2 window (not a browser tab), auto-inits an empty SQLite home, and injects the admin token. Close hides to the tray; quit only from the tray menu.
- Create a project on the board. Copy discuss or Copy build. Paste the pack into the agent host MCP config — the board is not an MCP client.
{
"mcpServers": {
"req-engine-discuss": {
"command": "C:\\path\\to\\req-engine.exe",
"args": ["mcp", "--pair", "disc_…", "--home", "C:\\path\\to\\req-engine\\data"]
}
}
}
Host and desktop must share --home. Templates: req-engine/examples/. Matrix: req-engine/docs/MCP.md.
Double-click launchers pin req-engine/data. Without --home / REQ_ENGINE_HOME, the CLI default is %USERPROFILE%\.req-engine (Unix: ~/.req-engine).
Optional: seed data, API-only, tests
cd req-engine
cargo test
cargo build --release
# Optional demo projects on the desktop
cargo run -- desktop --home ./data --seed-if-missing
# or: cargo run -- seed --home ./data
# API only (no native window)
cargo run -- init --home ./data --seed
cargo run -- serve --home ./data --host 127.0.0.1 --port 7420
Live HTTP smoke: req-engine/scripts/smoke.ps1. Browser-connect notes: WEB.md (optional).
Why this exists
Writing a requirement and implementing it are different jobs. Discussion agents should create and refine todos. Implementer agents should claim work and submit it. A human should decide done. Most “AI boards” collapse those jobs into a chatbot that can also PATCH status to whatever it likes.
req-engine is the opposite: a local state machine with seats. Intelligence stays in the agent host. The engine only stores facts, rejects illegal verbs, and shows who is seated.
Why verbs beat set_status
A free-form status API is an invitation to invent workflow. Two agents can mark the same card done without claiming it. A planner can skip review. A confused model can write "in-review" instead of "review". You then debug the prompt, not the product.
Here status is not a field you write. It is the result of a verb:
| Verb | From | To | Who (HTTP) |
|---|---|---|---|
| create | — | todo |
admin, planner |
claim |
todo |
in_progress |
foreman, admin — atomic, one winner |
report_progress |
in_progress / review |
unchanged | claimant or admin |
submit_for_review |
in_progress |
review |
claimant or admin |
complete_review pass / fail |
review |
done / todo |
admin only (desktop / HTTP) |
release |
in_progress |
todo |
claimant or admin |
cancel |
role-scoped | cancelled |
planner: todo · admin: any non-terminal |
There is no set_status / update_status on HTTP or MCP. done and cancelled are terminal. Soft-cancel only — no hard delete. Claim uses BEGIN IMMEDIATE plus WHERE status = 'todo' AND claimed_by IS NULL, so two MCP processes cannot both win.
The machine lives in req-engine/src/domain/state.rs. Services apply it; HTTP and MCP never bypass it.
Why Zero-LLM is a feature
If the store can think, you cannot audit it. A model inside the engine would invent transitions, hide failures in prose, and couple your board to an API key.
This process does not call OpenAI, Anthropic, or any other model. MCP is a server the host connects to. Tokens and pair codes are ACL, not “AI keys”. Seat faces are a display map from self-reported clientInfo.name (known host or identicon) — not authentication.
You can unit-test every illegal transition without a GPU, a network, or a prompt.
Architecture
Human ── WebView2 board ── HTTP /v1 (admin Bearer) ─┐
│
Discuss agent ── MCP stdio --pair disc_… ──────────┼──► req-engine
Build agent ── MCP stdio --pair build_… ──────────┘ │
▼
SQLite (requirements, events,
token hashes, pair hashes,
seat_presence heartbeats)
| Surface | Job |
|---|---|
| Domain | Pure transitions by role. No I/O. |
| Services | Verbs + events. Claim is transactional. |
| HTTP | Local board + admin review. Bearer → SHA-256 → admin / planner / foreman. |
| MCP | Product path: --pair binds one project + one seat. Debug --role + token exists; do not ship it. |
| Desktop | Starts the API, serves req-engine/web/index.html, opens a native window (not a browser tab). Close hides to the tray; 退出 quits. |
Seats, pair codes, occupancy
Each project has two seats:
| Seat | Pair prefix | MCP surface | May | Must not |
|---|---|---|---|---|
| Discuss | disc_ |
planner | list / get / create / update todo / cancel todo |
claim, submit, implement, complete_review |
| Build | build_ |
foreman | list_ready_tasks, claim, progress, submit, release |
create cards, complete_review |
Desktop Copy discuss / Copy build puts a pair code plus an onboarding prompt on the clipboard.
- SQLite stores SHA-256 of the code (
discuss_pair_hash/build_pair_hash). - Plaintext lives in
{home}/pair-codes.json(gitignored). Rotate invalidates the old code immediately. - A seated MCP process heartbeats every 4s. The UI treats a seat as occupied while
last_seenis within 15s. Clearing the process (or a different pid) drops the face.
list_ready_tasks returns todo cards whose dependency ids are all done.
HTTP (local)
Auth: Authorization: Bearer <token>. CORS allows common localhost static origins. Health is open; everything else is authed.
| Method | Path | Role |
|---|---|---|
GET |
/v1/health |
none |
GET / POST |
/v1/projects |
any / admin |
PATCH |
/v1/projects/:id |
admin |
POST |
/v1/projects/:id/archive · unarchive |
admin |
GET / POST |
/v1/projects/:id/pair-codes · …/:seat/rotate |
admin |
POST |
/v1/projects/:id/requirements |
admin, planner |
POST |
/v1/requirements/:id/claim · progress · submit-review · release |
foreman, admin |
POST |
/v1/requirements/:id/complete-review |
admin |
POST |
/v1/requirements/:id/cancel |
planner, admin |
Port 7420. Desktop injects the admin token into the WebView; you do not paste it for the normal path.
Data home
Inside {home}:
| File | What |
|---|---|
req-engine.sqlite |
Projects, requirements, event log, token hashes, pair hashes, seat_presence |
tokens.txt |
Bootstrap plaintext admin/planner/foreman (local only) |
pair-codes.json |
Per-project disc_ / build_ plaintext |
Treat those two plaintext files as secrets. Root .gitignore already excludes data/, data-*/, *.sqlite, tokens.txt, and pair-codes.json.
Layout
| Path | Role |
|---|---|
| req-engine/ | Crate: init / serve / mcp / desktop |
| req-engine/web/index.html | Runtime board (API-backed) |
| req-engine/src/domain/state.rs | Verb machine |
| req-engine/src/mcp/ | Planner / foreman stdio (rmcp) |
| req-engine/src/services/presence.rs | Occupancy TTL |
| demo/ | HTML mocks — not shipped as the UI |
| WEB.md | Browser-connect notes (optional) |
Crate-level developer notes: req-engine/README.md.
What this is not
- Not an agent runtime, worker pool, or IDLE scheduler
- Not a cloud multi-tenant SaaS
- Not a model wrapper — Zero LLM inside the engine is the contract
- Not a free-form Kanban you can
PATCHinto consistency
Installing Req Engine
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/Player-YN/req-engineFAQ
Is Req Engine MCP free?
Yes, Req Engine MCP is free — one-click install via Unyly at no cost.
Does Req Engine need an API key?
No, Req Engine runs without API keys or environment variables.
Is Req Engine hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Req Engine in Claude Desktop, Claude Code or Cursor?
Open Req Engine on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
wenb1n-dev/SmartDB_MCP
A universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
by wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashPostgres
Query your database in natural language
by AnthropicPostgreSQL
Read-only database access with schema inspection.
by modelcontextprotocolRedis
Interact with Redis key-value stores.
by modelcontextprotocolSQLite
Database interaction and business intelligence capabilities.
by modelcontextprotocolmxcp
Open-source framework for building enterprise-grade MCP servers using just YAML, SQL, and Python, with built-in auth, monitoring, ETL and policy enforcement.
by raw-labstadas-github/a2asearch-mcp
MCP server to search 4,800+ MCP servers, AI agents, CLI tools and agent skills. Install: npx -y a2asearch-mcp. Ask Claude: "Find MCP servers for database access
by tadas-githubjulien040/anyquery
Query more than 40 apps with one binary using SQL. It can also connect to your PostgreSQL, MySQL, or SQLite compatible database. Local-first and private by desi
by julien040drakonkat/wizzy-mcp-tmdb
A MCP server for The Movie Database API that enables AI assistants to search and retrieve movie, TV show, and person information.
by drakonkatCompare Req Engine with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs
