Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.neozhehan/figma-edit-mcp

NPM · FIGMA-EDIT-MCP · SCANNED SEP 20

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

Available components

0 this week 89 Trust /100
Trust breakdown (7 categories)

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
Install

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

# add to Claude Code
claude mcp add neozhehan-figma-edit-mcp -- npx -y figma-edit-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "neozhehan-figma-edit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-edit-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "neozhehan-figma-edit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-edit-mcp"
      ]
    }
  }
}
# add to Codex CLI
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
    }
  }
}
# add to OpenClaw
openclaw mcp add neozhehan-figma-edit-mcp --command npx --arg -y --arg figma-edit-mcp
# ~/.hermes/config.yaml
mcp_servers:
  neozhehan-figma-edit-mcp:
    command: "npx"
    args: ["-y", "figma-edit-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "neozhehan-figma-edit-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "figma-edit-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add neozhehan-figma-edit-mcp -t stdio -c npx -a -y figma-edit-mcp
// mcp.json
{
  "mcpServers": {
    "neozhehan-figma-edit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-edit-mcp"
      ]
    }
  }
}
Changelog

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.

Diagnostics

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 →

MCP tools · 45 exposed · ~6,181 tokens

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 →

Tool Tokens
annotation_list ~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`.

NameTypeReqDescription
includeCategoriesbooleanInclude the file's global annotation categories in the result. Defaults to true; pass false to omit them.
nodeIdstringThe node ID to get annotations from. Exactly one of pageId or nodeId is required.
pageIdstringThe page ID to get annotations from. Exactly one of pageId or nodeId is required.
NameTypeReqDescription
annotatedNodesarrayGrouped annotations, preserving the owning node in page and node modes
categoriesarrayList of global annotation categories
coveragePage-scan coverage; partial read data remains usable when complete is false
errorobject

No examples provided.

annotation_set ~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.

NameTypeReqDescription
annotationsarrayyesArray of annotations to set
NameTypeReqDescription
errorobject
failedCountnumberNumber of failed annotations
requestedCountnumberNumber of requested annotations
resultsarrayDetailed execution results with before/after annotation counts (one row per input, in input order)
skippedCountnumberNumber of skipped annotations
statusstringOverall status of the batch operation
succeededCountnumberNumber of succeeded annotations
successbooleanWhether all annotations were set successfully

No examples provided.

channel_join ~37

Join a plugin channel to establish the live connection to the Figma document.

NameTypeReqDescription
channelstringyesThe name of the channel to join
NameTypeReqDescription
allowEditNodefalse | 'page' | 'node'
allowEditStylebooleanWhether style edits are allowed
allowEditVariablebooleanWhether variable edits are allowed
channelstringChannel name
documentIdstringFigma document ID
documentNamestringFigma document name
editableScopeTypestringreadonly, page, or node
errorobject
errorCodestringError code if status is error
errorDetailsStructured error context if status is error and the underlying failure carried any
errorMessagestringError message if status is error
nodeobject
pageCountnumberNumber of pages in the document
pagesarray
pluginVersionstringSelf-reported bound Figma plugin build version (present on every successful join)
scopeRootIdEditable scope root node ID
serverVersionstringSelf-reported MCP server build version (present on every successful join)
statusstringConnection status

No examples provided.

component_delete_property ~83

Remove a component-property definition from a main component or variant set; propagates to every instance.

NameTypeReqDescription
nodeIdstringyesID of the COMPONENT or COMPONENT_SET
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
propertyNamestringyesThe human-readable name of the property to delete
NameTypeReqDescription
errorobject
idstringID of the component/component set
namestringName of the component/component set
propertyNamestringThe deleted property name
resultsDetailed execution results
successbooleanWhether property deletion was successful

No examples provided.

component_list ~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.

NameTypeReqDescription
filterstringFilter components by origin: 'local' (created in this file) or 'remote' (library components). If omitted, returns all.
pageIdstringThe ID of the page to query when scope is 'page'
scopestringScope of the search: 'page' (queries a specific page, requiring pageId) or 'document' (entire file, default).
NameTypeReqDescription
componentsarrayList of component objects
countnumberTotal count of components
coveragePage-scan coverage; partial read data remains usable when complete is false
errorobject

No examples provided.

component_manage_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`.

