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*stringdescriptionstringmiapre/html-to-figma-design-system
ie3jp/illustrator-mcp-server
coding-solo/godot-mcp
ivanmurzak/unity-mcp
yctimlin/mcp_excalidraw
figma/mcp-server-guide