Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Structured execution for coding agents: contracts, postconditions, gates, guardrails.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"stratum": {
"command": "npx",
"args": [
"-y",
"@smartmemory/stratum"
]
}
}
}Run this in your terminal
claude mcp add stratum -- npx -y @smartmemory/stratumPaste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"stratum": {
"command": "npx",
"args": [
"-y",
"@smartmemory/stratum"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"stratum": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@smartmemory/stratum"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 6, 2026
The registry name was verified against the domain smartmemory.ai (the registry checks domain ownership)
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.7.3) reached the registry 38 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, zanadir
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Find what a repository's CI is missing, and which security checks cannot fail the build.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
State machine dispatch server for AI agent workflows.
*Your agent proposes the step. Stratum decides whether it actually finished.*
Stratum gives AI coding agents (Claude Code, Codex, etc.) a formal execution model. Instead of improvising a plan and retrying blindly, the agent writes a typed spec, the server tracks state, enforces postconditions, and returns structured failure context on retry. Every step produces an auditable trace record.
Where it sits. Stratum is the execution kernel, one layer below the thing most people run day to day. Compose drives the product lifecycle (design, blueprint, plan, review gates) and calls Stratum to execute each step. Reach for Stratum directly when you want the state machine and the postconditions without a lifecycle on top of them.
The founding intent behind this machinery is recorded in docs/VISION.md: a spec language that keeps LLMs on rails invisibly, so the same conversation yields stronger results than freeform execution.
One shipped component:
@smartmemory/stratum): IR validation (version: 1 specs), flow execution with ensure postconditions, MCP server for Claude Code, query/gate/guard CLI, background flows and background agent runs. Published to npm as @smartmemory/stratum (bins: stratum, stratum-mcp) and listed in the MCP registry as ai.smartmemory/stratum-mcp.Engine status (2026-07-18, STRAT-PY-RETIRE): the TS engine is the ONLY engine.
The Python library (
stratum-py) and Python MCP server (stratum-mcp) are retired.
Their source is archived on the
python-legacybranch, and PyPI packages are
frozen at their final releases. The engine executes `version: 1` specs exclusively.
Legacy v0.x specs are rejected by
validateand classified (report-only) by
stratum migrate --check. The authoritative v1 shape is the Zod IR schema in
ts/src/ir/plusstratum validateoutput.
Governed workflows as auditable flows — on any agent, not just one vendor. Unlike a single-vendor in-context orchestrator, Stratum runs as an MCP server and a library under Claude Code, Codex, or any MCP host; enforces typed contracts and ensure postconditions on every flow execution; stops at real human gates; dispatches Claude *and* Codex agents in one flow (so an independent reviewer can be a different model from the implementer); and persists flow state across sessions. Where you want raw in-context fan-out, reach for an in-host workflow runtime; where you want the run governed, portable, and auditable, that's a Stratum workflow.
Install from npm (Node >= 22):
npm install -g @smartmemory/stratum # provides `stratum` (CLI) and `stratum-mcp` (MCP server)
Or run from a checkout for development:
git clone https://github.com/smartmemory/stratum
cd stratum/ts && npm install # or pnpm install
Requires node >= 22 (erasable-syntax type stripping; node >= 24 needs no flags — the CLI bootstrap gates --experimental-transform-types automatically).
Register the server in your project's .mcp.json. From the npm package:
{
"mcpServers": { "stratum": { "command": "npx", "args": ["-y", "-p", "@smartmemory/stratum", "stratum-mcp"] } } }
From a checkout:
{
"mcpServers": { "stratum": { "command": "node", "args": ["/absolute/path/to/stratum/ts/src/mcp/bin.mjs"] } } }
Restart Claude Code to activate. Optionally append the Stratum execution model block to your CLAUDE.md.
stratum help # validate | migrate | query | gate | guard | watch (npm install)
node ts/src/cli/bin.mjs help # same, from a checkout
From a checkout, a thin wrapper script (e.g. ~/bin/stratum-ts) pointing at ts/src/cli/bin.mjs avoids a PATH collision with the installed stratum bin.
When Claude Code has Stratum installed, it uses it automatically for non-trivial tasks:
.stratum.yaml spec internally (never shown to you)stratum_plan to validate the spec and get the first stepstratum_step_done after each step -- the server checks postconditionsstratum_audit at the end for a full execution traceYou see plain English narration throughout. The spec, state management, and postcondition enforcement happen behind the scenes.
A specification is the authored, version-controlled .stratum.yaml document. It declares contracts and one or more flows. The flows.entry field selects the flow that starts a run.
A flow is an executable directed acyclic graph of steps. Running the entry flow creates a persisted run with a runId. The v0.x top-level workflow: registration block and stratum_list_workflows were retired with the Python server.
A flow declares typed input fields, a typed output, optional limits, and steps. References and after lists form data and ordering edges. Gate routing and on_fail add explicit routing edges.
A step has an id, optional after dependencies, an optional when condition, and exactly one construct: do, set, gate, fanout, or run.
A do step is an agent-dispatched task. The task text is declared inline, and ${...} references inject flow input or prior step output values. The v0.x functions: registry and function: steps have no place in a v1 document.
Contracts define named output shapes. A do or set step declares its output contract with out. A flow declares both the step-output reference that supplies its result and the contract used to validate that result.
Ensures are structured postconditions on do, set, and fanout stage results. V1 supports expression, file existence, file content, and judged predicates.
A do or fanout step can set the positive integer attempts limit. The default is two attempts. Contract failures, ensure failures, task failures, and exhausted iterations use the same failure path. A deterministic set failure terminates the flow without retrying.
Gate steps pause execution for an external approve, revise, or kill decision. Approve and kill routes may name a later step or use null. A revise route may name a strict ancestor and requires a flow-level max_rounds limit.
The Zod IR schema in ts/src/ir/ and the errors produced by stratum validate are authoritative. The root is strict and has exactly three fields: version, contracts, and flows. Unknown fields are rejected.
version: 1
contracts: SentimentResult: label: string confidence: number flows: entry: classify classify: input: text: string output: from: "${classify_text.output}" contract: SentimentResult steps:
version: 1
contracts: WorkOutput: result: string quality_score: number flows: entry: reviewed_work reviewed_work: input: text: string output: from: "${work.output}" contract: WorkOutput max_rounds: 3 steps:
version (required)The only accepted value is the number 1. Quoted strings such as "1" and all v0.x values are rejected.
contracts (required)Each contract maps field names to type strings. Objects are strict at runtime, so undeclared output fields are rejected.
| Type form | Meaning | |
|---|---|---|
string, integer, number, boolean | Scalar value | |
object, array | Untyped JSON object or array | |
string[], Result[] | Typed array | |
| `draft | final` | String enum |
| `(draft | final)[]` | Array of string enum values |
Result | Another named contract | |
string?, Result[]? | Optional field |
Named contract references use an initial capital letter. Recursive contract references and unknown contract names are rejected.
flows (required)flows.entry must name a flow in the same mapping. Every flow has these fields:
| Field | Required | Shape |
|---|---|---|
input | yes | Field-to-type mapping using the contract type language |
output | yes | {from: "${step_id.output}", contract: ContractName} |
steps | yes | Array of strict step objects |
budget | no | Positive limits for one or more of usd, tokens, dispatches, or ms |
max_rounds | no | Positive integer required when a gate can revise to an ancestor |
carry | no | Named loop-carried flow values; entry flow only |
The output.from value must be one full reference to a step output with a known contract. A fanout output is an array, so a flow output must select an item such as ${fan.output[0]}.
Step IDs start with a lowercase letter and may contain lowercase letters, digits, underscores, and hyphens. IDs are unique within a flow. Every step accepts id, optional after, and optional when, then exactly one construct with only the fields listed below.
| Construct | Purpose | Additional fields |
|---|---|---|
do | Dispatch an inline task | agent, out, ensure, attempts, iterate, budget, on_fail |
set | Build an output object from expressions | required out, optional ensure |
gate | Pause for a decision | no fields outside the nested gate object |
fanout | Run stages over an array | attempts, budget, on_fail |
run | Invoke a subflow | required with, optional budget, on_fail |
agent is either claude or codex. attempts is a positive integer. An iterate object requires positive integer max and string expression until.
The nested gate object requires nullable on_approve, on_revise, and on_kill fields. It may also set a positive integer max_rounds.
The nested fanout object requires over, one or more steps, positive integer concurrency, isolation of worktree or none, require of all, any, or a positive in
Only the beginning is shown; read the rest in the repo