/skills/mfm-spec
Use when working with hosted MFM Spec: a spec stored in the MadeForMachine service and read, mutated, validated, and versioned through MCP tools. Use for service-backed spec authoring, minimal-context reads, fine-grained spec mutations, validation, history, and evaluation notes. Do not use for local file-backed specs; use the mfm-spec-local skill for that.
Public skill artifact for humans to inspect and agents to install.
https://mfm.dev/skills/mfm-spec$ manifest
slugmfm-specnamemfm-specversion0.3.0latest_version0.3.0statusalphaconnectormfmlicenseMIT$ requires — MCP tools
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 the intended graph change.
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 result is rejected (422) with the failing rules, and nothing is written. Author whole nodes, not diffs.
mfm_spec_historyList recent immutable revisions with source, reason, 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_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. 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. ## Scope Work at the MFM Spec MVP graph level: - **Components** — responsibility owners. - **Features** — observable behavior linked to the components they need. - **Evaluations** — feedback or judgment records against a feature, component, revision, 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_read` using `view=map`. Keep the whole map in context: node id, kind, status, parent, and edge summary. 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, 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. ## Interrogate First Let the user dump raw intent before formalizing. Classify it into components, features, 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, and evaluation subjects. ## 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 mutation carries the `base_rev` from the last read. 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`. 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, and checked evaluation subjects resolve, - component and dependency graphs are acyclic, - component responsibilities, feature intents, 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, revision, variant, artifact, or any combination. They record what was learned; a later explicit mutation promotes that lesson into the spec.