# io.github.jirayusueb/figma-mcp-rs (npm · figma-mcp-rs)

Figma/FigJam MCP server with read/write via plugin — no API token, no limits. 78 tools.

- Trust score: 76/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `figma-mcp-rs`: 76/100 (this document), [markdown](https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs.md), [page](https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs)

## Channel facts

- Registry: `npm`
- Package: `figma-mcp-rs`
- Version: `0.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 8 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 89/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 8650 tokens (~102/item across 84 items; 84 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 96% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_nodes" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 84 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the io.github.jirayusueb/figma-mcp-rs server?

io.github.jirayusueb/figma-mcp-rs runs locally as an npm package, launched with npx -y figma-mcp-rs. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add jirayusueb-figma-mcp-rs -- npx -y figma-mcp-rs
```

### Cursor

```json
{
  "mcpServers": {
    "jirayusueb-figma-mcp-rs": {
      "command": "npx",
      "args": [
        "-y",
        "figma-mcp-rs"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "jirayusueb-figma-mcp-rs": {
      "command": "npx",
      "args": [
        "-y",
        "figma-mcp-rs"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add jirayusueb-figma-mcp-rs -- npx -y figma-mcp-rs
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jirayusueb-figma-mcp-rs": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "figma-mcp-rs"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add jirayusueb-figma-mcp-rs --command npx --arg -y --arg figma-mcp-rs
```

### Hermes

```yaml
mcp_servers:
  jirayusueb-figma-mcp-rs:
    command: "npx"
    args: ["-y", "figma-mcp-rs"]
```

### Netclaw

```json
{
  "McpServers": {
    "jirayusueb-figma-mcp-rs": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "figma-mcp-rs"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add jirayusueb-figma-mcp-rs -t stdio -c npx -a -y figma-mcp-rs
```

### Other

