Figma MCP Bridge
Enables real-time reading and manipulation of Figma documents through 62 operations including creating shapes, modifying styles, managing components, configuring auto-layout, performing boolean operations, and exporting assets via a WebSocket bridge to a Figma plugin.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Figma MCP Bridgesearch for all button components in the current page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Figma MCP Bridge
A Model Context Protocol (MCP) server that enables Claude to read and manipulate Figma design files and FigJam files in real-time through a WebSocket bridge to a Figma plugin.
Features
88 operations - 63 Figma design tools + 21 FigJam tools (sticky notes, flowchart shapes, connectors, tables, code blocks, link previews) + 4 Prototype tools (reactions, flow starting points)
Works in both editors - Auto-detects whether you're in a Figma design file or FigJam, and gates editor-specific commands accordingly (FigJam-only sticky/connector/table tools; Figma-Design-only prototype tools)
Real-time bidirectional communication - Changes appear instantly in Figma/FigJam
Token-optimized queries - Efficient variable search and node traversal for AI interactions
Full Figma API access - Styles, variables, auto-layout, boolean operations, plus FigJam diagrams and documentation
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-bridgeFor Claude Desktop:
Edit your config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%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 repoIn 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 installAdd to Claude Code
claude mcp add figma-mcp-bridge node /path/to/figma-mcp-bridge/src/index.jsInstall 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 |
|
| 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_server_info
Get information about the MCP server: package version, WebSocket port, connection state, and connected document info. Useful for confirming which version of the server is running after a code change or upgrade.
Parameter | Type | Description |
(none) |
Returns: { version, port, connected, documentInfo }
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 |
| string[] | Yes | Array of node IDs (e.g., |
| string | No | Detail level: |
figma_get_local_styles
List all local styles defined in the document.
Parameter | Type | Required | Description |
| string | No | Filter: |
figma_get_local_variables
Get all local variables and variable collections.
Parameter | Type | Required | Description |
| string | No | Filter: |
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 |
| string | Yes | Node ID to get children of | |
| boolean | No |
| 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 |
| string | Yes | Scope to search (page/frame/section ID) | |
| string | No | Case-insensitive substring match | |
| string | No | Glob pattern with wildcards (e.g., | |
| string[] | No | Filter by node types: | |
| number | No |
| Search depth (-1 = unlimited, 1 = immediate children) |
| boolean | No |
| Return minimal data |
| number | No |
| 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 |
| string | No | Case-insensitive substring match | |
| string | No | Glob pattern with wildcards | |
| boolean | No |
| Include individual variants from component sets |
| boolean | No |
| Return minimal data |
| number | No |
| 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 |
| string | No | Case-insensitive substring match | |
| string | No |
| Filter: |
| boolean | No |
| Return minimal data |
| number | No |
| Maximum results |
Creation Commands
figma_create_rectangle
Create a new rectangle.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width in pixels |
| number | No |
| Height in pixels |
| string | No |
| Node name |
| color | No | Fill color | |
| string | No | Parent node ID |
figma_create_ellipse
Create an ellipse, circle, arc, or ring.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width (diameter for circle) |
| number | No |
| Height |
| string | No |
| Node name |
| color | No | Fill color | |
| string | No | Parent node ID | |
| number | No | Starting angle in radians | |
| number | No | Ending angle in radians | |
| number | No | Inner radius ratio (0-1) for rings |
figma_create_line
Create a line.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Line length |
| number | No |
| Rotation in degrees |
| number | No |
| Stroke weight |
| color | No | Stroke color | |
| string | No |
| Cap: |
| string | No |
| Node name |
| string | No | Parent node ID |
figma_create_frame
Create a frame container (supports auto-layout).
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width |
| number | No |
| Height |
| string | No |
| Node name |
| color | No | Fill color | |
| string | No | Parent node ID |
figma_create_text
Create a text node.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| string | No |
| Text content |
| number | No |
| Font size |
| string | No |
| Font family |
| string | No |
| Font style |
| color | No | Text color | |
| string | No |
| Node name |
| string | No | Parent node ID |
figma_clone_nodes
Clone (duplicate) nodes.
Parameter | Type | Required | Default | Description |
| string[] | Yes | Node IDs to clone | |
| string | No | Parent for clones | |
| number | No |
| X offset from original |
| number | No |
| Y offset from original |
figma_create_component
Create a reusable component.
Parameter | Type | Required | Default | Description |
| string | No | Convert existing node to component | |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width |
| number | No |
| Height |
| string | No |
| Component name |
| color | No | Fill color | |
| string | No | Parent node ID | |
| string | No | Component description |
figma_create_instance
Create an instance of a component.
Parameter | Type | Required | Description |
| string | Yes | Component ID to instantiate |
| number | No | X position |
| number | No | Y position |
| string | No | Parent node ID |
| string | No | Instance name |
Style Commands
figma_set_fills
Set fill color on a node.
Parameter | Type | Required | Description |
| string | Yes | Node to modify |
| 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 |
| string | Yes | Node to modify |
| color | Yes | Stroke color |
| number | No | Stroke weight in pixels |
figma_set_text
Set text content on a text node.
Parameter | Type | Required | Description |
| string | Yes | Text node to modify |
| string | Yes | New text content |
figma_set_opacity
Set node transparency.
Parameter | Type | Required | Description |
| string | Yes | Node to modify |
| number | Yes | Opacity (0-1) |
figma_set_corner_radius
Set corner radius.
Parameter | Type | Required | Description |
| string | Yes | Node to modify |
| number | No | Uniform radius for all corners |
| number | No | Top-left corner radius |
| number | No | Top-right corner radius |
| number | No | Bottom-left corner radius |
| number | No | Bottom-right corner radius |
figma_set_effects
Set effects (shadows, blurs).
Parameter | Type | Required | Description |
| string | Yes | Node to modify |
| 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 |
| string | Yes | Node to apply style to |
| string | Yes | Style ID |
| string | Yes | Property: |
figma_set_variable
Set variable value or bind to node property.
Parameter | Type | Required | Description |
| string | Yes | Variable ID |
| string | No | Mode ID (for setting value) |
| any | No | Value to set |
| string | No | Node ID (for binding) |
| string | No | Field to bind ( |
| number | No | Paint array index for fills/strokes (default 0) |
figma_set_text_style
Set text font properties on an existing text node.
Parameter | Type | Required | Description |
| string | Yes | Text node ID |
| number | No | Font size in pixels |
| string | No | Font family (e.g., "Inter") |
| string | No | Font style (e.g., "Bold", "Regular") |
| string | No |
|
| string | No |
|
| object | No |
|
| object | No |
|
| string | No |
|
| string | No |
|
figma_create_paint_style
Create a local paint (color) style.
Parameter | Type | Required | Description |
| string | Yes | Style name (use |
| color | Yes | Fill color |
| string | No | Style description |
figma_create_text_style
Create a local text style.
Parameter | Type | Required | Default | Description |
| string | Yes | Style name (use | |
| string | No |
| Font family |
| string | No |
| Font style |
| number | No |
| Font size in pixels |
| object | No | Line height | |
| object | No | Letter spacing | |
| string | No | Text case transformation | |
| string | No | Text decoration | |
| string | No | Style description |
Layout Commands
figma_set_auto_layout
Configure auto-layout on a frame.
Parameter | Type | Required | Description |
| string | Yes | Frame to configure |
| string | No |
|
| string | No |
|
| string | No |
|
| string | No |
|
| string | No |
|
| number | No | Top padding |
| number | No | Right padding |
| number | No | Bottom padding |
| number | No | Left padding |
| number | No | Space between items |
| number | No | Space between rows when wrapped |
| string | No |
|
figma_set_layout_align
Set child alignment in auto-layout.
Parameter | Type | Required | Description |
| string | Yes | Child node to modify |
| string | No |
|
| number | No | Growth factor (0-1) |
| string | No |
|
Transform Commands
figma_move_nodes
Move nodes to a new position.
Parameter | Type | Required | Description |
| string[] | Yes | Nodes to move |
| number | No | X position or offset |
| number | No | Y position or offset |
| boolean | No | If true, x/y are offsets (default false) |
figma_resize_nodes
Resize nodes.
Parameter | Type | Required | Description |
| string[] | Yes | Nodes to resize |
| number | No | New width |
| number | No | New height |
figma_delete_nodes
Delete nodes.
Parameter | Type | Required | Description |
| string[] | Yes | Nodes to delete |
figma_group_nodes
Group multiple nodes.
Parameter | Type | Required | Default | Description |
| string[] | Yes | Nodes to group | |
| string | No |
| Group name |
figma_ungroup_nodes
Ungroup group nodes.
Parameter | Type | Required | Description |
| string[] | Yes | Group nodes to ungroup |
figma_rename_node
Rename nodes.
Parameter | Type | Required | Description |
| string | No | Single node ID |
| string[] | No | Batch node IDs |
| string | Yes | New name |
figma_reorder_node
Change z-order (layer order).
Parameter | Type | Required | Description |
| string | Yes | Node to reorder |
| string/number | Yes |
|
figma_set_constraints
Set resize constraints (non-auto-layout frames only).
Parameter | Type | Required | Description |
| string | Yes | Node to configure |
| string | No |
|
| string | No |
|
Navigation Commands
figma_set_selection
Set the current selection.
Parameter | Type | Required | Description |
| string[] | Yes | Nodes to select (empty to clear) |
figma_set_current_page
Switch to a different page.
Parameter | Type | Required | Description |
| string | Yes | Page ID to switch to |
Export Commands
figma_export_node
Export a node as an image.
Parameter | Type | Required | Default | Description |
| string | Yes | Node to export | |
| string | No |
| Format: |
| number | No |
| Export scale (1 = 100%) |
Returns base64-encoded data.
Component Commands
figma_detach_instance
Detach instance from component (converts to frame).
Parameter | Type | Required | Description |
| string | Yes | Instance to detach |
figma_swap_instance
Swap a component instance to use a different component.
Parameter | Type | Required | Description |
| string | Yes | Instance node ID to swap |
| string | Yes | Component ID to swap to |
figma_combine_as_variants
Combine multiple components into a component set with variants.
Parameter | Type | Required | Description |
| string[] | Yes | Array of component IDs (minimum 2). Components must use variant naming (e.g., "Size=Large") |
Variable Management Commands
figma_create_variable_collection
Create a new variable collection to organize variables.
Parameter | Type | Required | Description |
| string | Yes | Collection name |
| string[] | No | Mode names (defaults to |
figma_create_variable
Create a new variable in a collection.
Parameter | Type | Required | Description |
| string | Yes | Variable collection ID |
| string | Yes | Variable name (use |
| string | Yes |
|
| any | No | Initial value for default mode |
| string | No | Variable ID to alias (instead of direct value) |
| string | No | Variable description |
| string[] | No | Where this variable can be used |
figma_rename_variable
Rename an existing variable.
Parameter | Type | Required | Description |
| string | Yes | Variable ID to rename |
| string | Yes | New name (use |
figma_delete_variables
Delete one or more variables.
Parameter | Type | Required | Description |
| string[] | Yes | Array of variable IDs to delete |
figma_rename_variable_collection
Rename a variable collection.
Parameter | Type | Required | Description |
| string | Yes | Collection ID to rename |
| string | Yes | New name |
figma_delete_variable_collection
Delete a variable collection and all its variables.
Parameter | Type | Required | Description |
| string | Yes | Collection ID to delete |
figma_add_mode
Add a new mode to a variable collection.
Parameter | Type | Required | Description |
| string | Yes | Collection ID to add mode to |
| string | Yes | Name for the new mode |
figma_rename_mode
Rename a mode in a variable collection.
Parameter | Type | Required | Description |
| string | Yes | Collection ID containing the mode |
| string | Yes | Mode ID to rename |
| string | Yes | New name for the mode |
figma_delete_mode
Delete a mode from a variable collection.
Parameter | Type | Required | Description |
| string | Yes | Collection ID containing the mode |
| string | Yes | Mode ID to delete |
figma_unbind_variable
Remove a variable binding from a node property.
Parameter | Type | Required | Default | Description |
| string | Yes | Node ID to unbind from | |
| string | Yes | Field to unbind ( | |
| number | No |
| Paint array index for fills/strokes |
Page Management Commands
FigJam restriction:
figma_create_pageandfigma_duplicate_pageare Figma Design only. The FigJam plugin runtime does not exposefigma.createPage()orPageNode.clone(). FigJam files can have multiple pages, but they must be created via the FigJam UI — plugins cannot create them programmatically. Calling these tools in FigJam returnsFIGMA_DESIGN_ONLY. Other page operations (rename, delete, list, switch current page) work in both editors.
figma_create_page
Create a new page in the document. Figma Design only.
Parameter | Type | Required | Description |
| string | Yes | Name for the new page |
| number | No | Position in the page list (0 = first). Defaults to end. |
figma_rename_page
Rename an existing page.
Parameter | Type | Required | Description |
| string | Yes | Page ID to rename |
| string | Yes | New name for the page |
figma_delete_page
Delete a page from the document.
Parameter | Type | Required | Description |
| string | Yes | Page ID to delete |
Note: Cannot delete the last remaining page.
figma_duplicate_page
Clone an entire page including all its contents. Figma Design only.
Parameter | Type | Required | Description |
| string | Yes | Page ID to duplicate |
| string | No | Name for the new page (defaults to "original name + copy") |
FigJam Commands
These tools target FigJam-only node types (sticky notes, flowchart shapes, connectors, tables, code blocks, link previews). They return WRONG_EDITOR if called against a Figma design file. Sections (figma_create_section / figma_set_section) are the exception — they work in both editors.
figma_create_sticky
Create a sticky note. Default size is fixed (240×240); width/height are not configurable. Text is set via the embedded sublayer (font auto-loaded).
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| string | No | Sticky note body text | |
| color | No | Background color of the sticky | |
| boolean | No | Use the wide rectangular sticky variant | |
| string | No | Parent node ID (defaults to current page) |
Author info is read-only at runtime. Figma's plugin docs list
authorNameandauthorVisibleas R/W onStickyNode, but the FigJam runtime rejects writes with "no setter for property". Figma auto-populates both from the active user's identity, so the labeling works correctly without programmatic control.
figma_set_sticky
Toggle a sticky between square and wide-rectangle variants. Use figma_set_text to change the body text.
Parameter | Type | Required | Description |
| string | Yes | The |
| boolean | No | Wide vs square sticky |
figma_create_shape_with_text
Create a flowchart shape with embedded text. Use ROUNDED_RECTANGLE for processes, DIAMOND for decisions, ENG_DATABASE for data stores. cornerRadius is fixed by shapeType and cannot be set.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width in pixels |
| number | No |
| Height in pixels |
| string | Yes | See list below | |
| string | No | Embedded text content | |
| color | No | Shape fill color | |
| color | No | Shape stroke color | |
| number | No | Stroke weight in pixels | |
| string | No | Parent node ID |
Shape types (30 values): SQUARE, ELLIPSE, ROUNDED_RECTANGLE, DIAMOND, TRIANGLE_UP, TRIANGLE_DOWN, PARALLELOGRAM_RIGHT, PARALLELOGRAM_LEFT, ENG_DATABASE, ENG_QUEUE, ENG_FILE, ENG_FOLDER, TRAPEZOID, PREDEFINED_PROCESS, SHIELD, DOCUMENT_SINGLE, DOCUMENT_MULTIPLE, MANUAL_INPUT, HEXAGON, CHEVRON, PENTAGON, OCTAGON, STAR, PLUS, ARROW_LEFT, ARROW_RIGHT, SUMMING_JUNCTION, OR, SPEECH_BUBBLE, INTERNAL_STORAGE.
figma_set_shape_type
Change the shape variant of an existing shape-with-text node.
Parameter | Type | Required | Description |
| string | Yes | The |
| string | Yes | New shape type (see list above) |
figma_create_connector
Create an arrow / connector between nodes. Default endCap is ARROW_EQUILATERAL so connectors look like arrows without configuration. Endpoints can attach via magnets, fixed positions on a node, or be free-floating on the canvas.
Parameter | Type | Required | Default | Description |
| endpoint | No | Start endpoint (see endpoint shape below) | |
| endpoint | No | End endpoint | |
| string | No |
|
|
| string | No |
| Decoration at start |
| string | No |
| Decoration at end |
| string | No | Center label text | |
| color | No | Line color | |
| number | No | Line thickness | |
| string | No | Parent node ID |
Endpoint shapes (one of):
{ nodeId, magnet }— attach to a node with a magnet (AUTO,TOP,LEFT,BOTTOM,RIGHT,CENTER,NONE){ nodeId, position: { x, y } }— attach to a node at a fixed position relative to it{ position: { x, y } }— free-floating on canvas at absolute coordinates
Stroke caps: NONE, ARROW_EQUILATERAL, ARROW_LINES, TRIANGLE_FILLED, CIRCLE_FILLED, DIAMOND_FILLED.
Magnet rule:
STRAIGHTconnectors only supportCENTERorNONEmagnets.ELBOWEDandCURVEDaccept all six. Validation runs server-side.
figma_set_connector
Modify an existing connector's endpoints, line type, end caps, or label.
Parameter | Type | Required | Description |
| string | Yes | The |
| endpoint | No | Replacement start endpoint |
| endpoint | No | Replacement end endpoint |
| string | No | New line routing type |
| string | No | New start decoration |
| string | No | New end decoration |
| string | No | Replacement label text |
figma_create_section
Create a labeled section. Works in both Figma design files and FigJam. Supports Dev Mode handoff status.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Width in pixels |
| number | No |
| Height in pixels |
| string | No | Section label | |
| color | No | Section background fill | |
| boolean | No | Visually collapse the section's contents | |
| string | No |
| |
| string | No | Optional description shown with the dev status | |
| string | No | Parent node ID |
figma_set_section
Update a section's name, dev status, or content visibility. Pass devStatus: null to clear it.
Parameter | Type | Required | Description |
| string | Yes | The |
| string | No | New section label |
| boolean | No | Show or hide section contents |
| string|null | No |
|
| string | No | Description shown with dev status |
figma_create_table
Create a table for documentation or structured data. Optionally seed initial cell content.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| number | No |
| Number of rows |
| number | No |
| Number of columns |
| array | No | Initial cells: | |
| color | No | Table background fill | |
| string | No | Parent node ID |
figma_set_table_cell
Set the text and/or fill color of a single table cell.
Parameter | Type | Required | Description |
| string | Yes | The |
| number | Yes | Row index (0-based) |
| number | Yes | Column index (0-based) |
| string | No | New cell text |
| color | No | New cell background fill |
figma_insert_table_row / figma_insert_table_column
Insert a row/column at the given index (existing rows/columns at and after the index shift).
Parameter | Type | Required | Description |
| string | Yes | The |
| number | Yes | Insert position (0 = top/leftmost) |
figma_remove_table_row / figma_remove_table_column
Remove a row/column.
Parameter | Type | Required | Description |
| string | Yes | The |
| number | Yes | Index to remove |
figma_resize_table_row / figma_resize_table_column
Set row height / column width.
Parameter | Type | Required | Description |
| string | Yes | The |
| number | Yes | Target index |
| number | Yes | New dimension in pixels |
figma_move_table_row / figma_move_table_column
Reorder rows/columns.
Parameter | Type | Required | Description |
| string | Yes | The |
| number | Yes | Source index |
| number | Yes | Destination index |
figma_create_code_block
Create a syntax-highlighted code block for documentation.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| string | Yes | Code text content | |
| string | No |
| Syntax highlighting language |
| string | No | Parent node ID |
Languages (17 values): TYPESCRIPT, CPP, RUBY, CSS, JAVASCRIPT, HTML, JSON, GRAPHQL, PYTHON, GO, SQL, SWIFT, KOTLIN, RUST, BASH, PLAINTEXT, DART.
figma_set_code_block
Update an existing code block's code text or language.
Parameter | Type | Required | Description |
| string | Yes | The |
| string | No | New code text |
| string | No | New syntax-highlighting language |
figma_create_link_preview
Create a rich link preview from a URL. Returns either an EMBED (iframe; works for OEmbed providers like YouTube/Spotify) or a LINK_UNFURL (rich card from OpenGraph/Twitter Card metadata) — the response includes nodeType so callers know which.
Parameter | Type | Required | Default | Description |
| number | No |
| X position |
| number | No |
| Y position |
| string | Yes | The URL to preview | |
| string | No | Parent node ID |
Building a flowchart end-to-end
// 1. Section to wrap the diagram
figma_create_section({ x: 0, y: 0, width: 1000, height: 600, name: "User signup flow" })
// → returns { node: { id: 'XX:1', ... } }
// 2. Process steps as shapes-with-text
figma_create_shape_with_text({
x: 40, y: 80, width: 200, height: 80,
shapeType: 'ROUNDED_RECTANGLE',
text: 'Start',
parentId: 'XX:1'
})
figma_create_shape_with_text({
x: 320, y: 80, width: 200, height: 120,
shapeType: 'DIAMOND',
text: 'Email valid?',
parentId: 'XX:1'
})
// ...etc.
// 3. Connectors between them
figma_create_connector({
start: { nodeId: 'XX:2', magnet: 'AUTO' },
end: { nodeId: 'XX:3', magnet: 'AUTO' },
lineType: 'ELBOWED',
parentId: 'XX:1'
})
// endCap defaults to ARROW_EQUILATERAL — you get an arrow without specifying
// 4. Add a sticky for context
figma_create_sticky({
x: 600, y: 80,
text: 'TODO: rate-limit this endpoint',
parentId: 'XX:1'
})FigJam node types not creatable via this MCP
STAMP, HIGHLIGHT, WASHI_TAPE, WIDGET, and MEDIA cannot be created from a non-widget plugin (Figma's API doesn't expose factory methods, or requires a pre-uploaded image hash). They can still be cloned, moved, deleted, and serialized through existing tools — they just can't be created from scratch.
Prototype Commands
These tools set up prototype interactions on Figma Design nodes. They operate on the reactions array (read/written via setReactionsAsync) and the page-level flowStartingPoints list. They are not applicable to FigJam files.
figma_get_reactions
Read all reactions currently set on a node.
Parameter | Type | Required | Description |
| string | Yes | Node ID to read reactions from |
Returns the full reactions array including trigger and actions details for each reaction.
figma_add_reaction
Add a prototype interaction to a node. Existing reactions are preserved — each call appends one new reaction.
Parameter | Type | Required | Description |
| string | Yes | Node ID to add the reaction to |
| object | Yes | What initiates the interaction (see Trigger types below) |
| object | Yes | What happens when the trigger fires (see Action types below) |
Trigger types:
| Extra fields | Description |
| — | Tap / click |
| — | Hover |
| — | Press and hold |
| — | Drag |
| — | Media playback ends |
|
| Auto-advance after delay |
|
| Mouse button released |
|
| Mouse button pressed |
|
| Cursor enters element |
|
| Cursor leaves element |
|
| Key pressed |
|
| Media reaches timestamp |
device values for ON_KEY_DOWN: KEYBOARD (default), XBOX_ONE, PS4, SWITCH_PRO, UNKNOWN_CONTROLLER.
Action types:
| Key fields | Description |
|
| Navigate to / open / scroll to a frame |
| — | Go back to previous frame |
| — | Close the current overlay |
|
| Open a URL — set |
For NODE actions, the navigation field controls the behaviour:
| Description |
| Navigate to destination frame (default) |
| Open destination as an overlay |
| Swap the current frame with destination |
| Scroll to destination within the current frame |
| Change component to a different variant |
Transition object (optional, for NODE actions):
Field | Values | Notes |
|
| Simple transitions — no |
|
| Directional — requires |
|
| Required for directional types |
| boolean (default | Smart-match shared layers — directional types only |
| number (seconds) | Default |
|
|
|
Example — click to navigate with a slide transition:
figma_add_reaction({
nodeId: '10:5',
trigger: { type: 'ON_CLICK' },
action: {
type: 'NODE',
destinationId: '10:20',
navigation: 'NAVIGATE',
transition: {
type: 'SLIDE_IN',
direction: 'LEFT',
duration: 0.3,
easing: { type: 'EASE_OUT' }
}
}
})Example — auto-advance after 3 seconds:
figma_add_reaction({
nodeId: '10:5',
trigger: { type: 'AFTER_TIMEOUT', timeout: 3000 },
action: {
type: 'NODE',
destinationId: '10:30',
navigation: 'NAVIGATE',
transition: { type: 'DISSOLVE', duration: 0.5, easing: { type: 'EASE_IN_AND_OUT' } }
}
})figma_remove_reaction
Remove a reaction from a node by its zero-based index. Use figma_get_reactions first to identify the index.
Parameter | Type | Required | Description |
| string | Yes | Node ID to remove the reaction from |
| number | Yes | Zero-based index of the reaction to remove |
figma_set_flow_starting_point
Set or clear a prototype flow starting point. Flow starting points are page-level — Figma stores them on the parent PageNode as a list of { nodeId, name } entries. The first entry is the default when entering Presentation view with nothing selected.
Parameter | Type | Required | Default | Description |
| string | Yes |
| |
| string | No |
| Display name for the flow. If the frame is already a starting point, its name is updated. |
| boolean | No | If |
Top-level frames (direct children of a page) are the typical starting points. The Figma typings mark
PageNode.flowStartingPointsasReadonlyArray, but the runtime accepts direct assignment — that's the documented (if quirky) pattern this tool uses internally.
Structure Commands
figma_reparent_nodes
Move nodes to a different parent container.
Parameter | Type | Required | Description |
| string[] | Yes | Array of node IDs to move |
| string | Yes | New parent node ID (must be a frame, group, or page) |
| number | No | Position within the new parent (0 = bottom/back). Defaults to top/front. |
figma_move_to_page
Move nodes from their current page to a different page.
Parameter | Type | Required | Description |
| string[] | Yes | Array of node IDs to move |
| string | Yes | Destination page ID |
| number | No | X position on target page |
| number | No | Y position on target page |
figma_set_rotation
Set the rotation of one or more nodes.
Parameter | Type | Required | Description |
| string[] | Yes | Array of node IDs to rotate |
| number | Yes | Rotation in degrees (-180 to 180) |
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 |
| string | Wildcard pattern ( | |
| string |
| Variable type filter |
| string | Collection name filter | |
| boolean |
| Minimal data (id, name, value only) |
| number |
| Max results |
Node Traversal
Use the depth parameter in figma_get_nodes:
Depth | Properties | Use Case |
| ~5 | Tree traversal, finding nodes |
| ~10 | Layout inspection |
| ~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 |
| Find frames/elements by name | ~50 tokens/node |
| Browse hierarchy level-by-level | ~50 tokens/node |
| Find specific components | ~50 tokens/result |
| 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
lengthparameterVectors only support M, L, Q, C, Z commands (no arcs)
detachInstance()also detaches ancestor instances30-second timeout on all commands
Troubleshooting
Plugin Not Connecting
Ensure the MCP server is running.
Ask Claude what port the bridge is on — the MCP server tells Claude its actual WebSocket port via the
instructionsfield on session init, and Claude will surface it proactively whenfigma_get_contextreportsconnected: false. You can also callfigma_server_infodirectly to see the port.Match that port in the Figma plugin UI's port input.
Re-run the plugin in Figma (
Cmd+Option+P).
Port Already in Use
The server automatically tries ports 3055–3070 in order. The actual bound port may differ from the default if you have multiple sessions running. To force a specific port:
FIGMA_BRIDGE_PORT=3057 node src/index.jsMultiple Claude Code Instances
Each Claude Code instance spawns its own MCP server, and each binds to the next available port in the 3055–3070 range. The bridge handles this automatically:
Start as many Claude Code sessions as you want — each picks an open port.
Ask Claude in each session what port it's on (or call
figma_server_info). The MCP server's instructions tell Claude to surface this when not connected.In each Figma file's plugin instance: type the matching port number and click Connect.
You can confirm which version + port a given session is on with figma_server_info — it returns { version, port, connected, documentInfo }.
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
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/magic-spells/figma-mcp-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server