Skip to content
Agentmart
Submit a tool

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

IndexedMITLocal (stdio)★ 9
Write a review

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.

We use your email only for this newsletter. Privacy

About

Compact Figma MCP with validated batch ops through a local plugin bridge.

No 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_catalog
  • find_replace_text
  • get_annotations
  • get_batch_op_spec
  • get_design_context
  • get_dev_resources
  • get_document
  • get_file_thumbnail
  • get_fonts
  • get_image_by_hash
  • get_library_variables
  • get_local_components
Show 21 more tools
  • get_metadata
  • get_node
  • get_nodes_info
  • get_pages
  • get_prototype
  • get_reactions
  • get_remote_variable_collection
  • get_screenshot
  • get_selection
  • get_selection_colors
  • get_styles
  • get_variable_defs
  • get_viewport
  • list_channels
  • list_library_variable_collections
  • reorder_nodes
  • rotate_nodes
  • scan_nodes_by_types
  • scan_text_nodes
  • search_batch_ops
  • search_nodes

Write 70 · Create, change, send or run things.

  • add_dev_resource
  • add_page
  • add_variable_mode
  • apply_style_to_node
  • batch
  • batch_rename_nodes
  • clone_node
  • create_component
  • create_ellipse
  • create_frame
  • create_gif
  • create_grid_style
Show 58 more tools
  • create_instance
  • create_line
  • create_link_preview
  • create_page_divider
  • create_paint_style
  • create_polygon
  • create_rectangle
  • create_section
  • create_slice
  • create_star
  • create_table
  • create_text
  • create_text_path
  • create_text_style
  • create_variable
  • create_variable_alias
  • create_variable_collection
  • create_vector
  • create_video
  • detach_instance
  • edit_dev_resource
  • import_component_by_key
  • import_image
  • import_style_by_key
  • import_svg
  • import_variable_by_key
  • lock_nodes
  • move_nodes
  • navigate_to_page
  • rename_node
  • rename_page
  • reorder_local_style
  • reorder_local_style_folder
  • reparent_nodes
  • resize_nodes
  • resolve_variable_for_consumer
  • save_screenshots
  • set_auto_layout
  • set_blend_mode
  • set_constraints
  • set_corner_radius
  • set_file_thumbnail
  • set_fills
  • set_instance_properties
  • set_opacity
  • set_presence
  • set_prototype_start
  • set_reactions
  • set_strokes
  • set_text
  • set_text_range
  • set_variable_mode
  • set_variable_value
  • set_visible
  • swap_component
  • ungroup_nodes
  • unlock_nodes
  • update_paint_style

Delete 10 · Delete, drop, revoke or wipe things.

  • create_effect_style
  • delete_dev_resource
  • delete_nodes
  • delete_page
  • delete_style
  • delete_variable
  • remove_reactions
  • set_effects
  • update_variable
  • update_variable_collection

Not yet classified 7 · We could not tell from the name and description.

  • bind_variable_to_effect
  • bind_variable_to_layout_grid
  • bind_variable_to_node
  • boolean_operation
  • export_frames_to_pdf
  • export_tokens
  • group_nodes

Network hosts it talks to 6

  • api.dicebear.com · found in code
  • api.figma.com · found in code
  • design-mac.example.ts.net · found in code
  • figma.com · found in code
  • github.com · found in code
  • glama.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_resource

    Attach a Dev Mode resource link to a node using addDevResourceAsync.

  • 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

    Execute 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_nodes

    Rename multiple nodes using find/replace, regex substitution, or prefix/suffix addition.

  • bind_variable_to_effect

    Bind 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_grid

    Bind 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_node

    Bind 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_operation
  • clone_node

    Clone an existing node, optionally repositioning it or placing it in a new parent.

  • create_component

    Convert 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_style

    Create 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_ellipse

    Create a new ellipse (circle/oval) on the current page or inside a parent node.

  • create_frame
