figma-mcp-go
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| add_page | Add a new page to the Figma document. |
| add_variable_mode | Add 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 switch to the name-prefix workaround: keep the single default mode and create variables prefixed by mode, e.g. 'light/color-bg' and 'dark/color-bg' in the same collection. Tell the user that native multi-mode variables require a paid Figma plan (Professional or above). |
| apply_style_to_node | Apply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style. |
| batch_rename_nodes | Rename multiple nodes using find/replace, regex substitution, or prefix/suffix addition. |
| bind_variable_to_node | Bind 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, bottomLeftRadius, bottomRightRadius, strokeWeight, itemSpacing, paddingTop, paddingRight, paddingBottom, paddingLeft. |
| clone_node | Clone an existing node, optionally repositioning it or placing it in a new parent. |
| create_component | Convert an existing FRAME node into a reusable COMPONENT. The frame is replaced in place by the new component. |
| create_effect_style | Create a new local effect style (drop shadow, inner shadow, or blur). |
| create_ellipse | Create a new ellipse (circle/oval) on the current page or inside a parent node. |
| create_frame | Create a new frame on the current page or inside a parent node. |
| create_grid_style | Create a new local layout grid style. |
| create_paint_style | Create a new local paint style with a solid fill color. |
| create_rectangle | Create a new rectangle on the current page or inside a parent node. |
| create_section | Create a Figma Section node on the current page. Sections are the modern way to organize frames and groups on a page. |
| create_text | Create 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. |
| create_text_style | Create 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. |
| create_variable | Create 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. |
| create_variable_collection | Create 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-prefix workaround: create all variables in a single collection and prefix each variable name with its mode, e.g. 'light/color-bg' and 'dark/color-bg'. Inform the user of this limitation. |
| delete_nodes | Delete one or more nodes. This cannot be undone via MCP — use with care. |
| delete_page | Delete a page from the Figma document. Cannot delete the only remaining page. |
| delete_style | Delete a style (paint, text, effect, or grid) by its ID. |
| delete_variable | Delete a single variable (provide variableId) or an entire collection and all its variables (provide collectionId). Provide exactly one of the two — not both. |
| detach_instance | Detach one or more component instances, converting them to plain frames. The link to the main component is broken; all visual properties are preserved. |
| export_frames_to_pdf | Export multiple frames as a single multi-page PDF file. Each frame becomes one page in order. Ideal for pitch decks, proposals, and slide exports. |
| export_tokens | Export all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase. |
| find_replace_text | Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given. |
| get_annotations | Get 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. |
| get_design_context | Get 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. |
| get_document | 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. |
| get_fonts | List all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes. |
| get_local_components | Get all components defined in the current Figma file. |
| get_metadata | Get metadata about the current Figma document: file name, pages, current page |
| get_node | Get 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. |
| get_nodes_info | Get full details for multiple nodes by ID in one round-trip. Prefer this over calling get_node repeatedly when you need several nodes. |
| get_pages | List all pages in the document with their IDs and names. Lightweight alternative to get_document. |
| get_reactions | Get 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 to delete them. |
| get_screenshot | Export 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. |
| get_selection | 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. |
| get_styles | 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. |
| get_variable_defs | Get all local variable definitions: collections, modes, and values. Variables are Figma's design token system. |
| get_viewport | Get the current Figma viewport: scroll center, zoom level, and visible bounds. |
| group_nodes | Group two or more nodes into a GROUP. All nodes must share the same parent. |
| import_image | Import 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. |
| lock_nodes | Lock one or more nodes to prevent accidental edits in Figma. |
| move_nodes | Move 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). |
| navigate_to_page | Switch the active Figma page. Provide either pageId or pageName. |
| remove_reactions | Remove 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). |
| rename_node | Rename 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. |
| rename_page | Rename an existing page in the Figma document. |
| reorder_nodes | Change the z-order (layer stack position) of one or more nodes. |
| reparent_nodes | Move one or more nodes to a different parent frame, group, or section. |
| resize_nodes | Resize one or more nodes. The same width/height is applied to every node in the list independently. Provide width, height, or both. |
| rotate_nodes | Rotate one or more nodes to an absolute angle in degrees. |
| save_screenshots | Export 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. |
| scan_nodes_by_types | Find all nodes of specific types in a subtree, regardless of name. Use search_nodes instead when you need to filter by name. |
| scan_text_nodes | Scan 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. |
| search_nodes | Search 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. |
| set_auto_layout | Set or update auto-layout (flex) properties on an existing frame. |
| set_blend_mode | Set the blend mode of one or more nodes (e.g. MULTIPLY, SCREEN, OVERLAY). |
| set_constraints | Set layout constraints (pinning behaviour) on one or more nodes relative to their parent. |
| set_corner_radius | Set corner radius on one or more nodes. Provide a uniform cornerRadius or individual per-corner values. |
| set_effects | Apply 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. |
| set_fills | Set 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. |
| set_opacity | Set the opacity of one or more nodes (0 = fully transparent, 1 = fully opaque). |
| set_reactions | Set 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: NODE (navigation), BACK, CLOSE, URL NODE navigation values: NAVIGATE, OVERLAY, SCROLL_TO, SWAP, CHANGE_TO Transition types: DISSOLVE, SMART_ANIMATE, MOVE_IN, MOVE_OUT, PUSH, SLIDE_IN, SLIDE_OUT DISSOLVE / SMART_ANIMATE: {"type":"DISSOLVE","duration":0.3,"easing":{"type":"EASE_OUT"}} Directional (PUSH, MOVE_IN, MOVE_OUT, SLIDE_IN, SLIDE_OUT): also require "direction" (LEFT|RIGHT|TOP|BOTTOM) and "matchLayers" (bool): {"type":"PUSH","direction":"LEFT","matchLayers":false,"duration":0.3,"easing":{"type":"EASE_OUT"}} Each reaction has a "trigger" and an "actions" array (plural). Each action in the array is an Action object. Example — on-click navigate with dissolve: {"nodeId":"1:2","reactions":[{"trigger":{"type":"ON_CLICK"},"actions":[{"type":"NODE","destinationId":"1:3","navigation":"NAVIGATE","transition":{"type":"DISSOLVE","duration":0.3,"easing":{"type":"EASE_OUT"}},"preserveScrollPosition":false}]}]} Example — on-click navigate with push (directional transition): {"nodeId":"1:2","reactions":[{"trigger":{"type":"ON_CLICK"},"actions":[{"type":"NODE","destinationId":"1:3","navigation":"NAVIGATE","transition":{"type":"PUSH","direction":"LEFT","matchLayers":false,"duration":0.3,"easing":{"type":"EASE_OUT"}},"preserveScrollPosition":false}]}]} Example — open URL on hover: {"nodeId":"1:2","reactions":[{"trigger":{"type":"ON_HOVER"},"actions":[{"type":"URL","url":"https://example.com"}]}]} Example — auto-advance after 3 seconds: {"nodeId":"1:2","reactions":[{"trigger":{"type":"AFTER_TIMEOUT","timeout":3000},"actions":[{"type":"NODE","destinationId":"1:4","navigation":"NAVIGATE","transition":{"type":"DISSOLVE","duration":0.3,"easing":{"type":"EASE_OUT"}},"preserveScrollPosition":false}]}]} Example — go back on click: {"nodeId":"1:2","reactions":[{"trigger":{"type":"ON_CLICK"},"actions":[{"type":"BACK"}]}]} |
| set_strokes | Set 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. |
| set_text | Update the text content of an existing TEXT node. |
| set_variable_value | Set a variable's value for a specific mode. |
| set_visible | Show or hide one or more nodes by setting their visibility. |
| swap_component | Swap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size. |
| ungroup_nodes | Ungroup one or more GROUP nodes, moving their children to the parent and removing the group. |
| unlock_nodes | Unlock one or more nodes, allowing them to be edited again. |
| update_paint_style | Update 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| annotation_conversion_strategy | Strategy for converting manual annotations to Figma's native annotations |
| bulk_rename_strategy | Rename nodes across a design following a naming convention |
| design_strategy | Best practices for working with Figma designs |
| design_token_generation_strategy | Extract raw values from an existing design and build a structured variable + style token system |
| generate_color_palette | Generate a complete semantic color palette (primitive scale + semantic aliases) from one or more brand colors |
| generate_component_variants | Generate design variants of an existing component or frame (size, color, state, theme) |
| generate_type_scale | Generate a complete typography scale (text styles) from a base font and size |
| reaction_to_connector_strategy | Strategy for analyzing Figma prototype reactions and mapping interaction flows |
| read_design_strategy | Best practices for reading Figma designs with figma-mcp-go |
| style_audit_strategy | Audit a design for nodes using raw values instead of linked styles or variables |
| swap_overrides_instances | Strategy for transferring overrides between component instances in Figma |
| text_replacement_strategy | Systematic approach for replacing text in Figma designs |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/vkhanhqui/figma-mcp-go'
If you have feedback or need assistance with the MCP directory API, please join our Discord server