io.github.neozhehan/figma-edit-mcp
NPM · FIGMA-EDIT-MCP · SCANNED SEP 20
Programmatically read, create, and modify Figma designs via MCP.
Available components
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. How we score → Why this is hard to score →
Supply Chain Security80
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects ws 8.20.0, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 84 of 189 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to neozhehan/figma-edit-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 46 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability84
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6389 tokens (~127/item across 50 items; 45 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.neozhehan/figma-edit-mcp server?
io.github.neozhehan/figma-edit-mcp runs locally as an npm package, launched with npx -y figma-edit-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · figma-edit-mcp
claude mcp add neozhehan-figma-edit-mcp -- npx -y figma-edit-mcp
{
"mcpServers": {
"neozhehan-figma-edit-mcp": {
"command": "npx",
"args": [
"-y",
"figma-edit-mcp"
]
}
}
} {
"servers": {
"neozhehan-figma-edit-mcp": {
"command": "npx",
"args": [
"-y",
"figma-edit-mcp"
]
}
}
} codex mcp add neozhehan-figma-edit-mcp -- npx -y figma-edit-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"neozhehan-figma-edit-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"figma-edit-mcp"
],
"enabled": true
}
}
} openclaw mcp add neozhehan-figma-edit-mcp --command npx --arg -y --arg figma-edit-mcp
mcp_servers:
neozhehan-figma-edit-mcp:
command: "npx"
args: ["-y", "figma-edit-mcp"] {
"McpServers": {
"neozhehan-figma-edit-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"figma-edit-mcp"
]
}
}
} assistant mcp add neozhehan-figma-edit-mcp -t stdio -c npx -a -y figma-edit-mcp
{
"mcpServers": {
"neozhehan-figma-edit-mcp": {
"command": "npx",
"args": [
"-y",
"figma-edit-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 −3
- Security disclosure: unverified → fail ▼ functional
- Stability: pass → 0.80 functional
- 17 Sept 26 +1
- Stability: 0.97 → pass security
- Security disclosure: fail → unverified ▼ functional
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 −3
- Stability: pass → 0.80 functional
- 10 Sept 26 +1
- Stability: 0.97 → pass security
- 8 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/figma-edit-mcp@2.3.3
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | neozhehan/figma-edit-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/neozhehan/figma-edit-mcp/.github/workflows/publish.yml@refs/tags/v2.3.3 |
| Rekor log index | 2339133716 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:bc99ac7e913f4ad3f8f781f7f82c385f44d621ade3cca668274b72d630c8e52ea94cf0ad3405fed158216af0e811c16ec5f2ae1d07f2ae3438bfb7945 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 3 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-5v7r-6r5c-r473 | CVE-2026-31808 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L | yes |
| GHSA-58qx-3vcg-4xpx | CVE-2026-45736 | medium | CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:N/A:N | yes |
| GHSA-96hv-2xvq-fx4p | CVE-2026-48779 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 189 packages
| Packages resolved | 189 |
|---|---|
| Deprecated | 1 |
| Stale | 84 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
annotation_list List Annotations ~153
Read the native annotations on a page or node (and subtree); exactly one of pageId or nodeId is required. The file's annotation categories are returned by default; pass includeCategories: false to omit them. Page loading is bounded; a page-scoped failure returns its structured error directly and successful reads include `coverage`.
| Name | Type | Req | Description |
|---|---|---|---|
| includeCategories | boolean | – | Include the file's global annotation categories in the result. Defaults to true; pass false to omit them. |
| nodeId | string | – | The node ID to get annotations from. Exactly one of pageId or nodeId is required. |
| pageId | string | – | The page ID to get annotations from. Exactly one of pageId or nodeId is required. |
| Name | Type | Req | Description |
|---|---|---|---|
| annotatedNodes | array | – | Grouped annotations, preserving the owning node in page and node modes |
| categories | array | – | List of global annotation categories |
| coverage | – | – | Page-scan coverage; partial read data remains usable when complete is false |
| error | object | – | – |
No examples provided.
annotation_set Set Annotations ~130
Append native annotations to one or more nodes in a batched call. If the status is 'partial_success', treat it as an incomplete operation and report the failed and skipped items to the user. Appending is NOT idempotent and a 'failed' row may already have appended its annotation (verified counts differ, or outcomeUnknown is true when post-state is unreadable; both carry partialMutation: true) — before retrying any non-success item, call annotation_list and compare the labels already on the node, or you will create a duplicate.
| Name | Type | Req | Description |
|---|---|---|---|
| annotations | array | yes | Array of annotations to set |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| failedCount | number | – | Number of failed annotations |
| requestedCount | number | – | Number of requested annotations |
| results | array | – | Detailed execution results with before/after annotation counts (one row per input, in input order) |
| skippedCount | number | – | Number of skipped annotations |
| status | string | – | Overall status of the batch operation |
| succeededCount | number | – | Number of succeeded annotations |
| success | boolean | – | Whether all annotations were set successfully |
No examples provided.
channel_join Join Channel ~37
Join a plugin channel to establish the live connection to the Figma document.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | yes | The name of the channel to join |
| Name | Type | Req | Description |
|---|---|---|---|
| allowEditNode | – | – | false | 'page' | 'node' |
| allowEditStyle | boolean | – | Whether style edits are allowed |
| allowEditVariable | boolean | – | Whether variable edits are allowed |
| channel | string | – | Channel name |
| documentId | string | – | Figma document ID |
| documentName | string | – | Figma document name |
| editableScopeType | string | – | readonly, page, or node |
| error | object | – | – |
| errorCode | string | – | Error code if status is error |
| errorDetails | – | – | Structured error context if status is error and the underlying failure carried any |
| errorMessage | string | – | Error message if status is error |
| node | object | – | – |
| pageCount | number | – | Number of pages in the document |
| pages | array | – | – |
| pluginVersion | string | – | Self-reported bound Figma plugin build version (present on every successful join) |
| scopeRootId | – | – | Editable scope root node ID |
| serverVersion | string | – | Self-reported MCP server build version (present on every successful join) |
| status | string | – | Connection status |
No examples provided.
component_delete_property Delete Component Property ~83
Remove a component-property definition from a main component or variant set; propagates to every instance.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | ID of the COMPONENT or COMPONENT_SET |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| propertyName | string | yes | The human-readable name of the property to delete |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the component/component set |
| name | string | – | Name of the component/component set |
| propertyName | string | – | The deleted property name |
| results | – | – | Detailed execution results |
| success | boolean | – | Whether property deletion was successful |
No examples provided.
component_list List Components ~131
List components in the document, with filtering and scope options. Document scans isolate page failures and report them in `coverage`; page-scoped failures return their structured error directly.
| Name | Type | Req | Description |
|---|---|---|---|
| filter | string | – | Filter components by origin: 'local' (created in this file) or 'remote' (library components). If omitted, returns all. |
| pageId | string | – | The ID of the page to query when scope is 'page' |
| scope | string | – | Scope of the search: 'page' (queries a specific page, requiring pageId) or 'document' (entire file, default). |
| Name | Type | Req | Description |
|---|---|---|---|
| components | array | – | List of component objects |
| count | number | – | Total count of components |
| coverage | – | – | Page-scan coverage; partial read data remains usable when complete is false |
| error | object | – | – |
No examples provided.
component_manage_property Manage Component Property ~247
Add or edit a component-property definition (BOOLEAN/TEXT/INSTANCE_SWAP) on a main component or variant set. Deleting is `component_delete_property`.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Action to perform |
| defaultValue | – | – | Required for ADD: Default value for the property. For INSTANCE_SWAP, this must be a component node ID. |
| newDefaultValue | – | – | For the EDIT action, to change the default value. For INSTANCE_SWAP, this must be a component node ID. |
| newPropertyName | string | – | For EDIT, the optional replacement property name. It must be non-empty when supplied; omit it to leave the existing property name unchanged. |
| nodeId | string | yes | ID of the COMPONENT or COMPONENT_SET |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| preferredValues | array | – | Array of preferred values for INSTANCE_SWAP properties during ADD or EDIT. |
| propertyName | string | yes | For ADD, the required new property name, which must be non-empty. For EDIT, the existing property's exact lookup name. |
| propertyType | string | – | Required for ADD: The type of property |
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | The action that was performed (ADD/EDIT) |
| error | object | – | – |
| id | string | – | ID of the component/component set |
| name | string | – | Name of the component/component set |
| propertyName | string | – | The affected property name |
| results | – | – | Detailed execution results |
| success | boolean | – | Whether property management was successful |
No examples provided.
create_component Create Component ~58
Convert an existing frame into a main component.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the frame to convert to a component |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the created component |
| name | string | – | Name of the created component |
| parentId | string | – | ID of the parent the component was placed into — confirm containment without a follow-up read |
No examples provided.
create_component_set Create Component Set ~132
Combine components into a component set (variants) with property definitions.
| Name | Type | Req | Description |
|---|---|---|---|
| componentSetName | string | – | Optional non-empty name for the component set |
| components | array | yes | Array of component objects |
| parentId | string | yes | ID of the appendable parent container (frame, group, page, section, etc.) to place the set in; discover it with node_info |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| properties | array | yes | Array of property names (e.g. ['Size', 'State']) |
| Name | Type | Req | Description |
|---|---|---|---|
| childCount | number | – | Number of variants in the set |
| error | object | – | – |
| id | string | – | ID of the created component set |
| name | string | – | Name of the component set |
| parentId | string | – | ID of the parent the set was placed into — confirm containment without a follow-up read |
| type | string | – | Node type (COMPONENT_SET) |
| variantProperties | object | – | Variant properties definition |
| warning | string | – | Warning message if some properties could not be read |
No examples provided.
create_frame Create Frame ~367
Create a frame (container) with optional fill/stroke and full auto-layout configuration.
| Name | Type | Req | Description |
|---|---|---|---|
| counterAxisAlignItems | string | – | Counter axis alignment for auto-layout frame |
| fillColor | object | – | Fill color in RGBA format |
| height | number | yes | 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 non-empty 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 | yes | Parent node ID to append the frame to |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| 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 | yes | Width of the frame |
| x | number | yes | X position |
| y | number | yes | Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the created frame |
| name | string | – | Name of the created frame |
| parentId | string | – | ID of the parent the node was placed into — confirm containment without a follow-up read |
No examples provided.
create_instance Create Instance ~124
Instantiate a component (by `componentKey` or `componentId`) at a position.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Parent node ID to append the instance to |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| x | number | yes | X position |
| y | number | yes | Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| componentId | string | – | ID of the component the instance was created from |
| error | object | – | – |
| id | string | – | ID of the created component instance |
| name | string | – | Name of the component instance |
| parentId | string | – | ID of the parent the instance was placed into — confirm containment without a follow-up read |
No examples provided.
create_shape Create Shape ~323
Create a rectangle, ellipse, polygon, or star via `type`, with position/size and optional `fillColor`/`strokeColor`. Shape-specific params (`arcData`; `pointCount`/`innerRadius`) validated by `type`. `pointCount` = sides (polygon) or points (star), native count — no even-parity rule.
| Name | Type | Req | Description |
|---|---|---|---|
| arcData | object | – | Optional arc data for creating arcs/donuts (ELLIPSE only) |
| fillColor | object | – | Fill color in RGBA format |
| height | number | yes | Height of the shape |
| innerRadius | number | – | 0.0–1.0, star sharpness (default: 1.0). STAR only. |
| name | string | – | Optional non-empty name for the shape |
| parentId | string | yes | Parent node ID to append the shape to |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| pointCount | number | – | Number of sides (polygon) or points (star), ≥3. Required for POLYGON and STAR. |
| strokeColor | object | – | Stroke color in RGBA format |
| type | string | yes | The type of shape to create |
| useAbsolutePosition | boolean | – | If true and parent is an auto-layout frame, forces absolute positioning to prevent layout shifts. |
| width | number | yes | Width of the shape |
| x | number | yes | X position |
| y | number | yes | Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the created shape |
| name | string | – | Name of the created shape |
| parentId | string | – | ID of the parent the node was placed into — confirm containment without a follow-up read |
No examples provided.
create_svg Create Node from SVG ~99
Create a node from an SVG markup string.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Optional non-empty name for the new node |
| parentId | string | yes | Parent ID to append to |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| svg | string | yes | The SVG XML string |
| x | number | – | X position |
| y | number | – | Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the created node |
| name | string | – | Name of the created node |
| parentId | string | – | ID of the parent the node was placed into — confirm containment without a follow-up read |
No examples provided.
create_text Create Text ~165
Create a text node with content and optional font size/weight/color.
| Name | Type | Req | Description |
|---|---|---|---|
| fontColor | object | – | Font color in RGBA format |
| fontSize | number | – | Font size, minimum 1 (default: 14) |
| fontWeight | integer | – | Font weight: 100–900 in increments of 100 (default: 400) |
| name | string | – | Optional non-empty semantic layer name for the text node |
| parentId | string | yes | Parent node ID to append the text to |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| text | string | yes | Text content |
| x | number | yes | X position |
| y | number | yes | Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the created text node |
| name | string | – | Name of the created text node |
| parentId | string | – | ID of the parent the node was placed into — confirm containment without a follow-up read |
No examples provided.
instance_get_overrides Get Instance Overrides ~45
Read the override properties from a source instance, to later apply them to other instances.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the component instance to get overrides from. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| mainComponentId | string | – | ID of the main component |
| message | string | – | Status message |
| overridesCount | number | – | Number of overrides found |
| sourceInstanceId | string | – | Source instance ID |
| success | boolean | – | Whether overrides retrieval was successful |
No examples provided.
instance_set_overrides Set Instance Overrides ~100
Apply previously-read overrides to target instances; targets are swapped to the source component and all overrides applied. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).
| Name | Type | Req | Description |
|---|---|---|---|
| sourceInstanceId | string | yes | ID of the source component instance |
| targetNodes | array | yes | Array of target instances with their expected names for verification. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| failedCount | number | – | Number of failed targets |
| requestedCount | number | – | Number of requested targets |
| results | array | – | Results per target node (one row per input, in input order) |
| skippedCount | number | – | Number of skipped targets |
| status | string | – | Overall status of the batch operation |
| succeededCount | number | – | Number of succeeded targets |
| success | boolean | – | Whether overrides application was successful |
No examples provided.
instance_set_property Set Instance Property ~112
Set one property on an instance — boolean toggle, text override, instance swap, or variant selection.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the instance node |
| nodeName | string | yes | The instance's current exact name, passed back verbatim from `node_info`. |
| propertyName | string | yes | The human-readable name of the component property to change |
| value | – | yes | The new value for the property. For INSTANCE_SWAP properties, this must be a component key (the stable library identifier). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| results | – | – | Execution details |
| success | boolean | – | Whether property update was successful |
No examples provided.
node_apply_style Apply Style ~120
Link a node to a shared library style (paint/text/effect/grid) by `styleId`. Use the raw `node_set_*` setters for ad-hoc values not backed by a style.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the node to apply style to |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| styleId | string | yes | The ID of the style to apply |
| styleType | string | yes | Type of style to apply (target property) |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
| success | boolean | – | Whether the style was applied successfully |
No examples provided.
node_bind_variable Bind Variable ~300
Bind a variable to a node property, or set an explicit variable mode. Use instead of a literal `node_set_*` when the value should track a design token. Ordering rules: set auto-layout before binding padding/spacing; set a solid fill before binding a colour token.
| Name | Type | Req | Description |
|---|---|---|---|
| bindVariables | object | – | Map of property names to variable IDs (to bind) or null (to unbind). Valid fields: fills, strokes, height, width, characters, itemSpacing, paddingLeft, paddingRight, paddingTop, paddingBottom, visibl… |
| explicitVariableModes | object | – | Map of variable collection IDs to mode IDs. E.g., { 'VariableCollectionID:1:2': 'ModeID:1:3' } |
| nodeId | string | yes | The ID of the node to bind variables to |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| message | string | – | Status message |
| name | string | – | Name of the modified node |
| success | boolean | – | Whether the variables were bound successfully |
No examples provided.
node_clone Clone Node ~95
Duplicate an existing node, optionally at a new `x`/`y`. Produces a new node id.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the node to clone |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| x | number | – | New X position for the clone |
| y | number | – | New Y position for the clone |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the new cloned node |
| name | string | – | Name of the cloned node |
| parentId | string | – | ID of the parent the clone was placed into — confirm containment without a follow-up read |
No examples provided.
node_delete Delete Nodes ~78
Delete one or more nodes in a single batched, per-item-validated call. No API undo. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).
| Name | Type | Req | Description |
|---|---|---|---|
| nodes | array | yes | Array of nodes to delete |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| failedCount | number | – | Number of failed deletions |
| requestedCount | number | – | Number of requested deletions |
| results | array | – | Detailed deletion results (one row per input, in input order) |
| skippedCount | number | – | Number of skipped deletions |
| status | string | – | Overall status of the batch operation |
| succeededCount | number | – | Number of succeeded deletions |
| success | boolean | – | Whether all deletions succeeded |
No examples provided.
node_export_visual Export Node Image ~138
Render a node to an image (PNG/JPG/SVG/PDF) at a given scale. Read-only; the canonical way to visually verify edits. SVG returns raw XML in `svg` (directly readable); PNG/JPG/PDF return base64 in `imageData` (PDF is a delivery artifact — prefer PNG/SVG for inspection).
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Export format |
| nodeId | string | yes | The ID of the node to export |
| scale | number | – | Export scale, between 0.1 and 4.0 (e.g. 1, 2, 0.5) |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| format | string | – | Image format |
| imageData | string | – | Base64-encoded binary data (PNG/JPG/PDF) |
| mimeType | string | – | MIME type of the exported image |
| nodeId | string | – | ID of the exported node |
| scale | number | – | Export scale used |
| svg | string | – | Raw SVG XML markup (returned instead of imageData when format=SVG) |
No examples provided.
node_flatten Flatten Node ~68
Flatten a node and its children into a single vector. Lossy — original structure is not recoverable.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the node to flatten |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the flattened node |
| name | string | – | Name of the flattened node |
| parentId | – | – | ID of the container the flattened node was placed in — the source node's original parent, so D11 containment is confirmable from this response without a follow-up node_info |
| type | string | – | Type of the flattened node (usually VECTOR) |
No examples provided.
node_group Group Nodes ~63
Wrap multiple nodes in a new group node.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Optional non-empty name for the new group. Omit to accept Figma's default; `""` is refused rather than silently substituted. |
| nodes | array | yes | Array of nodes to group |
| Name | Type | Req | Description |
|---|---|---|---|
| childCount | number | – | Number of children in the group |
| error | object | – | – |
| id | string | – | ID of the new group node |
| name | string | – | Name of the new group node |
No examples provided.
node_info Get Node Info ~220
Read one or more nodes — recursive subtree traversal with `properties` selection, `filter`, and `maxDepth`. Returns only the requested properties (incl. resolved `boundVariables`/`explicitVariableModes`) under each node's `properties` key. A node whose containing page could not be read is listed in `pageFailedNodes` with that page's ID, and the page's structured reason is in `coverage.pageErrors` — other pages still return normally. The workhorse read; start here before any write.
| Name | Type | Req | Description |
|---|---|---|---|
| concurrencyLimit | integer | – | Concurrency limit for parallel subtree walk (default: 4) |
| filter | object | – | Optional filter criteria. |
| maxDepth | integer | – | Maximum depth for recursive child traversal. 0 = self only, 1 = self and immediate children, etc. |
| nodeIds | array | – | Array of node IDs to inspect. If empty, uses editable scope. |
| properties | array | – | Array of property names to return (populates each node's `properties` object in the response). |
| Name | Type | Req | Description |
|---|---|---|---|
| coverage | – | – | Page-scan coverage; partial read data remains usable when complete is false |
| error | object | – | – |
| missingNodeIds | array | – | Requested IDs that weren't found |
| nodes | array | – | Node entries (id/name/type + optional properties/children/path/descendantCount) |
| pageFailedNodes | array | – | Requested nodes that exist but could not be read because their containing page failed; omitted when none |
No examples provided.
node_insert_child Reparent Node ~152
Reparent a node under a new parent at an optional `index`. Valid range is 0 to parent's child count. Omit `index` to append.
| Name | Type | Req | Description |
|---|---|---|---|
| childId | string | yes | ID of the child node to reparent |
| childNodeName | string | yes | The child node's current exact name, passed back verbatim from `node_info`. |
| index | number | – | Position in parent's children array (default: append). The output index reports the actual resolved position (same-parent reorder shifts indices). |
| parentId | string | yes | ID of the new parent node |
| parentNodeName | string | yes | The parent node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| childId | string | – | ID of the reparented child node |
| error | object | – | – |
| index | number | – | Index at which the child was inserted |
| newParentId | string | – | ID of the new parent node |
No examples provided.
node_rename Rename Node ~97
Rename a node (sets `name` to an exact value).
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | New non-empty name for the node. Figma normalizes an empty name to a type default, so `""` is refused rather than silently substituted. |
| nodeId | string | yes | The ID of the node to rename |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | The new name of the node |
| oldName | string | – | The old name of the node |
No examples provided.
node_set_auto_layout Set Auto Layout ~330
Configure a frame's auto-layout (mode, padding, spacing, alignment, sizing) in one unified setter.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | The ID of the frame to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified frame |
No examples provided.
node_set_corner_radius Set Corner Radius ~104
Set a node's corner radius — uniform or per-corner.
| Name | Type | Req | Description |
|---|---|---|---|
| corners | array | – | Optional array of 4 booleans to specify which corners to round [topLeft, topRight, bottomRight, bottomLeft] |
| nodeId | string | yes | The ID of the node to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| radius | number | yes | Corner radius value |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
No examples provided.
node_set_effects Set Effects ~109
Set a node's effect array (shadows, blurs). Use `node_apply_style` to link a shared effect style instead.
| Name | Type | Req | Description |
|---|---|---|---|
| effects | array | yes | Array of strict per-variant Figma effects: DROP_SHADOW/INNER_SHADOW or LAYER_BLUR/BACKGROUND_BLUR |
| nodeId | string | yes | The ID of the node to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
No examples provided.
node_set_fill Set Fill ~191
Set a node's fill to a literal RGBA color, an image, or clear it. Use `node_apply_style` to link a shared paint style, or `node_bind_variable` to bind a color token.
| Name | Type | Req | Description |
|---|---|---|---|
| a | number | – | Alpha component (0-1) |
| b | number | – | Blue component (0-1) |
| clear | boolean | – | Set to true to clear all fills. Must provide exactly one of solid color, image, or clear:true. |
| g | number | – | Green component (0-1) |
| image | object | – | Optional image payload. Must provide exactly one of solid color or image. |
| nodeId | string | yes | The ID of the node to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| r | number | – | Red component (0-1) |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
| warnings | array | – | Warnings from the operation (e.g., resizing) |
No examples provided.
node_set_stroke Set Stroke ~187
Set a node's stroke color and weight; supports uniform or per-side weights.
| Name | Type | Req | Description |
|---|---|---|---|
| a | number | – | Alpha component (0-1) |
| b | number | yes | Blue component (0-1) |
| g | number | yes | Green component (0-1) |
| nodeId | string | yes | The ID of the node to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| r | number | yes | 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) |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
No examples provided.
node_transform Transform Node ~112
Move and/or resize a node by setting absolute `x`/`y`/`width`/`height` (any subset).
| Name | Type | Req | Description |
|---|---|---|---|
| height | number | – | New height |
| nodeId | string | yes | The ID of the node to transform |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| width | number | – | New width |
| x | number | – | New X position |
| y | number | – | New Y position |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| height | number | – | Resulting height |
| id | string | – | ID of the transformed node |
| name | string | – | Name of the transformed node |
| width | number | – | Resulting width |
| x | number | – | Resulting X position |
| y | number | – | Resulting Y position |
No examples provided.
node_ungroup Ungroup Node ~65
Dissolve a group, promoting its children to the parent. Removes the group container.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the group to ungroup |
| nodeName | string | yes | The group's current exact name, passed back verbatim from `node_info`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| parentId | – | – | ID of the parent node (null if the group had no parent) |
| ungroupedChildren | array | – | List of ungrouped child nodes |
No examples provided.
page_info Get Pages ~82
List the document's pages; no args → all pages (no children), or pass `pageIds` → those pages with their top-level children. Batch ≤25 ids/call. Inspect `coverage`: a failed page is omitted with a structured `pageErrors` row while other pages still return.
| Name | Type | Req | Description |
|---|---|---|---|
| pageIds | array | – | Array of page IDs to inspect |
| Name | Type | Req | Description |
|---|---|---|---|
| coverage | – | – | Page-scan coverage; partial read data remains usable when complete is false |
| documentId | string | – | ID of the Figma document |
| documentName | string | – | Name of the Figma document |
| error | object | – | – |
| missingPageIds | array | – | Every requested page ID absent from `pages`, whatever the cause; `coverage.pageErrors` carries the structured reason for each |
| pageCount | number | – | Total page count |
| pages | array | – | List of page objects |
No examples provided.
reaction_list List Reactions ~36
Read prototype reactions from one or more nodes and their descendants.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeIds | array | yes | Array of node IDs to get reactions from |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| nodes | array | – | List of node entries with their reactions |
| nodesCount | number | – | Number of inspected nodes |
| nodesWithReactions | number | – | Number of nodes found that have reactions |
No examples provided.
reaction_update Update Reactions ~84
Replace a node's prototype reactions with a full new reactions array (read first via `reaction_list`).
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | The ID of the node to update reactions for |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| reactions | array | yes | The full array of Reaction objects to set |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| success | boolean | – | Whether the reactions were updated successfully |
No examples provided.
style_delete Delete Style ~67
Delete a local style by id. Detaches consumers — they keep their resolved values and lose only the style link.
| Name | Type | Req | Description |
|---|---|---|---|
| styleId | string | yes | ID of style to delete |
| styleName | string | yes | The style's current exact name, passed back verbatim from `style_list`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| message | string | – | Success/failure status message |
| success | boolean | – | Whether style was successfully deleted |
No examples provided.
style_list List Styles ~23
List all local styles (paint/text/effect/grid) in the document.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| colors | array | – | List of paint/color styles |
| effects | array | – | List of effect styles |
| error | object | – | – |
| grids | array | – | List of grid styles |
| texts | array | – | List of text styles |
No examples provided.
style_manage Manage Style ~232
Create a named style (paint/text/effect/grid), or update an existing one when `styleId` is given. UPDATE requires currentStyleName.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| currentStyleName | string | – | REQUIRED for UPDATE when styleId is supplied — the style's **current exact** name, passed back verbatim from `style_list` |
| description | string | – | Description of the style |
| name | string | – | Style name. Must be non-empty when supplied. REQUIRED for CREATE; omit it on UPDATE to leave the current style name unchanged. |
| properties | object | – | Style properties to set; which subset applies depends on `type` (TEXT/PAINT/EFFECT/GRID). |
| styleId | string | – | ID of the style to update (if not creating a new one) |
| type | string | yes | Type of style to create or update |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| id | string | – | ID of the style |
| name | string | – | Name of the style |
| type | string | – | Type of the style |
No examples provided.
text_set_content Set Text Contents ~78
Set the text of one or more text nodes in a single batched, per-item-validated call. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).
| Name | Type | Req | Description |
|---|---|---|---|
| text | array | yes | Array of text objects |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| failedCount | number | – | Number of failed text replacements |
| requestedCount | number | – | Number of requested text replacements |
| results | array | – | Detailed results per node (one row per input, in input order) |
| skippedCount | number | – | Number of skipped text replacements |
| status | string | – | Overall status of the batch operation |
| succeededCount | number | – | Number of succeeded text replacements |
| success | boolean | – | Whether all replacements succeeded |
No examples provided.
text_set_style Set Text Style ~185
Set any combination of typography properties (font, size, weight, spacing, decoration, …) on a text node.
| Name | Type | Req | Description |
|---|---|---|---|
| fontName | object | – | Font family and style |
| fontSize | number | – | Font size |
| letterSpacing | object | – | Letter spacing settings |
| lineHeight | – | – | Line height settings |
| nodeId | string | yes | The ID of the text node to modify |
| nodeName | string | yes | The node's current exact name, passed back verbatim from `node_info`. |
| paragraphIndent | number | – | Paragraph indent in pixels |
| paragraphSpacing | number | – | Paragraph spacing in pixels |
| textAlignHorizontal | string | – | Horizontal text alignment |
| textAlignVertical | string | – | Vertical text alignment |
| textCase | string | – | Case transformation on the text |
| textDecoration | string | – | Text decoration |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| name | string | – | Name of the modified node |
| success | boolean | – | Whether style was set successfully |
No examples provided.
variable_delete Delete Variables ~178
Delete specific variables or an entire collection. Runs a full-document consumer check first, before any removal: if a target is still in use the call is refused with VARIABLE_IN_USE, whose `details.variablesInUse` lists every consumer; if any page cannot be loaded and read it is refused with DOCUMENT_SCAN_INCOMPLETE, because a page error can never mean zero consumers.
| Name | Type | Req | Description |
|---|---|---|---|
| collectionId | string | – | ID of a variable collection to delete. Mutually exclusive with variableIds. |
| collectionName | string | – | Name of the collection to delete, for safety verification. Required if collectionId is used. |
| variableIds | array | – | Array of variable IDs to delete. Mutually exclusive with collectionId. |
| variableNames | array | – | Array of variable names corresponding to variableIds, for safety verification. Required if variableIds is used. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | – |
| message | string | – | Status message |
| success | boolean | – | Whether variables were deleted successfully |
No examples provided.
What is the io.github.neozhehan/figma-edit-mcp server?
io.github.neozhehan/figma-edit-mcp is listed in the public MCP registry as io.github.neozhehan/figma-edit-mcp. Programmatically read, create, and modify Figma designs via MCP. This page covers its npm package (figma-edit-mcp).
Is the io.github.neozhehan/figma-edit-mcp server safe to use?
io.github.neozhehan/figma-edit-mcp scores 89 out of 100 on VerifyMCP. We recorded 3 known advisories against it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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.neozhehan/figma-edit-mcp server expose?
io.github.neozhehan/figma-edit-mcp exposes 45 tools: page_info, node_info, node_transform, node_rename, node_delete, and 40 more. Their descriptions and schemas cost roughly 6,181 tokens of context every time the server is loaded.
Is the io.github.neozhehan/figma-edit-mcp server still maintained?
io.github.neozhehan/figma-edit-mcp 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.neozhehan/figma-edit-mcp server under?
io.github.neozhehan/figma-edit-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.