Talk in plain English. Watch Figma build.
You describe what you want, an AI assistant builds it live in your Figma Desktop.
No API key. No copy-paste. No plugin to babysit. No code to write.
Built by Sil Bormüller: Founder of Into Design Systems
Join my AI conference: AI Design Systems Conference 2027 on March 10 and 11 2027 online
figma-cli lets an AI assistant build directly in your Figma Desktop, while you talk to it in normal language.
You don't run commands or write code. You open Claude in this project and say things like:
"Create three pricing cards." "Use my brand's design system." "Make those buttons look like Stripe." "Check the contrast on this screen."
Claude does the rest. Figma updates in real time, in front of you.
It works with real, editable Figma , actual frames, components, variants and variables , not a flat image. And it runs locally: no API key, nothing sent to a cloud service. No rate limits either (why).
You don't install this by hand. You use an AI coding assistant , Claude Code (recommended, what most people use) or Cursor , point it at this project, and ask it to set everything up.
Using Cursor? Jump to Using Cursor for the one-line setup. The steps below are for Claude Code; everything the CLI does is identical in both.
Don't know git? No problem. Open Claude Code anywhere and paste:
"Download the figma-cli project from https://github.com/silships/figma-cli into a folder in my home directory, then go into it."
(Or, if you prefer: click the green Code button on the GitHub page → Download ZIP → unzip it.)
Open Claude Code inside the project folder and say:
"Set up figma-cli and connect it to my Figma."
Claude reads the project's instructions, installs what's needed, and connects to your open Figma Desktop. You watch , you don't type commands.
When it says it's connected, you're done. ✅
Now describe what you want:
"Add my brand colors, then create a primary button and a secondary button."
Claude builds it in Figma instantly.
Prefer Claude Code's plugin system? This repo is also a plugin marketplace, so Claude Code learns the figma-cli workflow in any project (not just this one) after a two-line install:
/plugin marketplace add silships/figma-cli
/plugin install figma-cli@intodesignsystems
That installs a skill that teaches Claude Code how to drive figma-cli (connect
modes, the render/JSX rules, tokens, verify, a11y). The CLI itself still needs
Node ≥ 18 and its dependencies , clone this repo and run npm install once (or
ask Claude to), then open Figma Desktop and say "connect to Figma". The plugin
supplies the know-how; the local CLI does the work.
Prefer Cursor? It works exactly the same , the CLI controls Figma Desktop, not your editor, so nothing about it is Claude-only. Most people use Claude Code, but if Cursor is your tool, here's the whole setup.
Open Cursor in any folder, open the chat (the Agent), and paste:
"Install github.com/silships/figma-cli and connect it to my Figma."
Cursor downloads the project, installs it, sets up its own rules so it knows how to drive it, and connects to your open Figma Desktop. You watch , you don't type commands.
Under the hood Cursor runs one extra command for itself ,
figma-cli init-agent, which drops a small.cursor/rules/figma-cli.mdcinto your project. That's the file that teaches Cursor's Agent the rules (use real variables, wrap text properly, build N items as N components, etc.). You never edit it.
When it says it's connected, you're done. ✅
Same as Claude Code , describe what you want:
"Add my brand colors, then create a primary button and a secondary button."
Cursor builds it in Figma instantly.
Already set up in a project and just want the Cursor rules? Run figma-cli init-agent yourself , it writes the Cursor rules and an AGENTS.md (which Claude Code and Cursor both read), without touching any existing CLAUDE.md.
figma-cli talks to Figma in one of three ways. Claude picks one during setup , here's what they mean, so you know what's happening:
All three do exactly the same things. Unsure? Use Yolo. Want nothing changed on your Figma app but still want the fast direct path? Use Browser. Prefer the official plugin route? Use Safe. You can switch anytime , just ask Claude.
Yolo and Browser mode both talk to Figma over CDP on port 9222 by default. If something else on your machine already uses that port (another Chrome with remote debugging, a browser automation tool), point figma-cli at a different one:
figma-cli --port 9333 connect # flag
FIGMA_PORT=9333 figma-cli connect # or env var
Invalid values fall back to 9222, so connect keeps working out of the box.
People keep asking how figma-cli differs from Figma's official MCP and from figma-console-mcp. Short version: they talk to Figma through the cloud REST API, figma-cli talks to Figma Desktop directly on your machine. That one architectural choice changes everything downstream.
| figma-cli | Figma official MCP / figma-console-mcp | |
|---|---|---|
| How it connects | CDP → your local Figma Desktop | Figma REST API (cloud) |
| Figma token | not needed | required (figd_…) |
| Figma rate limit | none (no API calls to throttle) | yes (as low as 6 read calls/month per seat) |
| Works offline | yes | no |
| Setup | one connect command | token + plugin/bridge + (for some) port wrangling |
Figma's APIs are rate-limited, and any tool built on them (Figma's official MCP included) runs into the same ceiling. The official MCP caps the tools that read from Figma by seat: just 6 calls per month on a View/Collab seat, and 200 to 600 per day (10 to 20 per minute) even on a paid Dev/Full seat (source). AI agents read constantly, so they burn through those fast, then sit in 429 cooldowns. figma-cli sidesteps all of it because it never calls the API: it drives Figma Desktop locally over CDP. No token, no 429, works offline.
figma-cli's commands are terse and there are no large tool schemas loaded into the AI's context. Driving an MCP server, by contrast, loads its instructions + dozens of tool schemas and returns verbose JSON. Measured like-for-like in one session (tokens ≈ bytes ÷ 4, approximate):
| Task | figma-cli | API-based MCP |
|---|---|---|
| Cold start → first component | ~140 tok | ~1,600 tok (~11×) |
| Generate one token-bound component | ~68 tok | ~256–556 tok (~4–8×) |
On a fixed AI plan (e.g. Claude Pro), fewer tokens per task means you get more done before hitting your AI's usage limits too — and a leaner context means the AI keeps its facts straight instead of "forgetting" node IDs as the window fills.
Bottom line: local, no token, no rate limit, no cloud round-trip, and the lowest token cost — built for fast, reliable building and verifying from Claude Code or Cursor.
Just say it in plain language. A few examples:
Build things
Use a design system
Bring your own brand
DESIGN.md file , see below)DESIGN.md , see below)Animate (Figma Motion)
Polish & hand off
You never memorize commands. Claude knows them , you just describe the outcome.
Have a brand or a design system? Put it in a single DESIGN.md file (colors, type, spacing) and tell Claude:
"Import ~/Downloads/my-DESIGN.md into Figma."
It creates real Figma variables (primary, canvas, ink, accent, …) you can use everywhere , and you can switch a design between systems on demand ("now make it look like Vercel"). Ready-made DESIGN.md files for popular brands work too.
DESIGN.md is no longer the only way in. You can point figma-cli import directly at the source files your project already has:
tailwind.config.js) , colors, radii, spacing and font families land as Figma variables.globals.css, styles.css) , supports shadcn HSL triples, Tailwind v4 @theme blocks and oklch.tokens.json) , W3C design-tokens format and Style Dictionary files, including alias resolution.http://localhost:6006 or ./storybook-static/) , imports your component inventory (names, variants) as context for the AI. Combine with a Tailwind or CSS import to get design tokens too.Ask Claude: "Import my tailwind config" or "load our storybook at localhost:6006" and it handles the rest.
The reverse also works. Open any Figma file , yours, a client's, a Community file like GitHub's Primer , and say:
"Export the design system as markdown."
figma-cli scans every page (no truncation, even on 100k+ node files) and writes a DESIGN.md with the full token map: colors ranked by usage, the type scale, spacing, radii, shadows, plus a variant matrix for every component set (e.g. Button: variant × size × state, with all values). If the file defines real variable collections, it captures those too , every variable with its real name, all its modes (light/dark, high-contrast, whatever the system uses) and its alias chains , not just a palette sampled from fills. The file round-trips , figma-cli import recreates those collections faithfully (modes and aliases included) in any other file.
Components aren't just documented, they're addressable: figma-cli spec "Button" reads the markdown in code (zero model tokens) and returns just that one component's spec plus its reuse handle, so an agent pulls in exactly what it needs on demand instead of loading the whole file.
What it's for:
figma-cli instantiate "Button") instead of cloning a one-off copy, so your file stays consistent with the source systemHuge files stay usable: when the structure trees alone would blow an AI context window, they're split into per-page files automatically and the main DESIGN.md stays small enough to load whole (Primer Web: 67 pages, 124k nodes → a 35k-token main file).
A DESIGN.md is prose. An AI has to interpret it, so the only way to answer "is this still correct?" is a human looking at it. That is fine for building and useless for verifying.
So there is a second, deterministic half. No model takes part in it at all.
figma-cli snapshot # → design.json, a canonical contract of the file (commit it)
figma-cli rules gen # → rules/*.yaml, one contract per component
figma-cli check # verify the open file against both, exit 1 on any violation
design.json is canonical: node ids, publish keys and timestamps are stripped, unordered sets sorted, floats rounded. The same system re-extracted, or exported and re-imported, compares byte-identical, so a difference always means a real change. The YAML contracts are generated by code reading the Figma Plugin API, not written by a model, and you review them once as a git diff.
What check enforces:
pages/Page 1/frames/Button/kids/size=sm/h: 32 → 56)--roundtrip) , proof that the token layer survives export and import, which is the failure that used to silently re-import everything whiteIt exits non-zero and speaks --json, so it runs in CI. Red means changed, not wrong: if the change was intended, re-run snapshot and review the diff, exactly like a snapshot test.
Verified against GitHub's Primer (1015 nodes, 1381 variables, a 144-variant Button): repeated runs compare equal, all 576 fills and 144 strokes across every variant check out, and a one-character typo in a single variant name is caught in under a second.
What stays human is whether the contract describes the right design. You decide that once. After that it is arithmetic.
Prefer to keep everything on your machine? figma-cli also works with local LLMs (via LM Studio or Ollama) , fully offline, no cloud, no key. Ask Claude to "set up the local LLM agent" and it'll walk you through it.
40+ ready components · 40+ capabilities · 10 areas. You trigger any of these just by asking.
🧩 Components (40+ components + 3 tools)
🎨 Design systems & tokens (4)
DESIGN.md , colors, typography, radius become real Figma variables🖼️ Visuals & effects (5)
📐 Layout & structure (4)
🎬 Motion & animation (5) (Figma Motion, Config 2026 Beta)
✅ Deterministic validation (5) (no model involved, CI-ready)
design.json and catch any later drift, with the exact path that changed♿ Accessibility (4)
📦 Handoff & export (4)
🤖 Built for AI (6)
figma-cli init-agent sets up the rules for bothverify --measure) so the AI checks its own work by numbersspec --check) , no eyeballing🔒 No strings (2)
Everything above is powered by a CLI that the AI calls for you. If you want to use it directly, script it, or see every command:
Auto-layout, by example. npm run examples renders a labelled gallery of the
auto-layout patterns that are easy to get wrong , wrapping card, space-between
navbar, stretching divider, toggle knobs, bottom-pinned sidebar, wrap grid,
min/max constraints, fill chain, z-stack , onto a page called "Auto-Layout
Patterns". It then measures what Figma actually produced and fails if any
number drifts, so it is documentation and a regression test at once.
npm test # unit tests, no Figma needed
npm run examples # render + verify the pattern gallery (needs a connected Figma)
npm run test:live # the above, plus render vs render-batch layout parity
You don't need any of this to use the tool , it's here for tinkerers.
Figma plugins are slow to build and tied to one UI. AI assistants are great at describing intent but need a clean way to act on Figma. figma-cli is the bridge: it talks to Figma Desktop directly, so you can design by conversation , locally, with no API key and no cloud roundtrip.
You design. The AI builds. Figma updates.
What each connection mode touches (Yolo patches one string in Figma's app.asar, Browser and Safe Mode leave the app alone), what the local daemon does, and where credentials live: SECURITY.md. That is also the page to hand to whoever approves tools at your company.
Found a vulnerability? Report it privately via GitHub private vulnerability reporting or [email protected], not in a public issue.
Sil Bormüller, founder of Into Design Systems, the conference and training platform for design system practitioners.
Join my AI conference: AI Design Systems Conference 2027 on March 10 and 11 2027 online.
MIT. Built by Sil Bormüller.
481 followers · starred Feb 2026
594 followers · starred Aug 2026
2,020 followers · starred Mar 2026
137 followers · starred Mar 2026
Talk in plain English. Watch Figma build.
You describe what you want, an AI assistant builds it live in your Figma Desktop.
No API key. No copy-paste. No plugin to babysit. No code to write.
Built by Sil Bormüller: Founder of Into Design Systems
Join my AI conference: AI Design Systems Conference 2027 on March 10 and 11 2027 online
figma-cli lets an AI assistant build directly in your Figma Desktop, while you talk to it in normal language.
You don't run commands or write code. You open Claude in this project and say things like:
"Create three pricing cards." "Use my brand's design system." "Make those buttons look like Stripe." "Check the contrast on this screen."
Claude does the rest. Figma updates in real time, in front of you.
It works with real, editable Figma , actual frames, components, variants and variables , not a flat image. And it runs locally: no API key, nothing sent to a cloud service. No rate limits either (why).
You don't install this by hand. You use an AI coding assistant , Claude Code (recommended, what most people use) or Cursor , point it at this project, and ask it to set everything up.
Using Cursor? Jump to Using Cursor for the one-line setup. The steps below are for Claude Code; everything the CLI does is identical in both.
Don't know git? No problem. Open Claude Code anywhere and paste:
"Download the figma-cli project from https://github.com/silships/figma-cli into a folder in my home directory, then go into it."
(Or, if you prefer: click the green Code button on the GitHub page → Download ZIP → unzip it.)
Open Claude Code inside the project folder and say:
"Set up figma-cli and connect it to my Figma."
Claude reads the project's instructions, installs what's needed, and connects to your open Figma Desktop. You watch , you don't type commands.
When it says it's connected, you're done. ✅
Now describe what you want:
"Add my brand colors, then create a primary button and a secondary button."
Claude builds it in Figma instantly.
Prefer Claude Code's plugin system? This repo is also a plugin marketplace, so Claude Code learns the figma-cli workflow in any project (not just this one) after a two-line install:
/plugin marketplace add silships/figma-cli
/plugin install figma-cli@intodesignsystems
That installs a skill that teaches Claude Code how to drive figma-cli (connect
modes, the render/JSX rules, tokens, verify, a11y). The CLI itself still needs
Node ≥ 18 and its dependencies , clone this repo and run npm install once (or
ask Claude to), then open Figma Desktop and say "connect to Figma". The plugin
supplies the know-how; the local CLI does the work.
Prefer Cursor? It works exactly the same , the CLI controls Figma Desktop, not your editor, so nothing about it is Claude-only. Most people use Claude Code, but if Cursor is your tool, here's the whole setup.
Open Cursor in any folder, open the chat (the Agent), and paste:
"Install github.com/silships/figma-cli and connect it to my Figma."
Cursor downloads the project, installs it, sets up its own rules so it knows how to drive it, and connects to your open Figma Desktop. You watch , you don't type commands.
Under the hood Cursor runs one extra command for itself ,
figma-cli init-agent, which drops a small.cursor/rules/figma-cli.mdcinto your project. That's the file that teaches Cursor's Agent the rules (use real variables, wrap text properly, build N items as N components, etc.). You never edit it.
When it says it's connected, you're done. ✅
Same as Claude Code , describe what you want:
"Add my brand colors, then create a primary button and a secondary button."
Cursor builds it in Figma instantly.
Already set up in a project and just want the Cursor rules? Run figma-cli init-agent yourself , it writes the Cursor rules and an AGENTS.md (which Claude Code and Cursor both read), without touching any existing CLAUDE.md.
figma-cli talks to Figma in one of three ways. Claude picks one during setup , here's what they mean, so you know what's happening:
All three do exactly the same things. Unsure? Use Yolo. Want nothing changed on your Figma app but still want the fast direct path? Use Browser. Prefer the official plugin route? Use Safe. You can switch anytime , just ask Claude.
Yolo and Browser mode both talk to Figma over CDP on port 9222 by default. If something else on your machine already uses that port (another Chrome with remote debugging, a browser automation tool), point figma-cli at a different one:
figma-cli --port 9333 connect # flag
FIGMA_PORT=9333 figma-cli connect # or env var
Invalid values fall back to 9222, so connect keeps working out of the box.
People keep asking how figma-cli differs from Figma's official MCP and from figma-console-mcp. Short version: they talk to Figma through the cloud REST API, figma-cli talks to Figma Desktop directly on your machine. That one architectural choice changes everything downstream.
| figma-cli | Figma official MCP / figma-console-mcp | |
|---|---|---|
| How it connects | CDP → your local Figma Desktop | Figma REST API (cloud) |
| Figma token | not needed | required (figd_…) |
| Figma rate limit | none (no API calls to throttle) | yes (as low as 6 read calls/month per seat) |
| Works offline | yes | no |
| Setup | one connect command | token + plugin/bridge + (for some) port wrangling |
Figma's APIs are rate-limited, and any tool built on them (Figma's official MCP included) runs into the same ceiling. The official MCP caps the tools that read from Figma by seat: just 6 calls per month on a View/Collab seat, and 200 to 600 per day (10 to 20 per minute) even on a paid Dev/Full seat (source). AI agents read constantly, so they burn through those fast, then sit in 429 cooldowns. figma-cli sidesteps all of it because it never calls the API: it drives Figma Desktop locally over CDP. No token, no 429, works offline.
figma-cli's commands are terse and there are no large tool schemas loaded into the AI's context. Driving an MCP server, by contrast, loads its instructions + dozens of tool schemas and returns verbose JSON. Measured like-for-like in one session (tokens ≈ bytes ÷ 4, approximate):
| Task | figma-cli | API-based MCP |
|---|---|---|
| Cold start → first component | ~140 tok | ~1,600 tok (~11×) |
| Generate one token-bound component | ~68 tok | ~256–556 tok (~4–8×) |
On a fixed AI plan (e.g. Claude Pro), fewer tokens per task means you get more done before hitting your AI's usage limits too — and a leaner context means the AI keeps its facts straight instead of "forgetting" node IDs as the window fills.
Bottom line: local, no token, no rate limit, no cloud round-trip, and the lowest token cost — built for fast, reliable building and verifying from Claude Code or Cursor.
Just say it in plain language. A few examples:
Build things
Use a design system
Bring your own brand
DESIGN.md file , see below)DESIGN.md , see below)Animate (Figma Motion)
Polish & hand off
You never memorize commands. Claude knows them , you just describe the outcome.
Have a brand or a design system? Put it in a single DESIGN.md file (colors, type, spacing) and tell Claude:
"Import ~/Downloads/my-DESIGN.md into Figma."
It creates real Figma variables (primary, canvas, ink, accent, …) you can use everywhere , and you can switch a design between systems on demand ("now make it look like Vercel"). Ready-made DESIGN.md files for popular brands work too.
DESIGN.md is no longer the only way in. You can point figma-cli import directly at the source files your project already has:
tailwind.config.js) , colors, radii, spacing and font families land as Figma variables.globals.css, styles.css) , supports shadcn HSL triples, Tailwind v4 @theme blocks and oklch.tokens.json) , W3C design-tokens format and Style Dictionary files, including alias resolution.http://localhost:6006 or ./storybook-static/) , imports your component inventory (names, variants) as context for the AI. Combine with a Tailwind or CSS import to get design tokens too.Ask Claude: "Import my tailwind config" or "load our storybook at localhost:6006" and it handles the rest.
The reverse also works. Open any Figma file , yours, a client's, a Community file like GitHub's Primer , and say:
"Export the design system as markdown."
figma-cli scans every page (no truncation, even on 100k+ node files) and writes a DESIGN.md with the full token map: colors ranked by usage, the type scale, spacing, radii, shadows, plus a variant matrix for every component set (e.g. Button: variant × size × state, with all values). If the file defines real variable collections, it captures those too , every variable with its real name, all its modes (light/dark, high-contrast, whatever the system uses) and its alias chains , not just a palette sampled from fills. The file round-trips , figma-cli import recreates those collections faithfully (modes and aliases included) in any other file.
Components aren't just documented, they're addressable: figma-cli spec "Button" reads the markdown in code (zero model tokens) and returns just that one component's spec plus its reuse handle, so an agent pulls in exactly what it needs on demand instead of loading the whole file.
What it's for:
figma-cli instantiate "Button") instead of cloning a one-off copy, so your file stays consistent with the source systemHuge files stay usable: when the structure trees alone would blow an AI context window, they're split into per-page files automatically and the main DESIGN.md stays small enough to load whole (Primer Web: 67 pages, 124k nodes → a 35k-token main file).
A DESIGN.md is prose. An AI has to interpret it, so the only way to answer "is this still correct?" is a human looking at it. That is fine for building and useless for verifying.
So there is a second, deterministic half. No model takes part in it at all.
figma-cli snapshot # → design.json, a canonical contract of the file (commit it)
figma-cli rules gen # → rules/*.yaml, one contract per component
figma-cli check # verify the open file against both, exit 1 on any violation
design.json is canonical: node ids, publish keys and timestamps are stripped, unordered sets sorted, floats rounded. The same system re-extracted, or exported and re-imported, compares byte-identical, so a difference always means a real change. The YAML contracts are generated by code reading the Figma Plugin API, not written by a model, and you review them once as a git diff.
What check enforces:
pages/Page 1/frames/Button/kids/size=sm/h: 32 → 56)--roundtrip) , proof that the token layer survives export and import, which is the failure that used to silently re-import everything whiteIt exits non-zero and speaks --json, so it runs in CI. Red means changed, not wrong: if the change was intended, re-run snapshot and review the diff, exactly like a snapshot test.
Verified against GitHub's Primer (1015 nodes, 1381 variables, a 144-variant Button): repeated runs compare equal, all 576 fills and 144 strokes across every variant check out, and a one-character typo in a single variant name is caught in under a second.
What stays human is whether the contract describes the right design. You decide that once. After that it is arithmetic.
Prefer to keep everything on your machine? figma-cli also works with local LLMs (via LM Studio or Ollama) , fully offline, no cloud, no key. Ask Claude to "set up the local LLM agent" and it'll walk you through it.
40+ ready components · 40+ capabilities · 10 areas. You trigger any of these just by asking.
🧩 Components (40+ components + 3 tools)
🎨 Design systems & tokens (4)
DESIGN.md , colors, typography, radius become real Figma variables🖼️ Visuals & effects (5)
📐 Layout & structure (4)
🎬 Motion & animation (5) (Figma Motion, Config 2026 Beta)
✅ Deterministic validation (5) (no model involved, CI-ready)
design.json and catch any later drift, with the exact path that changed♿ Accessibility (4)
📦 Handoff & export (4)
🤖 Built for AI (6)
figma-cli init-agent sets up the rules for bothverify --measure) so the AI checks its own work by numbersspec --check) , no eyeballing🔒 No strings (2)
Everything above is powered by a CLI that the AI calls for you. If you want to use it directly, script it, or see every command:
Auto-layout, by example. npm run examples renders a labelled gallery of the
auto-layout patterns that are easy to get wrong , wrapping card, space-between
navbar, stretching divider, toggle knobs, bottom-pinned sidebar, wrap grid,
min/max constraints, fill chain, z-stack , onto a page called "Auto-Layout
Patterns". It then measures what Figma actually produced and fails if any
number drifts, so it is documentation and a regression test at once.
npm test # unit tests, no Figma needed
npm run examples # render + verify the pattern gallery (needs a connected Figma)
npm run test:live # the above, plus render vs render-batch layout parity
You don't need any of this to use the tool , it's here for tinkerers.
Figma plugins are slow to build and tied to one UI. AI assistants are great at describing intent but need a clean way to act on Figma. figma-cli is the bridge: it talks to Figma Desktop directly, so you can design by conversation , locally, with no API key and no cloud roundtrip.
You design. The AI builds. Figma updates.
What each connection mode touches (Yolo patches one string in Figma's app.asar, Browser and Safe Mode leave the app alone), what the local daemon does, and where credentials live: SECURITY.md. That is also the page to hand to whoever approves tools at your company.
Found a vulnerability? Report it privately via GitHub private vulnerability reporting or [email protected], not in a public issue.
Sil Bormüller, founder of Into Design Systems, the conference and training platform for design system practitioners.
Join my AI conference: AI Design Systems Conference 2027 on March 10 and 11 2027 online.
MIT. Built by Sil Bormüller.
481 followers · starred Feb 2026
594 followers · starred Aug 2026
2,020 followers · starred Mar 2026
137 followers · starred Mar 2026