figma-mcp-go
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| add_pageB | Add a new page to the Figma document. |
| add_variable_modeA | 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_nodeA | Apply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style. |
| batch_rename_nodesA | Rename multiple nodes using find/replace, regex substitution, or prefix/suffix addition. |
| bind_variable_to_nodeA | 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_nodeB | Clone an existing node, optionally repositioning it or placing it in a new parent. |
| create_componentA | Convert an existing FRAME node into a reusable COMPONENT. The frame is replaced in place by the new component. |
| create_effect_styleB | Create a new local effect style (drop shadow, inner shadow, or blur). |
| create_ellipseA | Create a new ellipse (circle/oval) on the current page or inside a parent node. |
| create_frameB | Create a new frame on the current page or inside a parent node. |
| create_grid_styleA | Create a new local layout grid style. |
| create_paint_styleB | Create a new local paint style with a solid fill color. |
| create_rectangleA | Create a new rectangle on the current page or inside a parent node. |
| create_sectionC | Create a Figma Section node on the current page. Sections are the modern way to organize frames and groups on a page. |
| create_textA | 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_styleA | 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_variableA | 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_collectionA | 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_nodesA | Delete one or more nodes. This cannot be undone via MCP — use with care. |
| delete_pageA | Delete a page from the Figma document. Cannot delete the only remaining page. |
| delete_styleA | Delete a style (paint, text, effect, or grid) by its ID. |
| delete_variableA | 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_instanceA | 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_pdfA | 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_tokensA | Export all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase. |
| find_replace_textA | Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given. |
| get_annotationsA | 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_contextA | 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_documentA | 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_fontsA | List all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes. |
| get_local_componentsC | Get all components defined in the current Figma file. |
| get_metadataB | Get metadata about the current Figma document: file name, pages, current page |
| get_nodeA | 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_infoA | 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_pagesA | List all pages in the document with their IDs and names. Lightweight alternative to get_document. |
| get_reactionsA | 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_screenshotA | 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_selectionA | 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_stylesA | 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_defsA | Get all local variable definitions: collections, modes, and values. Variables are Figma's design token system. |
| get_viewportB | Get the current Figma viewport: scroll center, zoom level, and visible bounds. |
| group_nodesA | Group two or more nodes into a GROUP. All nodes must share the same parent. |
| import_imageA | 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_nodesA | Lock one or more nodes to prevent accidental edits in Figma. |
| move_nodesA | 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_pageA | Switch the active Figma page. Provide either pageId or pageName. |
| remove_reactionsA | 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_nodeA | 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_pageB | Rename an existing page in the Figma document. |
| reorder_nodesB | Change the z-order (layer stack position) of one or more nodes. |
| reparent_nodesB | Move one or more nodes to a different parent frame, group, or section. |
| resize_nodesA | Resize one or more nodes. The same width/height is applied to every node in the list independently. Provide width, height, or both. |
| rotate_nodesA | Rotate one or more nodes to an absolute angle in degrees. |
| save_screenshotsA | 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_typesA | 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_nodesA | 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_nodesB | 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_layoutB | Set or update auto-layout (flex) properties on an existing frame. |
| set_blend_modeA | Set the blend mode of one or more nodes (e.g. MULTIPLY, SCREEN, OVERLAY). |
| set_constraintsB | Set layout constraints (pinning behaviour) on one or more nodes relative to their parent. |
| set_corner_radiusA | Set corner radius on one or more nodes. Provide a uniform cornerRadius or individual per-corner values. |
| set_effectsA | 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_fillsA | 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_opacityA | Set the opacity of one or more nodes (0 = fully transparent, 1 = fully opaque). |
| set_reactionsA | 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_strokesA | 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_textB | Update the text content of an existing TEXT node. |
| set_variable_valueC | Set a variable's value for a specific mode. |
| set_visibleA | Show or hide one or more nodes by setting their visibility. |
| swap_componentA | Swap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size. |
| ungroup_nodesA | Ungroup one or more GROUP nodes, moving their children to the parent and removing the group. |
| unlock_nodesA | Unlock one or more nodes, allowing them to be edited again. |
| update_paint_styleA | 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
- 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/vkhanhqui/figma-mcp-go'
If you have feedback or need assistance with the MCP directory API, please join our Discord server