Figma MCP Bridge
Enables Claude to read and manipulate Figma documents in real-time through 62 operations including creating shapes, modifying styles, managing components, and exporting assets via a WebSocket bridge to a Figma plugin.
README
Figma MCP Bridge
A Model Context Protocol (MCP) server that enables Claude to read and manipulate Figma documents in real-time through a WebSocket bridge to a Figma plugin.
Features
- 62 Figma operations - Create shapes, modify styles, manage components, export assets
- Real-time bidirectional communication - Changes appear instantly in Figma
- Token-optimized queries - Efficient variable search and node traversal for AI interactions
- Full Figma API access - Styles, variables, auto-layout, boolean operations, and more
Architecture
Claude Code ←──stdio──→ MCP Server ←──WebSocket──→ Figma Plugin ←──→ Figma API
(Node.js) localhost:3055 (runs in Figma)
Quick Start
Prerequisites
- Node.js 18+
- Figma desktop app
- Claude Code CLI or Claude Desktop
Installation
Option A: Install from npm (recommended)
For Claude Code CLI:
claude mcp add figma-mcp-bridge -- npx @magic-spells/figma-mcp-bridge
For Claude Desktop:
Edit your config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"figma-mcp-bridge": {
"command": "npx",
"args": ["-y", "@magic-spells/figma-mcp-bridge"]
}
}
}
Then restart Claude Desktop.
Install the Figma plugin:
- Download the
pluginfolder from this repo - In Figma: Plugins → Development → Import plugin from manifest
- Select
plugin/manifest.json
Connect:
- Open a Figma file
- Run the plugin: Plugins → Development → Claude Figma Bridge
- The status should show "Connected"
Option B: Install from source
-
Clone the repository
git clone https://github.com/magic-spells/figma-mcp-bridge.git cd figma-mcp-bridge npm install -
Add to Claude Code
claude mcp add figma-mcp-bridge node /path/to/figma-mcp-bridge/src/index.js -
Install the Figma plugin
- In Figma: Plugins → Development → Import plugin from manifest
- Select
plugin/manifest.jsonfrom the cloned repo
-
Connect
- Open a Figma file
- Run the plugin: Plugins → Development → Claude Figma Bridge
- The status should show "Connected"
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
FIGMA_BRIDGE_PORT |
3055 |
WebSocket server port (auto-increments if busy) |
Auto-approve Figma Tools
Add to .claude/settings.local.json:
{
"permissions": {
"allow": ["mcp__figma-mcp-bridge__*"]
}
}
Commands Reference
Query Commands
figma_get_context
Get the current Figma document context including file info, current page, and selection.
| Parameter | Type | Description |
|---|---|---|
| (none) |
figma_list_pages
List all pages in the current Figma document.
| Parameter | Type | Description |
|---|---|---|
| (none) |
figma_get_nodes
Get detailed information about specific nodes by their IDs.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Array of node IDs (e.g., ["1:23", "4:56"]) |
depth |
string | No | Detail level: minimal, compact, or full (default) |
figma_get_local_styles
List all local styles defined in the document.
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
string | No | Filter: PAINT, TEXT, EFFECT, GRID, or ALL (default) |
figma_get_local_variables
Get all local variables and variable collections.
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
string | No | Filter: COLOR, FLOAT, STRING, BOOLEAN, or ALL (default) |
Note: Can return 25k+ tokens. Prefer
figma_search_variablesfor efficiency.
figma_get_children
Get immediate children of a node. Efficient for browsing hierarchy one level at a time.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
parentId |
string | Yes | Node ID to get children of | |
compact |
boolean | No | true |
Return minimal data |
figma_search_nodes
Search for nodes by name within a scope. Preferred for finding specific frames, sections, or elements.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
parentId |
string | Yes | Scope to search (page/frame/section ID) | |
nameContains |
string | No | Case-insensitive substring match | |
namePattern |
string | No | Glob pattern with wildcards (e.g., *button*) |
|
types |
string[] | No | Filter by node types: FRAME, TEXT, SECTION, COMPONENT, INSTANCE, GROUP, etc. |
|
maxDepth |
number | No | -1 |
Search depth (-1 = unlimited, 1 = immediate children) |
compact |
boolean | No | true |
Return minimal data |
limit |
number | No | 50 |
Maximum results |
Returns ~50 tokens/node vs ~500 for full node data.
figma_search_components
Search local components by name. Use when looking for specific components like "Button", "Header", etc.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nameContains |
string | No | Case-insensitive substring match | |
namePattern |
string | No | Glob pattern with wildcards | |
includeVariants |
boolean | No | false |
Include individual variants from component sets |
compact |
boolean | No | true |
Return minimal data |
limit |
number | No | 50 |
Maximum results |
figma_search_styles
Search local styles by name. More efficient than figma_get_local_styles when looking for specific styles.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nameContains |
string | No | Case-insensitive substring match | |
type |
string | No | "ALL" |
Filter: PAINT, TEXT, EFFECT, GRID, ALL |
compact |
boolean | No | true |
Return minimal data |
limit |
number | No | 50 |
Maximum results |
Creation Commands
figma_create_rectangle
Create a new rectangle.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
width |
number | No | 100 |
Width in pixels |
height |
number | No | 100 |
Height in pixels |
name |
string | No | "Rectangle" |
Node name |
fills |
color | No | Fill color | |
parentId |
string | No | Parent node ID |
figma_create_ellipse
Create an ellipse, circle, arc, or ring.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
width |
number | No | 100 |
Width (diameter for circle) |
height |
number | No | 100 |
Height |
name |
string | No | "Ellipse" |
Node name |
fills |
color | No | Fill color | |
parentId |
string | No | Parent node ID | |
arcData.startingAngle |
number | No | Starting angle in radians | |
arcData.endingAngle |
number | No | Ending angle in radians | |
arcData.innerRadius |
number | No | Inner radius ratio (0-1) for rings |
figma_create_line
Create a line.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
length |
number | No | 100 |
Line length |
rotation |
number | No | 0 |
Rotation in degrees |
strokeWeight |
number | No | 1 |
Stroke weight |
strokes |
color | No | Stroke color | |
strokeCap |
string | No | "NONE" |
Cap: NONE, ROUND, SQUARE, ARROW_LINES, ARROW_EQUILATERAL |
name |
string | No | "Line" |
Node name |
parentId |
string | No | Parent node ID |
figma_create_frame
Create a frame container (supports auto-layout).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
width |
number | No | 100 |
Width |
height |
number | No | 100 |
Height |
name |
string | No | "Frame" |
Node name |
fills |
color | No | Fill color | |
parentId |
string | No | Parent node ID |
figma_create_text
Create a text node.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
text |
string | No | "Text" |
Text content |
fontSize |
number | No | 16 |
Font size |
fontFamily |
string | No | "Inter" |
Font family |
fontStyle |
string | No | "Regular" |
Font style |
fills |
color | No | Text color | |
name |
string | No | "Text" |
Node name |
parentId |
string | No | Parent node ID |
figma_clone_nodes
Clone (duplicate) nodes.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nodeIds |
string[] | Yes | Node IDs to clone | |
parentId |
string | No | Parent for clones | |
offset.x |
number | No | 20 |
X offset from original |
offset.y |
number | No | 20 |
Y offset from original |
figma_create_component
Create a reusable component.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
fromNodeId |
string | No | Convert existing node to component | |
x |
number | No | 0 |
X position |
y |
number | No | 0 |
Y position |
width |
number | No | 100 |
Width |
height |
number | No | 100 |
Height |
name |
string | No | "Component" |
Component name |
fills |
color | No | Fill color | |
parentId |
string | No | Parent node ID | |
description |
string | No | Component description |
figma_create_instance
Create an instance of a component.
| Parameter | Type | Required | Description |
|---|---|---|---|
componentId |
string | Yes | Component ID to instantiate |
x |
number | No | X position |
y |
number | No | Y position |
parentId |
string | No | Parent node ID |
name |
string | No | Instance name |
Style Commands
figma_set_fills
Set fill color on a node.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to modify |
fills |
color | Yes | Fill color |
Color formats:
- Hex:
{ color: "#FF0000" }or{ color: "#FF0000AA" }(with alpha) - RGB:
{ r: 1, g: 0, b: 0, a: 0.5 } - Full array:
[{ type: "SOLID", color: { r, g, b }, opacity: 1 }]
figma_set_strokes
Set stroke color on a node.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to modify |
strokes |
color | Yes | Stroke color |
strokeWeight |
number | No | Stroke weight in pixels |
figma_set_text
Set text content on a text node.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Text node to modify |
text |
string | Yes | New text content |
figma_set_opacity
Set node transparency.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to modify |
opacity |
number | Yes | Opacity (0-1) |
figma_set_corner_radius
Set corner radius.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to modify |
radius |
number | No | Uniform radius for all corners |
topLeft |
number | No | Top-left corner radius |
topRight |
number | No | Top-right corner radius |
bottomLeft |
number | No | Bottom-left corner radius |
bottomRight |
number | No | Bottom-right corner radius |
figma_set_effects
Set effects (shadows, blurs).
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to modify |
effects |
array | Yes | Array of effect objects |
Shadow effect:
{
"type": "DROP_SHADOW",
"color": { "color": "#000000" },
"offset": { "x": 0, "y": 4 },
"radius": 8,
"spread": 0,
"visible": true
}
Blur effect:
{
"type": "LAYER_BLUR",
"radius": 10,
"visible": true
}
figma_apply_style
Apply a local style to a node.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to apply style to |
styleId |
string | Yes | Style ID |
property |
string | Yes | Property: fills, strokes, text, effects, grid |
figma_set_variable
Set variable value or bind to node property.
| Parameter | Type | Required | Description |
|---|---|---|---|
variableId |
string | Yes | Variable ID |
modeId |
string | No | Mode ID (for setting value) |
value |
any | No | Value to set |
nodeId |
string | No | Node ID (for binding) |
field |
string | No | Field to bind (opacity, cornerRadius, fills, etc.) |
paintIndex |
number | No | Paint array index for fills/strokes (default 0) |
Layout Commands
figma_set_auto_layout
Configure auto-layout on a frame.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Frame to configure |
layoutMode |
string | No | NONE, HORIZONTAL, VERTICAL |
primaryAxisSizingMode |
string | No | FIXED, AUTO |
counterAxisSizingMode |
string | No | FIXED, AUTO |
primaryAxisAlignItems |
string | No | MIN, CENTER, MAX, SPACE_BETWEEN |
counterAxisAlignItems |
string | No | MIN, CENTER, MAX, BASELINE |
paddingTop |
number | No | Top padding |
paddingRight |
number | No | Right padding |
paddingBottom |
number | No | Bottom padding |
paddingLeft |
number | No | Left padding |
itemSpacing |
number | No | Space between items |
counterAxisSpacing |
number | No | Space between rows when wrapped |
layoutWrap |
string | No | NO_WRAP, WRAP |
figma_set_layout_align
Set child alignment in auto-layout.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Child node to modify |
layoutAlign |
string | No | MIN, CENTER, MAX, STRETCH, INHERIT |
layoutGrow |
number | No | Growth factor (0-1) |
layoutPositioning |
string | No | AUTO, ABSOLUTE |
Transform Commands
figma_move_nodes
Move nodes to a new position.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Nodes to move |
x |
number | No | X position or offset |
y |
number | No | Y position or offset |
relative |
boolean | No | If true, x/y are offsets (default false) |
figma_resize_nodes
Resize nodes.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Nodes to resize |
width |
number | No | New width |
height |
number | No | New height |
figma_delete_nodes
Delete nodes.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Nodes to delete |
figma_group_nodes
Group multiple nodes.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nodeIds |
string[] | Yes | Nodes to group | |
name |
string | No | "Group" |
Group name |
figma_ungroup_nodes
Ungroup group nodes.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Group nodes to ungroup |
figma_rename_node
Rename nodes.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | No | Single node ID |
nodeIds |
string[] | No | Batch node IDs |
name |
string | Yes | New name |
figma_reorder_node
Change z-order (layer order).
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to reorder |
position |
string/number | Yes | "front", "back", or index number |
figma_set_constraints
Set resize constraints (non-auto-layout frames only).
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Node to configure |
horizontal |
string | No | MIN, CENTER, MAX, STRETCH, SCALE |
vertical |
string | No | MIN, CENTER, MAX, STRETCH, SCALE |
Navigation Commands
figma_set_selection
Set the current selection.
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeIds |
string[] | Yes | Nodes to select (empty to clear) |
figma_set_current_page
Switch to a different page.
| Parameter | Type | Required | Description |
|---|---|---|---|
pageId |
string | Yes | Page ID to switch to |
Export Commands
figma_export_node
Export a node as an image.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nodeId |
string | Yes | Node to export | |
format |
string | No | "PNG" |
Format: PNG, SVG, JPG, PDF |
scale |
number | No | 1 |
Export scale (1 = 100%) |
Returns base64-encoded data.
Component Commands
figma_detach_instance
Detach instance from component (converts to frame).
| Parameter | Type | Required | Description |
|---|---|---|---|
nodeId |
string | Yes | Instance to detach |
Token Optimization
Variable Queries
Use figma_search_variables instead of figma_get_local_variables:
// Inefficient (~25k+ tokens)
figma_get_local_variables({ type: 'ALL' })
// Efficient (~500 tokens)
figma_search_variables({
namePattern: 'tailwind/orange/*',
type: 'COLOR',
compact: true,
limit: 50
})
figma_search_variables parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
namePattern |
string | Wildcard pattern (* = any chars) |
|
type |
string | "ALL" |
Variable type filter |
collectionName |
string | Collection name filter | |
compact |
boolean | true |
Minimal data (id, name, value only) |
limit |
number | 50 |
Max results |
Node Traversal
Use the depth parameter in figma_get_nodes:
| Depth | Properties | Use Case |
|---|---|---|
minimal |
~5 | Tree traversal, finding nodes |
compact |
~10 | Layout inspection |
full |
~40 | Detailed node editing |
Finding Nodes
Use search tools instead of traversing the full tree:
// Find nodes by name within a page/frame
figma_search_nodes({
parentId: '1:2', // Required scope
nameContains: 'button', // Case-insensitive
types: ['FRAME', 'COMPONENT'],
compact: true
})
// Browse hierarchy one level at a time
figma_get_children({ parentId: '1:2' })
// Find components by name
figma_search_components({ nameContains: 'Header' })
// Find styles by name
figma_search_styles({ nameContains: 'primary', type: 'PAINT' })
| Tool | Use Case | Token Efficiency |
|---|---|---|
figma_search_nodes |
Find frames/elements by name | ~50 tokens/node |
figma_get_children |
Browse hierarchy level-by-level | ~50 tokens/node |
figma_search_components |
Find specific components | ~50 tokens/result |
figma_search_styles |
Find specific styles | ~30 tokens/result |
Known Limitations
- No ES6 spread operator in plugin code
- Boolean operations require nodes with same parent
- Constraints don't work on auto-layout children (use
layoutAlign) - Lines have height=0, use
lengthparameter - Vectors only support M, L, Q, C, Z commands (no arcs)
detachInstance()also detaches ancestor instances- 30-second timeout on all commands
Troubleshooting
Plugin Not Connecting
- Ensure the MCP server is running
- Check the port: default is 3055, or set
FIGMA_BRIDGE_PORT - Restart the plugin in Figma
- Click "Reconnect" in the plugin UI
Port Already in Use
The server automatically tries ports 3055-3070. To use a specific port:
FIGMA_BRIDGE_PORT=3057 node src/index.js
Multiple Claude Code Instances
Each Claude Code instance can work with a different Figma file by using different ports:
- First instance: Use default port 3055
- Second instance: Set
FIGMA_BRIDGE_PORT=3056 - In Figma plugin: Change the port number in the plugin UI to match
The plugin UI has a port input field - just change it to connect to a different MCP server.
Commands Timing Out
- Commands have a 30-second timeout
- Large exports may timeout; try smaller scales
- Check plugin is still connected (green status)
Font Errors
Text operations require font loading. The plugin handles this automatically, but if a font isn't installed, it will fail. Use fonts available on your system.
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
E2B
Using MCP to run code via e2b.