Figma Edit MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FIGMA_EDIT_MCP_SOCKET_HOST | No | The host for the WebSocket bridge (use 0.0.0.0 for WSL) | localhost |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| page_infoA | List the document's pages; no args → all pages (no children), or pass |
| node_infoA | Read one or more nodes — recursive subtree traversal with |
| node_transformA | Move and/or resize a node by setting absolute |
| node_renameA | Rename a node (sets |
| node_deleteA | 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). |
| node_cloneA | Duplicate an existing node, optionally at a new |
| view_navigateA | Navigate the editor view to a page or node(s). |
| node_groupB | Wrap multiple nodes in a new group node. |
| node_ungroupA | Dissolve a group, promoting its children to the parent. Removes the group container. |
| node_flattenA | Flatten a node and its children into a single vector. Lossy — original structure is not recoverable. |
| node_insert_childA | Reparent a node under a new parent at an optional |
| node_set_auto_layoutA | Configure a frame's auto-layout (mode, padding, spacing, alignment, sizing) in one unified setter. |
| node_set_fillA | Set a node's fill to a literal RGBA color, an image, or clear it. Use |
| node_set_strokeA | Set a node's stroke color and weight; supports uniform or per-side weights. |
| node_set_corner_radiusA | Set a node's corner radius — uniform or per-corner. |
| node_set_effectsA | Set a node's effect array (shadows, blurs). Use |
| node_apply_styleA | Link a node to a shared library style (paint/text/effect/grid) by |
| node_bind_variableA | Bind a variable to a node property, or set an explicit variable mode. Use instead of a literal |
| node_export_visualA | 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 |
| create_shapeA | Create a rectangle, ellipse, polygon, or star via |
| create_frameA | Create a frame (container) with optional fill/stroke and full auto-layout configuration. |
| create_textB | Create a text node with content and optional font size/weight/color. |
| create_svgB | Create a node from an SVG markup string. |
| create_componentA | Convert an existing frame into a main component. |
| create_instanceB | Instantiate a component (by |
| create_component_setA | Combine components into a component set (variants) with property definitions. |
| style_listA | List all local styles (paint/text/effect/grid) in the document. |
| style_manageA | Create a named style (paint/text/effect/grid), or update an existing one when |
| style_deleteA | Delete a local style by id. Detaches consumers — they keep their resolved values and lose only the style link. |
| text_set_contentA | 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). |
| text_set_styleA | Set any combination of typography properties (font, size, weight, spacing, decoration, …) on a text node. |
| component_listA | List components in the document, with filtering and scope options. Document scans isolate page failures and report them in |
| component_manage_propertyA | Add or edit a component-property definition (BOOLEAN/TEXT/INSTANCE_SWAP) on a main component or variant set. Deleting is |
| component_delete_propertyA | Remove a component-property definition from a main component or variant set; propagates to every instance. |
| instance_set_propertyA | Set one property on an instance — boolean toggle, text override, instance swap, or variant selection. |
| instance_get_overridesA | Read the override properties from a source instance, to later apply them to other instances. |
| instance_set_overridesA | 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). |
| variable_listA | List local variables/collections, or detailed info for specific variable ids; optionally scan for consumers. Document consumer scans isolate page failures and report them in |
| variable_manageA | Create collections and variables and set their values/aliases (create/update router). UPDATE_VARIABLE requires |
| variable_deleteA | 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 |
| annotation_listA | 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 |
| annotation_setA | 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. |
| reaction_listA | Read prototype reactions from one or more nodes and their descendants. |
| reaction_updateA | Replace a node's prototype reactions with a full new reactions array (read first via |
| channel_joinA | Join a plugin channel to establish the live connection to the Figma document. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| swap_overrides_instances | Strategy for transferring overrides between component instances in Figma |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| constraints | Hard, plugin-enforced rules (scope, name verification, batch validation, URL IDs). |
| error-playbook | Recovery playbook for every structured error code. |
| workflows | Discover-before-acting patterns and recipe skeletons. |
| tool-selection | Guidance on choosing the right tools, using node.info, batch vs single, etc. |
| node-fields | The full set of node_info `properties` (generated from @figma/plugin-typings), with types and how reference fields resolve. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/neozhehan/figma-edit-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server