Figma MCP Express
Compact Figma MCP with validated batch ops through a local plugin bridge.
Connector by sunhome243 · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/sunhome243-figma-mcp-express
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 26, 2026.
- Tools
- 33 read · 70 write · 10 delete · 7 not yet classified
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 120
Read from the source code; the running server may list different tools.
Read 33 · Look things up without changing anything.
fetch_library_catalogfind_replace_textget_annotationsget_batch_op_specget_design_contextget_dev_resourcesget_documentget_file_thumbnailget_fontsget_image_by_hashget_library_variablesget_local_components
Show 21 more tools
get_metadataget_nodeget_nodes_infoget_pagesget_prototypeget_reactionsget_remote_variable_collectionget_screenshotget_selectionget_selection_colorsget_stylesget_variable_defsget_viewportlist_channelslist_library_variable_collectionsreorder_nodesrotate_nodesscan_nodes_by_typesscan_text_nodessearch_batch_opssearch_nodes
Write 70 · Create, change, send or run things.
add_dev_resourceadd_pageadd_variable_modeapply_style_to_nodebatchbatch_rename_nodesclone_nodecreate_componentcreate_ellipsecreate_framecreate_gifcreate_grid_style
Show 58 more tools
create_instancecreate_linecreate_link_previewcreate_page_dividercreate_paint_stylecreate_polygoncreate_rectanglecreate_sectioncreate_slicecreate_starcreate_tablecreate_textcreate_text_pathcreate_text_stylecreate_variablecreate_variable_aliascreate_variable_collectioncreate_vectorcreate_videodetach_instanceedit_dev_resourceimport_component_by_keyimport_imageimport_style_by_keyimport_svgimport_variable_by_keylock_nodesmove_nodesnavigate_to_pagerename_noderename_pagereorder_local_stylereorder_local_style_folderreparent_nodesresize_nodesresolve_variable_for_consumersave_screenshotsset_auto_layoutset_blend_modeset_constraintsset_corner_radiusset_file_thumbnailset_fillsset_instance_propertiesset_opacityset_presenceset_prototype_startset_reactionsset_strokesset_textset_text_rangeset_variable_modeset_variable_valueset_visibleswap_componentungroup_nodesunlock_nodesupdate_paint_style
Delete 10 · Delete, drop, revoke or wipe things.
create_effect_styledelete_dev_resourcedelete_nodesdelete_pagedelete_styledelete_variableremove_reactionsset_effectsupdate_variableupdate_variable_collection
Not yet classified 7 · We could not tell from the name and description.
bind_variable_to_effectbind_variable_to_layout_gridbind_variable_to_nodeboolean_operationexport_frames_to_pdfexport_tokensgroup_nodes
Network hosts it talks to 6
api.dicebear.com· found in codeapi.figma.com· found in codedesign-mac.example.ts.net· found in codefigma.com· found in codegithub.com· found in codeglama.ai· found in code
Files it touches
/etc/passwd/tmp/logo.png/tmp/shot.png- Any path the agent passes to its tools
Tools (120)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_dev_resourceAttach a Dev Mode resource link to a node using addDevResourceAsync.
add_pageAdd a new page to the Figma document.
add_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 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_nodeApply an existing local style (paint, text, effect, or grid) to a node, linking the node to that style.
batchExecute many ops (writes AND reads) in ONE plugin round-trip — far fewer round-trips than calling each tool separately. `ops` is an ordered array of {type, nodeIds?, params}, where `type` is any BatchOpCatalog op name (create_frame, set_fills, get_node, search_nodes, …). WHEN TO USE: a KNOWN multi-step/dependent sequence (create→append→style), bulk (N× the same op), a read CHAIN (search_nodes→get_node on the found id), or build-then-VERIFY (writes then a get_node read-back, inline — the structural check before any screenshot). In the default core profile, low-level writes are normally validat…
batch_rename_nodesRename multiple nodes using find/replace, regex substitution, or prefix/suffix addition.
bind_variable_to_effectBind a variable to a field on an Effect object using setBoundVariableForEffect. Returns the updated effect object; apply it with set_effects or create_effect_style.
bind_variable_to_layout_gridBind a variable to a field on a LayoutGrid object using setBoundVariableForLayoutGrid. Returns the updated grid object; apply it with create_grid_style or layout-grid APIs.
bind_variable_to_nodeBind a local variable to a node property so the property is driven by the variable's value (this top-level tool takes one nodeId). Returns {results:[{nodeId,…}]}, a 1-element array. COLOR variables: use fillColor or strokeColor. BOOLEAN variables: use visible. STRING variables: use characters. FLOAT variables: use opacity, width, height, minWidth, maxWidth, minHeight, maxHeight, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius, strokeWeight, strokeTopWeight, strokeRightWeight, strokeBottomWeight, strokeLeftWeight, itemSpacing, counterAxisSpacing, gridRowGap, gridColumnGap, pa…
boolean_operationclone_nodeClone an existing node, optionally repositioning it or placing it in a new parent.
create_componentConvert an existing node (frame, group, or shape) into a reusable local COMPONENT in place, preserving ALL properties, bound variables (tokens), and effects (native figma.createComponentFromNode). Rejects nodes that are already a COMPONENT/COMPONENT_SET or an INSTANCE.
create_effect_styleCreate a new local effect style (drop shadow, inner shadow, blur, GLASS, NOISE, or TEXTURE). Supply either a single-effect shorthand (type + color/radius/etc.) or an effects[] array for multi-effect styles.
create_ellipseCreate a new ellipse (circle/oval) on the current page or inside a parent node.
create_frame
Show 105 more tools
create_gifCreate a FigJam GIF media node from an existing imageHash using Figma's createGif. This API is host/editor dependent.
create_grid_styleCreate a new local layout grid style.
create_instanceCreate an instance of a component. Provide componentId for a local source or componentKey to auto-import from a subscribed library, then optionally place, position/size, and set variant or exposed-instance properties.
create_lineCreate a straight line (LineNode) on the current page or inside a parent. Lines render via their stroke — a visible 1px black stroke is applied by default. Useful for dividers and rules.
create_link_previewCreate a FigJam link preview node from a URL using Figma's createLinkPreviewAsync. This API is host/editor dependent.
create_page_dividerCreate a page divider node using Figma's createPageDivider. The optional name must be divider-only text, such as --- or ***.
create_paint_styleCreate a new local paint style. Supply either a solid color shorthand (color hex) or a paints[] array for gradients, images, or multiple paints.
create_polygonCreate a regular polygon (PolygonNode) with a configurable number of sides on the current page or inside a parent.
create_rectangleCreate a new rectangle on the current page or inside a parent node. Use cornerRadius for uniform rounding or the per-corner params for asymmetric rounding.
create_sectionCreate a Figma Section node on the current page or inside a specified parent. Sections are the modern way to organize frames and groups on a page.
create_sliceCreate a Slice node for export regions.
create_starCreate a star (StarNode) with a configurable number of points and inner-radius ratio on the current page or inside a parent.
create_tableCreate a Table node (figma.createTable) with the given rows and columns. Optionally fill cells with text. Returns the table ID plus numRows/numColumns. Tables may be unavailable in some editor types.
create_textcreate_text_pathCreate a TextPath node from an existing vector-like node (VECTOR, RECTANGLE, ELLIPSE, POLYGON, STAR, or LINE).
create_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.
create_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.
create_variable_aliasCreate a variable alias value from an existing variable ID using createVariableAliasByIdAsync. Use the returned alias as a variable value.
create_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-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.
create_vectorCreate an editable VECTOR node with optional vectorPaths, size, fill color, and parent.
create_videoCreate a rectangle with a VIDEO fill from local videoPath or base64 videoData using Figma's createVideoAsync.
delete_dev_resourceDelete a Dev Mode resource link from a node by URL.
delete_nodesDelete one or more nodes. This cannot be undone via MCP — use with care.
delete_pagedelete_styleBind a variable to a field on a LayoutGrid object using setBoundVariableForLayoutGrid. Returns the updated grid object; apply it with create_grid_style or layout-grid APIs.
delete_variableUpdate a variable collection: rename it, hide it from publishing, rename/remove a mode, or clear an extended-collection variable override. A collection must always keep at least one mode.
detach_instanceedit_dev_resourceEdit a node Dev Mode resource link by its current URL. Provide url, name, or both as the replacement.
export_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.
export_tokensExport all design tokens (variables and paint styles) as JSON or CSS custom properties. Ideal for bridging Figma variables into your codebase.
fetch_library_catalogFetch a Figma library's FULL published catalog via the REST API WITHOUT needing the file open in Figma. Returns components, component_sets, styles, variables, and variableCollections (variables require Figma Enterprise plan — a 403 is surfaced as variablesError, not a fatal error). Requires FIGMA_TOKEN env (read-only PAT, auto-loaded from .env). Extract fileKey from any Figma URL: https://figma.com/design/<fileKey>/... Writes the full catalog JSON to outPath; returns a small handle {outPath, counts, sample} — query the file with jq, do NOT expect inline data. Use this to read design tokens fro…
find_replace_textFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
get_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.
get_batch_op_specReturn the full validated batch/FigmaPlan spec for one operation. Use after search_batch_ops and before composing unfamiliar batch ops.
get_design_contextDepth-limited, token-efficient node tree. Pass nodeId to scope to a subtree, else reads the current selection/page. detail=minimal|compact|full|codegen; dedupe_components collapses repeated instances. Large results spill to disk.
get_dev_resourcesRead Dev Mode resource links attached to a node via the node DevResourcesMixin. Optionally includes child resources.
get_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. Large responses are saved to disk and returned as {spilled:true,path,bytes,preview} — read the file with jq/grep; do not expect the full payload inline. Timeouts are server-managed; a read that times out should be re-scoped narrower, never given a longer timeout.
get_file_thumbnailGet the node currently assigned as the file thumbnail, if any.
get_fontsList all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes.
get_image_by_hashGet image metadata and bytes for an existing Figma image hash using figma.getImageByHash. Returns null image data when the hash is not in the file.
get_library_variablesGet all variables in a subscribed library collection by its key (from list_library_variable_collections). Returns name, resolvedType, and valuesByMode for every variable — use this to read design tokens (colors, spacing, typography) from a library that is subscribed but not open in Figma. Does NOT require the library file to be open.
get_local_componentsGet all components defined in the current Figma file, including file-local masters needed by create_instance {componentId}. Omit pageId for the whole-file recovery scan (loads all pages and can find local masters missed by page traversal); pass pageId to scan ONE page in large libraries. Large results are saved to disk and returned as {spilled:true,path} — read with jq. Timeouts are server-managed; a read that times out should be re-scoped narrower, never given a longer timeout.
get_metadataGet the lightweight structure/id map of the current document: file name, pages, current page (and node skeleton). The FIRST read in the official discipline — run it to find the ids you want, then target those nodes. PREFER A SIBLING WHEN: you have ids and want full node detail → get_node / get_nodes_info; you want a token-efficient property tree of a region → get_design_context; you're hunting nodes by name/type → search_nodes / scan_nodes_by_types; you just want the page list → get_pages. SCOPING: returns the map only — cheap and safe to call first. Large responses spill to disk as {spilled:t…
get_nodeGet one node by ID with full detail (fills, strokes, text, layout, boundVariables). PREFER A SIBLING WHEN: you need several nodes → get_nodes_info (one round-trip, not a get_node loop); you only want the structure/id map → get_metadata; you want a token-efficient overview of a whole selection/page → get_design_context; you're searching by name/type rather than a known id → search_nodes / scan_nodes_by_types. SCOPING: node ID must be colon format e.g. '4029:12345', never hyphens. depth caps traversal — DEFAULT depth is 50 (was unbounded); pass a larger depth (or Infinity) only for a deliberate …
get_nodes_infoGet full details for multiple nodes by ID in one round-trip. PREFER A SIBLING WHEN: you only need ONE node → get_node (simpler); you want the structure/id map of a subtree → get_metadata; you want a token-efficient whole-selection/page tree → get_design_context; you don't yet know the ids → search_nodes / scan_nodes_by_types to discover them first. This is the right tool the moment you have 2+ known ids — prefer it over a get_node loop. SCOPING: ids in colon format e.g. ['4029:12345','4029:67890']. depth bounds traversal per node (default 50). Large responses spill to disk — read with jq/grep.…
get_pagesList all pages in the document with their IDs and names. Lightweight alternative to get_document.
get_prototypeRead the prototype FLOW GRAPH for a whole page (or a scoped subtree). Unlike get_reactions (one node's raw reactions), this walks every reaction-bearing node — buttons and instances included, not just top-level frames — and returns the connections between them. Returns: { pageId, pageName, flowStartingPoints:[{nodeId,name}], prototypeStartNodeId, reactionNodeCount, edgeCount, edges:[...], overlays:[...] }. edges[]: { sourceId, sourceName, sourceType, trigger, actionType, navigation?, destinationId?, destinationName?, transition?, url? } — one entry per (source node, reaction, action). ove…
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 to delete them.
get_remote_variable_collectionLook up a remote (subscribed-library) variable collection by ID to discover its modes — getVariableCollectionByIdAsync, which local-only lookups miss.
get_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.
get_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_selection_colorsGet Figma's computed colors from the current selection using getSelectionColors.
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_variable_defsGet all local variable definitions: collections, modes, and values. Variables are Figma's design token system.
get_viewportGet the current Figma viewport: scroll center, zoom level, and visible bounds.
group_nodesGroup two or more nodes into a GROUP. All nodes must share the same parent.
import_component_by_keyImport a component (or component set) from a subscribed library by its key, making it available to instantiate. For a COMPONENT_SET key pass assetType='COMPONENT_SET'.
import_imageImport an image into Figma as a rectangle with an image fill. Provide imagePath (local PNG/JPG; server reads + base64-encodes), imageData (base64 PNG/JPG), or imageUrl (remote URL via figma.createImageAsync). imagePath wins over imageData; imageUrl is used only when no local/base64 input is provided.
import_style_by_keyImport a paint, text, or effect style from a subscribed library by its key, making it available to apply to nodes.
import_svgCreate Figma vector nodes from raw SVG markup (figma.createNodeFromSvg). Returns a FrameNode wrapping the imported vectors. The simplest way to add custom icons/illustrations that have no library component.
import_variable_by_keyImport a design variable from a subscribed library by its key, making it available to bind to node properties.
list_channelsList connected Figma plugin channels — one entry per open file. Returns channel id, fileName, fileKey, and pageName for each. When more than one file is connected, pass a channel id as the `channel` param on any other tool to target that specific file (or match by fileName first).
list_library_variable_collectionsList all variable collections available from subscribed libraries, including their IDs and modes.
lock_nodesFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
move_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). Note: x/y are parent-local coordinates, not absolute canvas coordinates.
navigate_to_pageSwitch the active Figma page. Provide either pageId or pageName.
remove_reactionsrename_nodeFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
rename_pagereorder_local_styleMove a local paint/text/effect/grid style after another style of the same type. Omit afterStyleId to move it to the top of its style list.
reorder_local_style_folderMove a local style folder after another folder for paint/text/effect/grid styles. Omit afterFolder to move it first.
reorder_nodesFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
reparent_nodesMove one or more nodes to a different parent frame, group, or section. By default (preserveAbsolutePosition=true) the node's canvas position is preserved after reparenting by adjusting its parent-local x/y. Set preserveAbsolutePosition=false to keep the raw x/y values unchanged (node will visually jump to a new location relative to the new parent).
resize_nodesresolve_variable_for_consumerResolve a variable's effective value for a specific scene node using Variable.resolveForConsumer.
rotate_nodesFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
save_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.
scan_nodes_by_typesFind all nodes of specific types in a subtree, regardless of name. The all-of-a-kind sweep (e.g. every INSTANCE / FRAME / COMPONENT under a frame). PREFER A SIBLING WHEN: you're matching by NAME → search_nodes; you only want TEXT → scan_text_nodes (shorthand for types:['TEXT']); you already have the ids → get_nodes_info; you want the structure map first → get_metadata. SCOPING: scope nodeId tightly + pass types — scanning a huge subtree can jam the plugin; large results spill to disk as {spilled:true,path} (read with jq). Timeouts are server-managed; fix a real timeout by narrowing scope. CHAI…
scan_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 the text copy of a component or frame. PREFER A SIBLING WHEN: you want other node types too → scan_nodes_by_types (pass the types); you're matching by name → search_nodes; you already have ids and want full detail → get_nodes_info; you want to find-and-replace copy rather than read it → find_replace_text (a write). SCOPING: scope nodeId tightly — scanning a huge subtree can jam the plugin; large results spill to disk as {spilled:true,path} (read with jq). Timeouts…
search_batch_opsSearch the validated batch/FigmaPlan operation catalog. Use this before get_batch_op_spec when you know the capability but not the exact op name.
search_nodesFind nodes by NAME substring (optionally filtered by type) within a subtree. Use when you know (part of) a node's name. PREFER A SIBLING WHEN: name doesn't matter and you want every node of a type → scan_nodes_by_types; you only want TEXT content → scan_text_nodes; you already have the id and want detail → get_node / get_nodes_info; you want the whole structure map → get_metadata. SCOPING: always pass nodeId (scope to a frame, not the whole page) + types + limit (default 50) — an unscoped search can jam the single-threaded plugin. Timeouts are server-managed; fix a real timeout by narrowing sc…
set_auto_layoutSet or update auto-layout (flex/grid) properties on an existing frame, component, or component set.
set_blend_modeFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
set_constraintsSet layout constraints (pinning behaviour) on one or more nodes relative to their parent — how a node resizes/repositions when its parent resizes. For non-auto-layout parents. Also a `batch` op type.
set_corner_radiusFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
set_effectsApply one or more effects (drop shadow, inner shadow, layer blur, background blur, plus the native GLASS / NOISE / TEXTURE effects) directly to one or more nodes. Replaces all existing effects on each target node. Pass an empty array to clear all effects. Returns {results:[{nodeId,effectCount}]} for each nodeId.
set_file_thumbnailSet or clear the current file thumbnail node. Omit nodeId to clear the thumbnail.
set_fillsSet the fill color on a single node (this top-level tool takes one nodeId, not an array). Returns {results:[{nodeId,…}]}, a 1-element array. PREFER variableId over a raw hex — bind a design token, don't bake a raw color (the project invariant). Use mode='append' to stack a new fill on top of existing fills instead of replacing them. Also a `batch` op type — and in `batch` it accepts nodeIds[] (all→all bulk: the same fill applied to every node) and returns {results:[{nodeId,…}]}. Fan a scan into it in ONE round-trip with the projection ref nodeIds:["$0.matchingNodes[*].id"].
set_instance_propertiesSet variant, boolean, text, and instance-swap properties on a component INSTANCE (this top-level tool takes one nodeId). Returns {results:[{nodeId,…}]}, a 1-element array. Use resetOverrides=true to restore defaults before applying. Also a `batch` op type — and in `batch` it accepts nodeIds[] (all→all bulk: apply the same property map to every instance) and returns {results:[{nodeId,…}]}. Fan a scan into it with nodeIds:["$0.matchingNodes[*].id"] (scan_nodes_by_types → matchingNodes; search_nodes → nodes); read back with $N.results[*].nodeId.
set_opacitySet the opacity of one or more nodes (nodeIds[]) — 0 = fully transparent, 1 = fully opaque. Bulk-apply: returns {results:[{nodeId,…}]}, one entry per node. Also a `batch` op type — fan a scan into it in ONE round-trip with the projection ref nodeIds:["$0.matchingNodes[*].id"]; read its bulk output back with $N.results[*].nodeId.
set_presenceUpdate your presence in the Figma plugin's Watch-agent panel WITHOUT performing a Figma operation. Set your manual status (workflow phase) and/or task (a one-sentence description of what you are working on). The orchestrator calls this once per agent right after dispatch to stamp the agent's task; an agent may call it again when its phase changes. Does not touch the canvas.
set_prototype_startSet the prototype flow starting point(s) for the page that contains the given frame(s). The start of a prototype is controlled through the page's flow starting points — prototypeStartNode is read-only and cannot be set directly. Pass one or more frame nodeIds (all must be on the same page). Each becomes a flow starting point. Provide "names" (parallel array) to label the flows; otherwise each flow takes the frame's name. mode "replace" (default) overwrites the page's starting points; "append" adds frames not already present; "remove" drops the given frames from the page's start points and kee…
set_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 (timeout ms), MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_DOWN (delay ms), ON_KEY_DOWN (device, keyCodes[]), ON_MEDIA_HIT (mediaHitTime), ON_MEDIA_END Supported action types: NODE (navigation), BACK, CLOSE, URL, SET_VARIABLE (variableId, variableValue?), SET_VARIABLE_MODE (variableCollectionId, variableModeId), CONDITIONAL (conditionalBlocks[]), UPDATE_MEDIA_RUNTIME (mediaAction) NODE navigatio…
set_strokesSet the stroke color and weight on a single node (this top-level tool takes one nodeId, not an array). Returns {results:[{nodeId,…}]}, a 1-element array. PREFER variableId over a raw hex — bind a design token. Use mode='append' to stack a new stroke on top of existing strokes instead of replacing them. Also a `batch` op type — and in `batch` it accepts nodeIds[] (all→all bulk: the same stroke applied to every node) and returns {results:[{nodeId,…}]}. Fan a scan into it in ONE round-trip with the projection ref nodeIds:["$0.matchingNodes[*].id"].
set_textset_text_rangeApply styling to a CHARACTER RANGE within a TEXT node (per-span formatting): mixed fonts/sizes, per-span color, hyperlinks, lists, indentation, decoration. Offsets are character indices with 0 <= startOffset < endOffset <= text length. Fonts covering the range are loaded automatically. Use set_text for whole-node changes.
set_variable_modePin a node to a specific mode of a variable collection (e.g. switch a frame's collection to Dark mode) via setExplicitVariableModeForCollection.
set_variable_valueSet a variable's value for a specific mode.
set_visibleShow or hide one or more nodes (nodeIds[]) by setting their visibility. Bulk-apply: returns {results:[{nodeId,…}]}, one entry per node. Also a `batch` op type — fan a scan into it in ONE round-trip with the projection ref nodeIds:["$0.matchingNodes[*].id"]; read its bulk output back with $N.results[*].nodeId.
swap_componentSwap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size (this top-level tool takes one nodeId). Returns {results:[{nodeId,…}]}, a 1-element array. Also a `batch` op type — and in `batch` it accepts nodeIds[] (all→all bulk: swap EVERY instance to the same target component) and returns {results:[{nodeId,…}]}. The canonical relibrary recipe: scan_nodes_by_types → swap_component nodeIds:["$0.matchingNodes[*].id"] swaps every matching instance in ONE round-trip (scan_nodes_by_types returns matchingNodes; search_nodes returns node…
ungroup_nodesSwap the main component of an existing INSTANCE node, replacing it with a different component while keeping position and size (this top-level tool takes one nodeId). Returns {results:[{nodeId,…}]}, a 1-element array. Also a `batch` op type — and in `batch` it accepts nodeIds[] (all→all bulk: swap EVERY instance to the same target component) and returns {results:[{nodeId,…}]}. The canonical relibrary recipe: scan_nodes_by_types → swap_component nodeIds:["$0.matchingNodes[*].id"] swaps every matching instance in ONE round-trip (scan_nodes_by_types returns matchingNodes; search_nodes returns node…
unlock_nodesFind and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.
update_paint_styleUpdate an existing paint style's name, color/paints, or description. Supports solid color shorthand (color hex) or paints[] for gradients and multi-paint styles. Only paint styles support in-place updates — to modify text, effect, or grid styles, use delete_style and recreate them.
update_variableUpdate an existing variable's metadata: rename, set publishing scopes, hide from publishing, set/remove per-platform code syntax, or remove an extended-mode override. Does not change normal mode values (use set_variable_value).
update_variable_collectionUpdate a variable collection: rename it, hide it from publishing, rename/remove a mode, or clear an extended-collection variable override. A collection must always keep at least one mode.
Signals
- Stars
- 9
- Forks
- 3
- Open issues
- 3
- Last commit
- Aug 11, 2026 (2 months ago)
- Last release
- Aug 6, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.sunhome243/figma-mcp-express- Version
- 2.8.1
- Auth
- No auth
- Packages
- npm figma-mcp-express
- License
- MIT
- Repository
- github.com/sunhome243/figma-mcp-express
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
Figma MCP Express. Agent Mart. https://agentmart.dev/connectors/sunhome243-figma-mcp-express (last updated 2026-10-24)