A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
An MCP server that critiques Figma designs against your design system. Flags drift and wrong-component-for-the-job, citi
An MCP server that critiques Figma designs against your design system. It flags where a design has drifted from the system, and when the wrong component is being used for the job, and it cites the rule every time.
It reviews; it never generates. No new design output, no autofixing your file. Just a quiet, consistent second opinion inside the AI tools you already use (Claude Code, Cursor, and other MCP clients).
Status: early. The deterministic checks are the trustworthy core. The component-choice checks are advisory and start narrow. Nothing here blocks anyone, by design.
| It flags | Example |
|---|---|
| Unbound color | A raw #14113b fill that should be a color token |
| Unbound stroke | A #000000 hairline that disappears in dark mode because it isn't a token |
| Raw typography | Per-layer 24px/600 instead of a published text style |
| Off-scale spacing / radius | 13px padding when your scale says 12 or 16 |
| Detached instances | A frame that looks like a Button but isn't an instance (the #1 drift source) |
| Non-library components | An instance whose main component isn't in your library |
| Wrong component for the job | Tabs used as a segmented selector (should be a ToggleButtonGroup) |
Two tiers, with different trust levels:
rulebook.json where you list your token names and component library so the checks get sharper. It works out of the box without this; the token-binding, off-scale, and typography checks need no configuration.Zero runtime dependencies. You need Node 18+.
git clone https://github.com/chuckjob/ds-crit-mcp.git
cd ds-crit-mcp
npm test # optional smoke test, no token needed
Figma → Settings → Security → Personal access tokens → Generate new token (read scope is enough). Then either:
mkdir -p ~/.config && echo "figd_your_token_here" > ~/.config/figma-token
or set FIGMA_TOKEN in the environment. The server reads FIGMA_TOKEN first, then ~/.config/figma-token, so nothing secret needs to live in your client config.
Claude Code:
claude mcp add ds-crit --scope user -- node /absolute/path/to/ds-crit-mcp/src/mcp/server.mjs
Cursor (or any client that uses an mcpServers block — ~/.cursor/mcp.json):
{
"mcpServers": {
"ds-crit": {
"command": "node",
"args": ["/absolute/path/to/ds-crit-mcp/src/mcp/server.mjs"]
}
}
}
Restart the client, and you're set.
In your AI client:
<figma url>" → runs lint_figma_node (fetches the frame and critiques it).suggest_component.token/unbound-fill" → explain_rule.| Tool | Use |
|---|---|
lint_figma_node { fileKey, nodeId, profile? } | Critique a frame by its Figma URL parts |
lint_node { node, profile? } | Critique a node tree you already have as JSON |
suggest_component { query } | "Which component for the job?" |
explain_rule { id } | What a rule checks and why |
drift_patterns { days? } | Top drift patterns from your local run history |
profile is design (default — drops the noisiest checks for low-noise critique of a work-in-progress frame) or all (everything).
Open rulebook.json and:
validTokenRefs — add your design system's token names. (Enables sharper "did you mean <token>?" hints.)componentRegistry — add your library's components as { key, name }. This powers the detached-instance and non-library-component checks. Set registryComplete: true only once it covers every library component.guards — exempt decorative art, editor chrome, or pages you don't audit (examples included).componentChoiceRules / componentCatalog — tune the "which component?" guidance to your library's names.SPACING_PX and RADIUS_PX at the top of src/engine/lint.mjs to your spacing/radius scales.rulebook.schema.ts documents every field.
If you'd rather host the server once and point multiple clients at it:
npm run http # serves MCP at POST /mcp and health at GET /health (PORT=8080)
# or:
docker build -t ds-crit-mcp . && docker run -p 8080:8080 -e FIGMA_TOKEN=figd_... ds-crit-mcp
Every crit appends an aggregate entry — finding types and counts only (e.g. detached-instance ×1), a timestamp, and the opaque Figma keys. Never layer names, messages, design content, or screenshots. Stored at ~/.ds-crit/findings.jsonl (override with DS_CRIT_LOG_DIR; opt out with DS_CRIT_NO_LOG=1).
See your top drift patterns:
npm run report # last 30 days
node scripts/report.mjs 0 # all time
Use it to prioritize: fix the components behind the most-flagged checks, or add a rule where the same mistake keeps recurring.
rulebook.json your design system as data (tokens, components, rules)
│
▼
engine (pure) ──► MCP server (stdio + HTTP)
lintNode() lint_figma_node · lint_node · suggest_component · explain_rule · drift_patterns
The engine is a pure function (src/engine/lint.mjs): node tree in, findings out. No Figma or network calls — that lives at the edges (src/mcp/figma.mjs, src/engine/adapter.mjs), which keeps the engine trivially testable.
MIT © Chuck Job
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
MCP server integration for DaVinci Resolve Studio
A Jetbrains IDE IntelliJ plugin aimed to provide coding agents the ability to leverage intelliJ's indexing of the codeba