# io.github.neozhehan/figma-edit-mcp (npm · figma-edit-mcp)

Programmatically read, create, and modify Figma designs via MCP.

- Trust score: 71/100 (medium)
- Change this week: +19
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

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

## Channel facts

- Registry: `npm`
- Package: `figma-edit-mcp`
- Version: `1.5.2`
- 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-08-03.

- **Supply Chain Security**: 70/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects ws 8.20.0, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to neozhehan/figma-edit-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 27 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5827 tokens (~121/item across 48 items; 48 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add neozhehan-figma-edit-mcp -- npx -y figma-edit-mcp
```

### Codex

```bash
codex mcp add neozhehan-figma-edit-mcp -- npx -y figma-edit-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add neozhehan-figma-edit-mcp --command npx --arg -y --arg figma-edit-mcp
```

### Hermes

```yaml
mcp_servers:
  neozhehan-figma-edit-mcp:
    command: "npx"
    args: ["-y", "figma-edit-mcp"]
```

### Other

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

## 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-08-02 (score 71, +11)

- [security regression] Known CVEs: fail → unverified
- [security improvement] Malware scan: unverified → pass
- [functional regression] Dependency health: partial → unverified

### 2026-08-01 (score 60, +26)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 34, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 52)

First indexed and scored.

## MCP tools (48)

### `create_rectangle` (~128 tokens)

Create a new rectangle in Figma

Input parameters:

- `height` (number, required): Height of the rectangle
- `name` (string): Optional name for the rectangle
- `parentId` (string): Optional parent node ID to append the rectangle to
- `parentNodeName` (string): Name of the parent node to verify against
- `useAbsolutePosition` (boolean): If true and parent is an auto-layout frame, forces absolute positioning to prevent layout shifts.
- `width` (number, required): Width of the rectangle
- `x` (number, required): X position
- `y` (number, required): Y position

### `create_frame` (~349 tokens)

Create a new frame in Figma

Input parameters:

- `counterAxisAlignItems` (string): Counter axis alignment for auto-layout frame
- `fillColor` (object): Fill color in RGBA format
- `height` (number, required): Height of the frame
- `itemSpacing` (number): Distance between children in auto-layout frame. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.
- `layoutMode` (string): Auto-layout mode for the frame
- `layoutSizingHorizontal` (string): Horizontal sizing mode for auto-layout frame
- `layoutSizingVertical` (string): Vertical sizing mode for auto-layout frame
- `layoutWrap` (string): Whether the auto-layout frame wraps its children
- `name` (string): Optional name for the frame
- `paddingBottom` (number): Bottom padding for auto-layout frame
- `paddingLeft` (number): Left padding for auto-layout frame
- `paddingRight` (number): Right padding for auto-layout frame
- `paddingTop` (number): Top padding for auto-layout frame
- `parentId` (string): Optional parent node ID to append the frame to
- `parentNodeName` (string): Name of the parent node to verify against
- `primaryAxisAlignItems` (string): Primary axis alignment for auto-layout frame. Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.
- `strokeColor` (object): Stroke color in RGBA format
- `strokeWeight` (number): Stroke weight
- `width` (number, required): Width of the frame
- `x` (number, required): X position
- `y` (number, required): Y position

### `create_node_from_svg` (~86 tokens)

Creates a node from an SVG string.

Input parameters:

- `name` (string): Name for the new node
- `parentId` (string): Parent ID to append to
- `parentNodeName` (string): Parent Name to verify against
- `svg` (string, required): The SVG XML string
- `x` (number): X position
- `y` (number): Y position

### `create_ellipse` (~181 tokens)

Create a new ellipse (circle, arc, donut) in Figma

Input parameters:

- `arcData` (object): Optional arc data for creating arcs/donuts
- `fillColor` (object): Fill color in RGBA format
- `height` (number, required): Height of the ellipse
- `name` (string): Optional name for the ellipse
- `parentId` (string): Optional parent node ID to append the ellipse to
- `parentNodeName` (string): Name of the parent node to verify against
- `strokeColor` (object): Stroke color in RGBA format
- `useAbsolutePosition` (boolean): If true and parent is an auto-layout frame, forces absolute positioning to prevent layout shifts.
- `width` (number, required): Width of the ellipse
- `x` (number, required): X position
- `y` (number, required): Y position

### `create_polygon_star` (~225 tokens)

Create a new polygon or star in Figma

Input parameters:

- `fillColor` (object): Fill color in RGBA format
- `height` (number, required): Height of the shape
- `innerRadius` (number): 0.0–1.0, star sharpness (default: 1.0 = polygon). If < 1.0, pointCount must be even.
- `name` (string): Optional name for the shape
- `parentId` (string): Optional parent node ID to append the shape to
- `parentNodeName` (string): Name of the parent node to verify against
- `pointCount` (number, required): Total vertex count (≥3). For stars, this is the number of points.
- `strokeColor` (object): Stroke color in RGBA format
- `useAbsolutePosition` (boolean): If true and parent is an auto-layout frame, forces absolute positioning to prevent layout shifts.
- `width` (number, required): Width of the shape
- `x` (number, required): X position
- `y` (number, required): Y position

### `move_node` (~68 tokens)

Move a node to a new position in Figma

Input parameters:

- `nodeId` (string, required): The ID of the node to move
- `nodeName` (string, required): Name of the node to modify
- `x` (number, required): New X position
- `y` (number, required): New Y position

### `resize_node` (~62 tokens)

Resize a node in Figma

Input parameters:

- `height` (number, required): New height
- `nodeId` (string, required): The ID of the node to resize
- `nodeName` (string, required): Name of the node to modify
- `width` (number, required): New width

### `set_node_name` (~60 tokens)

Set the name of a node in Figma

Input parameters:

- `name` (string, required): New name for the node
- `nodeId` (string, required): The ID of the node to rename
- `nodeName` (string, required): Name of the node to modify

### `delete_multiple_nodes` (~32 tokens)

Delete one or more nodes from Figma at once

Input parameters:

- `nodes` (array, required): Array of nodes to delete

### `clone_node` (~71 tokens)

Clone an existing node in Figma

Input parameters:

- `nodeId` (string, required): The ID of the node to clone
- `nodeName` (string, required): Name of the node to modify
- `x` (number): New X position for the clone
- `y` (number): New Y position for the clone

### `set_selections` (~37 tokens)

Set selection to one or more nodes in Figma and focus them

Input parameters:

- `nodeIds` (array, required): Array of node IDs to select

### `group_nodes` (~39 tokens)

Group multiple nodes into a group

Input parameters:

- `name` (string): Name for the new group
- `nodes` (array, required): Array of nodes to group

### `ungroup_nodes` (~46 tokens)

Ungroup a group node

Input parameters:

- `nodeId` (string, required): The ID of the group to ungroup
- `nodeName` (string, required): Name of the group to verify against

### `flatten_node` (~43 tokens)

Flatten node to vector

Input parameters:

- `nodeId` (string, required): The ID of the node to flatten
- `nodeName` (string, required): Name of the node to verify against

### `insert_child` (~97 tokens)

Reparent a node to a new parent

Input parameters:

- `childId` (string, required): ID of the child node to reparent
- `childNodeName` (string, required): Name of the child node to verify against
- `index` (number): Position in parent's children array (default: append)
- `parentId` (string, required): ID of the new parent node
- `parentNodeName` (string, required): Name of the parent node to verify against

### `set_fill_color` (~108 tokens)

Set the fill color of a node in Figma can be TextNode or FrameNode

Input parameters:

- `a` (number): Alpha component (0-1)
- `b` (number, required): Blue component (0-1)
- `g` (number, required): Green component (0-1)
- `nodeId` (string, required): The ID of the node to modify
- `nodeName` (string, required): Name of the node to modify
- `r` (number, required): Red component (0-1)

### `set_stroke` (~191 tokens)

Set the stroke color and weight of a node in Figma. Supports both uniform weight and individual side weights (top, bottom, left, right).

Input parameters:

- `a` (number): Alpha component (0-1)
- `b` (number, required): Blue component (0-1)
- `g` (number, required): Green component (0-1)
- `nodeId` (string, required): The ID of the node to modify
- `nodeName` (string, required): Name of the node to modify
- `r` (number, required): Red component (0-1)
- `strokeBottomWeight` (number): Bottom side stroke weight
- `strokeLeftWeight` (number): Left side stroke weight
- `strokeRightWeight` (number): Right side stroke weight
- `strokeTopWeight` (number): Top side stroke weight
- `weight` (number): Uniform stroke weight (used when individual side weights are not provided)

### `set_corner_radius` (~92 tokens)

Set the corner radius of a node in Figma

Input parameters:

- `corners` (array): Optional array of 4 booleans to specify which corners to round [topLeft, topRight, bottomRight, bottomLeft]
- `nodeId` (string, required): The ID of the node to modify
- `nodeName` (string, required): Name of the node to modify
- `radius` (number, required): Corner radius value

### `set_effects` (~58 tokens)

Applies shadow/effect arrays to nodes.

Input parameters:

- `effects` (array, required): Array of effect objects
- `nodeId` (string, required): The ID of the node to modify
- `nodeName` (string, required): Name of the node to verify against

### `get_styles` (~18 tokens)

Get all styles from the current Figma document

### `manage_style` (~211 tokens)

Creates named styles (Text, Paint, Effect, Grid) or updates an existing style if styleId is provided.

Input parameters:

- `bindVariables` (object): Map of field names to variable IDs (to bind) or null (to unbind). For PAINT styles, valid fields include 'color'. For TEXT styles, fields include 'fontSize', 'fontFamily', etc.
- `description` (string): Description of the style
- `name` (string, required): Name of the style
- `propertiesJson` (string): JSON string containing style properties: {fontName?: {family, style}, fontSize?: number, paints?: [{type, color?, opacity?, visible?}], effects?: [{type, visible?, color?, offset?, radius?, spread?}]…
- `styleId` (string): ID of the style to update (if not creating a new one)
- `type` (string, required): Type of style to create or update

### `apply_style` (~80 tokens)

Applies a style to a node by ID.

Input parameters:

- `nodeId` (string, required): The ID of the node to apply style to
- `nodeName` (string, required): Name of the node to verify against
- `styleId` (string, required): The ID of the style to apply
- `styleType` (string, required): Type of style to apply (target property)

### `create_text` (~144 tokens)

Create a new text element in Figma

Input parameters:

- `fontColor` (object): Font color in RGBA format
- `fontSize` (number): Font size (default: 14)
- `fontWeight` (number): Font weight (e.g., 400 for Regular, 700 for Bold)
- `name` (string): Semantic layer name for the text node
- `parentId` (string): Optional parent node ID to append the text to
- `parentNodeName` (string): Name of the parent node to verify against
- `text` (string, required): Text content
- `x` (number, required): X position
- `y` (number, required): Y position

### `set_multiple_text_contents` (~57 tokens)

Set one or more text contents parallelly in a node

Input parameters:

- `nodeId` (string, required): The ID of the node containing the text nodes to replace
- `text` (array, required): Array of text node IDs and their replacement texts

### `set_text_style` (~178 tokens)

Set any combination of text styles on a node

Input parameters:

- `fontFamily` (string): Font family (e.g., "Inter", "Roboto")
- `fontSize` (number): Font size in pixels
- `fontStyle` (string): Font style including weight (e.g., "Regular", "Bold", "Light Italic")
- `letterSpacing` (object): Letter spacing
- `lineHeight`: Line height
- `nodeId` (string, required): Target text node ID
- `nodeName` (string, required): Name of the node (for verification)
- `paragraphSpacing` (number): Space between paragraphs in pixels
- `textAlignHorizontal` (string): Horizontal text alignment
- `textAlignVertical` (string): Vertical text alignment
- `textCase` (string): Text casing
- `textDecoration` (string): Text decoration

### `set_auto_layout` (~317 tokens)

Set auto-layout properties for a frame in Figma. This unified tool replaces individual layout tools.

Input parameters:

- `counterAxisAlignItems` (string): Counter axis alignment (MIN/MAX = top/bottom in horizontal, left/right in vertical)
- `counterAxisSpacing` (number): Distance between wrapped rows/columns. Only works when layoutWrap is set to WRAP.
- `itemSpacing` (number): Distance between children. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.
- `layoutMode` (string): Layout mode for the frame
- `layoutSizingHorizontal` (string): Horizontal sizing mode (HUG for frames/text only, FILL for auto-layout children only)
- `layoutSizingVertical` (string): Vertical sizing mode (HUG for frames/text only, FILL for auto-layout children only)
- `layoutWrap` (string): Whether the auto-layout frame wraps its children
- `nodeId` (string, required): The ID of the frame to modify
- `nodeName` (string, required): Name of the node to modify
- `paddingBottom` (number): Bottom padding value
- `paddingLeft` (number): Left padding value
- `paddingRight` (number): Right padding value
- `paddingTop` (number): Top padding value
- `primaryAxisAlignItems` (string): Primary axis alignment (MIN/MAX = left/right in horizontal, top/bottom in vertical). Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.

### `get_components` (~96 tokens)

Get components from the Figma document with filtering options

Input parameters:

- `filter` (string): Filter components by origin: 'local' (created in this file) or 'remote' (library components). If omitted, returns all.
- `scope` (string): Scope of the search: 'current_page' (default) or 'document' (entire file, streams progress page-by-page and survives 60s inactivity timeout on large files).

### `create_component` (~50 tokens)

Transforms a frame into a main component.

Input parameters:

- `nodeId` (string, required): The ID of the frame to convert to a component
- `nodeName` (string, required): Name of the node to verify against

### `create_component_instance` (~110 tokens)

Create an instance of a component in Figma

Input parameters:

- `componentId` (string): Node ID of the component to instantiate (preferred for local components)
- `componentKey` (string): Key of the component to instantiate (for remote/library components)
- `parentId` (string): Optional parent node ID to append the instance to
- `parentNodeName` (string): Name of the parent node to verify against
- `x` (number, required): X position
- `y` (number, required): Y position

### `get_instance_overrides` (~68 tokens)

Get all override properties from a selected component instance. These overrides can be applied to other instances, which will swap them to match the source component.

Input parameters:

- `nodeId` (string): Optional ID of the component instance to get overrides from. If not provided, currently selected instance will be used.

### `set_instance_overrides` (~70 tokens)

Apply previously copied overrides to selected component instances. Target instances will be swapped to the source component and all copied override properties will be applied.

Input parameters:

- `sourceInstanceId` (string, required): ID of the source component instance
- `targetNodes` (array, required): Array of target instances with their expected names for verification.

### `create_component_set` (~101 tokens)

Transforms components into a component set (variants).

Input parameters:

- `componentSetName` (string): Name for the component set
- `components` (array, required): Array of component objects
- `parentId` (string): Parent frame to place the set in
- `parentNodeName` (string): Name of parent node (required if parentId provided, for verification)
- `properties` (array, required): Array of property names (e.g. ['Size', 'State'])

### `set_component_instance_property` (~108 tokens)

Set a specific property value (boolean toggle, text override, instance swap, or variant selection) on an instance.

Input parameters:

- `nodeId` (string, required): The ID of the instance node
- `nodeName` (string, required): Name of the instance node for verification
- `propertyName` (string, required): The human-readable name of the component property to change
- `value` (required): The new value for the property. For INSTANCE_SWAP properties, this must be a component key (the stable library identifier).

### `manage_component_property` (~234 tokens)

Perform CRUD operations on property definitions for main components or variant sets.

Input parameters:

- `action` (string, required): Action to perform
- `defaultValue`: Required for ADD: Default value for the property. For INSTANCE_SWAP, this must be a component node ID (for local components, the node id; for library components, first import via importComponentByKey…
- `newDefaultValue`: For the EDIT action, to change the default value. For INSTANCE_SWAP, this must be a component node ID.
- `newPropertyName` (string): For the EDIT action, to rename the property
- `nodeId` (string, required): ID of the COMPONENT or COMPONENT_SET
- `nodeName` (string, required): Name of the node for verification
- `preferredValues` (array): Array of preferred values for INSTANCE_SWAP properties during ADD or EDIT. Each entry must be { type, key } where key is the library key (component.key).
- `propertyName` (string, required): The human-readable name of the property to affect
- `propertyType` (string): Required for ADD: The type of property

### `get_variables` (~120 tokens)

Get all local variables/collections or detailed info for specific variable(s) by ID(s). When variableId is provided, optionally scan for consumer nodes, styles, and variable aliases via includeConsumers (Note: Consumer scanning is limited to the current document).

Input parameters:

- `includeConsumers` (string): Only used when variableId is provided; ignored otherwise. 'current_page' scans the active page (fast). 'document' scans all pages (streams progress page-by-page, slow on large files).
- `variableId` (array): Optional array of variable IDs to retrieve

### `get_node_variables` (~36 tokens)

Get bound variables and explicit variable modes for a specific node

Input parameters:

- `nodeId` (string, required): The ID of the node to inspect

### `set_bound_variable` (~135 tokens)

Bind a variable to a node's property or set explicit variable mode

Input parameters:

- `collectionId` (string): If setting mode: The collection ID
- `field` (string): The property field to bind (e.g. 'fills', 'width', 'fontName')
- `modeId` (string): If setting mode: The mode ID to set for the collection
- `nodeId` (string, required): The ID of the node to modify
- `nodeName` (string, required): Name of the node to modify
- `variableId` (string): The ID of the variable to bind. Pass null/undefined to unbind.

### `manage_variables` (~169 tokens)

Comprehensive tool to create collections, variables, and set values/aliases.

Input parameters:

- `action` (string, required): Action type
- `collectionId` (string): Collection ID (for CREATE_VARIABLE)
- `currentVariableName` (string): Current name of the variable to verify against (for UPDATE_VARIABLE)
- `description` (string): Description (for UPDATE_VARIABLE)
- `modeId` (string): Mode ID (for UPDATE_VARIABLE value setting)
- `modeName` (string): Mode name (for CREATE_COLLECTION)
- `name` (string): Name (for CREATE or UPDATE actions)
- `type` (string): Variable type (for CREATE_VARIABLE)
- `value`: Value for the variable (or alias) (for CREATE or UPDATE)
- `variableId` (string): Variable ID (for UPDATE_VARIABLE or alias)

### `delete_variables` (~122 tokens)

Delete specific variables by ID or an entire variable collection. Provide either variableIds OR collectionId (not both). Performs a full-document consumer check (nodes, styles, and variable aliases) first — if any variable is still in use, the entire operation is rejected. Note: Consumer scanning is limited to the current document.

Input parameters:

- `collectionId` (string): ID of a variable collection to delete (all its variables must be unused). Mutually exclusive with variableIds.
- `variableIds` (array): Array of variable IDs to delete. Mutually exclusive with collectionId.

### `get_annotations` (~48 tokens)

Get all annotations in the current document or specific node

Input parameters:

- `includeCategories` (boolean): Whether to include category information
- `nodeId` (string, required): node ID to get annotations for specific node

### `set_multiple_annotations` (~50 tokens)

Set one or more annotations parallelly in a node

Input parameters:

- `annotations` (array, required): Array of annotations to apply
- `nodeId` (string, required): The ID of the node containing the elements to annotate

### `update_reactions` (~94 tokens)

Update Figma Prototyping Reactions on a node by replacing its reactions array. Provide the full array of reactions. Use get_reactions first, modify the desired actions (e.g., to fix references to deleted variables), and pass the updated array here.

Input parameters:

- `nodeId` (string, required): The ID of the node to update reactions for
- `reactions` (array, required): The full array of Reaction objects to set

### `get_reactions` (~74 tokens)

Get Figma Prototyping Reactions from multiple nodes. CRITICAL: The output MUST be processed using the 'reaction_to_connector_strategy' prompt IMMEDIATELY to generate parameters for connector lines via the 'create_connections' tool.

Input parameters:

- `nodeIds` (array, required): Array of node IDs to get reactions from

### `create_connections` (~82 tokens)

Create connections between nodes, or set/check the default connector template. Pass 'connectorId' to set a default. Pass 'connections' to create lines. Pass nothing to check current default.

Input parameters:

- `connections` (array): Optional: Array of node connections to create
- `connectorId` (string): Optional: The ID of the connector node to set as default template

### `get_pages_info` (~86 tokens)

Get information about pages in the Figma document. No argument or empty array returns all pages without children. 1 or more pageIds returns the requested pageIds with top-level children for each requested page. Prefer batches of ≤25 pageIds per call; for larger requests, split across multiple calls for better responsiveness.

Input parameters:

- `pageIds` (array): Array of page IDs to inspect

### `get_nodes_info` (~911 tokens)

Get detailed information about one or more nodes. Supports recursive subtree traversal, property filtering, and streaming progress.

\- If no nodeIds are provided, the tool defaults to the current 'editable scope' (the node(s) selected when the plugin was opened).
\- Properties: When 'fields' is empty, only 'id', 'name', and 'type' are returned for each node. To get more data, specify fields from Figma's REST API (e.g., 'fills', 'strokes', 'characters', 'layoutMode').
\- Safe-list: Common properties like 'id', 'name', 'type', 'visible', 'locked', 'children', and 'descendantCount' are always available and do not incur additional performance cost.
\- Filtering: Use the 'filter' object to prune the tree (e.g., {"type": ["TEXT", "COMPONENT"]}). A node is included if it matches the filter OR has matching descendants.
\- Depth: 'maxDepth' controls how deep the recursive walk goes. Use 0 for just the target nodes, or higher for subtrees. Boundary nodes at maxDepth will include a 'descendantCount'.
\- Performance: This tool streams progress updates and is safe for deep traversals.

RESPONSE SHAPE:
\- Returns { nodes: [...], missingNodeIds?: [...] }. Each node has recursive 'children' arrays. When 'fields' is non-empty, every node (top-level and descendants) carries a 'properties' sub-object with only applicable keys — inapplicable keys are omitted (never null). Top-level entries always include 'descendantCount' (total recursive descendants). Boundary nodes at 'maxDepth' also include 'descendantCount' so you can distinguish truncated nodes from genuine leaves.

PATH:
\- Each top-level node includes a 'path' array of 3-tuples [type, id, name] representing the ancestor chain from the containing page down to the immediate parent. Pages have path === []. Direct children of a page have one element.

FILTER BEHAVIOR:
\- Filters are applied recursively across the entire subtree. Non-matching ancestors of matching nodes are retained as structural containers. Filter evaluation only runs with…

Input parameters:

- `fields` (array): Array of field names to return. Supported fields include 'fills', 'strokes', 'cornerRadius', 'opacity', 'blendMode', 'effects', 'characters', 'style', 'layoutMode', 'itemSpacing', 'paddingLeft', 'pad…
- `filter` (object): Optional filter criteria. Format: { fieldName: [value1, value2] }. Example: { type: ['TEXT', 'COMPONENT'], layoutMode: ['HORIZONTAL'] }. Matches are case-sensitive and multiple values for a field are…
- `maxDepth` (integer): Maximum depth for recursive child traversal. 0 = self only, 1 = self and immediate children, etc. If omitted, performs a full depth traversal (use with caution on large subtrees).
- `nodeIds` (array): Array of node IDs to get information about. If empty, uses editable scope.

### `join_channel` (~32 tokens)

Join a specific channel to communicate with Figma

Input parameters:

- `channel` (string): The name of the channel to join

### `export_node_as_image` (~53 tokens)

Export a node as an image from Figma

Input parameters:

- `format` (string): Export format
- `nodeId` (string, required): The ID of the node to export
- `scale` (number): Export scale

## Diagnostics

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

## Score history

- 2026-08-03: 71
- 2026-08-02: 71
- 2026-08-01: 60
- 2026-07-31: 34
- 2026-07-30: 52
- 2026-07-28: 52
- 2026-07-27: 52

## Links

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