What is MCP & Why Should I Care?
The bridge between your AI assistant and the tools you actually use every day.
What exactly is MCP (Model Context Protocol)?
+Imagine you're a brilliant architect, but you can only communicate through handwritten letters. Frustrating, right? That was Claude before MCP. The Model Context Protocol (MCP) is like giving Claude a direct phone line to your favorite tools — Figma, GitHub, Slack, databases, and more.
MCP is an open standard created by Anthropic that lets AI models like Claude talk to external applications through a structured, secure protocol. Instead of you copy-pasting designs, Claude can directly read your Figma files, inspect components, pull design tokens, and even understand your entire design system — all in real time.
Figma
Design files, components,
tokens, styles
MCP Server
Translates between
Figma API & Claude
Claude
Understands designs,
generates code
Think of the MCP server as a universal translator. Figma speaks REST API. Claude speaks MCP. The server sits in the middle and makes sure they understand each other perfectly.
Why does this matter for my design-to-code workflow?
+Here's the painful truth: the gap between design and code is where projects go to die. Designers spend weeks crafting pixel-perfect UIs. Developers squint at Figma specs and rebuild from scratch. Details get lost. Colors shift. Spacing drifts. Everyone's frustrated.
With MCP, Claude becomes the ultimate translator between these two worlds. It reads your Figma designs with the precision of a developer and the sensibility of a designer. It understands that your "Primary Button" component maps to a specific React component with specific props. It knows your spacing scale, your color tokens, your typography system.
Setting Up the Figma MCP Server
There are two ways to connect Figma to Claude — a quick UI-based flow for designers and a manual CLI setup for developers. But first, it helps to understand the two Claude products that support this integration, since which one you use determines your setup path.
| Claude Desktop GUI App | Claude Code CLI / VS Code | |
|---|---|---|
| What it is | Standalone desktop app with a chat interface. Also powers Cowork mode for non-developers. | Command-line tool for agentic coding. Runs in your terminal or as a VS Code extension inside the IDE's integrated terminal. |
| Interface | GUI — visual chat window, settings panel, integrations menu | Terminal-based — all configuration via CLI commands or JSON files |
| Figma setup path | Track A Quick Start (OAuth connector) or Track B Developer Setup | Track B only Developer Setup (manual MCP config) |
| MCP configuration | Built-in integrations panel or manual claude_desktop_config.json |
.mcp.json in project root or claude mcp add CLI command |
| VS Code? | No — separate standalone app | Yes — available as a VS Code extension. Runs Claude Code inside VS Code's terminal. Still uses CLI-based MCP config (Track B). |
| Figma tools available | All: get_design_context, get_screenshot, get_metadata, get_variable_defs, etc. |
All: identical tool set once MCP is configured |
| Best for | Designers, PMs, anyone wanting a visual interface. Quick prototyping, design reviews, handoff conversations. | Developers building from Figma designs. CI/CD pipelines, team-wide config, code generation workflows. |
| Criteria | Quick Start Native Connector | Developer Setup Manual MCP |
|---|---|---|
| Time to connect | ~30 seconds | 10–30 minutes |
| Terminal required | No | Yes — Node.js, npx, JSON config |
| Authentication | OAuth (browser pop-up) | Personal Access Token (manual) |
| Token rotation | Handled automatically | Manual — you set expiry & rotate |
| Permission scopes | Pre-configured by Claude | Full manual control per scope |
| Works with | Claude Desktop, Cowork mode only | Everything: Claude Code (CLI), VS Code extension, Claude Desktop, CI/CD pipelines. |
| Cross-platform? | No — only works inside Claude Desktop / Cowork. Doesn't carry over to Claude Code or VS Code. | Yes — a single .mcp.json config works in Claude Code, VS Code, and Claude Desktop. Set it up once, use it everywhere. |
| Custom MCP server | No — uses Anthropic's hosted server | Yes — clone, modify, extend freely |
| Advanced workflows | Not available. Design reviews, token extraction, and code generation via chat only. | Unlocks: CI/CD pipelines (auto-extract tokens on Figma publish), scheduled design audits, webhook-triggered code generation, batch processing across multiple files, headless/scripted runs. |
| Team/shared config | Per-user only — each person connects independently | Commit .mcp.json to repo for whole team. New devs clone the repo and they're ready. |
| Ideal for | Designers, PMs, quick prototyping, design reviews | Developers, cross-tool workflows, teams, CI/CD, anyone who works in both Claude Desktop and Claude Code |
Track A: Quick Start
Use Claude's built-in Figma connector. Authenticate via OAuth in your browser — no Node.js, no tokens, no config files. Claude handles the MCP server for you behind the scenes.
- Zero technical setup — just click and authorize
- Token refresh and rotation handled automatically
- Works immediately in Claude Desktop & Cowork mode
- No risk of token leaks in repos or config files
- Not available in Claude Code (CLI) or VS Code extension
- No custom scope selection — uses default permissions
- Cannot modify or extend the MCP server
- Per-user only — can't share config with your team via a repo
Track B: Developer Setup
Manually install the Figma MCP server, generate a Personal Access Token, and configure Claude via JSON. Full control over scopes, versioning, and team-wide configuration.
- Works everywhere — Claude Code, VS Code, Claude Desktop, CI/CD
- Granular control over every permission scope
- Commit
.mcp.jsonto your repo for shared team config - Clone & customize the MCP server source code
- Requires Node.js v18+ and terminal comfort
- Manual token generation, storage, and rotation
- Risk of token leaks if not stored in env variables
- JSON config errors can be hard to debug
Track A: Quick Start — Native Connector Connect Figma to Claude in under a minute, no terminal required
How do I connect Figma using Claude's built-in connector?
+Claude Desktop and Cowork mode include a native Figma connector that handles the entire MCP setup behind the scenes. No Node.js, no tokens to manage, no JSON files to edit. Here's all you need to do:
Open Integrations
In Claude Desktop, go to Settings → Integrations (or click the integrations icon in the sidebar). In Cowork mode, Claude will prompt you to connect when it detects a Figma-related task, or you can manually trigger it.
Click "Connect Figma"
Find Figma in the available connectors list and click Connect. A browser window will open with Figma's OAuth authorization screen. Sign in to your Figma account if you aren't already.
Authorize & Done
Click "Allow" on Figma's authorization page. The browser tab will close automatically and you'll see a green "Connected" status back in Claude. That's it — you can now paste any Figma URL into your conversation and Claude will read the design.
figma-developer-mcp package described in the Developer Setup, but hosted and maintained by Anthropic. You get the same get_design_context, get_screenshot, get_metadata, and get_variable_defs tools — zero configuration required.What permissions does the native connector request?
+The native connector requests a sensible default set of read-only scopes: File content (Read), Dev resources (Read), and Variables (Read). This gives Claude everything it needs to read your designs, extract tokens, and understand your component library — without any write access to your files. You can review the exact permissions on the OAuth screen before clicking "Allow."
Can I use this with Claude Code or the VS Code extension?
+No. Claude Code is a terminal-based tool — whether you run it directly in your terminal or through the VS Code extension (which is Claude Code running inside VS Code's integrated terminal). Neither has a GUI integrations panel, so there's no OAuth connector to click. If you work in Claude Code or VS Code, you'll need the Developer Setup (Track B) to manually configure the Figma MCP server. The good news: the claude mcp add command makes it a one-liner once you have your token.
Track B: Developer Setup — Manual MCP Configuration Full control over tokens, scopes, and server configuration for Claude Code and advanced workflows
What do I need before I start?
+The Developer Setup gives you full control over how Claude talks to Figma — custom scopes, team-shared configs, and the ability to modify the MCP server itself. The trade-off is you'll need a terminal and a few minutes of setup. Before we dive in, let's make sure your toolbox is ready. You'll need four things:
Node.js (v18+)
The MCP server runs on Node. Install it from nodejs.org or use nvm if you're fancy.
A Figma Account with API Access
You'll need a Personal Access Token from Figma. Free accounts work, but team/enterprise unlocks more component features.
Claude Desktop App or Claude Code
MCP servers connect through Claude Desktop or the CLI tool Claude Code. Both support MCP configuration.
Your Design System in Figma
For the full code-to-Figma workflow, you'll want a published component library in Figma. This is your source of truth.
How do I install Node.js step by step?
+The MCP server needs Node.js to run. Here's how to install it on each platform, including verification that everything works:
Option A: Direct Install (simplest)
Download from nodejs.org
Visit nodejs.org and download the LTS (Long Term Support) version — not "Current." LTS is more stable and is what the MCP server is tested against. As of writing, that's v20.x or v22.x.
Run the Installer
On macOS: Open the .pkg file and follow the wizard. It installs to /usr/local/. On Windows: Run the .msi installer. Check the box to "Add to PATH" when prompted — this is critical. On Linux: Use your package manager: sudo apt install nodejs npm (Ubuntu/Debian) or sudo dnf install nodejs (Fedora).
Verify the Installation
Open a new terminal window (important — existing terminals won't see the new PATH). Run these three commands to confirm everything is ready:
# Check Node.js version (must be 18+) $ node --version v20.11.0 # ✓ Good — v18 or higher # Check npm (comes bundled with Node) $ npm --version 10.2.4 # ✓ Good — any recent version works # Check npx (this is what the MCP server uses) $ npx --version 10.2.4 # ✓ Good — npx must be available
Option B: Using nvm (recommended for developers)
Node Version Manager lets you install and switch between multiple Node versions. This is ideal if you work on projects requiring different Node versions:
# Install nvm (macOS / Linux) $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # Close and reopen your terminal, then: $ nvm install --lts $ nvm use --lts $ node --version v20.11.0 # On Windows, use nvm-windows instead: # Download from github.com/coreybutler/nvm-windows $ nvm install lts $ nvm use lts
npx returns "command not found" after installing Node, your terminal's PATH isn't updated. Close ALL terminal windows and open a fresh one. On macOS, you may need to restart your machine or run source ~/.zshrc. On Windows, sign out and back in.How do I get a Figma Personal Access Token?
+Getting your Figma API token is your golden ticket to this whole workflow. Here's how:
Open Figma Settings
Click your profile avatar in the top-left corner of Figma (web or desktop) and select "Settings".
Navigate to Personal Access Tokens
Scroll down to the "Personal access tokens" section. Click "Generate new token".
Name It & Set Permissions
Give it a descriptive name like claude-mcp-integration. You'll see a list of permission scopes — select carefully based on what you need (see the detailed scope breakdown below).
Set an Expiration Date
Figma lets you set token expiry. For security, choose 90 days rather than "No expiration." Set a calendar reminder to rotate it before it expires. You can always generate a new one.
Copy & Store Securely
Copy the token immediately — you won't see it again! Store it in a password manager (1Password, Bitwarden, etc.) or as an environment variable on your machine. Never paste it into a Slack message, email, or shared doc.
Understanding Figma Token Permission Scopes:
When you create your token, Figma asks you to select scopes. Here's what each one does and whether you need it for the MCP workflow:
| Scope | What It Allows | Required? |
|---|---|---|
| File content (Read) | Read file structure, layers, frames, components, styles, properties. This is the core scope for the MCP server — without it, Claude can't see anything in your files. | Required |
| File content (Write) | Create and modify files, add comments. Needed if you want Claude to use the official MCP's write Skills to push changes back into Figma. Recommended for code-to-Figma workflows. | Recommended |
| Dev resources (Read) | Access Dev Mode data: code snippets, measurements, design tokens as displayed in Dev Mode. Enhances the quality of extracted information. | Recommended |
| Variables (Read) | Read Figma Variables (design tokens like colors, spacing, typography defined as variables). Essential if your team uses Figma's native Variables feature for tokens. | Recommended |
| Webhooks (Write) | Create webhooks for real-time file change notifications. Only for advanced CI/CD pipelines that need to trigger on Figma file saves. | Optional |
| Comments (Read/Write) | Read and post comments on files. Useful if you want Claude to read design feedback or post implementation notes directly on Figma frames. | Optional |
| Library analytics (Read) | View component usage analytics across your organization. Helps identify which components are most used and should be prioritized in code generation. | Optional |
FIGMA_PERSONAL_ACCESS_TOKEN instead. See the "Storing Your Token Safely" question below for the full setup.How do I store my Figma token safely using environment variables?
+Hardcoding your token directly into config files is a bad habit — especially if those files end up in version control. Here's how to set up environment variables on each platform so your token stays safe:
macOS / Linux (Zsh or Bash):
# Add to your shell profile (one-time setup) # For Zsh (default on modern macOS): $ echo 'export FIGMA_PERSONAL_ACCESS_TOKEN="figd_xYz123..."' >> ~/.zshrc $ source ~/.zshrc # For Bash (Linux default): $ echo 'export FIGMA_PERSONAL_ACCESS_TOKEN="figd_xYz123..."' >> ~/.bashrc $ source ~/.bashrc # Verify it's set: $ echo $FIGMA_PERSONAL_ACCESS_TOKEN figd_xYz123... # ✓ You should see your token
Windows (PowerShell):
# Set permanently for your user account: PS> [System.Environment]::SetEnvironmentVariable( "FIGMA_PERSONAL_ACCESS_TOKEN", "figd_xYz123...", "User" ) # Or via System Properties: # Win+R → sysdm.cpl → Advanced → Environment Variables # Add a new User variable with: # Name: FIGMA_PERSONAL_ACCESS_TOKEN # Value: figd_xYz123... # Restart your terminal, then verify: PS> echo $env:FIGMA_PERSONAL_ACCESS_TOKEN figd_xYz123...
Using a .env file (project-level):
# Create a .env file in your project root FIGMA_PERSONAL_ACCESS_TOKEN=figd_xYz123AbCdEfGhIjKlMnOp
.env file, immediately add it to your .gitignore: echo ".env" >> .gitignore. Also add .env.local, .env.*.local, and any other variants. A leaked Figma token gives full read access to your design files.How do I install and configure the Figma MCP Server?
+Here's where things get exciting. The Figma MCP server is available as an npm package. You can set it up in two ways:
Option A: Quick Setup (npx — no installation needed)
You can run the server directly with npx. This is the fastest way to get started, and it's what you'll reference in your Claude config. npx downloads and runs the package on demand — no npm install needed.
# Run the server directly to test it works $ npx -y figma-developer-mcp --figma-api-key=YOUR_TOKEN # You should see output like: Figma MCP Server running on stdio # Press Ctrl+C to stop — this was just a test
Option B: Clone from GitHub (for more control)
If you want to inspect the source, customize behavior, or pin to a specific version:
# Clone the official repository $ git clone https://github.com/anthropics/figma-developer-mcp.git $ cd figma-developer-mcp # Install dependencies $ npm install # Build the TypeScript source $ npm run build # Test it runs correctly $ node dist/index.js --figma-api-key=YOUR_TOKEN Figma MCP Server running on stdio
Next, you need to tell Claude where to find this server. The configuration differs based on whether you're using Claude Desktop or Claude Code:
For Claude Desktop App:
Edit (or create) your Claude Desktop configuration file. The location depends on your operating system:
macOS Config Location
~/Library/Application Support/Claude/claude_desktop_config.json
To open this folder: In Finder, press Cmd+Shift+G and paste the path. Or in Terminal: open ~/Library/Application\ Support/Claude/. If the Claude folder doesn't exist, create it.
Windows Config Location
%APPDATA%\Claude\claude_desktop_config.json
To open this folder: Press Win+R, type %APPDATA%\Claude, and hit Enter. If the Claude folder doesn't exist, create it. The full path is typically C:\Users\YourName\AppData\Roaming\Claude\.
Linux Config Location
~/.config/Claude/claude_desktop_config.json
Create the directory if needed: mkdir -p ~/.config/Claude. Then create the file with your text editor of choice.
Using npx (recommended — simplest approach):
{
"mcpServers": {
"figma": {
"command": "npx",
"args": [
"-y",
"figma-developer-mcp",
"--figma-api-key=YOUR_TOKEN_HERE"
]
}
}
}
Using an environment variable (more secure):
{
"mcpServers": {
"figma": {
"command": "npx",
"args": [
"-y",
"figma-developer-mcp"
],
"env": {
"FIGMA_PERSONAL_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
}
}
}
}
Using a locally cloned build:
{
"mcpServers": {
"figma": {
"command": "node",
"args": [
"/absolute/path/to/figma-developer-mcp/dist/index.js",
"--figma-api-key=YOUR_TOKEN_HERE"
]
}
}
}
/Users/jane/dev/figma-developer-mcp/dist/index.js) — not a relative path. Claude Desktop doesn't resolve ~/ or relative paths the same way your terminal does.For Claude Code (CLI):
Claude Code offers two approaches — a config file or an interactive command:
Method 1: Project config file (.mcp.json)
{
"mcpServers": {
"figma": {
"command": "npx",
"args": ["-y", "figma-developer-mcp",
"--figma-api-key", "YOUR_TOKEN"
]
}
}
}
Method 2: Claude Code CLI command (interactive)
# Add the Figma MCP server to your project $ claude mcp add figma -- npx -y figma-developer-mcp \ --figma-api-key YOUR_TOKEN # Or add it globally (available in all projects) $ claude mcp add --scope user figma -- npx -y figma-developer-mcp \ --figma-api-key YOUR_TOKEN # List all configured MCP servers to verify $ claude mcp list figma: npx -y figma-developer-mcp --figma-api-key=figd_...
.mcp.json if your whole team needs Figma access (commit it to your repo with a placeholder token). Use claude mcp add --scope user if it's just for you and you want it available across all projects. The CLI command is simpler for one-off setups.How do I find and copy the right Figma file URL?
+The Figma URL you share with Claude matters — different URL formats give Claude different levels of access. Here's how to get the right one:
Full File URL (most common)
Open your Figma file in the browser or desktop app. Copy the URL from the address bar. It looks like: https://www.figma.com/design/AbC123xYz/My-Design-System. This gives Claude access to the entire file — all pages, all frames, all components.
Specific Frame/Node URL (more targeted)
Right-click any frame in Figma and choose "Copy link to selection" (or select the frame and press Ctrl/Cmd+L). The URL will include a node-id parameter: ?node-id=123:456. This tells Claude exactly which frame to focus on — much faster for large files.
Component URL
In the Assets panel, right-click a component and choose "Copy link". This links directly to the main component definition, which is ideal when you want Claude to inspect a specific component's structure, variants, and properties.
/* Full file URL */ https://www.figma.com/design/FILE_KEY/File-Name /* URL with specific page */ https://www.figma.com/design/FILE_KEY/File-Name?node-id=PAGE_ID /* URL with specific frame/component */ https://www.figma.com/design/FILE_KEY/File-Name?node-id=123:456 /* The FILE_KEY is the important part — it's the unique */ /* identifier Claude uses to access your file via the API */
node-id rather than the entire file. This reduces API calls, speeds up Claude's response, and produces more focused output. You can say: "Read this Figma frame: [URL with node-id]. Convert just this frame to code."How do I publish my Figma component library so Claude can see it?
+This is a crucial Figma-side step that many people miss. Claude's get_components MCP tool only returns published components — local/unpublished components won't show up. Here's how to set up and publish your library:
Organize Your Components
In your Figma design system file, make sure every reusable element is a component (not just a frame). Select the element and press Ctrl/Cmd+Alt+K to create a component. Use slash naming for hierarchy: Button/Primary/Large, Input/Text/Default. This naming structure becomes the component's API that Claude reads.
Set Up Variants
For components with multiple states (e.g., Button with Primary/Secondary/Ghost), combine them into a Component Set. Select all variants, right-click, and choose "Combine as variants." Define properties like Type=Primary, Size=Medium, State=Default. Claude reads these variant properties and maps them to component props in code.
Add Descriptions
Select each component and add a description in the right panel. Something like: "Primary action button. Use for main CTAs. Supports icon-left and icon-right slots." Claude reads these descriptions and uses them to generate better code comments and prop documentation.
Publish the Library
In the Figma toolbar, go to the Assets panel (left sidebar). Click the book icon or go to the Figma menu → Libraries → Publish. Write a version description (e.g., "v2.4 — Added DataTable component, updated Button hover states"). Click "Publish". Your components are now available via the API.
Set Up Figma Variables (optional but powerful)
Go to Local variables (right panel) and define your design tokens as Figma Variables: colors (primitives like purple/500 and semantics like color/primary), spacing (space/sm=8, space/md=16), and border-radius. Bind these variables to your components. When Claude reads via MCP with the Variables scope, it can extract these as a structured token system.
Setting Up Talk to Figma MCP (Unofficial)
Talk to Figma MCP is a community-built server that gives Claude read and write access to Figma via a WebSocket bridge and a Figma plugin. The official Figma MCP now also supports write operations via Skills -- Talk to Figma MCP remains a popular alternative with a different architecture and toolset.
| Official Figma MCP Read + Write (via Skills) | Talk to Figma MCP Read + Write (via Plugin API) | |
|---|---|---|
| Access type | Read AND write via Figma REST API + Skills | Read AND write via Figma Plugin API |
| Can create/modify? | Yes — via Skills: create components, modify layouts, update styles, and more | Yes — create shapes, text, frames; set fills, strokes, auto-layout; batch-update text nodes |
| How it works | API token authenticates with Figma's REST API; Skills enable write operations | WebSocket bridge relays commands to a Figma plugin running inside Figma Desktop |
| Runtime requirement | Node.js (npx) | Bun runtime + WebSocket bridge + Figma Desktop with plugin running |
| Works with | Claude Desktop, Claude Code, VS Code, Cursor | Claude Desktop, Claude Code, VS Code, Cursor |
| Maintained by | Figma (official) | Community (arinspunk/claude-talk-to-figma-mcp) |
| Best for | Full round-trip workflows, design-to-code, code-to-Figma via Skills, token extraction, design reviews | Granular canvas control, low-level prototyping, text replacement, bulk modifications via individual tool calls |
Your AI client sends commands via MCP to the server, which relays them over WebSocket (port 3055) to a Figma plugin running inside Figma Desktop. The plugin executes commands using Figma's Plugin API and sends results back through the same chain.
| Variant | Best For | Repository |
|---|---|---|
| grab/cursor-talk-to-figma-mcp | Claude Code, Cursor, VS Code | github.com/grab/cursor-talk-to-figma-mcp |
| arinspunk/claude-talk-to-figma-mcp | Claude Desktop (DXT one-click install) | github.com/arinspunk/claude-talk-to-figma-mcp |
What do I need before I start?
+Talk to Figma MCP requires a different runtime and setup compared to the official Figma MCP. Here is what you need:
Figma Desktop App
The plugin that enables write access runs inside Figma Desktop (not the web version). Make sure it is installed and you are logged in. A full or Dev seat is recommended for higher API rate limits.
Bun Runtime
The MCP server and WebSocket bridge run on Bun (not Node.js). Install it with a single command — see below.
An AI Client with MCP Support
Claude Desktop, Claude Code, Cursor, or VS Code with MCP support. The setup differs slightly per client — covered in the configuration questions below.
Install Bun:
# macOS / Linux $ curl -fsSL https://bun.sh/install | bash # Windows (PowerShell) $ powershell -c "irm bun.sh/install.ps1 | iex" # Restart your terminal, then verify: $ bun --version 1.x.x # Any recent version works
How do I set this up with Claude Desktop?
+There are two ways to configure Talk to Figma MCP in Claude Desktop — a one-click DXT install or manual JSON configuration.
Method 1: DXT Install (fastest)
Download the DXT Package
Go to the arinspunk/claude-talk-to-figma-mcp releases page on GitHub. Download claude-talk-to-figma-mcp.dxt from the Assets section.
Install and Restart
Double-click the .dxt file. Claude Desktop configures itself automatically. Restart Claude Desktop, then skip ahead to the "WebSocket bridge and Figma plugin" question below.
Method 2: Manual JSON Configuration
Open your Claude Desktop config file (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json | Windows: %APPDATA%\Claude\claude_desktop_config.json) and add:
{
"mcpServers": {
"TalkToFigma": {
"command": "npx",
"args": ["-p", "claude-talk-to-figma-mcp@latest", "claude-talk-to-figma-mcp-server"]
}
}
}
{
"mcpServers": {
"TalkToFigma": {
"command": "bunx",
"args": ["cursor-talk-to-figma-mcp@latest"]
}
}
}
Save the file and restart Claude Desktop.
How do I set this up with Claude Code?
+Claude Code setup is a one-liner via the CLI, or you can add it manually to your project's .mcp.json:
$ claude mcp add TalkToFigma -- bunx cursor-talk-to-figma-mcp@latest
Or manually add to your project's .mcp.json:
{
"mcpServers": {
"TalkToFigma": {
"command": "bunx",
"args": ["cursor-talk-to-figma-mcp@latest"]
}
}
}
Restart Claude Code if it was running. Type /mcp in Claude Code to verify that TalkToFigma appears as a connected server.
How do I start the WebSocket bridge and install the Figma plugin?
+Regardless of which AI client you use, you need two additional things running: the WebSocket bridge (in a terminal) and the Figma plugin (inside Figma Desktop). Both must be active for write operations to work.
Start the WebSocket Bridge:
$ bunx cursor-talk-to-figma-mcp@latest socket # You should see: WebSocket server started on port 3055
Install the Figma Plugin:
Install from Figma Community
Open Figma Desktop. Go to Plugins → Search and search for "Talk to Figma MCP Plugin". Click Install or Try it out. Alternatively, visit the plugin page directly: figma.com/community/plugin/1485687494525374295
Run the Plugin and Get Channel ID
Open a design file. Right-click on canvas → Plugins → Talk to Figma MCP Plugin. The plugin displays a Channel ID (e.g., 959ykpvn). Copy this value.
Join the Channel from Claude
In Claude Desktop or Claude Code, tell Claude to join the channel. For example: Join channel 959ykpvn. You should see a confirmation that the connection is established. You now have bidirectional read/write access to that Figma file.
What tools are available once connected?
+Talk to Figma MCP exposes approximately 23 tools across four categories:
| Category | Key Tools | What They Do |
|---|---|---|
| Reading | get_document_info, get_selection, read_my_design, get_node_info |
Inspect the current document, get details about selected or specific nodes |
| Creation | create_rectangle, create_frame, create_text |
Create shapes, frames, and text nodes with position, size, name, and color |
| Modification | set_fill_color, set_stroke_color, set_text_content, set_corner_radius |
Change fills, strokes, text content, corner radius on existing nodes. Batch text updates via set_multiple_text_contents |
| Layout | set_layout_mode, set_padding, set_axis_align, set_item_spacing |
Configure auto-layout direction, padding, alignment, spacing, and sizing modes |
Create a red rectangle at position (100, 100) with size 200x100 to verify write access is working. Then try Get my current selection, then change its fill color to blue to test read + modify.What if something is not working?
+"Empty results" or commands not executing
Check three things: Is the WebSocket bridge running? (bunx ... socket in a terminal on port 3055). Is the Figma plugin open in the file you are working with? Did you join the correct channel ID? The ID changes each time you restart the plugin.
"Connection refused" errors
Make sure nothing else is using port 3055. Try restarting the WebSocket bridge. On macOS, check with lsof -i :3055 to see if another process has claimed the port.
Plugin not appearing in Figma
Ensure you installed it from Figma Community (or imported the manifest for dev mode). Try restarting Figma Desktop. The plugin only works in the Desktop app, not the web version.
MCP server not showing in Claude
For Claude Desktop: restart the app after editing claude_desktop_config.json. For Claude Code: run /mcp to check status; try claude mcp remove TalkToFigma then re-add. Ensure Bun is installed and available in your PATH.
What are the limitations of Talk to Figma MCP?
+Low-level Operations Only
The MCP creates individual shapes, text nodes, and frames. It does not have high-level primitives like "create a login form" or "build a component from React." Claude must decompose complex designs into individual API calls.
No Reusable Component Creation
You can create frames, shapes, and text, but creating reusable Figma components with variants requires more advanced Plugin API features that are not all exposed through the MCP tools.
One File at a Time
The plugin connects to one Figma file per channel. To work across multiple files simultaneously, you would need multiple plugin instances with separate channel IDs.
Bridge Must Stay Running
If the WebSocket bridge terminal closes, write access is lost immediately. You will need to restart the bridge and re-join the channel to resume.
Connecting Claude to Figma
Time to see the magic happen. Let's make sure Claude can see your designs.
I used the native connector (Track A) — how do I verify it's working? Track A
+If you connected Figma through Claude Desktop's built-in connector (Settings → Integrations), verification is straightforward — no terminal commands or config file checks needed.
Check the Integrations Panel
Go to Settings → Integrations in Claude Desktop. Find Figma in the list. You should see a green "Connected" badge next to it. If you see "Not connected" or "Error," click the connector to re-authorize.
Test with a Figma URL
Open a new conversation and paste a Figma file URL. Ask Claude something like: "What's in this Figma file? [URL]". If Claude responds with file structure details (pages, frames, components), you're fully connected.
Check Available Tools
In the chat input area, look for the tools indicator (hammer icon or number). Click it — you should see Figma tools listed: get_design_context, get_screenshot, get_metadata, get_variable_defs, and others. If these appear, your connection is fully operational.
How do I properly restart Claude to pick up the MCP config? Track B
+After saving your config file, Claude won't automatically detect changes. You need to restart properly — and the method differs by platform:
Claude Desktop on macOS
Option 1 (Quick): Right-click the Claude icon in the Dock → "Quit." Then reopen from Applications. Option 2 (Thorough): Press Cmd+Q to fully quit, wait 3 seconds, then relaunch. Do not just close the window — that leaves Claude running in the background without reloading configs. Option 3: In the Claude menu bar, look for a "Reload MCP Servers" option if available.
Claude Desktop on Windows
Right-click Claude in the system tray (bottom-right near the clock) → "Quit" or "Exit." Wait a few seconds, then relaunch from the Start menu. If Claude doesn't appear in the tray, open Task Manager (Ctrl+Shift+Esc), find any "Claude" processes, end them, then relaunch.
Claude Code (CLI)
Simply exit your current Claude Code session (/exit or Ctrl+C) and start a new one with claude. Claude Code reads the MCP config fresh on each session start. If you used claude mcp add, the change takes effect immediately in new sessions.
Claude Code in VS Code
The VS Code extension runs Claude Code in the integrated terminal. To reload MCP config: close your current Claude Code panel, then open a fresh one via Ctrl+Shift+P (or Cmd+Shift+P on macOS) → "Claude Code: New Session". The new session reads your .mcp.json or globally configured MCP servers from scratch. Alternatively, if you used claude mcp add in the VS Code terminal, just start a new session.
How do I verify the connection is working? Track B
+After restarting Claude, it's time for the moment of truth. Here's exactly what to look for and how to test, step by step:
Step 1: Check the MCP indicator in Claude Desktop
Look at the bottom of the Claude Desktop chat input area. You should see a small hammer icon (🔨) or a tools indicator with a number. Click it — a panel should appear listing your connected MCP servers. Look for "figma" in the list. If it shows a green dot or checkmark, the server is connected and running.
Step 2 (Claude Code): Check via CLI
# Inside a Claude Code session, type: /mcp # You should see output like: MCP Servers: figma — connected Tools: get_file, get_styles, get_components, get_node, ... Status: running
Step 3: Run a live test
Ask Claude to read a Figma file. Use a simple file you own — ideally one with a few frames and some components:
You: Can you read my Figma file and tell me what's in it? Here's the URL: https://www.figma.com/design/YOUR_FILE_KEY/Your-File-Name /* If the connection works, Claude will respond with: */ Claude: I'll read your Figma file now... ✓ Successfully connected to Figma! Your file "Your File Name" contains: - 3 pages: Home, Components, Tokens - 24 frames across all pages - 12 published components ... /* If the connection fails, you'll see something like: */ Claude: I tried to read the file but encountered an error: Error: 403 Forbidden — The token doesn't have access to this file, or the token is invalid.
The tools you should see available:
get_file
Retrieves the full structure of a Figma file — frames, components, layers, everything. This is Claude's X-ray vision into your designs. Parameters: fileKey (from the URL), optional depth to control how deep into the tree to read.
get_styles
Pulls your design tokens: colors, typography, effects, and grid styles. The DNA of your design system. Returns: an array of style objects with names, descriptions, and visual values (hex colors, font properties, shadow definitions).
get_components
Lists all published components and component sets in your library. Claude learns your design vocabulary. Returns: component names, descriptions, variant properties, and their node IDs for further inspection.
get_node
Zooms into a specific node/element by ID. Perfect for examining a particular component or frame in detail. Parameters: fileKey and nodeId. Returns: the full subtree of that node — all children, properties, styles, and layout info.
get_images
Exports specific nodes as images (PNG, SVG, JPG, PDF). Useful when Claude needs to reference how a particular section looks visually, or when exporting assets. Parameters: fileKey, nodeIds, format, scale.
npx is accessible from your system PATH.My first connection isn't working — how do I diagnose the problem? Track B
+Connection issues are almost always one of five things. Here's a systematic diagnostic checklist:
Invalid JSON in config file
The #1 cause. A missing comma, an extra trailing comma, or a mismatched bracket breaks the entire file. Paste your config into jsonlint.com to validate. Common trap: JSON doesn't allow comments — remove any // ... lines.
Token is invalid or expired
Test your token directly with a curl command. Open a terminal and run: curl -H "X-Figma-Token: YOUR_TOKEN" https://api.figma.com/v1/me. If you get back your user info, the token works. If you get a 403, generate a new one.
npx not in PATH
Claude Desktop uses a minimal PATH that may not include where Node.js is installed. Try using the full absolute path to npx in your config: on macOS, run which npx in Terminal (typically /usr/local/bin/npx), then use that path as the "command" value instead of just "npx".
Config file in the wrong location
The file must be named exactly claude_desktop_config.json and placed in the exact directory for your OS. A common mistake is saving it as claude_desktop_config.json.txt (Windows hides extensions by default). Enable "Show file extensions" in File Explorer settings.
Network/firewall blocking the connection
Corporate firewalls or VPNs may block outgoing connections to api.figma.com. If you're on a work network, try switching to a personal network to test. If it works there, you'll need to whitelist Figma's API endpoints with your IT team.
# 1. Test your token directly $ curl -s -H "X-Figma-Token: YOUR_TOKEN" \ https://api.figma.com/v1/me | head -5 {"id":"123","email":"you@company.com","handle":"YourName"} # ✓ Token is valid if you see your info # 2. Test npx is available and can find the package $ npx -y figma-developer-mcp --help # Should print help info, not "command not found" # 3. Find the absolute path to npx (for config) $ which npx /usr/local/bin/npx # Use this full path in your config if "npx" alone doesn't work # 4. Validate your config JSON $ cat ~/Library/Application\ Support/Claude/claude_desktop_config.json | python3 -m json.tool # If it prints formatted JSON, syntax is valid # If it shows "Expecting..." error, you have a JSON syntax issue
What can Claude actually "see" in my Figma file?
+This is where it gets mind-blowing. When Claude reads your Figma file through MCP, it doesn't just see a flat image — it sees the entire design tree, similar to how a browser sees HTML DOM. Specifically, Claude can read:
Structure: Every frame, group, component instance, and layer, including their nesting hierarchy. Claude understands parent-child relationships, auto-layout settings, and constraints.
Styles & Tokens: Fill colors (with exact hex/rgba values), stroke properties, corner radius, shadows, blur effects, typography (font family, size, weight, line height, letter spacing), and spacing.
Components: It recognizes component instances and traces them back to their main component definitions. It sees variant properties, overrides, and slot content.
Layout: Auto-layout direction, gap, padding, alignment, sizing modes (fixed, hug, fill), min/max dimensions — all the info needed to generate accurate Flexbox or Grid CSS.
How do I verify Talk to Figma MCP is connected? Read+Write
+Talk to Figma MCP has a different verification flow than the official MCP because it uses a WebSocket bridge + Figma plugin instead of a REST API token. Here are the three checks:
Check the WebSocket Bridge
Your terminal running bunx cursor-talk-to-figma-mcp@latest socket should show "WebSocket server started on port 3055" and remain running. If the terminal closed or shows errors, restart the bridge.
Check the Figma Plugin Channel
In Figma Desktop, open the Talk to Figma plugin (Plugins menu). It should display a Channel ID. Copy this ID -- it changes every time the plugin restarts. If no Channel ID appears, the plugin is not connected to the bridge.
Quick Write Test
Tell Claude: "Join channel [your-channel-id], then create a red rectangle at 100,100 size 200x100." If a red rectangle appears in your Figma canvas, the full pipeline is working: Claude → MCP Server → WebSocket → Plugin → Figma.
Figma to Code: The Export Pipeline
Turn your pixel-perfect designs into production-ready code — without losing a single detail.
get_document_info, read_my_design) that work for inspection, but the official MCP provides more detailed component and style data for code generation workflows.How does the Figma-to-Code workflow actually work?
+Here's the beautiful part: you don't need to install any Figma plugins or use third-party tools. Claude + MCP handles everything. Here's the flow:
Step 1: Share Your Figma URL with Claude
Copy the URL of the specific page, frame, or component you want to convert. Paste it into your Claude conversation. Pro tip: be specific about which frame you want — "Convert the 'Hero Section' frame from this page" gives better results than "convert this file."
Step 2: Claude Inspects the Design
Claude uses the MCP tools to read the file structure. It parses every layer, extracts colors, typography, spacing, and identifies component instances. It builds a mental model of your design, just like a developer would when examining a spec.
Step 3: Tell Claude Your Tech Stack
This is crucial: tell Claude what framework you're using. "Generate this as a React component using Tailwind CSS" vs "Give me vanilla HTML/CSS" will produce very different outputs. Also mention your component library if you have one (e.g., "use our existing Button and Card components from the design system").
Step 4: Claude Generates Production Code
Claude outputs clean, semantic code that matches your design. It preserves auto-layout as Flexbox/Grid, converts Figma tokens to CSS variables, maps component instances to your codebase's components, and handles responsive behavior based on constraints.
Step 5: Iterate & Refine
Not perfect on the first try? No problem. Say "Make the hero image full-bleed" or "Use our spacing scale instead of pixel values" and Claude adjusts. This conversational refinement is the superpower of this workflow.
What's the best prompt to use for Figma-to-Code?
+The quality of your output is directly proportional to the quality of your prompt. Here's a template that consistently produces excellent results:
/* Copy and customize this prompt for your needs */ Read this Figma file: [PASTE_FIGMA_URL] Context: - Framework: React with TypeScript - Styling: Tailwind CSS (v3.4) - Component library: Our custom design system at "src/components/ui/" - Design tokens are in "src/tokens.css" Please: 1. Convert the "Dashboard Layout" frame to code 2. Use our existing components where they match (Button, Card, Avatar, Badge) 3. Preserve all spacing using our 4px grid 4. Extract any new colors as CSS custom properties 5. Make it responsive (mobile-first) 6. Add meaningful component/prop names
Code to Figma: Build Directly in Figma with MCP
The game-changer. Take existing HTML, have Claude analyze it against your design system, and build the redesigned layout directly in Figma -- no designer handoff required for the initial draft. Now possible with the official Figma MCP's Skills or Talk to Figma MCP.
How does the Code-to-Figma pipeline work with write access?
+With the official Figma MCP's write Skills, the pipeline fundamentally changes. Previously, Claude could only generate a specification for a designer to manually build. Now, Claude can create the Figma layout directly -- placing frames, text nodes, shapes, setting colors, configuring auto-layout, and structuring the hierarchy. The designer reviews and polishes rather than builds from scratch.
Compare this with the old pipeline, where the "Builds layout in Figma" step was entirely manual:
Phase 1: Feed Claude Your Existing Code
Share your HTML/CSS/React code with Claude. Paste it directly, share a file, or point Claude Code at the file in your project. Claude analyzes the UI structure: what components exist, their hierarchy, visual properties, and behavior. This phase is unchanged.
Phase 2: Claude Reads Your Figma Component Library (Official MCP)
Point Claude at your Figma design system file using the official Figma MCP (Track A or B). Claude catalogs every component, variant, and property. It reads design tokens -- color palette, typography scale, spacing system. The official MCP is better for this step because it provides richer component metadata than Talk to Figma MCP's read tools.
Phase 3: Claude Creates the Component Mapping
Claude cross-references elements in your HTML with components in your Figma library. Your <button class="btn-primary"> maps to "Button / Primary / Medium." Your custom card maps to "Card / Elevated." Claude flags elements without design system matches. This phase is unchanged.
Phase 4: Claude Builds the Layout Directly in Figma (Official MCP Skills)
This is the key step. Instead of generating a text specification, Claude uses the official MCP's write Skills to build the layout directly in your Figma file. It creates frames with auto-layout, places text nodes with correct fonts and sizes, adds shapes with the right fills and corner radii, and structures everything in a logical hierarchy. (Alternatively, Talk to Figma MCP can be used here for more granular, low-level canvas control via its ~23 individual tool calls.)
Phase 5: Designer Reviews and Polishes
The designer opens the file and finds a rough but structurally correct layout already built. They refine the visual polish: nudge spacing, swap in actual component instances from the library, add micro-interactions, handle edge cases, and apply the design judgment that AI cannot replicate. The key shift: the designer is polishing, not building from scratch. This cuts the design phase from days to hours.
Phase 6: Export Back to New, Clean Code
Once the designer signs off, use the Figma-to-Code workflow (Section 04) to read the polished design and generate production code. The output uses your actual component library imports and token system.
What does Claude actually create in Figma during Phase 4?
+Let's make this concrete. Say Claude is rebuilding a login form based on your existing HTML. Here's an example sequence of tool calls Claude would make (shown using Talk to Figma MCP's granular tools for illustration -- the official MCP's Skills achieve similar results with higher-level operations):
# Step 1: Create the card container create_frame(name="LoginCard", x=100, y=100, width=400, height=480) set_fill_color(nodeId="...", r=1, g=1, b=1) set_corner_radius(nodeId="...", radius=16) set_layout_mode(nodeId="...", mode="VERTICAL") set_padding(nodeId="...", top=40, right=32, bottom=40, left=32) set_item_spacing(nodeId="...", spacing=24) # Step 2: Create the heading create_text(text="Sign In", fontSize=28, fontWeight=700) set_fill_color(nodeId="...", r=0.24, g=0.24, b=0.24) # Step 3: Create email input field (frame + text) create_frame(name="EmailInput", width=336, height=48) set_fill_color(nodeId="...", r=0.97, g=0.97, b=0.97) set_corner_radius(nodeId="...", radius=8) set_stroke_color(nodeId="...", r=0.85, g=0.85, b=0.85, weight=1) create_text(text="Email address", fontSize=14) # Step 4: Create password input (similar pattern) # Step 5: Create the submit button create_frame(name="SubmitButton", width=336, height=48) set_fill_color(nodeId="...", r=0.42, g=0.25, b=0.78) # --color-purple set_corner_radius(nodeId="...", radius=8) create_text(text="Log In", fontSize=16, fontWeight=700)
That's approximately 15-20 tool calls for a simple form. Claude executes these sequentially, getting node IDs back from each creation call to use in subsequent modification calls.
Show me the old workflow vs. the new workflow side by side.
+"Working with your designer (or autonomously if you trust the mapping), the redesigned screens are assembled in Figma using only components from your library. Claude can guide this by providing a detailed specification."
Translation: Claude writes a text document describing what to build. A designer manually drags components and builds it. Takes 1-5 days depending on complexity.
"Claude uses the official MCP's write Skills to build the layout directly in your Figma file. It creates frames with auto-layout, places text, adds shapes with the right fills and radii, structures the hierarchy."
Translation: Claude builds a rough layout in Figma automatically. A designer polishes it. Takes 30 minutes to a few hours.
Can you show me a concrete component mapping example?
+Absolutely. Here's what a real mapping looks like when Claude analyzes your HTML against your Figma component library. This table shows how each element in the old code gets translated to a design system component:
| Original HTML Element | Figma Component | Design Token | Notes |
|---|---|---|---|
| <button class="btn"> | Button / Primary / MD | --color-primary | Map to default variant |
| <input type="text"> | Input / Default / MD | --border-input | Add label component above |
| <div class="card"> | Card / Elevated | --shadow-md | Replace custom shadow |
| <nav class="topbar"> | Navigation / TopBar | --color-surface | Use sticky variant |
| <img class="avatar"> | Avatar / Circle / LG | --size-avatar-lg | Add status indicator slot |
| <span class="badge"> | Badge / Status / Success | --color-success | Match semantic color |
| <div class="modal"> | Dialog / Confirmation | --overlay-dim | Add backdrop component |
What does the code look like before and after redesign?
+Let's look at a real before/after to see the transformation. Imagine you have a legacy login form and your design system has well-defined components:
<div class="login-box"> <h2 style="color: #333; font-size: 24px; margin-bottom: 20px;"> Sign In </h2> <input type="email" style="width: 100%; padding: 12px; border: 1px solid #ccc; border-radius: 4px;" placeholder="Email" /> <input type="password" style="width: 100%; padding: 12px; ..." placeholder="Password" /> <button style="background: blue; color: white; padding: 12px 24px;"> Log In </button> </div>
import { Card } from '@ui/Card'; import { Heading } from '@ui/Heading'; import { Input } from '@ui/Input'; import { Button } from '@ui/Button'; import { Stack } from '@ui/Stack'; export const LoginForm = () => ( <Card variant="elevated" padding="xl"> <Stack gap="lg"> <Heading level={2}> Sign In </Heading> <Input type="email" label="Email" size="md" /> <Input type="password" label="Password" size="md" /> <Button variant="primary" size="lg" fullWidth> Log In </Button> </Stack> </Card> );
See the difference? The left side is fragile, inconsistent, and unmaintainable. The right side uses your design system's components, respects your spacing tokens, and is instantly consistent with every other screen in your app. That's the power of the round-trip workflow.
Walk me through the full process in elaborate detail.
+Same scenario as before: Acme Corp with their "Acme UI Kit" in Figma. A product team inherited a legacy Bootstrap dashboard and wants to rebuild it using their design system. Here's how it works now with Talk to Figma MCP:
Audit the Existing Code
Open Claude Code in your project. Ask: "Analyze the UI components in src/pages/Dashboard.tsx. List every visual element." Claude returns a structured inventory. Unchanged from before.
Load Your Figma Design System (Official MCP)
Share your Figma library URL. Claude reads via the official MCP: "Catalog all available components." Claude returns: Button (4 variants, 3 sizes), Card (3 variants), Input (5 types), etc. The official MCP gives richer metadata here.
Generate the Component Map
"Map every element from the legacy dashboard to our Acme UI Kit." Claude produces the mapping table. Bootstrap's .btn-primary becomes Acme's Button/Primary/MD. Unchanged from before.
Ensure Write Access is Available
The official Figma MCP now supports write via Skills -- if you're using it, you're already set. Alternatively, if using Talk to Figma MCP: open a new Figma file (or page), start the WebSocket bridge, run the Figma plugin, and tell Claude to join the channel. Either way, Claude now has write access.
Claude Builds the Layout in Figma
The big change. Tell Claude: "Using the component mapping, build the dashboard layout in Figma. Create the sidebar, the main content area with 3 metric cards, a data table section, and a search input. Use the Acme UI Kit colors and spacing." Claude executes 50-100+ tool calls, creating frames, text, shapes, setting auto-layout, colors, and spacing. You can watch it build in real time in Figma.
Designer Polishes the Draft
Your designer opens the file and finds a rough but structurally correct layout. They swap Claude's plain frames for actual component instances from the Acme UI Kit library, refine spacing, add icons, handle responsive edge cases, and apply micro-interactions. This takes hours, not days.
Export to New Production Code
Read the polished design with the official MCP and generate clean React/TypeScript using your actual Acme component imports. Review, refine, ship. Unchanged from before.
What still needs a designer's touch?
+Talk to Figma MCP is powerful but it does not replace designers. Here's what Claude builds well vs. what still needs human judgment:
| Claude Handles Well | Designer Still Needed For |
|---|---|
| Frame hierarchy and nesting | Swapping frames for actual component instances |
| Auto-layout direction, padding, spacing | Fine-tuning responsive behavior and breakpoints |
| Text content, font sizes, weights | Typography refinement (optical alignment, widows) |
| Fill colors using exact token values | Gradients, blending modes, visual effects |
| Corner radii, strokes | Shadows, blur effects, glassmorphism |
| Structural layout (sidebar, grid, stacks) | Micro-interactions, hover states, transitions |
| Batch text replacement across nodes | Iconography, illustrations, imagery |
The Full Round-Trip Workflow
The complete picture — from existing code, through design, and back to new code.
Can I see the complete workflow in one diagram?
+Here's the entire journey visualized. This is the workflow that turns legacy spaghetti into design-system-compliant, production-grade code:
The beauty of this workflow is that Claude is the central intelligence at every stage. It reads your old code, understands your design system, creates the mapping, builds the layout directly in Figma via the official MCP's Skills (or Talk to Figma MCP for granular control), then reads the polished Figma screens and generates production code. With write access now available in the official MCP, Phase 3 (Design Rebuild) is no longer a passive "guide the designer" step -- Claude handles the initial build directly. It's one conversation, one AI that understands the full picture.
How much time and effort does this really save?
+Let's get real with some rough estimates based on common scenarios:
Manual audit: 2-4 hours
Component mapping: 1-2 days
Figma rebuild: 3-5 days
Code from Figma: 5-10 days
QA & alignment: 2-3 days
Total: 2-4 weeks
AI-powered audit: 10-30 min
Auto component map: 5-15 min
AI-built Figma layout: 30-60 min
Designer polish: 2-4 hours
AI code generation: 30-60 min
Refinement: 1-2 hours
Total: 1-2 days
That's roughly a 7-10x speedup with MCP write access handling the Figma build, and the quality is often higher because Claude doesn't miss design token mismatches or spacing inconsistencies that humans overlook during long coding sessions. The biggest time savings comes from Phase 3 -- "Guided Figma rebuild" dropped from 1-2 days of manual designer work to 30-60 minutes of AI-built layout plus a few hours of designer polish.
Worked Examples: Real Prompts, Real Outputs
Concrete, copy-paste-ready examples for every step of the workflow. No hand-waving — just the real thing.
Example 1: Setting Up & Verifying the MCP Connection
+Scenario: You've just configured the Figma MCP server and want to verify it's working. Here's the exact interaction:
// ~/Library/Application Support/Claude/claude_desktop_config.json { "mcpServers": { "figma": { "command": "npx", "args": [ "-y", "figma-developer-mcp", "--figma-api-key=figd_xYz123AbCdEfGhIjKlMnOp" ] } } }
/* After restarting Claude Desktop */ You: Can you read my Figma file and tell me what's in it? Here's the URL: https://www.figma.com/design/AbC123xYz/ Acme-Design-System Claude: I'll read your Figma file now using the MCP tools. Let me fetch the file structure... ✓ Successfully connected to Figma! Your file "Acme Design System" contains: Pages (4): • Getting Started — Overview and usage docs • Foundations — Colors, typography, spacing • Components — 47 published components • Templates — 12 page templates Component Library Summary: • Button (Primary, Secondary, Ghost, Danger) — each with SM, MD, LG sizes • Input (Text, Email, Password, Search, Textarea) • Card (Default, Elevated, Outlined) • Avatar (Circle, Square) — XS to XXL • Badge (Status, Count, Dot) ... and 42 more components
Example 2: Figma-to-Code — Converting a Card Component
+Scenario: You want to convert a "Pricing Card" component from your Figma design into a React component with Tailwind CSS.
You: Read this Figma file:
https://www.figma.com/design/AbC123/Acme-Design-System
Find the "Pricing Card" component on the Components page.
Convert it to a React + TypeScript component using
Tailwind CSS.
Requirements:
- Make it accept props for: title, price, features list,
CTA button text, and a "popular" boolean for highlight
- Use our color tokens: primary=#6366F1, surface=#1E1B2E
- The card should be responsive
- Export as a named export
import React from 'react'; interface PricingCardProps { title: string; price: string; period?: string; features: string[]; ctaText: string; popular?: boolean; onCtaClick?: () => void; } export const PricingCard: React.FC<PricingCardProps> = ({ title, price, period = '/month', features, ctaText, popular = false, onCtaClick, }) => ( <div className={` relative rounded-2xl p-8 ${popular ? 'bg-[#6366F1] text-white ring-2 ring-[#6366F1]' : 'bg-[#1E1B2E] text-gray-100 ring-1 ring-white/10'} flex flex-col gap-6 transition-transform hover:-translate-y-1 `} > {popular && ( <span className="absolute -top-3 left-1/2 -translate-x-1/2 bg-amber-400 text-black text-xs font-bold px-3 py-1 rounded-full"> Most Popular </span> )} <h3 className="text-lg font-semibold tracking-tight"> {title} </h3> <div className="flex items-baseline gap-1"> <span className="text-4xl font-extrabold tracking-tight"> {price} </span> <span className="text-sm opacity-70"> {period} </span> </div> <ul className="flex flex-col gap-3"> {features.map((feat, i) => ( <li key={i} className="flex items-center gap-2 text-sm"> <span className="text-emerald-400"> ✓ </span> {feat} </li> ))} </ul> <button onClick={onCtaClick} className={` mt-auto w-full py-3 px-6 rounded-xl font-semibold text-sm transition-colors cursor-pointer ${popular ? 'bg-white text-[#6366F1] hover:bg-gray-100' : 'bg-[#6366F1] text-white hover:bg-[#5558E3]'} `} > {ctaText} </button> </div> );
Example 3: Code-to-Figma — Mapping a Legacy Page
+Scenario: You have a legacy Bootstrap dashboard and want Claude to create a mapping to your Figma component library so your designer can rebuild it.
You: I have this legacy dashboard HTML. I also have our design system in Figma. Legacy code: [paste or share file path] Figma DS: https://figma.com/design/AbC123/Acme-DS Please: 1. Analyze every UI element in the legacy HTML 2. Read our Figma component library via MCP 3. Create a detailed component mapping table 4. Flag elements that have NO match in our DS 5. Write a Figma assembly spec that a designer can follow to rebuild this page
/* Claude reads both sources and produces: */ ===== COMPONENT MAPPING REPORT ===== File analyzed: dashboard.html (347 lines) Figma library: Acme Design System v2.4 Components available: 47 --- DIRECT MATCHES (14 elements) --- # | HTML Element | Figma Component ----+------------------------+---------------------- 1 | .btn.btn-primary | Button/Primary/MD 2 | .btn.btn-outline-secondary | Button/Secondary/MD 3 | .card | Card/Elevated 4 | .form-control (text) | Input/Text/Default 5 | .form-control (search) | Input/Search/Default 6 | .badge.bg-success | Badge/Status/Success 7 | .badge.bg-warning | Badge/Status/Warning 8 | .navbar | Navigation/TopBar 9 | .nav-sidebar | Navigation/Sidebar 10 | .avatar-circle | Avatar/Circle/MD 11 | .dropdown-menu | Menu/Dropdown 12 | .table | DataTable/Default 13 | .breadcrumb | Breadcrumb/Default 14 | .progress-bar | ProgressBar/Linear --- PARTIAL MATCHES (3 elements) --- 15 | .stat-widget | Card/Metric → NOTE: HTML has icon left-aligned; Figma has icon top. Suggest using Card/Metric/Horizontal variant 16 | .chart-container | NO direct match → RECOMMEND: Create "ChartWrapper" component in Figma using Card/Default with 24px internal padding 17 | custom <footer> | NO direct match → RECOMMEND: Use Stack/Horizontal with Text/Caption for copyright line --- FIGMA ASSEMBLY SPEC --- Page structure (top to bottom): ├─ Navigation/TopBar │ ├─ Logo slot: Acme logo │ ├─ Search: Input/Search/Default (width: fill) │ └─ Right slot: Avatar/Circle/SM + Menu/Dropdown ├─ Main Layout: Auto-layout Horizontal │ ├─ Navigation/Sidebar (width: 260px, fixed) │ │ ├─ NavItem × 6 (icons: Home, Analytics, ...) │ │ └─ Divider + NavItem "Settings" │ └─ Content Area: Auto-layout Vertical, gap=24 │ ├─ Breadcrumb/Default │ ├─ Metrics Row: Auto-layout Horizontal, gap=16 │ │ ├─ Card/Metric (Revenue) ×1 │ │ ├─ Card/Metric (Users) ×1 │ │ ├─ Card/Metric (Orders) ×1 │ │ └─ Card/Metric (Conversion) ×1 │ ├─ Card/Elevated (contains ChartWrapper) │ │ ├─ Heading/H3: "Revenue Over Time" │ │ └─ Chart placeholder (540×280) │ └─ Card/Elevated (contains DataTable) │ ├─ Heading/H3: "Recent Orders" │ └─ DataTable/Default (6 cols, 10 rows) └─ Footer (Stack/Horizontal)
Your designer can now follow this spec like a recipe — dragging components from the Acme UI Kit library, following the layout structure, and producing a pixel-perfect, design-system-compliant version of the dashboard.
Example 4: Full Round-Trip — Exporting the Redesign Back to Code
+Scenario: Your designer has rebuilt the dashboard in Figma using the component mapping from Example 3. Now it's time to generate the final production code.
You: Our designer has finished rebuilding the dashboard in Figma using our Acme DS components. Here's the redesigned page: https://figma.com/design/XyZ789/Dashboard-Redesign Please convert this to production React + TypeScript. Requirements: - Import components from "@acme/ui" - Use our spacing tokens: $space-xs=4, $space-sm=8, $space-md=16, $space-lg=24, $space-xl=32 - Follow our file conventions: one component per file, PascalCase names - Include TypeScript interfaces for all props - Make the sidebar collapsible on mobile - Use CSS Modules for any custom styles - Include the data-fetching hooks (use SWR)
import React, { useState } from 'react'; import useSWR from 'swr'; import { TopBar, Sidebar, SidebarItem, Card, MetricCard, DataTable, Breadcrumb, SearchInput, Avatar, Stack, } from '@acme/ui'; import { RevenueChart } from './RevenueChart'; import { fetcher } from '@/lib/fetcher'; import styles from './DashboardPage.module.css'; interface MetricData { label: string; value: string; change: number; trend: 'up' | 'down'; } export const DashboardPage = () => { const [sidebarOpen, setSidebarOpen] = useState(true); const { data: metrics } = useSWR<MetricData[]>('/api/metrics', fetcher); const { data: orders } = useSWR('/api/orders/recent', fetcher); return ( <div className={styles.layout}> <TopBar> <TopBar.Logo src="/acme-logo.svg" /> <SearchInput placeholder="Search anything..." className={styles.searchExpand} /> <Avatar size="sm" src="/me.jpg" fallback="IS" /> </TopBar> <div className={styles.body}> <Sidebar collapsed={!sidebarOpen} onToggle={()=>setSidebarOpen(!sidebarOpen)}> <SidebarItem icon="home" active>Dashboard</SidebarItem> <SidebarItem icon="chart" >Analytics</SidebarItem> <SidebarItem icon="users" >Customers</SidebarItem> <SidebarItem icon="box" >Products</SidebarItem> <Sidebar.Divider /> <SidebarItem icon="settings" >Settings</SidebarItem> </Sidebar> <main className={styles.content}> <Breadcrumb items={[ { label: 'Home', href: '/' }, { label: 'Dashboard' }, ]} /> <Stack direction="horizontal" gap="md" wrap> {metrics?.map((m) => ( <MetricCard key={m.label} label={m.label} value={m.value} change={m.change} trend={m.trend} /> ))} </Stack> <Card variant="elevated" padding="lg"> <Card.Header> Revenue Over Time </Card.Header> <RevenueChart /> </Card> <Card variant="elevated" padding="lg"> <Card.Header> Recent Orders </Card.Header> <DataTable data={orders ?? []} columns={orderColumns} sortable pagination={{ pageSize: 10 }} /> </Card> </main> </div> </div> ); };
That's the full journey: legacy HTML → Claude analysis → component mapping → designer rebuilds in Figma → Claude generates production code. The new code uses your real component library, your real tokens, and your real conventions. It's not a rough draft — it's a production-ready starting point.
Example 5: Extracting Design Tokens from Figma
+Scenario: Before generating code, you want Claude to extract your complete design token system from Figma and output it as CSS custom properties.
You: Read our Figma design system at [URL].
Extract ALL design tokens and output them as:
1. CSS custom properties (:root block)
2. A Tailwind theme extension config
Include: colors, typography, spacing, border-radius,
shadows, and any Figma variables you find.
/* Auto-extracted from Figma: Acme Design System v2.4 */ /* Generated via Claude + Figma MCP */ :root { /* --- Colors: Primary --- */ --color-primary-50: #EEF2FF; --color-primary-100: #E0E7FF; --color-primary-500: #6366F1; --color-primary-600: #4F46E5; --color-primary-900: #312E81; /* --- Colors: Semantic --- */ --color-success: #10B981; --color-warning: #F59E0B; --color-danger: #EF4444; --color-info: #3B82F6; /* --- Colors: Surface --- */ --color-bg: #0F0D1A; --color-surface: #1E1B2E; --color-elevated: #2A2640; --color-border: rgba(255,255,255,0.08); /* --- Typography --- */ --font-sans: 'Inter', system-ui, sans-serif; --font-mono: 'JetBrains Mono', monospace; --text-xs: 0.75rem; /* 12px */ --text-sm: 0.875rem; /* 14px */ --text-base: 1rem; /* 16px */ --text-lg: 1.125rem; /* 18px */ --text-xl: 1.25rem; /* 20px */ --text-2xl: 1.5rem; /* 24px */ --text-3xl: 1.875rem; /* 30px */ /* --- Spacing (4px grid) --- */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-6: 24px; --space-8: 32px; --space-12: 48px; --space-16: 64px; /* --- Border Radius --- */ --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-full: 9999px; /* --- Shadows --- */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3); --shadow-md: 0 4px 12px rgba(0,0,0,0.25); --shadow-lg: 0 8px 24px rgba(0,0,0,0.3); }
Having your tokens extracted programmatically ensures perfect parity between Figma and code. No more eyeballing hex values or guessing spacing — it's all pulled directly from the source of truth.
Pixel-Perfect Matching: Making Claude Output Look Exactly Like the Reference
The difference between "kinda close" and "indistinguishable from the original." This is where craft meets precision — and where most people give up too early.
Why do Claude-generated mockups often look "close but not quite right"?
+Here's a truth that trips up everyone at first: Claude is brilliant at understanding structure and logic, but it doesn't "see" your design the way you do. When you show Claude a Figma file or a website, it reads the data — colors, fonts, spacing, hierarchy — but it doesn't perceive visual rhythm, optical balance, or the subtle "feel" of a design the way a human eye does.
The gap between "roughly correct" and "pixel-perfect" comes down to five common drift points:
Color Approximation
Claude may round colors to "close enough" values. #1E1B2E becomes #1a1a2e. Imperceptible? Maybe. But multiply that across 40 elements and the whole palette drifts.
Spacing & Sizing Guesses
Without exact values, Claude defaults to common patterns: 16px, 24px, 32px. Your design might use 18px, 28px, or a non-standard grid. These tiny offsets compound.
Typography Assumptions
Font weight, line height, and letter spacing are the most commonly "approximated" properties. Your heading might be Inter 600 at -0.02em tracking — Claude might output 700 with default tracking.
Shadow & Effect Details
Box shadows, blurs, gradients, and opacity layers are often simplified. A complex multi-layer shadow gets reduced to a single box-shadow value.
Layout Micro-Decisions
Alignment, overflow behavior, text truncation, aspect ratios, max-widths — these "invisible" properties define how a design feels and are the first things Claude skips when it's filling in gaps.
The good news? Every single one of these is solvable — you just need to give Claude the right reference material. Let's break down exactly how for each scenario.
What are the key essential components/references Claude needs to achieve pixel-perfect output?
+Think of these as the "Seven Pillars of Pixel Perfection" — the reference materials that, when provided together, eliminate guesswork entirely:
Here's what each pillar means in practice:
1. Color Tokens (exact values) — Don't say "dark blue background." Provide the exact hex: #0F0D1A. Include every color: backgrounds, text (primary, secondary, muted), borders, accents, hover states, active states, disabled states. The more colors you specify, the less Claude guesses.
2. Typography System — Font family, font weights for each heading level and body text, font sizes (in px or rem), line heights (as ratios like 1.5 or px values), letter spacing. If your H1 uses Inter Semi Bold 48px/56px with -0.02em tracking, say exactly that.
3. Spacing Scale — Your base unit (4px? 8px?), the scale (4, 8, 12, 16, 24, 32, 48, 64), and how it's used: section padding, card padding, gap between elements, margin between sections. Specify padding: 32px, not "generous padding."
4. Layout Rules — Max content width, sidebar width, grid columns, breakpoints, how elements stack on mobile, whether cards use fixed or fluid widths, alignment rules (center vs left).
5. Effects & Decorations — Exact box shadow values (offset, blur, spread, color), border radius for each element type, gradient definitions, backdrop blur values, border widths and colors, opacity levels.
6. Component Patterns — How buttons look (padding, border-radius, font-weight, text-transform), how cards are structured (header + body + footer), how inputs are styled (border color, focus ring, placeholder color), how navigation works.
7. Interaction States — Hover effects (color shifts, transforms, transitions), focus indicators, active/pressed states, disabled states, loading states, animation durations and easing curves.
Scenario 1: "Make this HTML look exactly like this Figma design"
+This is the most common scenario: you have a Figma design and you want Claude to generate HTML/CSS/React that looks identical. Here's the step-by-step approach:
Step 1: Extract the Design DNA via MCP
Before asking Claude to generate any code, have it study the design first. This is the most critical step that most people skip. Ask Claude to read the Figma file and output a complete design specification — not code, just a detailed report of every visual property it finds.
Step 2: Provide Explicit Overrides for Anything MCP Misses
MCP reads most properties, but some things get lost: background images/patterns, specific icon sets, custom fonts that aren't in the Figma metadata, animation behaviors, and responsive breakpoint logic. Supplement with explicit instructions for these.
Step 3: Request a "Spec-First" Generation
Ask Claude to first output the CSS custom properties / design tokens it plans to use, before writing the component code. Review these tokens against your Figma design. Catch color/spacing errors at the token level, not after 200 lines of code.
Step 4: Generate in Sections, Not All at Once
Don't ask for the entire page at once. Go section by section: "Now generate just the hero section," then "Now the features grid," then "Now the footer." This keeps Claude's attention focused and reduces accumulated drift.
Step 5: Visual Diff & Refine
Open the generated HTML alongside your Figma design. Screenshot both. Point out specific differences: "The card border radius should be 16px not 12px," "The heading is too bold — use font-weight 600 not 700." Claude corrects instantly.
The Master Prompt for this scenario:
/* PHASE 1: STUDY (run this first) */ Read this Figma file via MCP: [FIGMA_URL] Before writing any code, output a complete design specification including: 1. COLOR PALETTE: Every unique color used, grouped by purpose (backgrounds, text, borders, accents, states). Use exact hex values. 2. TYPOGRAPHY SCALE: Every text style — font family, weight, size, line-height, letter-spacing, and where each is used. 3. SPACING MAP: All unique padding, margin, and gap values. Identify the base grid unit. 4. COMPONENT INVENTORY: Every distinct UI element (buttons, cards, inputs, etc) with their exact visual properties. 5. EFFECTS: All shadows, gradients, blurs, border radii, and opacity values. 6. LAYOUT STRUCTURE: Page width, section layout (flex/grid), column counts, responsive behavior inferred from constraints. Output as a structured spec document. Do NOT write code yet. /* PHASE 2: GENERATE (run after reviewing spec) */ Now generate the HTML/CSS using exactly the spec above. Requirements: - Use CSS custom properties for ALL design tokens (colors, spacing, radii, shadows). Define them in a :root block at the top. - Match the Figma layout precisely: same flex directions, same gaps, same alignment. - Preserve exact values — do NOT round 18px to 16px, do NOT change #1E1B2E to #1a1a2e. - Include hover states and transitions that match the Figma interaction specs (if present). - Use semantic HTML5 elements. - Make it responsive following the Figma constraints. - Single file: inline all CSS in a <style> block. - Load the exact Google Fonts referenced in Figma. /* PHASE 3: REFINE (run after visual comparison) */ I compared your output to the Figma design. Fix these specific differences: [LIST EXACT DIFFERENCES YOU SPOTTED]
Scenario 2: "Make this look exactly like this reference website"
+Matching a live website is trickier than a Figma file because Claude can't read the website's actual CSS through MCP. But there's a powerful workflow that gets you incredibly close:
Step 1: Provide the Source Material
Give Claude as much raw information as possible. The ideal combination is: a screenshot of the page (Claude can analyze images), the page's HTML source code (right-click → View Page Source), and optionally the computed CSS for key elements (use browser DevTools → Computed tab). The screenshot gives Claude visual context; the source gives it structural truth.
Step 2: Extract the Design System from the Source
Ask Claude to analyze the HTML/CSS source and extract the design tokens — just like the Figma scenario. Claude will identify the color palette, typography scale, spacing patterns, and component structures from the actual code. This is far more accurate than Claude "guessing" from a screenshot alone.
Step 3: Specify What to Replicate vs. What to Improve
Be explicit about intent. Do you want a 1:1 clone? Or do you want the same style applied to different content? This distinction changes Claude's approach entirely.
Step 4: Use DevTools as Your Truth Source
For any element you need to match exactly, open DevTools, select the element, and copy the computed styles. Paste these into your prompt. Claude will use the exact font: 500 16px/24px "Inter" value rather than guessing.
Step 5: Iterate with Side-by-Side Comparison
Open both the reference site and your generated HTML in adjacent browser windows. Screenshot both at the same viewport width. Point out specific discrepancies. Repeat until the match is perfect.
The Master Prompt for this scenario:
/* Provide as much source material as possible */ I want to create an HTML page that matches the visual style of a reference website exactly. Reference materials I'm providing: 1. Screenshot: [attached image] 2. Source HTML: [pasted or attached] 3. Key CSS values (from DevTools): - Background: #0a0a0a - Primary text: #fafafa - Secondary text: #a1a1aa - Accent color: #6366f1 - Card background: #18181b - Border color: rgba(255,255,255,0.08) - Font: Inter, 400/500/600/700 - Base size: 16px, line-height: 1.6 - Border radius: cards=12px, buttons=8px - Content max-width: 1200px - Section padding: 80px vertical - Card shadow: 0 4px 24px rgba(0,0,0,0.2) Instructions: - Match the visual style exactly. Use the CSS values I provided as the source of truth. - Do NOT approximate or round any values. - Replicate the layout structure: [describe layout] - Include the same hover effects and transitions. - Use CSS custom properties for all tokens. - Single self-contained HTML file. - Load fonts from Google Fonts CDN. Content to use: [Provide YOUR content — headings, text, images — that should be styled in the reference site's visual language]
Scenario 3: "Make this Figma design match another reference Figma file"
+This is a "design style transfer" scenario — you have a design in one Figma file and you want it to adopt the visual language of a different reference Figma file (like your company's design system). Claude + MCP is uniquely powerful here because it can read both files simultaneously.
/* Claude reads both Figma files via MCP */ I have two Figma files. Please read both: SOURCE (the design to restyle): [FIGMA_URL_1] Focus on the page/frame: "[Frame Name]" REFERENCE (the target style to match): [FIGMA_URL_2] This is our design system / brand reference. Please do the following: 1. ANALYZE both files. Extract the complete design token sets from BOTH — colors, typography, spacing, effects, component patterns. 2. CREATE A MAPPING between the source's visual properties and the reference's design tokens. Show me a table: | Source Property | Source Value | Reference Token | 3. GENERATE A REDESIGN SPEC that tells a designer exactly how to rebuild the SOURCE design using ONLY the REFERENCE's visual language: - Which reference colors replace which source colors - Which reference type styles replace which headings - Which reference components replace which elements - How spacing should change to match the ref grid 4. THEN GENERATE CODE that implements the source layout/content but with the reference's complete visual style applied. Every color, font, spacing, shadow, and radius should come from the reference. The output should be indistinguishable in style from a page designed natively in the reference system.
Scenario 4: "I have HTML code — create an exact Figma representation using my component library"
+This is the reverse challenge: you have working code and need a Figma design that matches it exactly, built from your design system components. This is common when legacy code needs to be "documented" in Figma for future design work.
/* Provide both the code and your Figma library */ I have existing HTML/CSS code and I need to recreate it faithfully in Figma using our component library. My code: [paste HTML/CSS or share file] Our Figma component library: [FIGMA_LIBRARY_URL] Please: 1. AUDIT MY CODE — list every visual element, its computed dimensions, colors, fonts, spacing. Be exhaustive. Include: - Exact pixel dimensions of each section - Every color value (backgrounds, text, borders) - Font properties for each text element - Spacing between all elements (margin + padding) - Border radius, shadows, opacity for every box - Layout type (flex/grid) with direction & gaps 2. READ THE FIGMA LIBRARY — catalog all components, their variants, and their visual properties. 3. MAP CODE → FIGMA COMPONENTS — for each coded element, specify exactly which Figma component (and which variant/size) to use. Where there's no exact match, specify overrides needed. 4. WRITE A FIGMA BUILD SPEC — a step-by-step assembly guide a designer can follow: Frame: "Dashboard" (1440×900) ├─ Auto-layout: Vertical, gap=0 ├─ Child 1: Navigation/TopBar │ ├─ Width: Fill, Height: 64px │ ├─ Padding: 0 24px │ ├─ Background: #0F0D1A │ └─ Contents: [Logo] + [Spacer] + [Avatar/SM] ├─ Child 2: Auto-layout Horizontal, gap=0 │ ├─ Child 2a: Sidebar (Width: 260px, Fill Y) │ └─ Child 2b: Main Content (Fill X, Fill Y) │ ├─ Padding: 32px │ ├─ Auto-layout: Vertical, gap=24 │ └─ Children: [Metrics Row] [Chart Card] ... Include EVERY property needed to match the code.
How do I efficiently refine until it's truly pixel-perfect?
+The refinement loop is where "close" becomes "perfect." Here's the systematic approach that works every time:
The key is being surgically specific in your corrections. Vague feedback like "it doesn't look right" wastes iterations. Precise feedback like the examples below gets you there fast:
/* BAD — vague, forces Claude to guess */ ✗ "The header looks off." ✗ "The colors aren't quite right." ✗ "It doesn't feel the same." ✗ "Make it match better." /* GOOD — surgical, one-shot fixes */ ✓ "The hero heading should be font-weight 800, not 700. And the line-height should be 1.1, not 1.2." ✓ "Card background is #16161F but should be #1E1B2E. Border should be rgba(255,255,255,0.06) not rgba(255,255,255,0.1)." ✓ "The gap between metric cards is 16px but should be 20px. And each card should have padding 24px, not 20px." ✓ "The CTA button border-radius is 8px but should be 12px. Its box-shadow should be 0 4px 14px rgba(99,102,241,0.4), not the current 0 2px 8px value." ✓ "The section padding is 64px top/bottom but should be 80px. And the max-width should be 1140px, not 1200px."
The "Nuclear Option" for stubborn mismatches:
If a specific section just won't match, use this power prompt that forces Claude to work from computed CSS rather than its interpretation:
The [section name] still doesn't match. Here are the EXACT computed CSS values from the reference (copied from DevTools): .hero-container { max-width: 1140px; margin: 0 auto; padding: 96px 48px; display: flex; flex-direction: column; align-items: center; gap: 40px; background: #0a0a0f; } .hero-heading { font: 800 64px/1.08 "Inter"; letter-spacing: -0.03em; color: #fafafa; text-align: center; max-width: 800px; } .hero-subtitle { font: 400 20px/1.6 "Inter"; color: #a1a1aa; text-align: center; max-width: 580px; } Replace your current hero section CSS with these EXACT values. Do not modify or "improve" them.
Give me a quick cheat sheet: what input quality produces what accuracy?
+Here's the honest accuracy breakdown based on what you provide Claude:
| What You Provide | Expected Accuracy | What You'll Need to Fix |
|---|---|---|
| Just a verbal description | ~40-50% | Almost everything — colors, spacing, typography, layout |
| Screenshot only | ~65-75% | Exact color values, precise spacing, font details, effects |
| Figma file via MCP | ~80-85% | Some spacing nuances, interaction states, responsive behavior |
| Figma via MCP + explicit design tokens | ~90-93% | Minor spacing adjustments, shadow fine-tuning, edge cases |
| Source HTML/CSS + screenshot | ~88-92% | Interaction states, animations, dynamic behavior |
| Source + screenshot + key computed CSS | ~95-97% | Very minor tweaks — 1-2px adjustments at most |
| Figma MCP + tokens + existing component code + section-by-section generation + 2-3 refinement rounds | ~98-99% | Virtually nothing — pixel-perfect match |
Give me the complete prompt library for every pixel-perfect scenario.
+Here's your copy-paste arsenal — one prompt for each common scenario, optimized for maximum accuracy:
Prompt A: "Generate HTML that matches a Figma mockup exactly"
Read this Figma file: [URL] Focus on frame: "[Frame Name]" CRITICAL RULES: - Extract and use EXACT color values (no rounding) - Match EXACT font weights, sizes, and line heights - Preserve EXACT spacing (padding, margin, gap) - Replicate EXACT border-radius and shadow values - Follow EXACT layout structure (flex/grid/auto-layout) Output approach: 1. First output the design tokens as CSS variables 2. Wait for my confirmation 3. Then generate the full HTML with those tokens 4. Use semantic HTML5, single file, inline styles 5. Load exact Google Fonts from the design
Prompt B: "Clone a website's visual style for my own content"
I want to build a page that matches the visual style of [WEBSITE_URL] but with my own content. Here are the exact CSS values from the reference (from DevTools): Colors: [list every color] Fonts: [family, weights, sizes] Spacing: [section padding, card padding, gaps] Effects: [shadows, radii, gradients] Layout: [max-width, columns, breakpoints] My content: [YOUR_CONTENT] Apply the reference's visual language to my content. Use CSS custom properties. Match the reference EXACTLY on colors, typography, spacing, and effects.
Prompt C: "Generate Figma mockup (via code) from a reference website"
Create a high-fidelity mockup page for [PURPOSE] that visually matches the design language of [REFERENCE]. I'm providing: - Screenshot of the reference: [attached] - Key CSS values: [pasted from DevTools] Requirements: - Match the reference's color palette EXACTLY - Use the same typography system (font, weights, scale) - Replicate the spacing rhythm (base unit + scale) - Copy the component styling (cards, buttons, inputs) - Include matching hover/transition effects - Responsive: mobile-first with 768px/1024px breaks - Self-contained single HTML file My page content & structure: [Describe your page sections and content]
Prompt D: "Redesign existing code to match a Figma design system"
I have existing code that needs to be restyled to match our design system in Figma. My current code: [paste or file path] Our Figma design system: [FIGMA_URL] Please via MCP: 1. Read the Figma DS and extract ALL tokens 2. Analyze my code's current styling 3. Generate UPDATED code that: - Keeps the same structure & functionality - Replaces ALL colors with DS tokens - Replaces ALL fonts with DS typography - Replaces ALL spacing with DS grid values - Replaces ALL effects with DS shadow/radius tokens - Uses DS component patterns where applicable The output should look like it was built natively with the design system from day one.
Prompt E: "Universal refinement prompt" (use after any generation)
I compared your output to the reference. Fix these specific mismatches (do NOT change anything else): 1. [Element]: [property] is [current] → should be [correct value] 2. [Element]: [property] is [current] → should be [correct value] 3. [Element]: [property] is [current] → should be [correct value] Apply ONLY these changes. Do not "improve" or adjust anything else in the code.
Tips, Tricks & Troubleshooting
The wisdom that comes from doing this many, many times.
What are the top tips for getting the best results?
+Name Your Figma Layers Semantically
Layers named "Frame 427" tell Claude nothing. Layers named "Hero / CTA Button" tell it everything. Clean naming = cleaner code.
Publish Your Component Library
Published components in Figma are much easier for Claude to identify via MCP. Draft components may not appear in get_components results.
Use Auto Layout Everywhere
Figma auto-layout translates perfectly to CSS Flexbox. Absolutely-positioned layers result in worse code output. Auto-layout = responsive code.
Be Specific in Your Prompts
Don't say "convert this file." Say "convert the 'User Profile' frame to a React component using Tailwind and our @ui imports." Context is king.
Use Design Tokens / Variables in Figma
Figma's native variables feature makes tokens readable via the API. Claude can map these directly to your CSS custom properties or Tailwind theme.
What if something isn't working?
+"Claude can't see my Figma file"
Check that your Personal Access Token has the right permissions and hasn't expired. Verify the file isn't in a draft or restricted project. Try a file you own first.
"MCP server not appearing in Claude"
Double-check your claude_desktop_config.json syntax — a missing comma or bracket breaks everything. Restart Claude Desktop completely after config changes.
"Generated code doesn't match the design"
This usually means Claude didn't have enough context. Share your existing component library code alongside the Figma file. The more context, the better the output.
"Components not showing up"
Make sure components are published to your team library, not just local components. The Figma API's component endpoints only return published components.
Any tips specifically for Talk to Figma MCP (read/write)?
+Keep the WebSocket Bridge Terminal Visible
The bridge running in your terminal is the lifeline of the entire write pipeline. Dock it where you can see it. If it dies (machine sleep, terminal close), all write operations fail silently. On macOS, use caffeinate -i bunx cursor-talk-to-figma-mcp@latest socket to prevent sleep.
Always Copy a Fresh Channel ID
The Channel ID in the Figma plugin changes every time the plugin restarts, you switch files, or reopen Figma. Always grab a fresh one from the plugin UI before starting a new Claude session. Stale IDs are the #1 cause of "nothing happens" confusion.
Official MCP Now Handles Read + Write
The official Figma MCP supports both reading and writing via Skills, making it sufficient for most workflows. If you also use Talk to Figma MCP, it adds granular, low-level canvas control. Claude can switch between both MCPs seamlessly within a single conversation.
Pin to a Specific Version in Production Workflows
Instead of @latest, pin to a known working version: bunx cursor-talk-to-figma-mcp@1.2.3. This prevents surprise breaking changes from upstream updates during critical projects.
Break Complex Layouts into Small Steps
Don't ask Claude to "build a complete dashboard" in one prompt. Break it down: create the outer frame first, then the sidebar, then each card. Give explicit coordinates and sizes rather than asking Claude to figure out the layout on its own.
What other tools complement this workflow?
+While the Claude + MCP workflow is powerful on its own, these tools can enhance specific parts of the pipeline:
Figma Dev Mode — Figma's native developer handoff feature. It shows CSS, iOS, and Android code snippets for selected elements. Great for spot-checking Claude's output against Figma's own interpretation.
Storybook — If your team uses Storybook for your coded component library, Claude can reference it to understand your component APIs, props, and variants. Share your Storybook docs alongside the Figma file for maximum accuracy.
Figma Variables & Tokens Studio — For teams with mature design token systems, Tokens Studio (formerly Figma Tokens) exports tokens as JSON that Claude can directly consume. This bridges the gap between Figma's visual tokens and your code's CSS custom properties or Tailwind theme.
GitHub Copilot + Claude — Use Claude for the high-level design-to-code conversion, then lean on Copilot for filling in implementation details, event handlers, and business logic within the generated component structure.
Security & Token Management
Your Figma token is a key to your design files. Treat it like a password — because it is one.
What should I know about security with the native connector? Track A
+Even though the native connector handles token management automatically, there are a few things worth knowing:
You Can Revoke Access Anytime
Go to Figma → Settings → Account → Apps and integrations. You'll see "Claude" (or "Anthropic") listed as a connected app. Click Revoke to immediately sever the connection. Claude will lose all access to your Figma files until you reconnect.
OAuth Scopes Are Read-Only by Default
The native connector requests read-only OAuth scopes: File content (Read), Dev resources (Read), and Variables (Read). Write operations are handled separately via the official MCP's Skills feature, which Figma now supports. The OAuth scopes control what data Claude can access; Skills control what Claude can create or modify.
Access is Scoped to Your Account
The OAuth token inherits your Figma account's permissions. Claude can only see files you have access to. Your teammates' private drafts remain private.
Logging Out Disconnects the Session
If you log out of Claude Desktop, the active OAuth session ends. You'll need to re-authenticate when you log back in. However, the Figma-side authorization remains valid — you won't need to click "Allow" again unless you revoked it in Figma's settings.
Organization Admins Can Control This
If you're on a Figma Enterprise plan, your organization admin may restrict which third-party apps can access Figma via OAuth. If you can't connect Claude, check with your IT team — they may need to approve "Claude" / "Anthropic" in the organization's third-party app allowlist.
What are the security best practices for managing my Figma API token? Track B
+A leaked Figma token gives anyone full read access to every file you can access — including confidential designs, unreleased product screens, and internal documentation. Here's how to lock it down:
Never Hardcode Tokens in Version Control
If your claude_desktop_config.json or .mcp.json file contains a real token, do not commit it to Git. Add these files to .gitignore. If you've already committed a token, rotate it immediately — it may already be in your Git history even after deletion.
Use Environment Variables
Store your token in your shell profile (~/.zshrc, ~/.bashrc) or system environment variables. Reference the variable in your config using the "env" field. See Section 02 for the complete setup guide.
Set Token Expiration
When generating your Figma token, always set an expiration date (30, 60, or 90 days). Set a calendar reminder to rotate before expiry. Shorter-lived tokens limit the damage window if a token is compromised.
Use Minimal Scopes
Only grant the permissions Claude needs. For read-only workflows, select File content (Read), Dev resources (Read), and Variables (Read). Never grant write access unless you specifically need Claude to modify Figma files.
Rotate Tokens Regularly
Even without a breach, rotate your tokens every 60-90 days. In Figma Settings → Personal Access Tokens, generate a new token, update your environment variable, restart Claude, and then revoke the old token. Overlap them briefly to avoid downtime.
Audit Token Access Periodically
Review your Figma Settings → Personal Access Tokens list. Revoke any tokens you no longer use, don't recognize, or that were created for one-off experiments. Fewer active tokens = smaller attack surface.
How should teams manage tokens across an organization? Track B
+When multiple team members need the Figma MCP integration, you need a strategy for token management that balances security with convenience:
Approach 1: Individual tokens (recommended)
Each team member generates their own Personal Access Token with their own account. This is the safest approach because each token has the exact permissions of the user who created it, actions are auditable per-person, and revoking one person's token doesn't affect anyone else.
Approach 2: Shared service account (enterprise)
For CI/CD pipelines or automated workflows, create a dedicated Figma service account (e.g., design-bot@company.com) with read-only access to the relevant projects. Generate a token for this account and store it in your organization's secrets manager (AWS Secrets Manager, HashiCorp Vault, 1Password Business, etc.). This keeps automated access separate from human access.
Sharing the MCP config without sharing the token:
{
"mcpServers": {
"figma": {
"command": "npx",
"args": ["-y", "figma-developer-mcp"],
"env": {
// Each dev sets this env var locally
"FIGMA_PERSONAL_ACCESS_TOKEN": "${FIGMA_PERSONAL_ACCESS_TOKEN}"
}
}
}
}
claude mcp add or copy the shared config. Total time: under 5 minutes.Team Collaboration Workflows
Scaling the Figma + Claude workflow across your entire design and engineering team.
How should designers and developers collaborate using this workflow?
+The Figma + Claude MCP workflow fundamentally changes the designer-developer handoff. Instead of the traditional "designer throws designs over the wall" model, you get a continuous feedback loop. Here's what the collaboration looks like in practice:
1. Designer Creates & Publishes Components
The designer builds the component library in Figma with clean naming (Button/Primary/Large), proper auto-layout, and published components. They set up Figma Variables for tokens. Key responsibility: the designer is now the "API designer" — every component they publish is an interface that Claude will translate to code.
2. Team Members Connect to Figma
If using Claude Desktop or Cowork mode (Track A): each team member connects Figma independently via Settings → Integrations → Connect Figma. Takes 30 seconds per person, no developer involvement needed. If using Claude Code or VS Code (Track B): a developer configures the MCP server once, commits the .mcp.json to the repo with a placeholder token, and each team member sets their own FIGMA_PERSONAL_ACCESS_TOKEN env variable. They then establish code-side conventions: component file structure, naming patterns, import paths, token file location. Mixed teams: designers typically use Track A, developers use Track B — both connect to the same Figma files with identical tools.
3. Designer Assembles New Screens
When a new feature is designed, the designer builds it entirely from published components — no one-off custom elements. They use proper auto-layout for every layout, and annotate any interactive behavior in comments or a spec note.
4. Developer Generates Code via Claude + MCP
The developer shares the Figma URL with Claude, specifies their codebase conventions, and generates production code. Because the designer used published components, Claude maps them directly to the coded components. The output is typically 90-95% production-ready.
5. Joint Review & Iteration
Designer and developer review the output together. The designer spots visual discrepancies; the developer spots implementation issues. Both feed corrections to Claude for refinement. This collaborative review typically takes 15-30 minutes, replacing what used to be days of back-and-forth.
What if our whole team uses Claude Desktop — do we still need the Developer Setup?
+No. If every team member uses Claude Desktop or Cowork mode, each person simply connects Figma via the native connector independently. There's nothing to share, nothing to configure in a repo, and no developer involvement required.
Each Person Connects Independently
Every team member goes to Settings → Integrations → Connect Figma and authorizes with their own Figma account. Each connection is scoped to that person's Figma access — a designer sees the files shared with them, a PM sees the files shared with them.
No Shared Config or Tokens
Unlike Track B where you'd commit a .mcp.json and manage env variables, Track A has zero shared configuration. No onboarding doc needed beyond: "Open Claude Desktop, go to Settings → Integrations, click Connect Figma."
Revoking is Per-Person
If someone leaves the team, they revoke access in their Figma settings (or you remove their Figma account from the organization). Their Claude connection stops working immediately — no shared tokens to rotate or service accounts to audit.
How do I keep Figma and code in sync as the design system evolves?
+Design systems evolve constantly — new components get added, existing ones get updated, tokens change. Here's how to keep Figma and code synchronized using the MCP workflow:
Scheduled Token Audits
Once a month, ask Claude to re-extract your design tokens from Figma and diff them against your current tokens.css or Tailwind theme. Claude will identify any new colors, modified spacing values, or deprecated tokens. This catches drift before it becomes a problem.
Component Parity Checks
When your designer publishes new components in Figma, ask Claude to compare the Figma component list against your coded component library: "Read our Figma library and list any components that don't exist in our src/components/ directory." This gives you a clear "to-build" list.
Version-Aligned Publishing
Match your Figma library publish versions to your code releases. When the designer publishes "v2.5" of the Figma library, the developer generates updated code and releases "v2.5" of the code library. This creates a clear audit trail.
Automated Change Detection
For enterprise teams, use Figma's webhooks (requires the Webhooks scope) to trigger notifications when the design system file is updated. This can kick off an automated pipeline: Figma webhook → CI runs Claude to extract updated tokens → opens a PR with the changes.
Can I automate Figma-to-Code in a CI/CD pipeline? Track B
+Yes — and for mature teams this is the ultimate workflow. Here's the architecture for a fully automated Figma-to-Code pipeline:
What you can automate today:
Design token extraction — Set up a scheduled script (e.g., a GitHub Action that runs nightly or on-demand) that uses Claude Code with the Figma MCP to extract tokens and commit any changes to a PR. The script fetches the latest tokens from Figma, generates your tokens.css / Tailwind theme, and diffs against the current version.
Component inventory reports — Automatically generate a "component coverage" report that shows which Figma components have code implementations and which don't. This becomes your design system health dashboard.
Visual regression testing — After generating code from Figma, use tools like Chromatic (for Storybook) or Percy to screenshot the generated components and compare against the Figma exports. This catches visual drift automatically.
Limitations, Rate Limits & Known Issues
What the workflow can't do (yet), and how to work around the rough edges.
What are the current limitations of the Figma MCP workflow?
+This workflow is powerful, but it's important to know its boundaries so you set realistic expectations:
Claude Can't "See" Raster Images
MCP reads the structure of your Figma file, not rendered pixels. Claude knows an image element exists and its dimensions, but can't see the actual photo/illustration content. For image-heavy designs, you'll need to provide the image assets separately or describe what each image should be.
Complex Animations Aren't in the API
Figma's native prototyping animations (smart animate, spring transitions, scroll effects) are not exposed through the REST API. Claude can't read your prototype interactions. You'll need to describe animation behavior explicitly: "The card should scale to 1.03 on hover with a 200ms ease-out transition."
Large Files Can Be Slow
Files with 200+ frames or thousands of layers take longer to read via MCP. The Figma API returns the full node tree, and very large responses can slow Claude down. Workaround: always target specific frames/pages rather than requesting the entire file. Use node-id in your URLs.
Plugin-Generated Content May Not Read Cleanly
Some Figma plugins create non-standard layer structures, custom metadata, or deeply nested groups that confuse the API output. If Claude's reading of a particular element seems garbled, check if it was generated by a plugin and try recreating it with native Figma tools.
No Real-Time Sync
MCP reads the file at the moment you ask. It doesn't maintain a live connection. If your designer is actively editing while Claude reads, Claude sees the state at the time of the API call. For consistent results, coordinate timing — read files when the designer is done editing.
Unpublished Components Are Invisible
The get_components API endpoint only returns published components. If your designer has created components but hasn't published them to the team library, Claude won't see them. Always confirm your library is published and up to date before running the workflow.
Native Connector (Track A) Can't Be Customized Track A
If you're using the built-in Figma connector in Claude Desktop, you cannot customize the MCP server behavior, pin to a specific server version, add custom middleware, or modify how the server processes Figma API responses. The connector uses Anthropic's managed server with default settings. If you encounter a server-side bug, need an unreleased feature, or want to add custom pre-processing logic, you'll need to switch to the Developer Setup (Track B) where you run and control the server directly.
What about Talk to Figma MCP (read/write) limitations?
+The limitations above apply to the official Figma MCP. Talk to Figma MCP has its own set of limitations related to its WebSocket architecture and community-maintained status:
Low-Level Operations Only
Talk to Figma MCP exposes ~23 primitive tools (create_rectangle, create_text, set_fill_color, etc.). There are no composite operations like "create a card component with variants." Complex layouts require dozens of sequential API calls.
No Reusable Component Creation
The createComponent and createComponentSet Plugin API methods are not exposed. Claude can create visual layouts (frames, shapes, text) but cannot create actual reusable Figma components or variants. You must manually promote frames to components in Figma.
Single File at a Time
Each plugin instance runs in one Figma file with one Channel ID. To modify a different file, you must restart the plugin there, get a new Channel ID, and rejoin. Cross-file operations are not supported simultaneously.
What are Figma's API rate limits, and how do I avoid hitting them?
+Figma's REST API has rate limits to prevent abuse. If you hit them, you'll see 429 Too Many Requests errors. Here's what to know:
Current limits (as of 2025): Figma allows approximately 30 requests per minute per personal access token for file-reading endpoints. Image export endpoints have separate, lower limits. Enterprise plans may have higher thresholds.
How Claude triggers API calls: Each MCP tool call translates to one or more Figma API requests. get_file is typically 1-2 calls. get_components is 1 call. get_node is 1 call per node. If Claude is reading multiple frames or iterating through components, these add up quickly.
Strategies to stay under limits:
Target Specific Frames
Instead of "read the entire file," say "read the frame named 'Dashboard' on the 'App Screens' page." This reduces API calls from potentially dozens to just 1-2.
Extract Tokens Once, Reuse
Have Claude extract your design tokens at the start of a session and save them as a CSS or JSON file. For subsequent code generation in the same session, reference the extracted tokens rather than re-reading from Figma each time.
Batch Your Work
Plan your Claude session: read the Figma file once, generate all the code you need, then refine. Don't re-read the file for every small change — Claude remembers the file structure within a conversation.
Glossary of Key Terms
Quick reference for every acronym and concept mentioned in this guide.
The Complete Glossary
+| Term | Definition |
|---|---|
| MCP | Model Context Protocol. An open standard created by Anthropic that allows AI models like Claude to communicate with external tools and services through a structured, secure protocol. Think of it as a "USB port for AI" — a universal connector. |
| MCP Server | A lightweight program that sits between Claude and an external service (like Figma). It translates Claude's requests into API calls the service understands, and translates responses back. The Figma MCP server is a Node.js application. |
| Personal Access Token | A secret API key generated in Figma that authenticates your identity when making API requests. It carries your permissions — anything your Figma account can access, the token can access. |
| Design Tokens | The atomic values of your design system: colors, fonts, spacing, shadows, border-radii. They're the "single source of truth" that both Figma and code reference. In CSS, they're custom properties (--color-primary). In Figma, they're styles or variables. |
| Component | A reusable UI element in Figma (Button, Card, Input, etc.). Components have a "main" definition and can be instantiated across files. In code, they map to React components, Vue components, or Web Components. |
| Variant | A variation of a Figma component with different properties (e.g., Button can have variants: Primary/Secondary/Ghost, Small/Medium/Large). In code, these map to component props. |
| Component Set | A group of component variants combined into a single entity in Figma. It defines the "API" of a component — which properties it accepts and which values each property can have. |
| Auto Layout | Figma's layout system that automatically arranges child elements with defined direction, spacing, padding, and alignment. Translates directly to CSS Flexbox in code. |
| Figma Variables | Figma's native token system that stores named values (colors, numbers, strings, booleans) with support for multiple modes (light/dark, responsive breakpoints). Readable via the API with the Variables scope. |
| npx | A Node.js tool that runs npm packages without installing them globally. The command npx -y figma-developer-mcp downloads and runs the Figma MCP server on demand. The -y flag auto-confirms the install prompt. |
| Claude Desktop | Anthropic's desktop application for Claude. Supports MCP server connections through a JSON configuration file. Available for macOS and Windows. |
| Claude Code | Anthropic's CLI tool for agentic coding with Claude. Supports MCP through project-level .mcp.json files or the claude mcp add command. Ideal for developers who work primarily in the terminal. |
| Component Mapping | The process of matching HTML elements in existing code to their equivalent Figma components. E.g., <button class="btn"> → Button/Primary/MD. Claude generates these mappings automatically. |
| Round-Trip Workflow | The complete cycle: Code → Claude analysis → Figma component mapping → Designer rebuilds in Figma → Claude generates new code from the redesign. The "holy grail" workflow described in Sections 5-6. |
| Node ID | A unique identifier for any element in a Figma file (frame, component, layer, etc.). Appears in URLs as ?node-id=123:456. Used by the get_node MCP tool to target specific elements. |
| File Key | The unique identifier for a Figma file, found in the file's URL: figma.com/design/AbC123xYz/File-Name. This is what the MCP server uses to identify which file to read. |
| Talk to Figma MCP | A community-built MCP server (by arinspunk, forked from grab) that provides read+write access to Figma via a WebSocket bridge and Figma plugin. It offers ~23 granular, low-level tools to create frames, text, shapes, set colors, configure auto-layout, and modify existing elements directly on the Figma canvas. The official Figma MCP now also supports write via Skills, but Talk to Figma MCP remains popular for its fine-grained canvas control. |
| WebSocket Bridge | A local server process (running on port 3055) that relays messages between the Talk to Figma MCP server and the Figma plugin. Started via bunx cursor-talk-to-figma-mcp@latest socket. Must remain running in a terminal for the entire session -- if it dies, all write operations fail silently. |
| Channel ID | A unique identifier generated by the Talk to Figma Figma plugin each time it starts. Claude must "join" this channel to communicate with the correct Figma file. The ID changes on every plugin restart, file switch, or Figma reopen -- always copy a fresh one before starting work. |
| Bun | A fast JavaScript runtime (alternative to Node.js) used by Talk to Figma MCP. The WebSocket bridge and MCP server run on Bun. Install via curl -fsSL https://bun.sh/install | bash. The command bunx is Bun's equivalent of npx. |
| DXT (Desktop Extension) | A packaging format for Claude Desktop extensions that enables one-click installation. Some Talk to Figma MCP variants are available as .dxt files, which can be installed by dragging them onto Claude Desktop -- no manual JSON config editing required. |