npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@iflow-mcp/magic-spells-figma-mcp-bridge

v0.1.3

Published

MCP server enabling Claude to read and manipulate Figma documents via WebSocket bridge

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 plugin folder 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

  1. Clone the repository

    git clone https://github.com/magic-spells/figma-mcp-bridge.git
    cd figma-mcp-bridge
    npm install
  2. Add to Claude Code

    claude mcp add figma-mcp-bridge node /path/to/figma-mcp-bridge/src/index.js
  3. Install the Figma plugin

    • In Figma: Plugins → Development → Import plugin from manifest
    • Select plugin/manifest.json from the cloned repo
  4. 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_variables for 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 length parameter
  • 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

  1. Ensure the MCP server is running
  2. Check the port: default is 3055, or set FIGMA_BRIDGE_PORT
  3. Restart the plugin in Figma
  4. 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:

  1. First instance: Use default port 3055
  2. Second instance: Set FIGMA_BRIDGE_PORT=3056
  3. 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