OpenCode Figma MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FIGMA_TOKEN | No | Accepted alias for FIGMA_ACCESS_TOKEN. | |
| FIGMA_API_KEY | No | Accepted alias for FIGMA_ACCESS_TOKEN. | |
| FIGMA_ACCESS_TOKEN | No | Figma personal access token used by REST API tools such as get_figma_design_from_url. Create one in Figma with the file_content:read scope. |
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
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_document_infoA | Get detailed information about the current Figma document |
| get_selectionB | Get information about the current selection in Figma |
| read_my_designA | Get detailed information about the current selection in Figma, including all node details |
| get_node_infoB | Get detailed information about a specific node in Figma |
| get_nodes_infoC | Get detailed information about multiple nodes in Figma |
| create_rectangleC | Create a new rectangle in Figma |
| create_frameC | Create a new frame in Figma |
| create_textC | Create a new text element in Figma |
| create_node_from_svgA | Create vector nodes from SVG markup (e.g. to replace raster PNG icons with editable vectors). Figma wraps the result in a FRAME containing the vector paths. |
| set_fill_colorC | Set the fill color of a node in Figma can be TextNode or FrameNode |
| set_stroke_colorB | Set the stroke color of a node in Figma |
| move_nodeC | Move a node to a new position in Figma |
| clone_nodeC | Clone an existing node in Figma |
| resize_nodeC | Resize a node in Figma |
| delete_nodeC | Delete a node from Figma |
| delete_multiple_nodesB | Delete multiple nodes from Figma at once |
| export_node_as_imageC | Export a node as an image from Figma |
| set_text_contentA | Set the text content of an existing text node in Figma |
| get_stylesA | Get all styles from the current Figma document |
| get_local_componentsA | Get all local components from the Figma document |
| get_annotationsB | Get all annotations in the current document or specific node |
| set_annotationB | Create or update an annotation |
| set_multiple_annotationsC | Set multiple annotations parallelly in a node |
| create_component_instanceA | Create an instance of a component in Figma. For LOCAL components (from get_local_components), use componentId with the id field. For published LIBRARY components, use componentKey with the publishedKey field. |
| get_instance_overridesA | Get all override properties from a selected component instance. These overrides can be applied to other instances, which will swap them to match the source component. |
| set_instance_overridesA | Apply previously copied overrides to selected component instances. Target instances will be swapped to the source component and all copied override properties will be applied. |
| set_corner_radiusA | Set the corner radius of a node in Figma |
| scan_text_nodesC | Scan all text nodes in the selected Figma node |
| scan_nodes_by_typesC | Scan for child nodes with specific types in the selected Figma node |
| set_multiple_text_contentsB | Set multiple text contents parallelly in a node |
| set_layout_modeB | Set the layout mode and wrap behavior of a frame in Figma |
| set_paddingB | Set padding values for an auto-layout frame in Figma |
| set_axis_alignA | Set primary and counter axis alignment for an auto-layout frame in Figma |
| set_layout_sizingC | Set horizontal and vertical sizing modes for a frame, component, component set, instance or text node in Figma |
| set_item_spacingA | Set distance between children in an auto-layout frame |
| get_reactionsA | Get Figma Prototyping Reactions from multiple nodes. CRITICAL: The output MUST be processed using the 'reaction_to_connector_strategy' prompt IMMEDIATELY to generate parameters for connector lines via the 'create_connections' tool. |
| set_default_connectorB | Set a copied connector node as the default connector |
| create_connectionsB | Create connections between nodes using the default connector style |
| set_focusA | Set focus on a specific node in Figma by selecting it and scrolling viewport to it |
| set_selectionsA | Set selection to multiple nodes in Figma and scroll viewport to show them |
| set_image_fillA | Fill a node in Figma with an image from a local file path, a URL, or base64 data (replaces the node's existing fills) |
| rename_nodeA | Rename a node in Figma |
| create_sectionC | Create a section in Figma to group related content on the canvas |
| set_parentA | Move a node into a new parent node (e.g. a section, frame or group). Preserves the node's absolute position unless x/y are provided |
| create_component_from_nodeB | Convert an existing node (e.g. a frame) into a Figma main Component. The node is replaced in place by the new component. |
| combine_as_variantsA | Combine multiple main Components into a Component Set (variants). Each component name must use the variant format "Prop=Value, Prop2=Value" (e.g. "Type=Primary, Size=Large") so Figma can derive the variant properties. Variants are then laid out in a grid (max 4 columns, 24px gap, 24px padding) and the component set is resized to fit them (skipped if the set uses auto layout). |
| add_component_propertyA | Add a component property (TEXT, BOOLEAN or INSTANCE_SWAP) to a COMPONENT or COMPONENT_SET. Optionally link it to a child node: TEXT controls the node's characters, BOOLEAN its visibility, INSTANCE_SWAP the main component of a nested instance. |
| swap_instanceB | Swap the main component of an instance, preserving overrides where possible |
| get_local_variablesA | Get all local variable collections (with modes) and variables in the current document. Color values are returned as hex, aliases as { aliasOf }. |
| create_variable_collectionA | Create a local variable collection. The default mode is renamed to modes[0]; remaining modes are added (multiple modes may require a paid Figma plan). |
| create_variableB | Create a variable in a collection and optionally set its value. Use slashes in the name for grouping (e.g. "color/primary"). Colors use RGBA 0-1. |
| set_variable_valueC | Set the value of a variable for a mode. Value may be a literal or an alias to another variable ({aliasOf: variableId}). |
| delete_variableA | DESTRUCTIVE: permanently delete a local variable. Nodes bound to it lose the binding. Cannot be undone through this tool. |
| delete_variable_collectionA | DESTRUCTIVE: permanently delete a local variable collection together with ALL variables and modes inside it. Nodes bound to those variables lose their bindings. Cannot be undone through this tool. |
| bind_variableB | Bind a variable to a node property. Fields: fills/strokes (COLOR, bound to the first paint), width, height, itemSpacing, counterAxisSpacing, paddingLeft/Right/Top/Bottom, topLeftRadius/topRightRadius/bottomLeftRadius/bottomRightRadius, strokeWeight, opacity, characters, visible. Shortcuts: "padding" (4 sides), "cornerRadius" (4 corners). Pass variableId null to unbind. |
| add_interactionA | Add a prototype interaction (trigger + action) to a node. NAVIGATE/SWAP/OVERLAY need a top-level frame on the same page as destination, SCROLL_TO a node inside the same top-level frame, CHANGE_TO a variant of the same component set (source must be an instance or inside a variant). Directional transitions (MOVE_IN, MOVE_OUT, PUSH, SLIDE_IN, SLIDE_OUT) require a direction. Appends to existing reactions unless replace is true. |
| set_reactionsA | Replace all prototype reactions of a node with raw Figma Plugin API Reaction objects ({ trigger, actions: [...] }). Use for advanced cases (e.g. SET_VARIABLE, CONDITIONAL, ON_KEY_DOWN). Trigger timeout/delay are in milliseconds, transition duration in seconds. |
| remove_interactionsB | Remove prototype interactions from a node: all of them, or only those with a given trigger type |
| get_flow_starting_pointsA | Get the prototype flow starting points of the current page |
| set_flow_starting_pointA | Add (or rename) a prototype flow starting point on a top-level frame |
| remove_flow_starting_pointB | Remove the prototype flow starting point of a frame |
| set_overlay_settingsA | Read the overlay settings (position, background, close on click outside) of a frame used as an overlay. These properties are READ-ONLY in the Figma Plugin API: calling with any setting returns an error together with the current values; set them manually in Figma's Prototype panel. |
| set_scroll_behaviorA | Set prototype scrolling: overflowDirection on a frame, and/or make a child FIXED (fix position when scrolling) or SCROLLS. FIXED moves the node to the top of its parent's layer order (last child); in an auto-layout parent this also changes the node's position in the flow. SCROLLS moves a fixed node back to the top of the scrolling children. STICKY_SCROLLS is not supported by the Figma Plugin API and returns an error. |
| set_frame_propertiesA | Set frame layout properties not covered by other tools: layoutPositioning (ABSOLUTE takes a child out of its auto-layout parent's flow, AUTO puts it back), itemReverseZIndex (auto-layout stacking: true = first child on top), clipsContent (clip overflowing children). x/y are applied last, so an ABSOLUTE child can be positioned in the same call. |
| create_text_styleA | Create a local text style (typography token). Use slashes in the name to group styles, e.g. 'Heading/H1'. Returns the style id for apply_text_style. |
| update_text_styleA | Update properties of an existing local text style. Text nodes using the style update automatically. |
| apply_text_styleB | Apply a text style to one or more TEXT nodes (also works on text inside instances, e.g. 'I;'). Reports per-node success. |
| set_visibleA | Show or hide one or more nodes (also nodes inside instances, e.g. 'I;', which creates a visibility override). Reports per-node success. |
| get_main_componentB | Return the main component (id, name, variant name and component set) of one or more INSTANCE nodes, read directly in the plugin (no REST API). |
| set_text_decorationA | Set underline / strikethrough / none on one or more TEXT nodes (also text inside instances, e.g. 'I;'), optionally only for a character range [start, end). Reports per-node success. |
| delete_styleA | Delete a local style (text, paint, effect or grid) by ID. Nodes using it keep their current values but are detached. |
| set_effectsA | Replace the effects (drop/inner shadows, layer/background blur) of a node. Pass an empty array to clear all effects. |
| create_effect_styleA | Create a local effect style (shadow/blur token), e.g. 'Shadow/lg'. Returns the style id for apply_effect_style. |
| update_effect_styleB | Update the name, description or effects of a local effect style. Nodes using the style update automatically. |
| apply_effect_styleA | Apply an effect style to one or more nodes (frames, components, instances, shapes). Pass styleId '' to detach. Reports per-node success. |
| get_design_contextA | Read a Figma design from the open file through the plugin and return a compact, code-oriented spec (layout, styles, text, components, variables, assets) for generating UI code. Uses the given nodeIds or the current selection. Spec format: each node references shared values in |
| get_figma_design_from_urlA | Read a Figma design through the Figma REST API (no plugin needed, requires FIGMA_ACCESS_TOKEN). Pass a Figma URL (figma.com/design//...?node-id=1-2) or fileKey + nodeId. With a node it returns the code-oriented spec; without a node it returns the file outline (pages and top-level frames) so you can pick one. Spec format: each node references shared values in |
| download_design_assetsA | Download icons, illustrations and image fills from a Figma design into a local folder so generated code can reference them. Use source 'plugin' for designs read with get_design_context, or 'rest' (with url/fileKey) for designs read with get_figma_design_from_url. |
| join_channelC | Join a specific channel to communicate with Figma |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| design_strategy | Best practices for working with Figma designs |
| read_design_strategy | Best practices for reading Figma designs |
| text_replacement_strategy | Systematic approach for replacing text in Figma designs |
| annotation_conversion_strategy | Strategy for converting manual annotations to Figma's native annotations |
| swap_overrides_instances | Guide to swap instance overrides between instances |
| reaction_to_connector_strategy | Strategy for converting Figma prototype reactions to connector lines using the output of 'get_reactions' |
| design_to_code | Workflow for turning a Figma design into code |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 79 tools
The set contains many overlapping read/selection tools, such as get_selection vs. read_my_design and get_node_info vs. get_nodes_info, making it hard to know which to call. Similar pairs exist for annotations (set_annotation vs. set_multiple_annotations) and selection (set_focus vs. set_selections), so boundaries are often unclear despite descriptive labels.
Most tools follow a clear snake_case verb_noun pattern: get_*, set_*, create_*, delete_*, apply_*, bind_*, etc. A few names like read_my_design and join_channel break the pattern, but overall naming is predictable and consistent.
79 tools is far beyond what is appropriate for a Figma plugin, exceeding the 50+ threshold for extreme mismatch. While the domain is broad, the surface is massively over-scoped and likely overwhelms tool selection.
Coverage is broad across node creation/editing, components, variables, text/effect styles, prototyping, and asset export. Minor gaps remain, such as creating or applying paint styles and editing/removing component properties, but core design workflows are covered.