NameTypeReqDescription
actionstringyesAction to perform
defaultValueRequired for ADD: Default value for the property. For INSTANCE_SWAP, this must be a component node ID.
newDefaultValueFor the EDIT action, to change the default value. For INSTANCE_SWAP, this must be a component node ID.
newPropertyNamestringFor EDIT, the optional replacement property name. It must be non-empty when supplied; omit it to leave the existing property name unchanged.
nodeIdstringyesID of the COMPONENT or COMPONENT_SET
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
preferredValuesarrayArray of preferred values for INSTANCE_SWAP properties during ADD or EDIT.
propertyNamestringyesFor ADD, the required new property name, which must be non-empty. For EDIT, the existing property's exact lookup name.
propertyTypestringRequired for ADD: The type of property
NameTypeReqDescription
actionstringThe action that was performed (ADD/EDIT)
errorobject
idstringID of the component/component set
namestringName of the component/component set
propertyNamestringThe affected property name
resultsDetailed execution results
successbooleanWhether property management was successful

No examples provided.

create_component ~58

Convert an existing frame into a main component.

NameTypeReqDescription
nodeIdstringyesThe ID of the frame to convert to a component
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
idstringID of the created component
namestringName of the created component
parentIdstringID of the parent the component was placed into — confirm containment without a follow-up read

No examples provided.

create_component_set ~132

Combine components into a component set (variants) with property definitions.

NameTypeReqDescription
componentSetNamestringOptional non-empty name for the component set
componentsarrayyesArray of component objects
parentIdstringyesID of the appendable parent container (frame, group, page, section, etc.) to place the set in; discover it with node_info
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
propertiesarrayyesArray of property names (e.g. ['Size', 'State'])
NameTypeReqDescription
childCountnumberNumber of variants in the set
errorobject
idstringID of the created component set
namestringName of the component set
parentIdstringID of the parent the set was placed into — confirm containment without a follow-up read
typestringNode type (COMPONENT_SET)
variantPropertiesobjectVariant properties definition
warningstringWarning message if some properties could not be read

No examples provided.

create_frame ~367

Create a frame (container) with optional fill/stroke and full auto-layout configuration.

NameTypeReqDescription
counterAxisAlignItemsstringCounter axis alignment for auto-layout frame
fillColorobjectFill color in RGBA format
heightnumberyesHeight of the frame
itemSpacingnumberDistance between children in auto-layout frame. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.
layoutModestringAuto-layout mode for the frame
layoutSizingHorizontalstringHorizontal sizing mode for auto-layout frame
layoutSizingVerticalstringVertical sizing mode for auto-layout frame
layoutWrapstringWhether the auto-layout frame wraps its children
namestringOptional non-empty name for the frame
paddingBottomnumberBottom padding for auto-layout frame
paddingLeftnumberLeft padding for auto-layout frame
paddingRightnumberRight padding for auto-layout frame
paddingTopnumberTop padding for auto-layout frame
parentIdstringyesParent node ID to append the frame to
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
primaryAxisAlignItemsstringPrimary axis alignment for auto-layout frame. Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.
strokeColorobjectStroke color in RGBA format
strokeWeightnumberStroke weight
widthnumberyesWidth of the frame
xnumberyesX position
ynumberyesY position
NameTypeReqDescription
errorobject
idstringID of the created frame
namestringName of the created frame
parentIdstringID of the parent the node was placed into — confirm containment without a follow-up read

No examples provided.

create_instance ~124

Instantiate a component (by `componentKey` or `componentId`) at a position.

NameTypeReqDescription
componentIdstringNode ID of the component to instantiate (preferred for local components)
componentKeystringKey of the component to instantiate (for remote/library components)
parentIdstringyesParent node ID to append the instance to
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
xnumberyesX position
ynumberyesY position
NameTypeReqDescription
componentIdstringID of the component the instance was created from
errorobject
idstringID of the created component instance
namestringName of the component instance
parentIdstringID of the parent the instance was placed into — confirm containment without a follow-up read

No examples provided.

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.

