Control Figma directly from your terminal.
Full read/write access to Figma Desktop via Chrome DevTools Protocol.
No API key, no plugins, no MCP server setup.
███████╗██╗ ██████╗ ███╗ ███╗ █████╗ ██████╗ ███████╗ ██████╗██╗ ██╗
██╔════╝██║██╔════╝ ████╗ ████║██╔══██╗ ██╔══██╗██╔════╝ ██╔════╝██║ ██║
█████╗ ██║██║ ███╗██╔████╔██║███████║█████╗██║ ██║███████╗█████╗██║ ██║ ██║
██╔══╝ ██║██║ ██║██║╚██╔╝██║██╔══██║╚════╝██║ ██║╚════██║╚════╝██║ ██║ ██║
██║ ██║╚██████╔╝██║ ╚═╝ ██║██║ ██║ ██████╔╝███████║ ╚██████╗███████╗██║
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝╚══════╝╚═╝
A CLI that connects directly to Figma Desktop and gives you complete control:
- Design Tokens — Create variables, collections, modes (Light/Dark), bind to nodes
- Create Anything — Frames, text, shapes, icons (150k+ from Iconify), components
- Team Libraries — Import and use components, styles, variables from any library
- Analyze Designs — Colors, typography, spacing, find repeated patterns
- Lint & Accessibility — Contrast checker, touch targets, design rules
- Export — PNG, SVG, JSX, Storybook stories, CSS variables, Tailwind config
- Batch Operations — Rename layers, find/replace text, create 100 variables at once
- Works with Claude Code — Just ask in natural language, Claude knows all commands
Other tools require MCP servers, API keys, or complex setup. This one doesn't.
| figma-ds-cli | MCP-based tools | |
|---|---|---|
| Setup | Download ZIP, npm install, done |
Configure MCP server + client |
| API Key | Not needed | Personal Access Token or OAuth |
| Claude Code | Just run claude |
Manual MCP configuration |
| AI Knowledge | CLAUDE.md included, AI knows everything |
Teach AI manually |
| Designer-friendly | Yes | Requires technical setup |
This project includes a CLAUDE.md file that Claude reads automatically. It contains:
- All available commands and their syntax
- Best practices (e.g., "use
renderfor text-heavy designs") - Common requests mapped to solutions
Example: You type "Create Tailwind colors" → Claude already knows to run node src/index.js tokens tailwind because it's documented in CLAUDE.md.
No explaining. No teaching. Just ask.
- Node.js 18+
- Figma Desktop (free account works)
- macOS, Windows, or Linux
On macOS, your Terminal needs Full Disk Access permission to patch Figma. Do this first:
- Open System Settings → Privacy & Security → Full Disk Access
- Click + and add your terminal app (Terminal, iTerm, VS Code, Warp, etc.)
- Restart your terminal (quit completely and reopen)
Without this, the CLI cannot connect to Figma.
Best for designers who want to try it once:
- Click the green Code button above
- Select Download ZIP
- Unzip the folder
- Open Terminal and navigate to the folder:
cd ~/Downloads/figma-cli-mainThat's it! No npm install needed, dependencies are included.
Best if you want automatic updates:
git clone https://github.com/silships/figma-cli.git
cd figma-cliTo update to the latest version anytime:
git pull1. Connect to Figma
node src/index.js connectThis starts Figma with remote debugging enabled.
2. Use with Claude Code
claudeThen just ask:
"Create Tailwind colors"
"Add a card component"
"Export variables as CSS"
The included CLAUDE.md teaches Claude all commands automatically.
Connects to Figma Desktop via Chrome DevTools Protocol (CDP). No API key needed because it uses your existing Figma session.
┌─────────────┐ WebSocket (CDP) ┌─────────────┐
│ figma-ds-cli │ ◄───────────────────────► │ Figma │
│ (CLI) │ localhost:9222 │ Desktop │
└─────────────┘ └─────────────┘
If you see EPERM: operation not permitted, open '.../app.asar':
1. Grant Full Disk Access to Terminal
macOS blocks file access without this permission, even with sudo.
- Open System Settings → Privacy & Security → Full Disk Access
- Click the + button
- Add Terminal (or iTerm, VS Code, Warp, etc.)
- Restart Terminal completely (quit and reopen)
2. Make sure Figma is completely closed
# Check if Figma is still running
ps aux | grep -i figma
# Force quit if needed
killall Figma3. Run init again
node src/index.js initIf still failing, try with sudo: sudo node src/index.js init
4. Manual patch (last resort)
If nothing works, you can patch manually:
# Backup original
sudo cp /Applications/Figma.app/Contents/Resources/app.asar ~/app.asar.backup
# The patch changes one string in the file
# From: removeSwitch("remote-debugging-port")
# To: removeSwitch("remote-debugXing-port")
# Use a hex editor or this command:
sudo sed -i '' 's/remote-debugging-port/remote-debugXing-port/g' /Applications/Figma.app/Contents/Resources/app.asar
# Re-sign the app
sudo codesign --force --deep --sign - /Applications/Figma.appRun Command Prompt or PowerShell as Administrator, then run node src/index.js init.
- Make sure Figma Desktop is running (not the web version)
- Check if port 9222 is available:
lsof -i :9222 - Restart Figma:
node src/index.js connect
- Create complete design systems (colors, spacing, typography, radii)
- Create Tailwind CSS color palettes (all 22 color families, 50-950 shades)
- Create and manage variable collections
- Variable modes (Light/Dark/Mobile) with per-mode values
- Batch create up to 100 variables at once
- Batch update variable values across modes
- Bind variables to node properties (fill, stroke, gap, padding, radius)
- Export variables as CSS custom properties
- Export variables as Tailwind config
- Frames with auto-layout
- Rectangles, circles, ellipses
- Text with custom fonts, sizes, weights
- Lines
- Icons (150,000+ from Iconify: Lucide, Material Design, Heroicons, etc.)
- Groups
- Components from frames
- Component instances
- Component sets with variants
- Change fill and stroke colors
- Set corner radius
- Resize and move
- Apply auto-layout (row/column, gap, padding)
- Set sizing mode (hug/fill/fixed)
- Rename nodes
- Duplicate nodes
- Delete nodes
- Flip nodes (horizontal/vertical)
- Scale vectors
- Find nodes by name
- Find nodes by type (FRAME, COMPONENT, TEXT, etc.)
- XPath-like queries (
//FRAME[@width > 300]) - Select nodes by ID
- Get node properties
- Get node tree structure
- List all nodes on canvas
- Arrange frames in grid or column
- Delete all nodes
- Zoom to fit content
- Smart positioning (auto-place without overlaps)
- Export nodes as PNG (with scale factor)
- Export nodes as SVG
- Export multiple sizes (@1x, @2x, @3x)
- Take screenshots
- Export to JSX (React code)
- Export to Storybook stories
- Export variables as CSS
- Export variables as Tailwind config
- Create sticky notes
- Create shapes with text
- Connect elements with arrows
- List FigJam elements
- Run JavaScript in FigJam context
- List available library variable collections
- Import variables from libraries
- Import components from libraries
- Create instances of library components
- Import and apply library styles (color, text, effect)
- Bind library variables to node properties
- Swap component instances to different library components
- List all enabled libraries
- Batch rename layers (with patterns: {n}, {name}, {type})
- Case conversion (camelCase, PascalCase, snake_case, kebab-case)
- Lorem ipsum generator (words, sentences, paragraphs)
- Fill text with placeholder content
- Insert images from URL
- Unsplash integration (random stock photos by keyword)
- Contrast checker (WCAG AA/AAA compliance)
- Check text contrast against background
- Find and replace text across all layers
- Select same (fill, stroke, font, size)
- Color blindness simulation (deuteranopia, protanopia, tritanopia)
- Analyze colors — usage frequency, variable bindings
- Analyze typography — all font combinations used
- Analyze spacing — gap/padding values, grid compliance
- Find clusters — detect repeated patterns (potential components)
- Visual diff — compare two nodes
- Create diff patch — structural patches between versions
- Design linting with 8+ rules:
no-default-names— detect unnamed layersno-deeply-nested— flag excessive nestingno-empty-frames— find empty framesprefer-auto-layout— suggest auto-layoutno-hardcoded-colors— check variable usagecolor-contrast— WCAG AA/AAA compliancetouch-target-size— minimum 44x44 checkmin-text-size— minimum 12px text
- Accessibility snapshot — extract interactive elements tree
- Create component sets with variants
- Add variant properties
- Combine frames into component sets
- Organize variants into grid with labels
- Auto-generate component sets from similar frames
- Add descriptions to components (supports markdown)
- Document with template (usage, props, notes)
- Read component descriptions
- Set up grid layout with columns and rows
- Configure column/row gaps
- Auto-reorganize children into grid
- Capture console logs from Figma
- Execute code with log capture
- Reload page
- Navigate to files
- Execute any Figma Plugin API code directly
- Render complex UI from JSX-like syntax
- Full programmatic control over Figma
- Match vectors to Iconify icons
- Comments (read/write/delete) — requires Figma API key
- Version history
- Team/project management
Sil Bormüller — intodesignsystems.com
This CLI is built on top of figma-use by dannote — an excellent Figma CLI with JSX rendering, XPath queries, design linting, and much more.
We use figma-use for:
- JSX rendering (
rendercommand) - Node operations (
node tree,node to-component, etc.) - Design analysis (
analyze colors,analyze typography) - Design linting (
lint) - And many other features
Big thanks to dannote for figma-use!
MIT