spec-loop
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., "@spec-loopshow me the checkout feature spec as Markdown"
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.
spec-loop
Your coding agent keeps one JSON model per feature; you read and edit it as Markdown, and every edit comes back to it over MCP.
spec-loop is for a product owner who works with a coding agent and wants to decide what gets built without writing specifications by hand. The agent keeps the specification as data; you read it, answer, and edit it where you read it.
One JSON model per feature, governed by a JSON Schema that says which fields each phase requires and when a phase may close.
Markdown documents rendered from the model, read in the VS Code preview, that you can edit directly.
One MCP server that takes your edits back into the model, so it works the same with Gemini CLI, Claude Code and Codex.
The model is rendered as Markdown documents that the owner reads in the VS Code preview. The owner answers in the chat, or edits the documents directly and asks the agent to take the edits into account. The agent maps each edit back to the object it changes and applies it. It reports, and does not apply, any edit that widens the scope or contradicts the model. spec-loop specifies; it does not implement: the code is written at the anchors, between the anchoring and verification phases, with the agent's usual development workflow.
A feature goes through six phases. Each phase adds one kind of object and is left only when the schema says it is complete:
flowchart TB
framing["framing: intent, actors, scope in and out, constraints, assumptions, questions, glossary"]
requirements["requirements: one EARS sentence per behaviour, with facet and priority; svg wireframe for each interface requirement"]
acceptance["acceptance: Given/When/Then criteria, at least one per requirement"]
anchoring["anchoring: file and symbol that will realise each requirement"]
verification["verification: one declared test per criterion, status from the test runner"]
done["done: every test passing or justified, no open question"]
framing --> requirements --> acceptance --> anchoring --> verification --> doneContents
Related MCP server: @nlspec/server
Why
A coding agent works best on structured data, so the specification is a JSON model with a schema, not prose.
The owner reads a projection of that model, as Markdown documents in the VS Code preview, and never edits JSON.
The owner's answers and edits come back into the model through the MCP server: applied when coherent, reported with a reason otherwise.
The schema fixes the granularity: six phases, each adding one kind of object, each closed only when complete.
One server, one model, one set of skills: the same loop with Gemini CLI, Antigravity, Claude Code and Codex.
Day one
You need Node 22 or later, a project folder, VS Code 1.121 or later, and one agent. Run every line from the project folder.
The package mcp-spec-loop is not published on npm yet. Until it is, clone this repository, run npm install in it (this builds dist/), and use the "until published" line of your agent.
Gemini CLI
# once published
gemini mcp add -s project -e SPEC_LOOP_ROOT="$PWD" spec-loop -- npx -y mcp-spec-loop@0.1.0
# until published (local clone)
gemini mcp add -s project -e SPEC_LOOP_ROOT="$PWD" spec-loop -- node /path/to/spec-loop/dist/mcp.jsAntigravity CLI
Run agy plugin import gemini after the Gemini line, or commit examples/consumer/.agents/mcp_config.json. Until the package is published, put the local command in mcp_config.json. Antigravity CLI (agy) replaced Gemini CLI for free and Google One accounts in June 2026.
Claude Code
# once published
claude mcp add --scope project spec-loop -- npx -y mcp-spec-loop@0.1.0
# until published (local clone)
claude mcp add --scope project spec-loop -- node /path/to/spec-loop/dist/mcp.jsCodex
# once published
codex mcp add spec-loop --env SPEC_LOOP_ROOT="$PWD" -- npx -y mcp-spec-loop@0.1.0
# until published (local clone)
codex mcp add spec-loop --env SPEC_LOOP_ROOT="$PWD" -- node /path/to/spec-loop/dist/mcp.jsEnrich the loop from your project
A project can add to the base loop, never remove from it, with one file it owns: spec/spec-loop.json, validated by schema/project.schema.json.
{
"hooks": [
{ "phase": "verification", "on": "beforeLeave", "run": "npm test", "timeout": 300, "title": "Unit tests" }
],
"instructions": {
"requirements": { "beforeLeave": "Check every interface requirement against docs/ui.md." }
}
}A
beforeLeavehook runs beforephasemoves the feature forward out of its phase; a non-zero exit blocks the move.An
onEnterhook runs right after the phase is entered; a failure is recorded and does not undo the move.The server runs each command through the shell from the project root, with a timeout (120 s by default), and keeps the last 4000 characters of its output.
createruns theonEnterhooks of the first phase: creating a feature is entering it.Every run is recorded in the feature (
lifecycle.hookRuns, the last 10 per hook), shown bystatus, and listed inrendered/verification.md;phaseneeds an absoluteroot, where the hooks run.instructionsare appended to the schema's instructions innext.instruction.
The commands come only from this file, which belongs to the project like its package.json scripts; spec-loop runs nothing from a remote source. A complete example is in examples/consumer/spec/spec-loop.json; the details are in learn topic project.
Skills
Gemini CLI, Antigravity and Codex read .agents/skills/; Claude Code reads .claude/skills/, linked to the same folder:
mkdir -p .agents/skills && cp -R /path/to/spec-loop/skills/* .agents/skills/
mkdir -p .claude && ln -s ../.agents/skills .claude/skills # Claude Code onlyexamples/consumer/ holds every file a project commits for the three agents.
Walkthrough
Ask the agent to create a feature, then run the
framingskill.Open
spec/README.mdin the preview (Ctrl+Shift+V, Cmd+Shift+V on macOS) and edit a rendered line.Ask the agent to take your changes into account (
reconcile), then tell it to move to the next phase.
The server looks for spec/ in the root argument of each tool call. Without one, it uses SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR (set by Claude Code), then its working directory. A value still holding an unexpanded ${…} is skipped. The skills always pass root, and status and features echo the resolved path.
VS Code
Commit .vscode/extensions.json from examples/consumer/. VS Code then proposes three preview extensions when the folder is first opened. Each one is optional, and the documents stay readable without it:
Extension | Adds | Without it |
| callouts: open question | a blockquote whose first line names the kind |
| checkboxes in "Left to do" and the question list | a list line starting with |
| footnotes for a textual source of a requirement | a marker and a paragraph below the block |
Tools
Tool | Writes | What it does |
| no | Returns the method by topic; |
| no | Lists every feature: id, phase, completeness, pending owner edits, last modification. |
| no | Reports one feature: file path, completeness, unaddressed fields, pending edits, last reconciliation, phase history, last backward move. |
| no | Checks a feature or a candidate object against the schema and the coverage rules, parses every Mermaid artifact and, for a stored feature, checks every svg file; every error has a JSON pointer. |
| no | Compares the regenerated projection with the files on disk; maps each hunk to an id and a pointer; classifies alterations. |
| yes | Writes the skeleton of a new feature (next FEAT number) and renders it; needs an absolute |
| yes | Renders the feature deterministically; refuses while owner edits are unverified. |
| yes | Applies an RFC 6902 JSON Patch, validates, writes, re-renders; |
| yes | Advances to the next phase when the current one is complete and the project's |
| yes | Applies the coherent owner edits, turns the others into open questions, restores the projection, records the reconciliation. |
Read-only tools carry readOnlyHint: true. Every result carries the same JSON as text and as structuredContent.
Every result about a feature (create, status, patch, phase, reconcile, and each line of features) carries next: the current phase, the skill to run, the instruction to follow now (from the schema: on entering the phase, while it is incomplete, before leaving it), the missing count and the todo list. The agent follows it at every turn, so the method is never more than one result away.
Skills
Skill | When | What the agent does |
| framing | Interviews the owner one question per field, each with a recommended answer, exploring the repository first. |
| requirements | Writes one EARS sentence per behaviour with facet, priority, title, rationale and source; a screen wireframe for each interface requirement. |
| acceptance | Drafts Given/When/Then criteria per requirement and asks the owner only for business values. |
| anchoring | Reads the target repository and anchors each requirement on a file and symbol, without writing code. |
| verification | Declares the test of each criterion, writes a missing one at its declared place, runs only the named test files once and records the runner's result. |
| closing | Checks the closing gate and closes the feature on the owner's decision. |
| any time | Takes the owner's edits into account: applies the coherent ones, reports the others with the reason. |
Between anchoring and verification, the agent implements at the anchors with its usual development workflow; spec-loop does not write code. Every phase skill reads the model at status.file, changes it only with patch, and follows the refusal rule of method/loop.md.
Rendered documents
Each feature lives in spec/FEAT-nnn-<name>/. Its feature.json is the model and rendered/ holds the projection. assets/ holds the svg wireframes, and .manifest.json the hash of everything the server last wrote. spec/README.md is the index of all features, with a menu by phase and a warning for any feature with pending owner edits.
File | Content |
| Phase diagram, documents, artifacts, what is left to do (task list), questions, history; warnings when the phase waits for answers or tests fail |
| Intent, context diagram, actors, scope, constraints, assumptions, open questions and answered questions, glossary |
| Summary table (id, title, facet, priority, EARS form, origin), then one block per requirement with its wireframes |
| One rule per requirement, one Gherkin example per criterion (Given, When, Then) |
| Anchors: file, symbol, kind of change, requirements realised |
| Declared tests and the coverage table |
| Decisions, when there are any |
A document appears once its phase is reached. A document of a closed phase opens with a line pointing at the current one. Every document opens and closes with the same navigation, rendered by one partial from the schema's phase list:
a breadcrumb back to the feature and to all features;
the menu of the feature's documents in phase order;
"Previous" and "Next" links at the bottom.
The diff ignores the navigation.
The built-in VS Code preview renders CommonMark, tables and Mermaid; callouts, checkboxes and footnotes need the extensions listed under VS Code, and read as plain blockquotes, list lines and paragraphs without them.
No meaning is carried by colour, and no inline HTML is used. The only exception is the <!-- id: … --> and <!-- ptr: … --> comments that let the diff find the object behind each block. The rules are in method/artifacts.md.
Principles
The JSON is the truth. The documents are a projection of it; nothing in them exists only in Markdown.
The schema governs the lifecycle. Phases, their order, required fields and coverage rules live in
schema/feature.schema.json. The code names no phase and no facet.The MCP server is the only writer of
spec/. Agents never edit those files with a file tool; a hand edit offeature.jsonis detected and must be reconciled.Rendering is deterministic. The same model gives the same bytes, so a diff against the disk shows exactly what the owner changed.
Owner edits are first-class. They are never overwritten unread. Each one is applied, or reported with its reason and kept as an open question, and the owner's files are saved before any re-render.
Further reading
docs/vocabulary-research.md: why each term, the EARS and Gherkin choices, the glossary.docs/integration-guide.md: how Gemini CLI, Antigravity, Claude Code and Codex load the server and the skills.method/: the method served bylearn.method/index.mdmaps each phase to its skill.docs/decisions.md: every decision, one dated line each.site/index.html, published at https://ng-galien.github.io/spec-loop/: the project page; the brand is inassets/brand/.
Development
npm install # builds dist/ through prepare
npm run build # assembles the skills, then compiles
npm run typecheck
npx vitest run test/render.test.ts # one file at a time
npm start # the MCP server on stdioThe skills are generated. Edit skills-src/, never skills/:
the shared parts are in
skills-src/parts/(preamble, model, refusal, report, stop);each skill has a
skill.yaml(name, description, phase, the parts in order, the patch example) and abody.mdthat places each part with{{> part}}.
Then run npm run assemble. It writes skills/<name>/SKILL.md and the copy in examples/consumer/.agents/skills/; the Gemini extension and the Claude and Codex plugins read skills/ directly. test/skills.test.ts fails, and lists the stale files, when a generated skill differs from its source.
Made for product owners who build with agents · Project page · MIT licence
Available Tools
10 toolscreateCreate a spec-loop featureA
Write the skeleton of a new spec-loop feature (next FEAT number, first phase), render it and refresh spec/README.md. One feature at a time: refuses while another feature is not done, naming it, unless the owner asked for it explicitly (by owner with a reason, recorded in the new feature's lifecycle).
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Who decided the creation; defaults to agent. Pass owner only when the owner explicitly asked to open this feature while another one is not done | |
| name | Yes | Kebab-case name, e.g. maket-http-connector | |
| root | Yes | Absolute path of the project that holds or will hold spec/; required | |
| title | Yes | Title for the owner | |
| reason | No | The owner's reason for opening a feature while another one is not done; required with by owner in that case |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| ok | Yes | |
| next | Yes | |
| hooks | Yes | onEnter project hooks of the first phase, run once the feature is created |
| errors | Yes | |
| render | Yes | |
| feature | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive, closed-world tool; the description adds real behavioral context: it writes files (skeleton, render, README refresh), can fail with a named blocking feature, and records the owner's reason in the new feature's lifecycle. It stops short of describing the success payload, which the output schema already covers.
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, no filler. The primary action and its side effects come first, and the gating rule follows immediately after; every clause carries decision-relevant information.
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?
With 5 parameters at full schema coverage, an output schema for return values, and annotations covering the safety profile, the description supplies exactly the missing layer: side effects and the refusal/override rule. Nothing needed to call it correctly is absent.
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 coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying by=owner and reason together and stating that the reason is persisted in the new feature's lifecycle. The name/root/title parameters get no additional treatment, which keeps it from a 5.
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?
States a specific verb and resource ('Write the skeleton of a new spec-loop feature') and enumerates the concrete side effects: next FEAT number, first phase, render, refresh spec/README.md. This is clearly distinguishable from siblings like features (listing), phase (advancing), and render (regenerating output).
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?
Explicitly states the precondition and the refusal behavior ('refuses while another feature is not done, naming it') plus the override path via by=owner with a reason. It lacks explicit routing to siblings such as features/status for checking whether an in-progress feature blocks creation, but the when/when-not guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffDiff a spec-loop projectionARead-onlyIdempotent
Compare the regenerated projection of a spec-loop feature with the files on disk and the manifest; each hunk carries its block id and JSON pointer, and every alteration is classified.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| clean | Yes | |
| files | Yes | |
| feature | Yes | |
| ownerEdits | Yes | |
| alterations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the description is not responsible for covering the safety profile. It adds genuinely new behavior: the comparison is three-way (regenerated projection, disk files, manifest), and every alteration comes classified with a block id and JSON pointer, which tells the agent what kind of answer to expect.
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?
It is a single front-loaded sentence that establishes the comparison target first and the result shape second, with no filler or restatement of the name.
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?
With an output schema present and rich annotations, the description covers the comparison semantics and the meaning of the returned hunks, which is what an agent needs in order to call it. The only gap is routing guidance against reconcile and validate, which is a usage-guidelines concern.
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%, and the schema already spells out the fallback chain for root (SPEC_LOOP_ROOT, CLAUDE_PROJECT_DIR, working directory) and the three accepted feature forms. The description adds nothing parameter-level beyond that, so the baseline 3 applies.
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 gives a specific verb and resource: it compares a regenerated projection against both the on-disk files and the manifest, and it names what the result contains (hunks with block ids and JSON pointers). It does not, however, distinguish this from adjacent siblings like reconcile or validate, which an agent could easily confuse with it.
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 word 'Compare' plus the mention of the regenerated projection implies the situation where this is useful (checking drift after regeneration), but there is no explicit when-to-use or when-not-to-use statement, and no sibling is named as the alternative. Guidance is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
featuresList spec-loop featuresBRead-onlyIdempotent
One summary line per spec-loop feature under spec/: id, name, phase, completeness, pending owner edits or alterations, last modification; echoes the resolved root and spec path.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. |
Output Schema
| Name | Required | Description |
|---|---|---|
| root | Yes | Resolved project root |
| spec | Yes | Resolved spec/ folder |
| features | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is fully covered without the description's help. What the description does add beyond that is the side effect of echoing the resolved root and spec path, which tells the agent it can verify which project was actually read. It does not mention ordering, whether the scan recurses, or behavior on an empty spec/ directory.
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?
One densely packed sentence with the actor and output shape front-loaded and no filler. The field enumeration is long but each item is informative; only slight trimming (e.g. 'pending edits/alterations') would tighten it further.
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?
An output schema exists, so the description is not obliged to explain return values, and root resolution is fully covered by the parameter schema. For a single-optional-param, read-only listing tool the description plus structured fields give the agent everything needed to call it correctly.
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% and the root parameter already spells out the full resolution chain (arg, SPEC_LOOP_ROOT, CLAUDE_PROJECT_DIR, cwd). The description's 'echoes the resolved root and spec path' adds a small but real point the schema does not make: the agent can confirm which root won. That is marginal value on top of a self-sufficient schema, so baseline 3 is right.
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?
States a specific verb and resource ('One summary line per spec-loop feature'), and enumerates exactly what each line contains (id, name, phase, completeness, pending owner edits, last modification). An agent can immediately tell this is a read-only inventory of features, distinct from action-oriented siblings like create, patch or reconcile. It only misses explicit naming of the closest rival (status).
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 never says when to reach for this instead of the sibling 'status' or 'diff' tools, nor any prerequisite. The only usage-adjacent information (pass root on every call, with a fallback chain) lives entirely in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
learnLearn the spec-loop methodARead-onlyIdempotent
Return one topic of the spec-loop method; phases and fields are generated from the schema. Topics: artifacts, feedback, fields, glossary, index, loop, phases, project, questioning, use-cases.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Defaults to index |
Output Schema
| Name | Required | Description |
|---|---|---|
| topic | Yes | |
| topics | Yes | |
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that topics are generated from the schema, but it does not add much behavioral context beyond what annotations and the output schema provide.
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?
The description is short and front-loaded, stating the core behavior before listing topics. The topic list is somewhat redundant with the enum, but it remains useful and does not bloat the definition.
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?
For a one-parameter read-only tool with an output schema and rich annotations, the description is mostly complete. It explains what is returned and lists valid topics; the output schema handles return structure, so no major gaps remain.
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%, and the topic parameter is fully enumerated with a default documented in the schema. The description repeats the topic list but does not add meaning beyond the schema, so the baseline of 3 is appropriate.
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 verb and resource: it returns one topic of the spec-loop method, and it enumerates the available topics. The purpose is clear, but it does not differentiate itself from siblings such as phase, features, or status.
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 usage as a documentation/topic lookup by saying it returns one topic and listing valid topics. However, it does not state when to choose this tool over siblings like phase or features, nor does it provide any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patchPatch a spec-loop featureA
Apply an RFC 6902 JSON Patch to a spec-loop feature.json, validate, write only when no invalid error remains, then re-render. id, name, phase and lifecycle are not patchable.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | ||
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| next | Yes | What the agent does next: every result about a feature carries it; follow it |
| errors | Yes | |
| render | Yes | |
| feature | Yes | |
| validation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: validation gating before any write, a re-render side effect, and an explicit list of non-patchable fields (id, name, phase, lifecycle) that would otherwise be discovered only by failure. It does not say whether ops are applied atomically or what state remains if a mid-sequence op fails, which is the notable gap for a mutation tool.
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, both load-bearing: the first packs the operation, format, safety gate and side effect; the second carries the only field-level constraint. Front-loaded with the action and zero filler.
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?
With annotations declaring a non-readonly, non-open-world operation and an output schema present, the definition covers what an agent needs to invoke it: target identity, format, gating, side effects, and forbidden fields. Failure semantics (atomicity, partial-application state) are the only meaningful omission.
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 coverage is 67% and both root and feature carry schema descriptions, so the baseline is 3. The description earns an extra point by constraining what paths the `ops` array may legally target ('id, name, phase and lifecycle are not patchable'), a path-level rule the schema cannot express.
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?
States a specific verb and standard (Apply an RFC 6902 JSON Patch) against a specific resource (spec-loop feature.json), then describes the full pipeline: validate, conditional write, re-render. This distinguishes it from the validate and render siblings, which it internally subsumes, and from create.
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 conditional write ('write only when no invalid error remains') implies the validation gate and hints that a separate validate call is not needed first. However, it never explicitly says when to reach for patch versus create, validate, or render — the routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phaseAdvance a spec-loop featureA
Move a spec-loop feature to the next phase of the schema, only when the current phase is complete (entry rules of the next phase included), no owner edit is pending and every beforeLeave project hook of spec/spec-loop.json exits 0; or, with to, back to an earlier phase on the owner's decision with a reason. Runs the onEnter project hooks of the phase entered, records the history entry and every hook run.
| Name | Required | Description | Default |
|---|---|---|---|
| by | Yes | Who decided the move: owner when the owner asked for it; a backward move requires owner | |
| to | No | An earlier phase to move back to; omit to advance to the next phase | |
| root | Yes | Absolute path of the project that holds spec/; required, since project hooks run there | |
| reason | No | Why the owner moves the feature back; required with to | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| to | Yes | |
| from | Yes | |
| next | Yes | What the agent does next: every result about a feature carries it; follow it |
| hooks | Yes | Project hooks run by this call: beforeLeave hooks of the phase left, then onEnter hooks of the phase entered |
| patch | Yes | |
| feature | Yes | |
| missing | Yes | |
| reasons | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the gating logic (hook exit codes, pending owner edits), the side effects (runs onEnter hooks of the entered phase, records a history entry plus every hook run), and the fact that project hooks execute inside `root`. These are consequential behavioral traits an agent cannot infer from readOnlyHint=false / destructiveHint=false.
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?
Front-loaded with the primary action and only ~60 words, with zero filler. It is, however, a single semicolon-chained sentence packing four nested conditions, which makes it denser to parse than necessary; a short bullet of preconditions would read better.
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?
Output schema exists so return values need not be explained, and the description covers the operation's preconditions, side effects and the backward-move exception. For a non-destructive, non-open-world state-transition tool with 100% schema coverage, nothing an agent needs before invoking it is missing.
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 coverage is 100%, so baseline is 3, but the description adds genuine meaning: it explains the `to`/`reason` pairing and that a backward move requires `by: owner`, i.e. the cross-parameter constraint the schema only hints at per-property. It does not explain `feature` identifier forms or `root` semantics beyond what the schema already says.
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?
States a specific verb and resource ('Move a spec-loop feature to the next phase of the schema') and even names the governing artifact (spec/spec-loop.json). An agent can distinguish this from siblings like status, validate or reconcile because the description defines the phase-transition operation precisely, including the backward-move variant.
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?
Gives explicit preconditions for advancing (current phase complete, entry rules satisfied, no pending owner edit, beforeLeave hooks exit 0) and explicit conditions for the backward variant (use with `to`, requires owner, requires reason). The gap is that it never references sibling tools (e.g. use status to check phase, validate to test readiness), so routing between tools is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconcileReconcile owner edits of a spec-loop featureA
Close a reconciliation of the owner edits of a spec-loop feature: apply the JSON Patch for the coherent owner edits, turn each reported one into an open question, restore the projection exactly (owner files kept in .spec-loop/overwritten//) and record lastVerify. applied + reported must equal the pending count from diff.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | JSON Patch for the coherent edits; may be empty | |
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| applied | Yes | Number of pending items brought into the JSON or accepted | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder | |
| reported | Yes | Pending items reported to the owner instead of applied; each becomes an open question in framing.questions | |
| featureChange | No | Required when feature.json was changed outside the MCP: accept it (recorded in lifecycle.acceptedChanges) or restore the last known good copy |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| next | Yes | What the agent does next: every result about a feature carries it; follow it |
| patch | Yes | |
| errors | Yes | |
| applied | Yes | |
| feature | Yes | |
| pending | Yes | |
| reported | Yes | |
| questions | Yes | Ids of the open questions created for the reported items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring a non-readonly but non-destructive and non-open-world operation, the description adds substantive behavior: it applies a JSON Patch, converts reported items into open questions, restores the projection exactly, preserves owner files under .spec-loop/overwritten/<time>/, and records lastVerify. It does not cover failure behavior or what happens when the applied/reported count invariant is violated.
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?
The purpose is front-loaded and there is no wasted filler. However, it is one long dense sentence, making the many behaviors and the invariant harder to parse than a more structured description would be.
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?
For a complex mutation tool with six parameters, nested objects, annotations, and an output schema, the description supplies the core flow, preservation path, and count invariant. It still leaves a gap around explicit sibling selection guidance and mismatch/error behavior, so it is not fully complete.
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 baseline is 3. The description adds a meaningful cross-parameter invariant: applied + reported must equal the pending count from diff, and it clarifies that reported items become open questions, which goes beyond the schema text.
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?
States a specific verb and resource: 'Close a reconciliation of the owner edits of a spec-loop feature', then enumerates applying the JSON Patch, turning reported items into open questions, restoring the projection, and recording lastVerify. It references diff's pending count, but does not explicitly contrast itself with the patch or diff siblings.
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 workflow is only implied through 'pending count from diff', suggesting this tool is used after diff. There is no explicit when-to-use versus when-not-to-use guidance, nor a clear alternative among diff, patch, or validate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderRender a spec-loop featureAIdempotent
Project a spec-loop feature.json into its rendered/ folder (deterministic) and refresh the manifest and spec/README.md. Refuses while owner edits are unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| files | Yes | |
| feature | Yes | |
| refused | Yes | Files or assets holding unverified owner edits; non-empty means nothing was written |
| removed | Yes | |
| backedUp | Yes | Owner-edited files saved under .spec-loop/overwritten/ before they were overwritten |
| validation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, idempotent=true, destructive=false), the description discloses real side effects: it writes into rendered/ and additionally refreshes the manifest and spec/README.md. It also flags a hard refusal guard. It stops short of describing what the refusal error looks like or how to clear it.
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, zero filler, with the primary action and its outputs front-loaded before the refusal caveat. Every clause 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?
An output schema exists, so return values need not be explained, and side effects are covered. The main gap is the unverified-owner-edits state: the description states a blocking condition without pointing at the sibling (reconcile/validate) that resolves it, leaving the agent stuck on refusal.
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 both parameters are already documented in the schema. The description adds only an implied notion that `feature` targets a feature.json, and says nothing about the `root` resolution chain, so baseline 3 is correct.
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?
Names a specific verb (project/render) and resource (a spec-loop feature.json into rendered/), and enumerates the collateral outputs (manifest, spec/README.md). It does not explicitly contrast itself with siblings like validate, diff, or reconcile, so an agent must infer the boundary.
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 clause 'Refuses while owner edits are unverified' is a precondition that implies when not to call, which is useful. However, there is no explicit statement of when to choose render over diff/validate/reconcile, nor which tool resolves the unverified state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusStatus of a spec-loop featureCRead-onlyIdempotent
Phase, completeness (recomputed by validate), pending owner edits and alterations (recomputed by diff against the manifest), last reconciliation and phase history of one spec-loop feature.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| feature | Yes | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| file | Yes | Absolute path of feature.json |
| name | Yes | |
| next | Yes | What the agent does next: every result about a feature carries it; follow it |
| root | Yes | Resolved project root |
| spec | Yes | Resolved spec/ folder |
| hooks | Yes | Project hooks declared in spec/spec-loop.json, each with its last run on this feature |
| phase | Yes | |
| title | Yes | |
| folder | Yes | |
| nextPhase | Yes | |
| lastVerify | Yes | |
| ownerEdits | Yes | |
| alterations | Yes | |
| unaddressed | Yes | Fields of the current phase never set, optional ones included; a field set to an empty array counts as addressed |
| completeness | Yes | |
| phaseHistory | Yes | |
| lastBackwardMove | Yes | The last move back to an earlier phase, with the owner's reason |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds genuine value by noting that completeness is recomputed by validate and alterations by diff against the manifest, clarifying that this tool reports rather than mutates state, but it says nothing about cost, freshness, or failure 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?
One dense sentence with no filler, and the field list is front-loaded. It loses a point for being an ungrammatical fragment whose parenthetical clauses make it slower to parse than a plain declarative sentence would be.
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?
An output schema exists, so not explaining return values is acceptable, and the annotations cover the safety profile. However, for a read tool with nine siblings, the definition provides no routing guidance and no statement of the actual action, leaving the agent to infer selection.
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%, including the root fallback chain and the accepted forms of the feature identifier, so the schema fully carries parameter meaning. The description mentions 'one spec-loop feature' but adds no syntax or selection detail beyond the schema; baseline 3 applies.
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 is a noun phrase listing the fields returned (phase, completeness, pending edits, history) rather than a verb+resource statement, so it never says plainly 'report the status of a feature.' It does implicitly distinguish itself from siblings by attributing completeness to validate and alterations to diff, but an agent must infer the actual action.
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?
There is no explicit when-to-use or when-not-to-use guidance and no mention of the alternatives (validate, diff, phase, features). Usage is only inferable from the read-only, reporting framing of the field list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateValidate a spec-loop featureARead-onlyIdempotent
Validate a spec-loop feature.json, or a candidate object, against the schema and the coverage checks of its phase, and parse every Mermaid artifact; for a stored feature, also check that every svg artifact file exists and is a safe svg. Every error has a JSON pointer.
| Name | Required | Description | Default |
|---|---|---|---|
| json | No | Candidate feature object, validated instead of the stored file | |
| root | No | Absolute path of the project holding spec/. Pass it on every call; otherwise SPEC_LOOP_ROOT, then CLAUDE_PROJECT_DIR, then the server working directory. | |
| feature | No | spec-loop feature: its id (FEAT-001), its name (maket-http-connector) or its folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| phase | Yes | |
| valid | Yes | No invalid error: the JSON may be written |
| errors | Yes | |
| complete | Yes | No error at all: the current phase is complete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered; the description adds genuinely new behavior: Mermaid artifacts are parsed, svg artifacts are existence- and safety-checked only for stored features, and errors carry JSON pointers. It does not describe error verbosity or failure aggregation, leaving a small gap.
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?
A single dense sentence that front-loads the object of validation before the extra checks. It is efficient, though the run-on structure makes the checks slightly harder to scan than a short bulleted breakdown would.
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?
With an output schema present, return values need not be explained, and the description covers both input modes and the error-pointer convention. Minor gaps remain around precedence between json and feature and whether multiple errors are returned together.
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 explains json, root and feature fully, including root resolution precedence. The description only implicitly conveys that json takes precedence over the stored file, adding little beyond the schema's own text; baseline 3 applies.
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?
States a specific verb (validate) and precise resources (feature.json or a candidate object) plus the exact check set: schema, phase coverage checks, Mermaid parsing, and svg file existence/safety. No sibling (diff, render, phase, reconcile) shares this verb-and-check profile, so the tool is easy to distinguish.
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?
Clearly delineates two usage modes: a stored feature versus a candidate object passed inline, and notes that the stored-file path adds svg artifact checks. It does not name alternatives or when-not conditions (e.g., reconcile vs validate), so it stops short of full routing guidance.
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.
10 tool updates
v0.1.0- First observed
create - First observed
diff - First observed
features - First observed
learn - First observed
patch - First observed
phase - First observed
reconcile - First observed
render - First observed
status - First observed
validate
TDQS
Scored across 10 tools
The tools mostly target distinct lifecycle operations: listing features, inspecting one feature, creating, validating, rendering, patching, phase transitions, diffing, reconciling, and reading method topics. There is some conceptual overlap between diff/status/features because status and features summarize information that diff computes, but the boundaries are clear enough for an agent.
All tool names are lowercase single tokens with no mixed casing or chaotic style. They are not a strict verb_noun pattern and mix verbs with nouns such as features, status, and phase, but the convention is still predictable and readable.
Ten tools is well scoped for a spec-loop feature lifecycle server. Each tool covers a distinct operation in the create-validate-render-diff-patch-phase-reconcile workflow, and none appears redundant.
The surface covers the core lifecycle: create, inspect, validate, render, patch, transition, diff owner edits, reconcile, and learn the method. Minor gaps exist around deleting or archiving features and explicitly managing open questions generated during reconciliation, but agents can work around these.
Maintenance
Related MCP Connectors
Spec-driven development for AI coding agents: live requirements, stories and traceability over MCP
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
MCP-native collaborative markdown editor with real-time AI document editing
MEOK AGENTS.md Linter MCP — validates the cross-vendor coding-agent spec (Cursor / Claude Code /
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables document-driven development by automatically detecting Markdown spec changes, generating implementation plans, and syncing code and tests through MCP tools.16 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to parse, create, update, delete, and search natural language specification elements in markdown files via MCP tools.1MIT
- AlicenseAqualityAmaintenanceRepository-native protocol and MCP server for coordinating work items, documentation, changelogs, and project memory between humans and AI agents, using Markdown files in a Git repository as the canonical data source.303MIT
- AlicenseNot gradedqualityBmaintenanceEnables autonomous agents to turn high-level features into structured PRDs, user stories, Gherkin acceptance criteria, edge cases, and OpenAPI-compatible API contract skeletons. It exposes MCP tools for synthesizing requirements and generating endpoint specifications.7MIT