Walk a Figma node (or the whole current page) and report accessibility and design-quality problems
in one pass. Runs entirely through use_figma, so it works on any Figma plan and inspects the
real design (true colors, real auto-layout, actual variant names) rather than generated code.
Why this is unique: the native Figma MCP (get_design_context, get_metadata, etc.) reads
designs for code generation but does not lint them. There is no built-in "is this accessible /
token-clean?" check on the design side. This skill fills that gap with a faithful port of 14 WCAG 2.2
rules plus 6 design-system/layout rules.
Skill boundaries
use_figmarules — load the officialfigma-useskill first; it is the full Figma Plugin API reference. Essentials these scripts rely on: plain JS with top-levelawait+return(no IIFE, nofigma.closePlugin();console.logis not returned), inputs inlined asconstat the top of each script, colors in 0–1 range, load fonts before any text op,await figma.getNodeByIdAsync(...), and atomic errors (a failed script applies nothing — read the error, fix, retry).- Per-component deep scorecard (state coverage, color-blind sim, 0–100 scores) → use
figma-audit-accessibility. - CODE-side a11y (axe-core over generated HTML) → use
figma-scan-code-accessibility. - Design-vs-code drift → use
figma-check-design-parity.
Workflow
- Pick the scope. Get the target
NODE_ID(a frame, component set, or screen) from the user's selection or a URL. Leave itnullto lint the entire current page. - Pick the rules.
RULESdefaults to['all']. Narrow it to a group ('wcag','design-system','layout') or a specific rule id (e.g.'wcag-contrast') to cut noise. The full catalog is in references/lint-rules.md. - Run
scripts/lint-design.jsviause_figma(skillNames: "figma-lint-design"). Edit theconstinputs at the top first. - Triage by severity. The result groups findings by rule, each carrying
severity(critical/warning/info) andwcagLevel(a/aa/aaa/best-practice/design-system). Lead withcritical(contrast, target size, focus, color-only). - Fix + re-lint. Apply fixes (via
figma-manage-variables,figma-use, etc.) and re-run the same scope to confirmsummary.totaldropped. Each finding includes the offendingnode.idso you can jump straight to it.
Key rules
- Colors are 0–1 floats. Contrast math uses sRGB linearization + relative luminance; the script ships its own helpers (no hex needed for input).
- Background is inferred by walking ancestors for the nearest solid fill (defaults to white).
Contrast on semi-transparent fills is flagged
approximate: true. MAX_DEPTH(default 10) andMAX_FINDINGS(default 100) bound the walk. Iftruncatedis set, narrow the scope or raise the cap.- WCAG-honest severity: some rules (text size, line height, letter/paragraph spacing) are labelled
best-practice, not a hard WCAG failure — see lint-rules.md for the exact reasoning per rule. - Findings are descriptive, not auto-fixed. Confirm intent before bulk-editing a design.