NameTypeReqDescription
arcDataobjectOptional arc data for creating arcs/donuts (ELLIPSE only)
fillColorobjectFill color in RGBA format
heightnumberyesHeight of the shape
innerRadiusnumber0.0–1.0, star sharpness (default: 1.0). STAR only.
namestringOptional non-empty name for the shape
parentIdstringyesParent node ID to append the shape to
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
pointCountnumberNumber of sides (polygon) or points (star), ≥3. Required for POLYGON and STAR.
strokeColorobjectStroke color in RGBA format
typestringyesThe type of shape to create
useAbsolutePositionbooleanIf true and parent is an auto-layout frame, forces absolute positioning to prevent layout shifts.
widthnumberyesWidth of the shape
xnumberyesX position
ynumberyesY position
NameTypeReqDescription
errorobject
idstringID of the created shape
namestringName of the created shape
parentIdstringID of the parent the node was placed into — confirm containment without a follow-up read

No examples provided.

create_svg ~99

Create a node from an SVG markup string.

NameTypeReqDescription
namestringOptional non-empty name for the new node
parentIdstringyesParent ID to append to
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
svgstringyesThe SVG XML string
xnumberX position
ynumberY position
NameTypeReqDescription
errorobject
idstringID of the created node
namestringName of the created node
parentIdstringID of the parent the node was placed into — confirm containment without a follow-up read

No examples provided.

create_text ~165

Create a text node with content and optional font size/weight/color.

NameTypeReqDescription
fontColorobjectFont color in RGBA format
fontSizenumberFont size, minimum 1 (default: 14)
fontWeightintegerFont weight: 100–900 in increments of 100 (default: 400)
namestringOptional non-empty semantic layer name for the text node
parentIdstringyesParent node ID to append the text to
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
textstringyesText content
xnumberyesX position
ynumberyesY position
NameTypeReqDescription
errorobject
idstringID of the created text node
namestringName of the created text node
parentIdstringID of the parent the node was placed into — confirm containment without a follow-up read

No examples provided.

instance_get_overrides ~45

Read the override properties from a source instance, to later apply them to other instances.

NameTypeReqDescription
nodeIdstringyesThe ID of the component instance to get overrides from.
NameTypeReqDescription
errorobject
mainComponentIdstringID of the main component
messagestringStatus message
overridesCountnumberNumber of overrides found
sourceInstanceIdstringSource instance ID
successbooleanWhether overrides retrieval was successful

No examples provided.

instance_set_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).

NameTypeReqDescription
sourceInstanceIdstringyesID of the source component instance
targetNodesarrayyesArray of target instances with their expected names for verification.
NameTypeReqDescription
errorobject
failedCountnumberNumber of failed targets
requestedCountnumberNumber of requested targets
resultsarrayResults per target node (one row per input, in input order)
skippedCountnumberNumber of skipped targets
statusstringOverall status of the batch operation
succeededCountnumberNumber of succeeded targets
successbooleanWhether overrides application was successful

No examples provided.

instance_set_property ~112

Set one property on an instance — boolean toggle, text override, instance swap, or variant selection.

NameTypeReqDescription
nodeIdstringyesThe ID of the instance node
nodeNamestringyesThe instance's current exact name, passed back verbatim from `node_info`.
propertyNamestringyesThe human-readable name of the component property to change
valueyesThe new value for the property. For INSTANCE_SWAP properties, this must be a component key (the stable library identifier).
NameTypeReqDescription
errorobject
resultsExecution details
successbooleanWhether property update was successful

No examples provided.

node_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.

NameTypeReqDescription
nodeIdstringyesThe ID of the node to apply style to
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
styleIdstringyesThe ID of the style to apply
styleTypestringyesType of style to apply (target property)
NameTypeReqDescription
errorobject
namestringName of the modified node
successbooleanWhether the style was applied successfully

No examples provided.

node_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.

NameTypeReqDescription
bindVariablesobjectMap 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…
explicitVariableModesobjectMap of variable collection IDs to mode IDs. E.g., { 'VariableCollectionID:1:2': 'ModeID:1:3' }
nodeIdstringyesThe ID of the node to bind variables to
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
messagestringStatus message
namestringName of the modified node
successbooleanWhether the variables were bound successfully

No examples provided.

node_clone ~95