Show 105 more tools
  • create_gif

    Create a FigJam GIF media node from an existing imageHash using Figma's createGif. This API is host/editor dependent.

  • create_grid_style

    Create a new local layout grid style.

  • create_instance

    Create 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_line

    Create 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_preview

    Create a FigJam link preview node from a URL using Figma's createLinkPreviewAsync. This API is host/editor dependent.

  • create_page_divider

    Create a page divider node using Figma's createPageDivider. The optional name must be divider-only text, such as --- or ***.

  • create_paint_style

    Create a new local paint style. Supply either a solid color shorthand (color hex) or a paints[] array for gradients, images, or multiple paints.

  • create_polygon

    Create a regular polygon (PolygonNode) with a configurable number of sides on the current page or inside a parent.

  • create_rectangle

    Create 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_section

    Create 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_slice

    Create a Slice node for export regions.

  • create_star

    Create a star (StarNode) with a configurable number of points and inner-radius ratio on the current page or inside a parent.

  • create_table

    Create 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_text
  • create_text_path

    Create a TextPath node from an existing vector-like node (VECTOR, RECTANGLE, ELLIPSE, POLYGON, STAR, or LINE).

  • 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_alias

    Create a variable alias value from an existing variable ID using createVariableAliasByIdAsync. Use the returned alias as a variable value.

  • 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.

  • create_vector

    Create an editable VECTOR node with optional vectorPaths, size, fill color, and parent.

  • create_video

    Create a rectangle with a VIDEO fill from local videoPath or base64 videoData using Figma's createVideoAsync.

  • delete_dev_resource

    Delete a Dev Mode resource link from a node by URL.

  • delete_nodes

    Delete one or more nodes. This cannot be undone via MCP — use with care.

  • delete_page
  • delete_style

    Bind 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_variable

    Update 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_instance
  • edit_dev_resource

    Edit a node Dev Mode resource link by its current URL. Provide url, name, or both as the replacement.

  • 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.

  • fetch_library_catalog

    Fetch 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_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_batch_op_spec

    Return the full validated batch/FigmaPlan spec for one operation. Use after search_batch_ops and before composing unfamiliar batch ops.

  • get_design_context

    Depth-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_resources

    Read Dev Mode resource links attached to a node via the node DevResourcesMixin. Optionally includes child resources.

  • 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. 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_thumbnail

    Get the node currently assigned as the file thumbnail, if any.

  • get_fonts

    List all fonts used in the current page, sorted by usage frequency. Useful for understanding typography without scanning all text nodes.

  • get_image_by_hash

    Get 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_variables

    Get 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_components

    Get 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_metadata

    Get 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_node

    Get 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_info

    Get 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_pages

    List all pages in the document with their IDs and names. Lightweight alternative to get_document.

  • get_prototype

    Read 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_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_remote_variable_collection

    Look up a remote (subscribed-library) variable collection by ID to discover its modes — getVariableCollectionByIdAsync, which local-only lookups miss.

  • 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_selection_colors

    Get Figma's computed colors from the current selection using getSelectionColors.

  • 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_component_by_key

    Import 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_image

    Import 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_key

    Import a paint, text, or effect style from a subscribed library by its key, making it available to apply to nodes.

  • import_svg

    Create 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_key

    Import a design variable from a subscribed library by its key, making it available to bind to node properties.

  • list_channels

    List 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_collections

    List all variable collections available from subscribed libraries, including their IDs and modes.

  • lock_nodes

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • 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). Note: x/y are parent-local coordinates, not absolute canvas coordinates.

  • navigate_to_page

    Switch the active Figma page. Provide either pageId or pageName.

  • remove_reactions
  • rename_node

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • rename_page
  • reorder_local_style

    Move 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_folder

    Move a local style folder after another folder for paint/text/effect/grid styles. Omit afterFolder to move it first.

  • reorder_nodes

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • reparent_nodes

    Move 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_nodes
  • resolve_variable_for_consumer

    Resolve a variable's effective value for a specific scene node using Variable.resolveForConsumer.

  • rotate_nodes

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • 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. 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_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 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_ops

    Search 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_nodes

    Find 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_layout

    Set or update auto-layout (flex/grid) properties on an existing frame, component, or component set.

  • set_blend_mode

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • set_constraints

    Set 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_radius

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • set_effects

    Apply 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_thumbnail

    Set or clear the current file thumbnail node. Omit nodeId to clear the thumbnail.

  • set_fills

    Set 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_properties

    Set 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_opacity

    Set 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_presence

    Update 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_start

    Set 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_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 (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_strokes

    Set 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_text
  • set_text_range

    Apply 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_mode

    Pin a node to a specific mode of a variable collection (e.g. switch a frame's collection to Dark mode) via setExplicitVariableModeForCollection.

  • set_variable_value

    Set a variable's value for a specific mode.

  • set_visible

    Show 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_component

    Swap 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_nodes

    Swap 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_nodes

    Find and replace text content across all TEXT nodes in a subtree. Searches the entire current page if no nodeId is given.

  • update_paint_style

    Update 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_variable

    Update 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_collection

    Update 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
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)