This bypasses Figma's REST API rate limits entirely by running a local plugin bridge that exposes 73 read/write operations over stdio. You can create frames, text, and components, bind variables to node properties, set up prototype reactions, manage styles and collections, and even do find-and-replace across text layers. No API token required, which means the free Figma plan works fine. Setup involves adding the server to your MCP config and importing a manifest into Figma Desktop. Best for design automation workflows where you'd otherwise hit the 6 calls per month limit on Starter plans or need programmatic control over layers, auto-layout, and design tokens without dealing with REST quotas.
claude mcp add figma-mcp-go -- npx -y @vkhanhqui/figma-mcp-goRun in your terminal. Replace YOUR_* placeholders with real values; add --scope user to install for every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
add_pageAdd a new page to the Figma document.2 paramsAdd a new page to the Figma document.
namestringindexnumberadd_variable_modeAdd a new mode to an existing variable collection (e.g. Light/Dark, Desktop/Mobile). IMPORTANT — Figma free plan only allows 1 mode per collection; calling this tool on a free-plan account will return the error 'Limited to 1 modes only'. If that error occurs, stop retrying and...2 paramsAdd a new mode to an existing variable collection (e.g. Light/Dark, Desktop/Mobile). IMPORTANT — Figma free plan only allows 1 mode per collection; calling this tool on a free-plan account will return the error 'Limited to 1 modes only'. If that error occurs, stop retrying and...
modeName*stringcollectionId*stringapply_style_to_nodeApply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style.3 paramsApply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style.
nodeId*stringtargetstringstyleId*stringbatch_rename_nodesRename multiple nodes using find/replace, regex substitution, or prefix/suffix addition.7 paramsRename multiple nodes using find/replace, regex substitution, or prefix/suffix addition.
findstringprefixstringsuffixstringnodeIds*arrayreplacestringuseRegexbooleanregexFlagsstringbind_variable_to_nodeBind a local variable to a node property so the property is driven by the variable's value. COLOR variables: use fillColor or strokeColor. BOOLEAN variables: use visible. FLOAT variables: use opacity, rotation, width, height, cornerRadius, topLeftRadius, topRightRadius, bottom...3 paramsBind a local variable to a node property so the property is driven by the variable's value. COLOR variables: use fillColor or strokeColor. BOOLEAN variables: use visible. FLOAT variables: use opacity, rotation, width, height, cornerRadius, topLeftRadius, topRightRadius, bottom...
field*stringnodeId*stringvariableId*stringclone_nodeClone an existing node, optionally repositioning it or placing it in a new parent.4 paramsClone an existing node, optionally repositioning it or placing it in a new parent.
xnumberynumbernodeId*stringparentIdstringcreate_componentConvert an existing FRAME node into a reusable COMPONENT. The frame is replaced in place by the new component.2 paramsConvert an existing FRAME node into a reusable COMPONENT. The frame is replaced in place by the new component.
namestringnodeId*stringcreate_effect_styleCreate a new local effect style (drop shadow, inner shadow, or blur).9 paramsCreate a new local effect style (drop shadow, inner shadow, or blur).
name*stringtypestringcolorstringradiusnumberspreadnumberoffsetXnumberoffsetYnumberopacitynumberdescriptionstringcreate_ellipseCreate a new ellipse (circle/oval) on the current page or inside a parent node.7 paramsCreate a new ellipse (circle/oval) on the current page or inside a parent node.
xnumberynumbernamestringwidthnumberheightnumberparentIdstringfillColorstringcreate_frameCreate a new frame on the current page or inside a parent node.19 paramsCreate a new frame on the current page or inside a parent node.
xnumberynumbernamestringwidthnumberheightnumberparentIdstringfillColorstringlayoutModestringlayoutWrapstringpaddingTopnumberitemSpacingnumberpaddingLeftnumberpaddingRightnumberpaddingBottomnumbercounterAxisSpacingnumbercounterAxisAlignItemsstringcounterAxisSizingModestringprimaryAxisAlignItemsstringprimaryAxisSizingModestringcreate_grid_styleCreate a new local layout grid style.10 paramsCreate a new local layout grid style.
name*stringcolorstringcountnumberoffsetnumberopacitynumberpatternstringalignmentstringgutterSizenumberdescriptionstringsectionSizenumbercreate_paint_styleCreate a new local paint style with a solid fill color.3 paramsCreate a new local paint style with a solid fill color.
name*stringcolor*stringdescriptionstringcreate_rectangleCreate a new rectangle on the current page or inside a parent node.8 paramsCreate a new rectangle on the current page or inside a parent node.
xnumberynumbernamestringwidthnumberheightnumberparentIdstringfillColorstringcornerRadiusnumbercreate_sectionCreate a Figma Section node on the current page. Sections are the modern way to organize frames and groups on a page.5 paramsCreate a Figma Section node on the current page. Sections are the modern way to organize frames and groups on a page.
xnumberynumbernamestringwidthnumberheightnumbercreate_textCreate a new text node on the current page or inside a parent node. The font is loaded automatically before insertion. Returns the created node ID and bounds. Use set_text to update the content of an existing text node.9 paramsCreate a new text node on the current page or inside a parent node. The font is loaded automatically before insertion. Returns the created node ID and bounds. Use set_text to update the content of an existing text node.
xnumberynumbernamestringtext*stringfontSizenumberparentIdstringfillColorstringfontStylestringfontFamilystringcreate_text_styleCreate a new local text style (typography preset). Returns the new style's ID. Apply it to nodes with apply_style_to_node. Use get_styles to list existing text styles.10 paramsCreate a new local text style (typography preset). Returns the new style's ID. Apply it to nodes with apply_style_to_node. Use get_styles to list existing text styles.
name*stringfontSizenumberfontStylestringfontFamilystringdescriptionstringlineHeightUnitstringtextDecorationstringlineHeightValuenumberletterSpacingUnitstringletterSpacingValuenumbercreate_variableCreate a new variable (design token) inside an existing collection. Returns the new variable's ID. Use get_variable_defs to find collection IDs, set_variable_value to set values per mode, and bind_variable_to_node to apply the variable to a node property.4 paramsCreate a new variable (design token) inside an existing collection. Returns the new variable's ID. Use get_variable_defs to find collection IDs, set_variable_value to set values per mode, and bind_variable_to_node to apply the variable to a node property.
name*stringtype*stringvaluestringcollectionId*stringcreate_variable_collectionCreate a new local variable collection with an optional initial mode name. NOTE — Figma free plan limits each collection to 1 mode. If you need Light/Dark (or any multi-mode) theming and the user is on the free plan, do NOT try to call add_variable_mode; instead use the name-p...2 paramsCreate a new local variable collection with an optional initial mode name. NOTE — Figma free plan limits each collection to 1 mode. If you need Light/Dark (or any multi-mode) theming and the user is on the free plan, do NOT try to call add_variable_mode; instead use the name-p...
name*stringinitialModeNamestringdelete_nodesDelete one or more nodes. This cannot be undone via MCP — use with care.1 paramsDelete one or more nodes. This cannot be undone via MCP — use with care.
nodeIds*arraydelete_pageDelete a page from the Figma document. Cannot delete the only remaining page.2 paramsDelete a page from the Figma document. Cannot delete the only remaining page.
pageIdstringpageNamestringdelete_styleDelete a style (paint, text, effect, or grid) by its ID.1 paramsDelete a style (paint, text, effect, or grid) by its ID.
styleId*stringdelete_variableDelete a single variable (provide variableId) or an entire collection and all its variables (provide collectionId). Provide exactly one of the two — not both.2 paramsDelete a single variable (provide variableId) or an entire collection and all its variables (provide collectionId). Provide exactly one of the two — not both.
variableIdstringcollectionIdstringdetach_instanceDetach one or more component instances, converting them to plain frames. The link to the main component is broken; all visual properties are preserved.1 paramsDetach one or more component instances, converting them to plain frames. The link to the main component is broken; all visual properties are preserved.
nodeIds*arrayexport_frames_to_pdfExport multiple frames as a single multi-page PDF file. Each frame becomes one page in order. Ideal for pitch decks, proposals, and slide exports.2 paramsExport multiple frames as a single multi-page PDF file. Each frame becomes one page in order. Ideal for pitch decks, proposals, and slide exports.
nodeIds*arrayoutputPath*stringexport_tokensExport all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase.1 paramsExport all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase.
formatstringfind_replace_textFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.5 paramsFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
find*stringnodeIdstringreplace*stringuseRegexbooleanregexFlagsstringget_annotationsGet dev-mode annotations in the current document or scoped to a specific node. Returns annotation objects with label text, measurement type, and the ID of the annotated node. Omit nodeId to retrieve all annotations on the current page.1 paramsGet dev-mode annotations in the current document or scoped to a specific node. Returns annotation objects with label text, measurement type, and the ID of the annotated node. Omit nodeId to retrieve all annotations on the current page.
nodeIdstringget_design_contextGet a depth-limited, token-efficient tree of the current selection or page. Use this instead of get_document when exploring large files. Supports detail levels (minimal/compact/full) and dedupe_components for pages heavy with repeated component instances.3 paramsGet a depth-limited, token-efficient tree of the current selection or page. Use this instead of get_document when exploring large files. Supports detail levels (minimal/compact/full) and dedupe_components for pages heavy with repeated component instances.
depthnumberdetailstringdedupe_componentsbooleanget_documentGet the full node tree of the current page (not the whole file — only the active page). Returns all nodes recursively and can be very large. Prefer get_design_context for exploration or when token efficiency matters.Get the full node tree of the current page (not the whole file — only the active page). Returns all nodes recursively and can be very large. Prefer get_design_context for exploration or when token efficiency matters.
No parameters — call it with no arguments.
get_fontsList all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes.List all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes.
No parameters — call it with no arguments.
get_local_componentsGet all components defined in the current Figma file.Get all components defined in the current Figma file.
No parameters — call it with no arguments.
get_metadataGet metadata about the current Figma document: file name, pages, current pageGet metadata about the current Figma document: file name, pages, current page
No parameters — call it with no arguments.
get_nodeGet a single node by ID with full detail. Use get_nodes_info to fetch multiple nodes in one round-trip instead of calling this repeatedly. Node ID must be colon format e.g. '4029:12345', never hyphens.1 paramsGet a single node by ID with full detail. Use get_nodes_info to fetch multiple nodes in one round-trip instead of calling this repeatedly. Node ID must be colon format e.g. '4029:12345', never hyphens.
nodeId*stringget_nodes_infoGet full details for multiple nodes by ID in one round-trip. Prefer this over calling get_node repeatedly when you need several nodes.1 paramsGet full details for multiple nodes by ID in one round-trip. Prefer this over calling get_node repeatedly when you need several nodes.
nodeIds*arrayget_pagesList all pages in the document with their IDs and names. Lightweight alternative to get_document.List all pages in the document with their IDs and names. Lightweight alternative to get_document.
No parameters — call it with no arguments.
get_reactionsGet the prototype reactions defined on a node. Returns an array of reaction objects — each has a trigger (e.g. ON_CLICK, ON_HOVER, AFTER_TIMEOUT) and an actions array (navigate to node, open URL, go back, etc.). Use set_reactions to add or replace reactions, remove_reactions t...1 paramsGet the prototype reactions defined on a node. Returns an array of reaction objects — each has a trigger (e.g. ON_CLICK, ON_HOVER, AFTER_TIMEOUT) and an actions array (navigate to node, open URL, go back, etc.). Use set_reactions to add or replace reactions, remove_reactions t...
nodeId*stringget_screenshotExport a screenshot of one or more nodes as base64-encoded image data (held in memory). Use save_screenshots instead when you want to write images directly to disk without base64 in the response.3 paramsExport a screenshot of one or more nodes as base64-encoded image data (held in memory). Use save_screenshots instead when you want to write images directly to disk without base64 in the response.
scalenumberformatstringnodeIdsarrayget_selectionGet the nodes currently selected in Figma. Returns an empty array if nothing is selected. Use get_design_context or get_node to retrieve deeper detail about a specific node by ID.Get the nodes currently selected in Figma. Returns an empty array if nothing is selected. Use get_design_context or get_node to retrieve deeper detail about a specific node by ID.
No parameters — call it with no arguments.
get_stylesGet all local styles in the document (paint, text, effect, and grid). Returns each style's ID, name, type, and properties. Use the style ID with apply_style_to_node or update_paint_style. For design tokens (variables), use get_variable_defs instead.Get all local styles in the document (paint, text, effect, and grid). Returns each style's ID, name, type, and properties. Use the style ID with apply_style_to_node or update_paint_style. For design tokens (variables), use get_variable_defs instead.
No parameters — call it with no arguments.
get_variable_defsGet all local variable definitions: collections, modes, and values. Variables are Figma's design token system.Get all local variable definitions: collections, modes, and values. Variables are Figma's design token system.
No parameters — call it with no arguments.
get_viewportGet the current Figma viewport: scroll center, zoom level, and visible bounds.Get the current Figma viewport: scroll center, zoom level, and visible bounds.
No parameters — call it with no arguments.
group_nodesGroup two or more nodes into a GROUP. All nodes must share the same parent.2 paramsGroup two or more nodes into a GROUP. All nodes must share the same parent.
namestringnodeIds*arrayimport_imageImport a base64-encoded image into Figma as a rectangle with an image fill. Use get_screenshot to capture images or provide your own base64 PNG/JPG.8 paramsImport a base64-encoded image into Figma as a rectangle with an image fill. Use get_screenshot to capture images or provide your own base64 PNG/JPG.
xnumberynumbernamestringwidthnumberheightnumberparentIdstringimageData*stringscaleModestringlock_nodesLock one or more nodes to prevent accidental edits in Figma.1 paramsLock one or more nodes to prevent accidental edits in Figma.
nodeIds*arraymove_nodesMove one or more nodes to an absolute canvas position. The same x/y is applied to every node independently (not a relative offset from current position).3 paramsMove one or more nodes to an absolute canvas position. The same x/y is applied to every node independently (not a relative offset from current position).
xnumberynumbernodeIds*arraynavigate_to_pageSwitch the active Figma page. Provide either pageId or pageName.2 paramsSwitch the active Figma page. Provide either pageId or pageName.
pageIdstringpageNamestringremove_reactionsRemove prototype reactions from a node. Omit indices to remove all reactions. Provide a zero-based indices array to remove specific reactions (use get_reactions first to see current indices).2 paramsRemove prototype reactions from a node. Omit indices to remove all reactions. Provide a zero-based indices array to remove specific reactions (use get_reactions first to see current indices).
nodeId*stringindicesarrayrename_nodeRename a single node by ID. Returns the updated node with its new name. Use batch_rename_nodes to rename multiple nodes at once or to apply find/replace patterns across many nodes.2 paramsRename a single node by ID. Returns the updated node with its new name. Use batch_rename_nodes to rename multiple nodes at once or to apply find/replace patterns across many nodes.
name*stringnodeId*stringrename_pageRename an existing page in the Figma document.3 paramsRename an existing page in the Figma document.
pageIdstringnewName*stringpageNamestringreorder_nodesChange the z-order (layer stack position) of one or more nodes.2 paramsChange the z-order (layer stack position) of one or more nodes.
order*stringnodeIds*arrayreparent_nodesMove one or more nodes to a different parent frame, group, or section.2 paramsMove one or more nodes to a different parent frame, group, or section.
nodeIds*arrayparentId*stringresize_nodesResize one or more nodes. The same width/height is applied to every node in the list independently. Provide width, height, or both.3 paramsResize one or more nodes. The same width/height is applied to every node in the list independently. Provide width, height, or both.
widthnumberheightnumbernodeIds*arrayrotate_nodesRotate one or more nodes to an absolute angle in degrees.2 paramsRotate one or more nodes to an absolute angle in degrees.
nodeIds*arrayrotation*numbersave_screenshotsExport screenshots for multiple nodes and write them to the local filesystem. Returns file metadata (path, size, dimensions) — no base64 in the response. Use get_screenshot instead when you need the image data in memory.3 paramsExport screenshots for multiple nodes and write them to the local filesystem. Returns file metadata (path, size, dimensions) — no base64 in the response. Use get_screenshot instead when you need the image data in memory.
items*arrayscalenumberformatstringscan_nodes_by_typesFind all nodes of specific types in a subtree, regardless of name. Use search_nodes instead when you need to filter by name.2 paramsFind all nodes of specific types in a subtree, regardless of name. Use search_nodes instead when you need to filter by name.
types*arraynodeId*stringscan_text_nodesScan all TEXT nodes in a subtree and return their content. Shorthand for scan_nodes_by_types with ['TEXT'] — use when you only need text copy from a component or frame.1 paramsScan all TEXT nodes in a subtree and return their content. Shorthand for scan_nodes_by_types with ['TEXT'] — use when you only need text copy from a component or frame.
nodeId*stringsearch_nodesSearch for nodes by name substring and/or type within a subtree. Use this when you know (part of) the node name. Use scan_nodes_by_types when you want all nodes of a type regardless of name.4 paramsSearch for nodes by name substring and/or type within a subtree. Use this when you know (part of) the node name. Use scan_nodes_by_types when you want all nodes of a type regardless of name.
limitnumberquery*stringtypesarraynodeIdstringset_auto_layoutSet or update auto-layout (flex) properties on an existing frame.13 paramsSet or update auto-layout (flex) properties on an existing frame.
nodeId*stringlayoutModestringlayoutWrapstringpaddingTopnumberitemSpacingnumberpaddingLeftnumberpaddingRightnumberpaddingBottomnumbercounterAxisSpacingnumbercounterAxisAlignItemsstringcounterAxisSizingModestringprimaryAxisAlignItemsstringprimaryAxisSizingModestringset_blend_modeSet the blend mode of one or more nodes (e.g. MULTIPLY, SCREEN, OVERLAY).2 paramsSet the blend mode of one or more nodes (e.g. MULTIPLY, SCREEN, OVERLAY).
nodeIds*arrayblendMode*stringset_constraintsSet layout constraints (pinning behaviour) on one or more nodes relative to their parent.3 paramsSet layout constraints (pinning behaviour) on one or more nodes relative to their parent.
nodeIds*arrayverticalstringhorizontalstringset_corner_radiusSet corner radius on one or more nodes. Provide a uniform cornerRadius or individual per-corner values.6 paramsSet corner radius on one or more nodes. Provide a uniform cornerRadius or individual per-corner values.
nodeIds*arraycornerRadiusnumbertopLeftRadiusnumbertopRightRadiusnumberbottomLeftRadiusnumberbottomRightRadiusnumberset_effectsApply one or more effects (drop shadow, inner shadow, layer blur, background blur) directly to a node. Replaces all existing effects. Pass an empty array to clear all effects.2 paramsApply one or more effects (drop shadow, inner shadow, layer blur, background blur) directly to a node. Replaces all existing effects. Pass an empty array to clear all effects.
nodeId*stringeffects*arrayset_fillsSet the fill color on a single node (takes one nodeId, not an array). Use mode='append' to stack a new fill on top of existing fills instead of replacing them.4 paramsSet the fill color on a single node (takes one nodeId, not an array). Use mode='append' to stack a new fill on top of existing fills instead of replacing them.
modestringcolor*stringnodeId*stringopacitynumberset_opacitySet the opacity of one or more nodes (0 = fully transparent, 1 = fully opaque).2 paramsSet the opacity of one or more nodes (0 = fully transparent, 1 = fully opaque).
nodeIds*arrayopacity*numberset_reactionsSet prototype reactions on a node. Use mode "replace" (default) to overwrite all reactions, or "append" to add to existing ones. Supported triggers: ON_CLICK, ON_HOVER, ON_PRESS, ON_DRAG, AFTER_TIMEOUT, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_DOWN Supported action types: NOD...3 paramsSet prototype reactions on a node. Use mode "replace" (default) to overwrite all reactions, or "append" to add to existing ones. Supported triggers: ON_CLICK, ON_HOVER, ON_PRESS, ON_DRAG, AFTER_TIMEOUT, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_DOWN Supported action types: NOD...
modestringnodeId*stringreactions*arrayset_strokesSet the stroke color and weight on a single node (takes one nodeId, not an array). Use mode='append' to stack a new stroke on top of existing strokes instead of replacing them.4 paramsSet the stroke color and weight on a single node (takes one nodeId, not an array). Use mode='append' to stack a new stroke on top of existing strokes instead of replacing them.
modestringcolor*stringnodeId*stringstrokeWeightnumberset_textUpdate the text content of an existing TEXT node.2 paramsUpdate the text content of an existing TEXT node.
text*stringnodeId*stringset_variable_valueSet a variable's value for a specific mode.3 paramsSet a variable's value for a specific mode.
value*stringmodeId*stringvariableId*stringset_visibleShow or hide one or more nodes by setting their visibility.2 paramsShow or hide one or more nodes by setting their visibility.
nodeIds*arrayvisible*booleanswap_componentSwap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size.2 paramsSwap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size.
nodeId*stringcomponentId*stringungroup_nodesUngroup one or more GROUP nodes, moving their children to the parent and removing the group.1 paramsUngroup one or more GROUP nodes, moving their children to the parent and removing the group.
nodeIds*arrayunlock_nodesUnlock one or more nodes, allowing them to be edited again.1 paramsUnlock one or more nodes, allowing them to be edited again.
nodeIds*arrayupdate_paint_styleUpdate an existing paint style's name, color, or description. Only paint styles support in-place updates — to modify text, effect, or grid styles, use delete_style and recreate them.4 paramsUpdate an existing paint style's name, color, or description. Only paint styles support in-place updates — to modify text, effect, or grid styles, use delete_style and recreate them.
namestringcolorstringstyleId*stringdescriptionstringFigma MCP — Free, No Rate Limits
Open-source Figma MCP server with full read/write access via plugin — no REST API, no rate limits. Turn text into designs and designs into real code. Works with Cursor, Claude, GitHub Copilot, and any MCP-compatible AI tool.
Highlights
Styles, Variables, Components, Prototypes, and Content
https://github.com/user-attachments/assets/eae41471-fc72-4574-8261-4f42c38b8c99
Text to Design, Design to Code
https://github.com/user-attachments/assets/17bda971-0e83-4f18-8758-8ac2b8dcba62
Most Figma MCP servers rely on the Figma REST API.
That sounds fine… until you hit this:
| Plan | Limit |
|---|---|
| Starter / View / Collab | 6 tool calls/month |
| Pro / Org (Dev seat) | 200 tool calls/day |
| Enterprise | 600 tool calls/day |
If you're experimenting with AI tools, you'll burn through that in minutes.
I didn't have enough money to pay for higher limits. So I built something that doesn't use the API at all.
Install via npx — no build step required. Watch the setup video or follow the steps below.
Claude Code CLI
claude mcp add -s project figma-mcp-go -- npx -y @vkhanhqui/figma-mcp-go@latest
Codex CLI
codex mcp add figma-mcp-go -- npx -y @vkhanhqui/figma-mcp-go@latest
.mcp.json (Claude and other MCP-compatible tools)
{
"mcpServers": {
"figma-mcp-go": {
"command": "npx",
"args": ["-y", "@vkhanhqui/figma-mcp-go"]
}
}
}
.vscode/mcp.json (Cursor / VS Code / GitHub Copilot)
{
"servers": {
"figma-mcp-go": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@vkhanhqui/figma-mcp-go"
]
}
}
}
manifest.json from the plugin.zip| Tool | Description |
|---|---|
create_frame | Create a frame with optional auto-layout, fill, and parent |
create_rectangle | Create a rectangle with optional fill and corner radius |
create_ellipse | Create an ellipse or circle |
create_text | Create a text node (font loaded automatically) |
import_image | Decode base64 image and place it as a rectangle fill |
create_component | Convert an existing FRAME node into a reusable component |
create_section | Create a Figma Section node to organise frames on a page |
| Tool | Description |
|---|---|
set_text | Update text content of an existing TEXT node |
set_fills | Set solid fill color (hex) on a node |
set_strokes | Set solid stroke color and weight on a node |
set_opacity | Set opacity of one or more nodes (0 = transparent, 1 = opaque) |
set_corner_radius | Set corner radius — uniform or per-corner |
set_auto_layout | Set or update auto-layout (flex) properties on a frame |
set_visible | Show or hide one or more nodes |
lock_nodes | Lock one or more nodes to prevent accidental edits |
unlock_nodes | Unlock one or more nodes |
rotate_nodes | Set absolute rotation in degrees on one or more nodes |
reorder_nodes | Change z-order: bringToFront, sendToBack, bringForward, sendBackward |
set_blend_mode | Set blend mode (MULTIPLY, SCREEN, OVERLAY, …) on one or more nodes |
set_constraints | Set responsive constraints { horizontal, vertical } on one or more nodes |
move_nodes | Move nodes to an absolute x/y position |
resize_nodes | Resize nodes by width and/or height |
rename_node | Rename a node |
clone_node | Clone a node, optionally repositioning or reparenting |
reparent_nodes | Move nodes to a different parent frame, group, or section |
batch_rename_nodes | Bulk rename nodes via find/replace, regex, or prefix/suffix |
find_replace_text | Find and replace text across all TEXT nodes in a subtree or page; supports regex |
| Tool | Description |
|---|---|
delete_nodes | Delete one or more nodes permanently |
| Tool | Description |
|---|---|
set_reactions | Set prototype reactions (triggers + actions) on a node; mode replace or append |
remove_reactions | Remove all or specific reactions by zero-based index from a node |
| Tool | Description |
|---|---|
set_effects | Apply drop shadow / blur effects directly on a node (no style required) |
create_paint_style | Create a named paint style with a solid color |
create_text_style | Create a named text style with font, size, and spacing |
create_effect_style | Create a named effect style (drop shadow, inner shadow, blur) |
create_grid_style | Create a named layout grid style (columns, rows, or grid) |
update_paint_style | Rename or recolor an existing paint style |
apply_style_to_node | Apply an existing local style to a node, linking it to that style |
delete_style | Delete any style (paint, text, effect, or grid) by ID |
| Tool | Description |
|---|---|
create_variable_collection | Create a new local variable collection with an optional initial mode |
add_variable_mode | Add a new mode to an existing collection (e.g. Light/Dark) |
create_variable | Create a variable (COLOR/FLOAT/STRING/BOOLEAN) in a collection |
set_variable_value | Set a variable's value for a specific mode |
bind_variable_to_node | Bind a variable to a node property — supports fillColor, strokeColor, visible, opacity, rotation, width, height, corner radii, spacing, and more |
delete_variable | Delete a variable or an entire collection |
| Tool | Description |
|---|---|
add_page | Add a new page to the document (optional name and index) |
delete_page | Delete a page by ID or name (cannot delete the only page) |
rename_page | Rename a page by ID or current name |
| Tool | Description |
|---|---|
navigate_to_page | Switch the active Figma page by ID or name |
group_nodes | Group two or more nodes into a GROUP |
ungroup_nodes | Ungroup GROUP nodes, moving children to the parent |
swap_component | Swap the main component of an INSTANCE node |
detach_instance | Detach component instances, converting them to plain frames |
| Tool | Description |
|---|---|
get_document | Full current page tree |
get_metadata | File name, pages, current page |
get_pages | All pages (IDs + names) — lightweight, no tree loading |
get_selection | Currently selected nodes |
get_node | Single node by ID |
get_nodes_info | Multiple nodes by ID |
get_design_context | Depth-limited tree with detail level (minimal/compact/full) |
search_nodes | Find nodes by name substring and/or type within a subtree |
scan_text_nodes | All text nodes in a subtree |
scan_nodes_by_types | Nodes matching given type list |
get_viewport | Current viewport center, zoom, and visible bounds |
| Tool | Description |
|---|---|
get_styles | Paint, text, effect, and grid styles |
get_variable_defs | Variable collections and values |
get_local_components | All components + component sets with variant properties |
get_annotations | Dev-mode annotations |
get_fonts | All fonts used on the current page, sorted by frequency |
get_reactions | Prototype/interaction reactions on a node |
| Tool | Description |
|---|---|
get_screenshot | Base64 image export of any node |
save_screenshots | Export images to disk (server-side, no API call) |
export_frames_to_pdf | Export multiple frames as a single multi-page PDF file saved to disk |
export_tokens | Export design tokens (variables + paint styles) as JSON or CSS |
| Prompt | Description |
|---|---|
read_design_strategy | Best practices for reading Figma designs |
design_strategy | Best practices for creating and modifying designs |
text_replacement_strategy | Chunked approach for replacing text across a design |
annotation_conversion_strategy | Convert manual annotations to native Figma annotations |
swap_overrides_instances | Transfer overrides between component instances |
reaction_to_connector_strategy | Map prototype reactions into interaction flow diagrams |
Issues and PRs are welcome.
miapre/html-to-figma-design-system
ie3jp/illustrator-mcp-server
coding-solo/godot-mcp
ivanmurzak/unity-mcp
yctimlin/mcp_excalidraw
figma/mcp-server-guide