Duplicate an existing node, optionally at a new `x`/`y`. Produces a new node id.

NameTypeReqDescription
nodeIdstringyesThe ID of the node to clone
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
xnumberNew X position for the clone
ynumberNew Y position for the clone
NameTypeReqDescription
errorobject
idstringID of the new cloned node
namestringName of the cloned node
parentIdstringID of the parent the clone was placed into — confirm containment without a follow-up read

No examples provided.

node_delete ~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).

NameTypeReqDescription
nodesarrayyesArray of nodes to delete
NameTypeReqDescription
errorobject
failedCountnumberNumber of failed deletions
requestedCountnumberNumber of requested deletions
resultsarrayDetailed deletion results (one row per input, in input order)
skippedCountnumberNumber of skipped deletions
statusstringOverall status of the batch operation
succeededCountnumberNumber of succeeded deletions
successbooleanWhether all deletions succeeded

No examples provided.

node_export_visual ~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).

NameTypeReqDescription
formatstringExport format
nodeIdstringyesThe ID of the node to export
scalenumberExport scale, between 0.1 and 4.0 (e.g. 1, 2, 0.5)
NameTypeReqDescription
errorobject
formatstringImage format
imageDatastringBase64-encoded binary data (PNG/JPG/PDF)
mimeTypestringMIME type of the exported image
nodeIdstringID of the exported node
scalenumberExport scale used
svgstringRaw SVG XML markup (returned instead of imageData when format=SVG)

No examples provided.

node_flatten ~68

Flatten a node and its children into a single vector. Lossy — original structure is not recoverable.

NameTypeReqDescription
nodeIdstringyesThe ID of the node to flatten
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
idstringID of the flattened node
namestringName of the flattened node
parentIdID 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
typestringType of the flattened node (usually VECTOR)

No examples provided.

node_group ~63

Wrap multiple nodes in a new group node.

NameTypeReqDescription
namestringOptional non-empty name for the new group. Omit to accept Figma's default; `""` is refused rather than silently substituted.
nodesarrayyesArray of nodes to group
NameTypeReqDescription
childCountnumberNumber of children in the group
errorobject
idstringID of the new group node
namestringName of the new group node

No examples provided.

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.

