/skills/mfm-spec
Use the hosted MFM Spec harness to create, challenge, improve, validate, and version a project specification through authenticated MCP tools.
Public skill artifact for humans to inspect and agents to install.
https://mfm.dev/skills/mfm-spec$ manifest
slugmfm-specnamemfm-specversion0.5.3latest_version0.5.3statusalphaconnectormfmlicenseMIT$ requires — MCP tools
mfm_spec_projectRead the authoritative project meta before authoring: head_rev, spec_format, active rule-set version, tool profile, agent guidance, typed constraints, and policy_rev. Prompts are bootstrap only; this response is the source of truth.
mfm_spec_readPull a projection of your tenant project's spec. Start with view=map to see the whole tree (ids, kinds, parents, edges — no bodies) and to get the `rev`; then view=node or view=subtree to read content. The returned `rev` is your `base_rev` for mutation/write — always mutate against what you just read.
mfm_spec_validateDry-run a fine-grained mutation batch. The server applies the operations to `base_rev`, parses the full resulting graph, and returns lint/op errors without committing anything.
mfm_spec_mutateCommit a fine-grained mutation batch against `base_rev`. Use this as the normal authoring primitive after reading the map and validating one coherent graph change. `change_note` explains its overall meaning, rationale, and remaining review focus.
mfm_spec_renameRename a node — THE way to change a node's id. An id is the node's identity, so this is not an in-place edit: the server deterministically recreates the node under `new_id` (content unchanged), repoints every live referrer (children, dependents, touching features), and supersedes the old id (`status: superseded`, `superseded_by: [new_id]`) so provenance stays in the graph. Read view=referrers first to see the blast radius. Never hand-compose a rename from create/delete ops — that loses provenance.
mfm_spec_mergeMerge nodes into one successor — THE way to fold responsibilities together. You author the successor (`into`: a create payload, or an existing node's id to absorb into); the server does only the deterministic wiring: repoints every live referrer to the successor and supersedes each merged node (`superseded_by` -> successor), so the record of what absorbed what stays queryable in the graph. Read view=referrers on each node first. Never hand-compose a merge ending in delete_node — that destroys provenance.
mfm_spec_splitSplit one node into two or more successors — THE way to divide a responsibility. You author the successors (`into` payloads) and decide `reassign`: which successor each live referrer now needs — read view=referrers first; the split is rejected listing any referrer you left unassigned, because that division is design judgment the server refuses to guess. The wiring is deterministic: referrers are repointed per `reassign` and the split node is superseded by all successors.
mfm_spec_retireRetire a node whose responsibility is GONE, not relocated (if it moved, use merge/rename instead). The node is superseded with no successor — kept in the graph as provenance, never hard-deleted. Refused while live nodes still reference it (the refusal lists them): repoint or edit those first, guided by view=referrers.
mfm_spec_writeCommit a batch of full node files (upserts) and id deletions against `base_rev`. The server validates the whole resulting spec via the MFM Spec format rules and commits only if `base_rev` is still HEAD: on success it returns the new `rev`; a stale base is rejected (409) with the current HEAD and the changed node ids — re-read those and re-issue; an inconsistent or unchanged result is rejected (422), and nothing is written. `change_note` explains the coherent change for the human revision history. Author whole nodes, not diffs.
mfm_spec_historyList recent immutable revisions with source, change note, and touched node ids.
mfm_spec_importImport a lossless open-format dump. This is the explicit project bootstrap path.
mfm_spec_exportExport the hosted spec as the lossless open-format envelope.
$ install
Give this prompt to an agent that can read URLs and write local files:
Install the MFM skill 'mfm-spec' for this agent. Use the skill page as the source of truth: https://mfm.dev/skills/mfm-spec Fetch the current skill artifact, write the full skill folder to the right skills directory for this harness, and do not hand-edit generated files. Also configure the 'mfm' MCP server at https://mcp.mfm.dev/mcp, complete OAuth, and verify these tools are visible before claiming setup is done: mfm_spec_project, mfm_spec_read, mfm_spec_validate, mfm_spec_mutate, mfm_spec_rename, mfm_spec_merge, mfm_spec_split, mfm_spec_retire, mfm_spec_write, mfm_spec_history, mfm_spec_import, mfm_spec_export. After installation, start a fresh agent session or reload the tool/skill registry if this harness requires it.
Manual fallback by harness:
general1. Install the full skill folder from https://github.com/MadeForMachine/mfm-skills.git. 2. Copy 'skills/mfm-spec/' into your agent's skills directory without renaming files. 3. Configure the 'mfm' MCP server at https://mcp.mfm.dev/mcp. 4. Complete OAuth and confirm the required tools are visible.
Claude Codegit clone https://github.com/MadeForMachine/mfm-skills.git mkdir -p ~/.claude/skills cp -R mfm-skills/skills/mfm-spec ~/.claude/skills/mfm-spec claude mcp add --transport http mfm https://mcp.mfm.dev/mcp claude mcp login mfm
Codexgit clone https://github.com/MadeForMachine/mfm-skills.git mkdir -p ~/.agents/skills cp -R mfm-skills/skills/mfm-spec ~/.agents/skills/mfm-spec codex mcp add mfm --url https://mcp.mfm.dev/mcp codex mcp login mfm
Cursorgit clone https://github.com/MadeForMachine/mfm-skills.git
mkdir -p ~/.agents/skills
cp -R mfm-skills/skills/mfm-spec ~/.agents/skills/mfm-spec
// Add this to ~/.cursor/mcp.json for global setup,
// or .cursor/mcp.json for project setup:
{
"mcpServers": {
"mfm": {
"url": "https://mcp.mfm.dev/mcp"
}
}
}
Then open Cursor MCP settings and authenticate the mfm server.install paths .claude/skills/mfm-spec/ # project-local Claude Code fallback .agents/skills/mfm-spec/ # project-local Codex & Cursor fallback
Raw manifest: /skills.json · source & manual fallback: MadeForMachine/mfm-skills/tree/main/skills/mfm-spec
$ artifact — SKILL.md body
MFM Spec is the hosted MadeForMachine product that uses the MFM Spec format as its portable artifact, but keeps the canonical working spec in a service-backed revision store. Your job is to steer the user's own agent: discuss, interrogate, read minimal context, mutate through deterministic MCP tools, and let server validation guard the graph. The authority split is load-bearing: the customer's agent performs every generative and semantic judgment; MadeForMachine stores, projects, validates, and admits the result deterministically. Never imply that the service authors the spec, runs a model, or can turn a semantic judgment into a validation guarantee. If the `mfm_spec_*` MCP tools are not available, do not pretend to persist anything. You may shape the intended change in the conversation, but stop before commit and report that the MFM Spec connector/tooling is missing. ## Recover Authentication If an MFM tool reports `Auth required` or another OAuth failure, trigger the client's MCP reauthentication flow yourself instead of handing that action to the user. In Codex, run `codex mcp login mfm`; it opens the confirmation request in the user's browser. Wait for the login command to complete, then retry the MFM tool. If the current tool transport still holds its pre-login state, retry from a fresh agent session. The user's role is to approve the browser request, not to discover or execute the recovery command. ## Scope Work at the MFM Spec MVP graph level: - **Components** — responsibility owners. - **Features** — observable behavior linked to the components they need. - **Criteria** — system qualities, constraints, and prohibitions the spec must preserve, pursue, or avoid. - **Evaluations** — feedback or judgment records against a feature, component, revision, criterion, variant, or artifact. Do not choose technologies, UI layouts, data schemas, implementation plans, or code. Park those as lower-layer details or open questions on the relevant node. ## Read Small Start every session with `mfm_spec_project` for current project metadata and policy, then use `mfm_spec_read` with `view=map`. Keep the whole map in context: node id, kind, status, parent, and edge summary — including criterion statement, scope, and strength. Load full bodies only for the active blast radius: - `view=node` for one full node, - `view=subtree` for a component branch, - `view=referrers` for everything pointing AT one node — children, dependents, touching features, scoped criteria, and evaluation subjects — the blast radius to query before any identity change, - named projections such as `authoring-map`, `feature-work`, or `derivation-context` when the task has a stable slice shape. The persisted spec is the memory. The chat is disposable. ## Honor Project Policy The `mfm_spec_project` response is authoritative for the current session. Keep its agent guidance, typed constraints, active rule-set version, and tool profile in context while shaping the change. A pasted prompt or remembered policy is only a bootstrap hint and never overrides the service response. Treat a policy failure as design feedback, not a tool glitch. If policy rejects the proposed shape, discuss a compliant alternative with the user before retrying; do not weaken, route around, or silently ignore the constraint. Policy is hosted admission configuration. It is separate from portable spec criteria, which express semantic design intent inside the graph. ## Interrogate First Let the user dump raw intent before formalizing. Classify it into components, features, criteria, evaluations, open questions, and lower-layer details. Propose the smallest touched node set, then surface the one or two boundary questions that would change the graph. Always name the touched nodes before mutating. A request rarely affects one node; trace the blast radius across dependencies, feature touches, criterion scopes, and evaluation subjects. ## Apply Criteria Actively Criteria are not passive review checklists. Use the active criteria to improve the spec while it is being written or changed: 1. Read the compact statement, scope, and strength for every active criterion. 2. Load the full body only for criteria relevant to the current discussion. 3. Before proposing a mutation, state any pressure or conflict those criteria create. 4. Ask for missing decisions that materially affect a criterion. 5. Push back when a proposal violates a required criterion; for a preferred criterion, name the trade-off instead of silently overriding it. 6. Record unresolved tensions as open questions and conclusions as decisions on the relevant node. Record review findings as evaluations whose subject includes the criterion. A criterion may create technical pressure — for example, latency can rule out obviously slow interaction shapes — but do not turn that pressure into a prescribed technology or architecture inside the spec. Preserve the outcome and constraint; leave the mechanism for derivation. Criterion collections are setup inputs, not graph nodes or live dependencies. Once a collection is applied, its criteria are ordinary portable project nodes: read, edit, evaluate, or supersede them like any other criterion. Never invent or retain a live catalog reference in the spec. ## Mutate Through Tools The normal commit path is `mfm_spec_mutate`, not whole-node replacement. Use `mfm_spec_validate` first when the change is non-trivial or when you expect a repair loop. Every commit carries the `base_rev` from the last read and a required `change_note`. A revision is one coherent decision, not one touched node. Once the touched-node set has settled, batch all of its operations, validate the complete candidate, and commit it once. The `change_note` is a concise human explanation of what changed overall, why, and any remaining point worth review. Do not mechanically enumerate files or operations: the service already stores those as deterministic evidence. Failed validation attempts create no revision, and the service rejects an unchanged candidate rather than recording an empty checkpoint. MVP operations are deliberately small and deterministic: - create node, - delete node, - move node, - set frontmatter field, - add/remove dependency, - add/remove feature touch, - replace or append a named body section, - record evaluation node. Use `mfm_spec_write` only for import/bootstrap or as an escape hatch when the user already intends to replace whole nodes. It is not the normal authoring primitive. ## Reorganize Through Intents, Not Cascades A node's id is its identity. When the shape of the spec is wrong — a node is misnamed, two nodes are one, one node is two, a responsibility is gone — do NOT hand-compose the change from primitive ops, and never end an identity change in `delete_node`: that destroys the provenance the graph is for. Use the dedicated intents: - `mfm_spec_rename` — recreates under the new id, repoints every live referrer, supersedes the old id. Fully deterministic; you supply nothing but the ids. - `mfm_spec_merge` — you author the successor (`into`: a create payload, or an existing node id to absorb into); the server wires: referrers repoint, each merged node gets `status: superseded` and `superseded_by` → successor. - `mfm_spec_split` — you author the successor payloads and `reassign` each live referrer to the successor it now needs; the server refuses to guess an unassigned referrer. - `mfm_spec_retire` — for a responsibility that is gone, not relocated. Refused while live nodes still reference it; the refusal lists them. The loop is always: `view=referrers` on the affected node → name the blast radius to the user → issue the intent with the current `base_rev` and a `change_note`. Superseded nodes stay in the graph as provenance; evaluations keep pointing at them by design. If a write is rejected because `base_rev` is stale, re-read the map and the changed nodes, reconcile the user's intent against the new head, and resend a fresh mutation batch. Never force through a conflict. ## Validation Boundary `mfm_spec_validate` and `mfm_spec_mutate` both apply the proposed operations to the base revision, parse the resulting MFM Spec graph, and run the deterministic lint rules. A failed validation changes nothing. Treat the error report as the source of truth for structural validity; semantic quality remains your job. Load-bearing errors: - exactly one root component, - all parents, dependencies, feature touches, criterion scope references, and checked evaluation subjects resolve, - component and dependency graphs are acyclic, - component responsibilities, feature intents, criterion statements, and evaluation summaries are one sentence. ## Evaluation Notes When feedback arrives, record it as an `evaluation` node instead of burying it in chat or rewriting intent silently. Evaluations may point at a component, feature, criterion, revision, variant, artifact, or any combination. They record what was learned; a later explicit mutation promotes that lesson into the spec.