MCP server
ui-craft-mcp exposes eight deterministic tools over the Model Context Protocol — task routing, anti-slop, token lint, acceptance bar, the composite score, and the two fold tools.
Updated 2026-08-05
ui-craft-mcp exposes eight deterministic tools over the Model Context Protocol (stdio transport). Works with Claude Desktop, Cursor, and any MCP-compatible client.
The MCP server is the checks layer — deterministic, rule-based, identical output for identical input. The skill is the taste layer — judgment, aesthetics, architecture. These never overlap: there are no taste rules in the server, and no rule-checks duplicated in the skill.
Tools
| Tool | What it does |
|---|---|
route_task |
Routes a natural-language task to the references, commands and tools that cover it, plus the first move — pointers only, never rules |
check_anti_slop |
43-rule anti-slop scanner via scan() from ui-craft-detect — in-process, no subprocess |
tokens_lint |
Off-system token detector: raw hex colors, non-scale radius/spacing px, magic z-index |
acceptance_bar |
Acceptance checklist for a UI surface (dashboard, landing, auth, generic) — data only, no scoring |
ux_coverage |
The parts a screen archetype needs to be complete, across 12 archetypes — the completeness axis, reported beside distinction and never folded into a score |
score_ui |
Composite UICraftScore (0-100 + grade + per-dimension subscores) — all three dimensions in one call |
fold_candidates |
Draws landing-fold composition classes, preferring ones the project has not spent yet |
check_fold |
Renders a URL and reports what its fold actually is — screenshot, composition class, drift, invariants |
Most tools accept either a code string (inline source) or a path (file or directory), and return structured JSON findings + a summary. route_task takes a prompt, acceptance_bar and ux_coverage take a surface or archetype name, and check_fold takes a URL.
Why route_task exists
The routing table in the skill only fires when your words match our filenames. Ask for “an analytics panel” and nothing points at recipe-dashboard.md, because that file never says analytics. route_task closes the gap with a synonym map, and by indexing entries under the parts they are built from — so “pricing block” reaches the landing recipe.
It returns pointers, never rules: the design judgment stays in the files it points at.
Quick start
Wire it into your project’s .mcp.json:
{ "mcpServers": { "ui-craft": { "command": "npx", "args": ["-y", "ui-craft-mcp@0.9.0"] } } }
The version is pinned on purpose. Every launcher ui-craft generates or documents uses an immutable package spec, declared in distribution-manifest.json — an unpinned npx resolves to whatever is newest at first run, which is how an install silently changes behaviour between two machines.
Then your MCP client can call the tools directly — for example, gate a build by calling score_ui on a changed file and checking the grade.
Boundary, restated
- Deterministic. Same input → same output, every run. Safe to gate CI on.
- No judgment. Aesthetic and architectural decisions stay in the skill and the
/heuristiccommand. The judged UsabilityScore is computed by the host agent, not by this server.
Source
- npm:
ui-craft-mcp - Server source:
mcp/src/server.mjs
Spotted something out of date? Open an issue on GitHub →