NameTypeReqDescription
concurrencyLimitintegerConcurrency limit for parallel subtree walk (default: 4)
filterobjectOptional filter criteria.
maxDepthintegerMaximum depth for recursive child traversal. 0 = self only, 1 = self and immediate children, etc.
nodeIdsarrayArray of node IDs to inspect. If empty, uses editable scope.
propertiesarrayArray of property names to return (populates each node's `properties` object in the response).
NameTypeReqDescription
coveragePage-scan coverage; partial read data remains usable when complete is false
errorobject
missingNodeIdsarrayRequested IDs that weren't found
nodesarrayNode entries (id/name/type + optional properties/children/path/descendantCount)
pageFailedNodesarrayRequested nodes that exist but could not be read because their containing page failed; omitted when none

No examples provided.

node_insert_child ~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.

NameTypeReqDescription
childIdstringyesID of the child node to reparent
childNodeNamestringyesThe child node's current exact name, passed back verbatim from `node_info`.
indexnumberPosition in parent's children array (default: append). The output index reports the actual resolved position (same-parent reorder shifts indices).
parentIdstringyesID of the new parent node
parentNodeNamestringyesThe parent node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
childIdstringID of the reparented child node
errorobject
indexnumberIndex at which the child was inserted
newParentIdstringID of the new parent node

No examples provided.

node_rename ~97

Rename a node (sets `name` to an exact value).

NameTypeReqDescription
namestringyesNew non-empty name for the node. Figma normalizes an empty name to a type default, so `""` is refused rather than silently substituted.
nodeIdstringyesThe ID of the node to rename
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
namestringThe new name of the node
oldNamestringThe old name of the node

No examples provided.

node_set_auto_layout ~330

Configure a frame's auto-layout (mode, padding, spacing, alignment, sizing) in one unified setter.

NameTypeReqDescription
counterAxisAlignItemsstringCounter axis alignment (MIN/MAX = top/bottom in horizontal, left/right in vertical)
counterAxisSpacingnumberDistance between wrapped rows/columns. Only works when layoutWrap is set to WRAP.
itemSpacingnumberDistance between children. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.
layoutModestringLayout mode for the frame
layoutSizingHorizontalstringHorizontal sizing mode (HUG for frames/text only, FILL for auto-layout children only)
layoutSizingVerticalstringVertical sizing mode (HUG for frames/text only, FILL for auto-layout children only)
layoutWrapstringWhether the auto-layout frame wraps its children
nodeIdstringyesThe ID of the frame to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
paddingBottomnumberBottom padding value
paddingLeftnumberLeft padding value
paddingRightnumberRight padding value
paddingTopnumberTop padding value
primaryAxisAlignItemsstringPrimary 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.
NameTypeReqDescription
errorobject
namestringName of the modified frame

No examples provided.

node_set_corner_radius ~104

Set a node's corner radius — uniform or per-corner.

NameTypeReqDescription
cornersarrayOptional array of 4 booleans to specify which corners to round [topLeft, topRight, bottomRight, bottomLeft]
nodeIdstringyesThe ID of the node to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
radiusnumberyesCorner radius value
NameTypeReqDescription
errorobject
namestringName of the modified node

No examples provided.

node_set_effects ~109

Set a node's effect array (shadows, blurs). Use `node_apply_style` to link a shared effect style instead.

NameTypeReqDescription
effectsarrayyesArray of strict per-variant Figma effects: DROP_SHADOW/INNER_SHADOW or LAYER_BLUR/BACKGROUND_BLUR
nodeIdstringyesThe ID of the node to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
namestringName of the modified node

No examples provided.

node_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.

NameTypeReqDescription
anumberAlpha component (0-1)
bnumberBlue component (0-1)
clearbooleanSet to true to clear all fills. Must provide exactly one of solid color, image, or clear:true.
gnumberGreen component (0-1)
imageobjectOptional image payload. Must provide exactly one of solid color or image.
nodeIdstringyesThe ID of the node to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
rnumberRed component (0-1)
NameTypeReqDescription
errorobject
namestringName of the modified node
warningsarrayWarnings from the operation (e.g., resizing)

No examples provided.

node_set_stroke ~187

Set a node's stroke color and weight; supports uniform or per-side weights.

NameTypeReqDescription
anumberAlpha component (0-1)
bnumberyesBlue component (0-1)
gnumberyesGreen component (0-1)
nodeIdstringyesThe ID of the node to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
rnumberyesRed component (0-1)
strokeBottomWeightnumberBottom side stroke weight
strokeLeftWeightnumberLeft side stroke weight
strokeRightWeightnumberRight side stroke weight
strokeTopWeightnumberTop side stroke weight
weightnumberUniform stroke weight (used when individual side weights are not provided)
NameTypeReqDescription
errorobject
namestringName of the modified node

No examples provided.

node_transform ~112

Move and/or resize a node by setting absolute `x`/`y`/`width`/`height` (any subset).

NameTypeReqDescription
heightnumberNew height
nodeIdstringyesThe ID of the node to transform
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
widthnumberNew width
xnumberNew X position
ynumberNew Y position
NameTypeReqDescription
errorobject
heightnumberResulting height
idstringID of the transformed node
namestringName of the transformed node
widthnumberResulting width
xnumberResulting X position
ynumberResulting Y position

No examples provided.

node_ungroup ~65

Dissolve a group, promoting its children to the parent. Removes the group container.

NameTypeReqDescription
nodeIdstringyesThe ID of the group to ungroup
nodeNamestringyesThe group's current exact name, passed back verbatim from `node_info`.
NameTypeReqDescription
errorobject
parentIdID of the parent node (null if the group had no parent)
ungroupedChildrenarrayList of ungrouped child nodes

No examples provided.

page_info ~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.

NameTypeReqDescription
pageIdsarrayArray of page IDs to inspect
NameTypeReqDescription
coveragePage-scan coverage; partial read data remains usable when complete is false
documentIdstringID of the Figma document
documentNamestringName of the Figma document
errorobject
missingPageIdsarrayEvery requested page ID absent from `pages`, whatever the cause; `coverage.pageErrors` carries the structured reason for each
pageCountnumberTotal page count
pagesarrayList of page objects

No examples provided.

reaction_list ~36

Read prototype reactions from one or more nodes and their descendants.

NameTypeReqDescription
nodeIdsarrayyesArray of node IDs to get reactions from
NameTypeReqDescription
errorobject
nodesarrayList of node entries with their reactions
nodesCountnumberNumber of inspected nodes
nodesWithReactionsnumberNumber of nodes found that have reactions

No examples provided.

reaction_update ~84

Replace a node's prototype reactions with a full new reactions array (read first via `reaction_list`).

NameTypeReqDescription
nodeIdstringyesThe ID of the node to update reactions for
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
reactionsarrayyesThe full array of Reaction objects to set
NameTypeReqDescription
errorobject
successbooleanWhether the reactions were updated successfully

No examples provided.

style_delete ~67

Delete a local style by id. Detaches consumers — they keep their resolved values and lose only the style link.

NameTypeReqDescription
styleIdstringyesID of style to delete
styleNamestringyesThe style's current exact name, passed back verbatim from `style_list`.
NameTypeReqDescription
errorobject
messagestringSuccess/failure status message
successbooleanWhether style was successfully deleted

No examples provided.

style_list ~23

List all local styles (paint/text/effect/grid) in the document.

Input schema present but exposes no named parameters.

NameTypeReqDescription
colorsarrayList of paint/color styles
effectsarrayList of effect styles
errorobject
gridsarrayList of grid styles
textsarrayList of text styles

No examples provided.

style_manage ~232

Create a named style (paint/text/effect/grid), or update an existing one when `styleId` is given. UPDATE requires currentStyleName.

NameTypeReqDescription
bindVariablesobjectMap 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.
currentStyleNamestringREQUIRED for UPDATE when styleId is supplied — the style's **current exact** name, passed back verbatim from `style_list`
descriptionstringDescription of the style
namestringStyle name. Must be non-empty when supplied. REQUIRED for CREATE; omit it on UPDATE to leave the current style name unchanged.
propertiesobjectStyle properties to set; which subset applies depends on `type` (TEXT/PAINT/EFFECT/GRID).
styleIdstringID of the style to update (if not creating a new one)
typestringyesType of style to create or update
NameTypeReqDescription
errorobject
idstringID of the style
namestringName of the style
typestringType of the style

No examples provided.

text_set_content ~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).

