figma-mcp-bridge
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"figma-mcp-bridge": {
"args": [
"-y",
"@magic-spells/figma-mcp-bridge"
],
"command": "npx"
}
}
}
服务介绍
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