```json
{
  "mcpServers": {
    "jirayusueb-figma-mcp-rs": {
      "command": "npx",
      "args": [
        "-y",
        "figma-mcp-rs"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 75, +4)

- [functional improvement] Stability: unverified → 0.23

### 2026-09-13 (score 71, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-09-11 (score 56)

First indexed and scored.

## MCP tools (84)

### `add_page` (~58 tokens)

Add a new page to the Figma document.

Input parameters:

- `index` (number|null): Position index to insert the page (0 = first). Defaults to last position.
- `name` (string|null): Name for the new page (default 'Page')

### `add_variable_mode` (~30 tokens)

Input parameters:

- `collectionId` (string, required): Variable collection ID
- `modeName` (string, required): Name for the new mode

### `apply_style_to_node` (~99 tokens)

Apply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style.

Input parameters:

- `nodeId` (string, required): Target node ID in colon format e.g. 4029:12345
- `styleId` (string, required): Style ID to apply (from get_styles)
- `target` (string|null): For paint styles only — apply to 'fill' (default) or 'stroke'

### `auto_arrange` (~137 tokens)

Auto-arrange objects on a FigJam board in grid, row, or column layout. FigJam only.

Input parameters:

- `columns` (number|null): Grid columns (default auto based on sqrt of count)
- `layout` (string|null): Layout mode: "grid", "row", or "column" (default "grid")
- `nodeIds` (array|null): Node IDs to arrange (optional; if absent, arranges page children)
- `spacing` (number|null): Spacing between items (default 40)
- `startX` (number|null): Starting X position
- `startY` (number|null): Starting Y position

### `batch_rename_nodes` (~166 tokens)

Rename multiple nodes using find/replace, regex substitution, or prefix/suffix addition.

Input parameters:

- `find` (string|null): String (or regex pattern when useRegex=true) to search for in the node name
- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `prefix` (string|null): String to prepend to the node name
- `regexFlags` (string|null): Regex flags e.g. 'gi' (default 'g'). Only used when useRegex=true.
- `replace` (string|null): Replacement string. Required when find is provided.
- `suffix` (string|null): String to append to the node name
- `useRegex` (boolean|null): Treat find as a regular expression (default false)

### `bind_variable_to_node` (~197 tokens)

Bind a local variable to a node property so the property is driven by the variable's value. COLOR variables: use fillColor or strokeColor. BOOLEAN variables: use visible. FLOAT variables: use opacity, rotation, width, height, cornerRadius, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius, strokeWeight, itemSpacing, paddingTop, paddingRight, paddingBottom, paddingLeft.

Input parameters:

- `field` (string, required): Property to bind: fillColor | strokeColor | visible | opacity | rotation | width | height | cornerRadius | topLeftRadius | topRightRadius | bottomLeftRadius | bottomRightRadius | strokeWeight | itemS…
- `nodeId` (string, required): Target node ID in colon format e.g. 4029:12345
- `variableId` (string, required): Variable ID to bind (from get_variable_defs)

### `clone_node` (~96 tokens)

Clone an existing node, optionally repositioning it or placing it in a new parent.

Input parameters:

- `nodeId` (string, required): Source node ID in colon format e.g. '4029:12345'
- `parentId` (string|null): Parent node ID for the clone. Defaults to same parent as source.
- `x` (number|null): X position of the clone
- `y` (number|null): Y position of the clone

### `create_code_block` (~73 tokens)

Create a code block on a FigJam board with syntax highlighting. FigJam only.

Input parameters:

- `code` (string, required): Code content (required)
- `language` (string|null): Programming language (default "PLAINTEXT")
- `x` (number|null): X position
- `y` (number|null): Y position

### `create_component` (~76 tokens)

Convert an existing FRAME node into a reusable COMPONENT. The frame is replaced in place by the new component.

Input parameters:

- `name` (string|null): Optional name for the component. Defaults to the frame's current name.
- `nodeId` (string, required): FRAME node ID to convert, in colon format e.g. '4029:12345'

### `create_connector` (~100 tokens)

Create a connector on the current FigJam page, optionally linked between two nodes. FigJam only.

Input parameters:

- `endNodeId` (string|null): Optional node ID the connector ends at, colon format e.g. '4029:67890'
- `startNodeId` (string|null): Optional node ID the connector starts from, colon format e.g. '4029:12345'
- `text` (string|null): Optional text label for the connector

### `create_effect_style` (~217 tokens)

Create a new local effect style (drop shadow, inner shadow, or blur).

Input parameters:

- `color` (string|null): Shadow color as hex e.g. #000000 (default #000000, shadows only)
- `description` (string|null): Optional style description
- `name` (string, required): Style name e.g. 'Shadow/Card'
- `offsetX` (number|null): Shadow X offset in pixels (default 0, shadows only)
- `offsetY` (number|null): Shadow Y offset in pixels (default 4, shadows only)
- `opacity` (number|null): Shadow color opacity 0–1 (default 0.25, shadows only)
- `radius` (number|null): Blur radius in pixels (default 8 for shadows, 4 for blurs)
- `spread` (number|null): Shadow spread in pixels (default 0, shadows only)
- `type` (string|null): Effect type: DROP_SHADOW (default), INNER_SHADOW, LAYER_BLUR, or BACKGROUND_BLUR

### `create_ellipse` (~139 tokens)

Create a new ellipse (circle/oval) on the current page or inside a parent node.

Input parameters:

- `fillColor` (string|null): Fill color as hex e.g. #3B82F6
- `height` (number|null): Height in pixels (default 100)
- `name` (string|null): Ellipse name
- `parentId` (string|null): Parent node ID in colon format. Defaults to current page.
- `width` (number|null): Width in pixels (default 100)
- `x` (number|null): X position (default 0)
- `y` (number|null): Y position (default 0)

### `create_frame` (~348 tokens)

Create a new frame on the current page or inside a parent node.

Input parameters:

- `counterAxisAlignItems` (string|null): Cross-axis alignment: MIN, CENTER, MAX, or BASELINE
- `counterAxisSizingMode` (string|null): Cross-axis sizing: FIXED or AUTO (hug)
- `counterAxisSpacing` (number|null): Gap between wrapped rows/columns (only when layoutWrap is WRAP)
- `fillColor` (string|null): Fill color as hex e.g. #FFFFFF
- `height` (number|null): Height in pixels (default 100)
- `itemSpacing` (number|null): Auto-layout gap between children
- `layoutMode` (string|null): Auto-layout direction: HORIZONTAL, VERTICAL, or NONE
- `layoutWrap` (string|null): Wrap behaviour: NO_WRAP or WRAP
- `name` (string|null): Frame name
- `paddingBottom` (number|null): Auto-layout bottom padding
- `paddingLeft` (number|null): Auto-layout left padding
- `paddingRight` (number|null): Auto-layout right padding
- `paddingTop` (number|null): Auto-layout top padding
- `parentId` (string|null): Parent node ID in colon format. Defaults to current page.
- `primaryAxisAlignItems` (string|null): Main-axis alignment: MIN, CENTER, MAX, or SPACE_BETWEEN
- `primaryAxisSizingMode` (string|null): Main-axis sizing: FIXED or AUTO (hug)
- `width` (number|null): Width in pixels (default 100)
- `x` (number|null): X position (default 0)
- `y` (number|null): Y position (default 0)

### `create_grid_style` (~236 tokens)

Create a new local layout grid style.

Input parameters:

- `alignment` (string|null): Alignment: STRETCH (default), CENTER, MIN, or MAX (COLUMNS/ROWS only)
- `color` (string|null): Grid line color as hex e.g. #FF0000 (GRID only, default #FF0000)
- `count` (number|null): Number of columns or rows (COLUMNS/ROWS only, default 12)
- `description` (string|null): Optional style description
- `gutterSize` (number|null): Gutter size in pixels (COLUMNS/ROWS only, default 16)
- `name` (string, required): Style name e.g. 'Grid/Desktop'
- `offset` (number|null): Margin/offset in pixels (COLUMNS/ROWS only, default 0)
- `opacity` (number|null): Grid line opacity 0–1 (GRID only, default 0.1)
- `pattern` (string|null): Grid pattern: GRID (default), COLUMNS, or ROWS
- `sectionSize` (number|null): Grid cell size in pixels (GRID only, default 8)

### `create_paint_style` (~67 tokens)

Create a new local paint style with a solid fill color.

Input parameters:

- `color` (string, required): Fill color as hex e.g. #FF5733
- `description` (string|null): Optional style description
- `name` (string, required): Style name e.g. 'Brand/Primary'

### `create_rectangle` (~143 tokens)

Create a new rectangle on the current page or inside a parent node.

Input parameters:

- `cornerRadius` (number|null): Corner radius in pixels
- `fillColor` (string|null): Fill color as hex e.g. #FF5733
- `height` (number|null): Height in pixels (default 100)
- `name` (string|null): Rectangle name
- `parentId` (string|null): Parent node ID in colon format. Defaults to current page.
- `width` (number|null): Width in pixels (default 100)
- `x` (number|null): X position (default 0)
- `y` (number|null): Y position (default 0)

### `create_section` (~97 tokens)

Create a Figma Section node on the current page. Sections are the modern way to organize frames and groups on a page.

Input parameters:

- `height` (number|null): Height in pixels
- `name` (string|null): Section name (default 'Section')
- `width` (number|null): Width in pixels
- `x` (number|null): X position (default 0)
- `y` (number|null): Y position (default 0)

### `create_shape_with_text` (~115 tokens)

Create a shape with text on a FigJam board (rectangles, circles, diamonds, etc.). FigJam only.

Input parameters:

- `fillColor` (string|null): Fill color as hex
- `height` (number|null): Height
- `shapeType` (string|null): Shape type (default "ROUNDED_RECTANGLE")
- `text` (string, required): Text content (required)
- `width` (number|null): Width
- `x` (number|null): X position
- `y` (number|null): Y position

### `create_stickies` (~122 tokens)

Create multiple sticky notes at once on a FigJam board, with optional grid auto-layout. FigJam only.

Input parameters:

- `columns` (number|null): Number of columns in grid layout (default 5)
- `items` (array, required): Array of stickies to create (required, max 200)
- `spacing` (number|null): Spacing between stickies (default 40)
- `startX` (number|null): Starting X position for grid (default 0)
- `startY` (number|null): Starting Y position for grid (default 0)

### `create_sticky` (~99 tokens)

Create a sticky note on the current FigJam page. FigJam only.

Input parameters:

- `fillColor` (string|null): Fill color as hex string e.g. '#FFD54F'
- `name` (string|null): Optional name for the node
- `text` (string, required): Text content for the sticky note (required)
- `x` (number|null): X position on the canvas
- `y` (number|null): Y position on the canvas

### `create_table` (~107 tokens)

Create a table on a FigJam board with optional cell text content. FigJam only.

Input parameters:

- `cells` (array|null): Cell contents (optional, ragged arrays OK)
- `columns` (number, required): Number of columns (required, 1-50)
- `name` (string|null): Table name
- `rows` (number, required): Number of rows (required, 1-50)
- `x` (number|null): X position
- `y` (number|null): Y position

### `create_text` (~258 tokens)

Create a new text node on the current page or inside a parent node. The font is loaded automatically before insertion. Returns the created node ID and bounds. Use set_text to update the content of an existing text node.

Input parameters:

- `fillColor` (string|null): Text color as hex e.g. #000000 (default black)
- `fontFamily` (string|null): Font family name e.g. 'Inter', 'Roboto', 'SF Pro Display' (default Inter). Must be a font installed in Figma.
- `fontSize` (number|null): Font size in pixels (default 14)
- `fontStyle` (string|null): Font style variant e.g. 'Regular', 'Bold', 'Italic', 'Medium', 'SemiBold' (default Regular). Must match an available style for the chosen fontFamily.
- `name` (string|null): Node name shown in the layers panel (defaults to the text content)
- `parentId` (string|null): Parent node ID in colon format. Defaults to current page.
- `text` (string, required): Text content to display
- `x` (number|null): X position in pixels (default 0)
- `y` (number|null): Y position in pixels (default 0)

### `create_text_style` (~281 tokens)

Create a new local text style (typography preset). Returns the new style's ID. Apply it to nodes with apply_style_to_node. Use get_styles to list existing text styles.

Input parameters:

- `description` (string|null): Optional human-readable description shown in the Figma style panel
- `fontFamily` (string|null): Font family name e.g. 'Inter', 'Roboto' (default Inter). Must be installed in Figma.
- `fontSize` (number|null): Font size in pixels (default 16)
- `fontStyle` (string|null): Font style variant e.g. 'Regular', 'Bold', 'Medium', 'SemiBold' (default Regular)
- `letterSpacingUnit` (string|null): Letter spacing unit: PIXELS (default) or PERCENT
- `letterSpacingValue` (number|null): Letter spacing value (unit set by letterSpacingUnit)
- `lineHeightUnit` (string|null): Line height unit: PIXELS (default) or PERCENT
- `lineHeightValue` (number|null): Line height value (unit set by lineHeightUnit)
- `name` (string, required): Style name — use slash notation to organise into groups e.g. 'Heading/H1', 'Body/Regular'
- `textDecoration` (string|null): Text decoration: NONE (default), UNDERLINE, or STRIKETHROUGH

### `create_variable` (~187 tokens)

Create a new variable (design token) inside an existing collection. Returns the new variable's ID. Use get_variable_defs to find collection IDs, set_variable_value to set values per mode, and bind_variable_to_node to apply the variable to a node property.

Input parameters:

- `collectionId` (string, required): ID of the variable collection to add this variable to (from get_variable_defs)
- `name` (string, required): Variable name — use slash notation to group e.g. 'Color/Primary', 'Spacing/MD'
- `type` (string, required): Variable type: COLOR (hex color), FLOAT (numeric dimension/spacing), STRING (text), or BOOLEAN (true/false toggle)
- `value` (string|null): Initial value for the first mode. COLOR: hex e.g. #FF5733. FLOAT: number e.g. 16. STRING: text. BOOLEAN: true or false.

### `create_variable_collection` (~36 tokens)

Input parameters:

- `initialModeName` (string|null): Name for the initial mode (default 'Mode 1')
- `name` (string, required): Collection name

### `delete_nodes` (~49 tokens)

Delete one or more nodes. This cannot be undone via MCP — use with care.

Input parameters:

- `nodeIds` (array, required): Node IDs to delete in colon format e.g. ['4029:12345']

### `delete_page` (~65 tokens)

Delete a page from the Figma document. Cannot delete the only remaining page.

Input parameters:

- `pageId` (string|null): Page node ID in colon format e.g. '0:2'
- `pageName` (string|null): Exact page name to delete (alternative to pageId)

### `delete_style` (~37 tokens)

Delete a style (paint, text, effect, or grid) by its ID.

Input parameters:

- `styleId` (string, required): Style ID to delete

### `delete_variable` (~74 tokens)

Delete a single variable (provide variableId) or an entire collection and all its variables (provide collectionId). Provide exactly one of the two — not both.

Input parameters:

- `collectionId` (string|null): Collection ID to delete (removes all variables in the collection)
- `variableId` (string|null): Variable ID to delete

### `detach_instance` (~60 tokens)

Detach one or more component instances, converting them to plain frames. The link to the main component is broken; all visual properties are preserved.

Input parameters:

- `nodeIds` (array, required): INSTANCE node IDs in colon format e.g. ['4029:12345']

### `execute_code` (~165 tokens)

Run arbitrary Figma Plugin API code inside the plugin sandbox and return its value. The code runs as an async function body — use await and end with a return. Use this only for operations the dedicated tools do not cover; prefer the specific tool when one exists. Runs in the user's open file and is undoable with Cmd/Ctrl+Z.

Input parameters:

- `code` (string, required): The code to execute. It runs as an async function body — use `await` and end with a `return`. Use this only for operations the dedicated tools do not cover; prefer the specific tool when one exists.
- `timeoutMs` (number|null): Optional timeout in milliseconds (1-25000, default 5000). Clipped to keep it under the bridge's 30s deadline.

### `export_frames_to_pdf` (~99 tokens)

Export multiple frames as a single multi-page PDF file. Each frame becomes one page in order. Ideal for pitch decks, proposals, and slide exports.

Input parameters:

- `nodeIds` (array, required): Ordered list of frame node IDs to export as PDF pages, colon format e.g. '4029:12345'
- `outputPath` (string, required): File path to write the PDF to, must end in .pdf (relative to working directory or absolute)

### `export_tokens` (~53 tokens)

Export all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase.

Input parameters:

- `format` (string|null): Output format: json (default) or css

### `find_replace_text` (~140 tokens)

Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

Input parameters:

- `find` (string, required): Text string (or regex pattern when useRegex=true) to search for
- `nodeId` (string|null): Root node ID to scope the search. Defaults to the entire current page.
- `regexFlags` (string|null): Regex flags e.g. 'gi' (default 'g'). Only used when useRegex=true.
- `replace` (string, required): Replacement string (use empty string to delete matches)
- `useRegex` (boolean|null): Treat find as a regular expression (default false)

### `get_annotations` (~87 tokens)

Get dev-mode annotations in the current document or scoped to a specific node. Returns annotation objects with label text, measurement type, and the ID of the annotated node. Omit nodeId to retrieve all annotations on the current page.

Input parameters:

- `nodeId` (string|null): Optional — scope results to annotations on this node and its descendants, colon format e.g. '4029:12345'

### `get_board_contents` (~49 tokens)

Get all objects and connectors on the current FigJam page. Returns nodes with text content and connection data. FigJam only.

Input parameters:

- `includeConnections` (boolean|null): Include connector information (default true)

### `get_design_context` (~169 tokens)

Get a depth-limited, token-efficient tree of the current selection or page. Use this instead of get_document when exploring large files. Supports detail levels (minimal/compact/full) and dedupe_components for pages heavy with repeated component instances.

Input parameters:

- `dedupe_components` (boolean|null): When true, INSTANCE nodes are serialized compactly (mainComponentId + componentProperties + overrides array of differing text/nested content) and unique component definitions are collected once in a…
- `depth` (number|null): How many levels deep to traverse (default 2)
- `detail` (string|null): Property verbosity: minimal (id/name/type/bounds only), compact (+fills/strokes/opacity), full (everything, default)

### `get_document` (~50 tokens)

Get the full node tree of the current page (not the whole file — only the active page). Returns all nodes recursively and can be very large. Prefer get_design_context for exploration or when token efficiency matters.

### `get_fonts` (~32 tokens)

List all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes.

### `get_local_components` (~20 tokens)

Get all components defined in the current Figma file.

### `get_metadata` (~25 tokens)

Get metadata about the current Figma document: file name, pages, current page

### `get_node` (~79 tokens)

Get a single node by ID with full detail. Use get_nodes_info to fetch multiple nodes in one round-trip instead of calling this repeatedly. Node ID must be colon format e.g. '4029:12345', never hyphens.

Input parameters:

- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'

### `get_nodes_info` (~66 tokens)

Get full details for multiple nodes by ID in one round-trip. Prefer this over calling get_node repeatedly when you need several nodes.

Input parameters:

- `nodeIds` (array, required): List of node IDs in colon format e.g. ['4029:12345', '4029:67890']

### `get_pages` (~26 tokens)

List all pages in the document with their IDs and names. Lightweight alternative to get_document.

### `get_reactions` (~99 tokens)

Get the prototype reactions defined on a node. Returns an array of reaction objects — each has a trigger (e.g. ON_CLICK, ON_HOVER, AFTER_TIMEOUT) and an actions array (navigate to node, open URL, go back, etc.). Use set_reactions to add or replace reactions, remove_reactions to delete them.

Input parameters:

- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'

### `get_screenshot` (~113 tokens)

Export a screenshot of one or more nodes as base64-encoded image data (held in memory). Use save_screenshots instead when you want to write images directly to disk without base64 in the response.

Input parameters:

- `format` (string|null): Export format: PNG (default), SVG, JPG, or PDF
- `nodeIds` (array|null): Optional node IDs to export, colon format. If empty, exports current selection.
- `scale` (number|null): Export scale for raster formats (default 2)

### `get_selection` (~44 tokens)

Get the nodes currently selected in Figma. Returns an empty array if nothing is selected. Use get_design_context or get_node to retrieve deeper detail about a specific node by ID.

### `get_status` (~47 tokens)

Check whether the Figma plugin bridge is connected and get setup instructions when it is not. Call this first if any tool fails with 'plugin not connected'. Does not touch the Figma document.

### `get_styles` (~65 tokens)

Get all local styles in the document (paint, text, effect, and grid). Returns each style's ID, name, type, and properties. Use the style ID with apply_style_to_node or update_paint_style. For design tokens (variables), use get_variable_defs instead.

### `get_variable_defs` (~31 tokens)

Get all local variable definitions: collections, modes, and values. Variables are Figma's design token system.

### `get_viewport` (~26 tokens)

Get the current Figma viewport: scroll center, zoom level, and visible bounds.

### `group_nodes` (~75 tokens)

Group two or more nodes into a GROUP. All nodes must share the same parent.

Input parameters:

- `name` (string|null): Optional name for the new group
- `nodeIds` (array, required): Node IDs to group (minimum 2), in colon format e.g. ['4029:12345', '4029:12346']

### `import_image` (~174 tokens)

Import a base64-encoded image into Figma as a rectangle with an image fill. Use get_screenshot to capture images or provide your own base64 PNG/JPG.

Input parameters:

- `height` (number|null): Height in pixels (default 200)
- `imageData` (string, required): Base64-encoded image data (PNG or JPG)
- `name` (string|null): Node name
- `parentId` (string|null): Parent node ID in colon format. Defaults to current page.
- `scaleMode` (string|null): Image scale mode: FILL (default), FIT, CROP, or TILE
- `width` (number|null): Width in pixels (default 200)
- `x` (number|null): X position (default 0)
- `y` (number|null): Y position (default 0)

### `lock_nodes` (~43 tokens)

Lock one or more nodes to prevent accidental edits in Figma.

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']

### `move_nodes` (~82 tokens)

Move one or more nodes to an absolute canvas position. The same x/y is applied to every node independently (not a relative offset from current position).

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `x` (number|null): Target X position
- `y` (number|null): Target Y position

### `navigate_to_page` (~61 tokens)

Switch the active Figma page. Provide either pageId or pageName.

Input parameters:

- `pageId` (string|null): Page node ID in colon format e.g. '0:1'
- `pageName` (string|null): Exact page name to navigate to

### `remove_reactions` (~91 tokens)

Remove prototype reactions from a node. Omit indices to remove all reactions. Provide a zero-based indices array to remove specific reactions (use get_reactions first to see current indices).

Input parameters:

- `indices` (array|null): Zero-based indices of reactions to remove. Omit or pass [] to remove all.
- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'

### `rename_node` (~104 tokens)

Rename a single node by ID. Returns the updated node with its new name. Use batch_rename_nodes to rename multiple nodes at once or to apply find/replace patterns across many nodes.

Input parameters:

- `name` (string, required): New name for the node. Figma supports slash-separated path notation e.g. 'Icons/Arrow/Left' to organise nodes in component panels.
- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'

### `rename_page` (~72 tokens)

Rename an existing page in the Figma document.

Input parameters:

- `newName` (string, required): New name for the page
- `pageId` (string|null): Page node ID in colon format e.g. '0:2'
- `pageName` (string|null): Current page name to find (alternative to pageId)

### `reorder_nodes` (~69 tokens)

Change the z-order (layer stack position) of one or more nodes.

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `order` (string, required): Order operation: bringToFront, sendToBack, bringForward, or sendBackward

### `reparent_nodes` (~72 tokens)

Move one or more nodes to a different parent frame, group, or section.

Input parameters:

- `nodeIds` (array, required): Node IDs to move in colon format e.g. ['4029:12345']
- `parentId` (string, required): Target parent node ID in colon format e.g. '4029:99'

### `resize_nodes` (~83 tokens)

Resize one or more nodes. The same width/height is applied to every node in the list independently. Provide width, height, or both.

Input parameters:

- `height` (number|null): New height in pixels
- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `width` (number|null): New width in pixels

### `rotate_nodes` (~62 tokens)

Rotate one or more nodes to an absolute angle in degrees.

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `rotation` (number, required): Rotation angle in degrees (positive = counter-clockwise in Figma)

### `save_screenshots` (~117 tokens)

Export screenshots for multiple nodes and write them to the local filesystem. Returns file metadata (path, size, dimensions) — no base64 in the response. Use get_screenshot instead when you need the image data in memory.

Input parameters:

- `format` (string|null): Default export format: PNG (default), SVG, JPG, or PDF
- `items` (array, required): List of {nodeId, outputPath, format?, scale?} objects
- `scale` (number|null): Default export scale for raster formats (default 2)

### `scan_nodes_by_types` (~85 tokens)

Find all nodes of specific types in a subtree, regardless of name. Use search_nodes instead when you need to filter by name.

Input parameters:

- `nodeId` (string, required): Root node ID to scan from, colon format e.g. '4029:12345'
- `types` (array, required): Node types to find e.g. ['FRAME', 'COMPONENT', 'INSTANCE']

### `scan_text_nodes` (~72 tokens)

Scan all TEXT nodes in a subtree and return their content. Shorthand for scan_nodes_by_types with ['TEXT'] — use when you only need text copy from a component or frame.

Input parameters:

- `nodeId` (string, required): Root node ID to scan from, colon format e.g. '4029:12345'

### `search_nodes` (~140 tokens)

Search for nodes by name substring and/or type within a subtree. Use this when you know (part of) the node name. Use scan_nodes_by_types when you want all nodes of a type regardless of name.

Input parameters:

- `limit` (number|null): Maximum results to return (default: 50)
- `nodeId` (string|null): Scope search to this subtree (default: current page), colon format e.g. '4029:12345'
- `query` (string, required): Name substring to match (case-insensitive)
- `types` (array|null): Filter by Figma node type e.g. ['TEXT', 'FRAME', 'COMPONENT']

### `set_auto_layout` (~256 tokens)

Set or update auto-layout (flex) properties on an existing frame.

Input parameters:

- `counterAxisAlignItems` (string|null): Cross-axis alignment: MIN, CENTER, MAX, or BASELINE
- `counterAxisSizingMode` (string|null): Cross-axis sizing: FIXED or AUTO (hug)
- `counterAxisSpacing` (number|null): Gap between wrapped rows/columns (only when layoutWrap is WRAP)
- `itemSpacing` (number|null): Gap between children
- `layoutMode` (string|null): Auto-layout direction: HORIZONTAL, VERTICAL, or NONE
- `layoutWrap` (string|null): Wrap behaviour: NO_WRAP or WRAP
- `nodeId` (string, required): Frame node ID in colon format e.g. '4029:12345'
- `paddingBottom` (number|null): Bottom padding
- `paddingLeft` (number|null): Left padding
- `paddingRight` (number|null): Right padding
- `paddingTop` (number|null): Top padding
- `primaryAxisAlignItems` (string|null): Main-axis alignment: MIN, CENTER, MAX, or SPACE_BETWEEN
- `primaryAxisSizingMode` (string|null): Main-axis sizing: FIXED or AUTO (hug)

### `set_blend_mode` (~120 tokens)

Set the blend mode of one or more nodes (e.g. MULTIPLY, SCREEN, OVERLAY).

Input parameters:

- `blendMode` (string, required): Blend mode: NORMAL, MULTIPLY, SCREEN, OVERLAY, DARKEN, LIGHTEN, COLOR_DODGE, COLOR_BURN, HARD_LIGHT, SOFT_LIGHT, DIFFERENCE, EXCLUSION, HUE, SATURATION, COLOR, LUMINOSITY, PASS_THROUGH
- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']

### `set_constraints` (~102 tokens)

Set layout constraints (pinning behaviour) on one or more nodes relative to their parent.

Input parameters:

- `horizontal` (string|null): Horizontal constraint: MIN (left), MAX (right), CENTER, STRETCH, or SCALE
- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `vertical` (string|null): Vertical constraint: MIN (top), MAX (bottom), CENTER, STRETCH, or SCALE

### `set_corner_radius` (~124 tokens)

Set corner radius on one or more nodes. Provide a uniform cornerRadius or individual per-corner values.

Input parameters:

- `bottomLeftRadius` (number|null): Bottom-left corner radius
- `bottomRightRadius` (number|null): Bottom-right corner radius
- `cornerRadius` (number|null): Uniform corner radius applied to all corners
- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `topLeftRadius` (number|null): Top-left corner radius
- `topRightRadius` (number|null): Top-right corner radius

### `set_effects` (~143 tokens)

Apply one or more effects (drop shadow, inner shadow, layer blur, background blur) directly to a node. Replaces all existing effects. Pass an empty array to clear all effects.

Input parameters:

- `effects` (array, required): Array of effect objects. Each has: type (DROP_SHADOW | INNER_SHADOW | LAYER_BLUR | BACKGROUND_BLUR), radius, color (hex, shadows only), opacity (0–1, shadows only), offsetX, offsetY (shadows only), s…
- `nodeId` (string, required): Target node ID in colon format e.g. 4029:12345

### `set_fills` (~173 tokens)

Set the fill color on a single node (takes one nodeId, not an array). Use mode='append' to stack a new fill on top of existing fills instead of replacing them.

Input parameters:

- `color` (string, required): Fill color as hex: #RRGGBB e.g. #FF5733 or #RRGGBBAA e.g. #FF573380 for 50% alpha
- `mode` (string|null): 'replace' (default) overwrites all existing fills; 'append' stacks this fill on top of existing ones
- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'
- `opacity` (number|null): Fill opacity 0–1 (default 1). Combines multiplicatively with any alpha in the color hex.

### `set_opacity` (~67 tokens)

Set the opacity of one or more nodes (0 = fully transparent, 1 = fully opaque).

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `opacity` (number, required): Opacity value between 0 and 1

### `set_reactions` (~84 tokens)

Input parameters:

- `mode` (string|null): "replace" (default) overwrites all existing reactions; "append" adds to them
- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'
- `reactions` (array, required): Array of reaction objects. Each has a 'trigger' and an 'actions' array (plural) of Action objects.

### `set_strokes` (~133 tokens)

Set the stroke color and weight on a single node (takes one nodeId, not an array). Use mode='append' to stack a new stroke on top of existing strokes instead of replacing them.

Input parameters:

- `color` (string, required): Stroke color as hex e.g. #000000
- `mode` (string|null): 'replace' (default) overwrites all strokes; 'append' stacks on top of existing strokes
- `nodeId` (string, required): Node ID in colon format e.g. '4029:12345'
- `strokeWeight` (number|null): Stroke weight in pixels (default 1)

### `set_text` (~51 tokens)

Update the text content of an existing TEXT node.

Input parameters:

- `nodeId` (string, required): TEXT node ID in colon format e.g. '4029:12345'
- `text` (string, required): New text content

### `set_variable_value` (~82 tokens)

Set a variable's value for a specific mode.

Input parameters:

- `modeId` (string, required): Mode ID within the collection
- `value` (string, required): Value to set. COLOR: hex e.g. #FF5733. FLOAT: number e.g. 16. STRING: text. BOOLEAN: true or false.
- `variableId` (string, required): Variable ID

### `set_visible` (~59 tokens)

Show or hide one or more nodes by setting their visibility.

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']
- `visible` (boolean, required): true to show the node, false to hide it

### `swap_component` (~73 tokens)

Swap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size.

Input parameters:

- `componentId` (string, required): Target COMPONENT node ID in colon format (from get_local_components)
- `nodeId` (string, required): INSTANCE node ID in colon format e.g. 4029:12345

### `ungroup_nodes` (~51 tokens)

Ungroup one or more GROUP nodes, moving their children to the parent and removing the group.

Input parameters:

- `nodeIds` (array, required): GROUP node IDs in colon format e.g. ['4029:12345']

### `unlock_nodes` (~43 tokens)

Unlock one or more nodes, allowing them to be edited again.

Input parameters:

- `nodeIds` (array, required): Node IDs in colon format e.g. ['4029:12345']

### `update_paint_style` (~101 tokens)

Update an existing paint style's name, color, or description. Only paint styles support in-place updates — to modify text, effect, or grid styles, use delete_style and recreate them.

Input parameters:

- `color` (string|null): New fill color as hex e.g. #FF5733
- `description` (string|null): New style description
- `name` (string|null): New style name
- `styleId` (string, required): Paint style ID

### `use_figma` (~332 tokens)

Run JavaScript against the Figma Plugin API inside the file. Use this for anything the named tools don't cover: FigJam tables/shapes/code blocks/labels, Slides, component variants and properties, vector networks, styled text ranges, variable scopes, library imports, bulk edits in one round-trip.

Code runs as the body of `async () => { ... }`: top-level `await` works, and only the value you `return` comes back (console.log is discarded, so return IDs, counts, or names — never node objects, the response must be JSON-serializable).

Sandbox rules that cause most failures: colors are 0–1 floats, not 0–255; `fills`/`strokes` are read-only arrays, so clone-modify-reassign; load fonts with `await figma.loadFontAsync(node.fontName)` before touching `characters` on existing text; switch pages with `await figma.setCurrentPageAsync(page)` (the sync setter throws) and note the page resets to the first page on every call; `figma.notify()` is unavailable; append a node to an auto-layout parent before setting `layoutSizingHorizontal/Vertical` to HUG or FILL; `figma.createPage()` is Design-file only. Work in small steps and verify between calls.

Input parameters:

- `code` (string, required): JavaScript executed as the body of `async () => { ... }` inside the Figma plugin sandbox. Top-level `await` is allowed. `return` the data you need — console.log is discarded and only the returned val…

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs#diagnostics

## Score history

- 2026-09-20: 76
- 2026-09-19: 75
- 2026-09-18: 75
- 2026-09-17: 71
- 2026-09-16: 71
- 2026-09-15: 71
- 2026-09-14: 71
- 2026-09-13: 71
- 2026-09-12: 56
- 2026-09-11: 56

## Common questions

### What is the io.github.jirayusueb/figma-mcp-rs server?

io.github.jirayusueb/figma-mcp-rs is listed in the public MCP registry as io.github.jirayusueb/figma-mcp-rs. Figma/FigJam MCP server with read/write via plugin, no API token, no limits. 78 tools. This page covers its npm package (figma-mcp-rs).

### Is the io.github.jirayusueb/figma-mcp-rs server safe to use?

io.github.jirayusueb/figma-mcp-rs scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.jirayusueb/figma-mcp-rs server expose?

io.github.jirayusueb/figma-mcp-rs exposes 84 tools: add_page, add_variable_mode, apply_style_to_node, auto_arrange, batch_rename_nodes, and 79 more. Their descriptions and schemas cost roughly 8,650 tokens of context every time the server is loaded.

### Is the io.github.jirayusueb/figma-mcp-rs server still maintained?

io.github.jirayusueb/figma-mcp-rs is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.jirayusueb/figma-mcp-rs server under?

io.github.jirayusueb/figma-mcp-rs declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/figma-mcp-rs
- Socket report: https://socket.dev/npm/package/figma-mcp-rs
- Repository: https://github.com/jirayusueb/figma-mcp-rs
- Changelog RSS feed: https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs.xml
- Changelog JSON feed: https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs.json
- HTML version of this page: https://verifymcp.io/servers/jirayusueb-figma-mcp-rs/figma-mcp-rs