NameTypeReqDescription
textarrayyesArray of text objects
NameTypeReqDescription
errorobject
failedCountnumberNumber of failed text replacements
requestedCountnumberNumber of requested text replacements
resultsarrayDetailed results per node (one row per input, in input order)
skippedCountnumberNumber of skipped text replacements
statusstringOverall status of the batch operation
succeededCountnumberNumber of succeeded text replacements
successbooleanWhether all replacements succeeded

No examples provided.

text_set_style ~185

Set any combination of typography properties (font, size, weight, spacing, decoration, …) on a text node.

NameTypeReqDescription
fontNameobjectFont family and style
fontSizenumberFont size
letterSpacingobjectLetter spacing settings
lineHeightLine height settings
nodeIdstringyesThe ID of the text node to modify
nodeNamestringyesThe node's current exact name, passed back verbatim from `node_info`.
paragraphIndentnumberParagraph indent in pixels
paragraphSpacingnumberParagraph spacing in pixels
textAlignHorizontalstringHorizontal text alignment
textAlignVerticalstringVertical text alignment
textCasestringCase transformation on the text
textDecorationstringText decoration
NameTypeReqDescription
errorobject
namestringName of the modified node
successbooleanWhether style was set successfully

No examples provided.

variable_delete ~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.

NameTypeReqDescription
collectionIdstringID of a variable collection to delete. Mutually exclusive with variableIds.
collectionNamestringName of the collection to delete, for safety verification. Required if collectionId is used.
variableIdsarrayArray of variable IDs to delete. Mutually exclusive with collectionId.
variableNamesarrayArray of variable names corresponding to variableIds, for safety verification. Required if variableIds is used.
NameTypeReqDescription
errorobject
messagestringStatus message
successbooleanWhether variables were deleted successfully

No examples provided.

Common questions

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.