MCP server intelligence profile

figma-console-mcp Server

A Model Context Protocol server that bridges design and development by giving AI assistants complete access to Figma for extraction, creation, debugging, and bidirectional token sync

Hybridsouthleft
Awaiting current scanNpm · 1.40.0

The selected current version does not yet have completed public verification. Unknown does not mean clean or vulnerable.

1Distribution channel
121Independently observed tools
0Linked remote endpoints
AvailableVersion intelligence

Detailed security scan evidence is not public for this MCP yet. Public identity, registry metadata, and independently observed protocol inventory remain available.

Install and connect

Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.

Install figma-console-mcp from npm

Install exact version 1.40.0. No verified executable entrypoint is available, so use the package documentation to launch it.

npm install --save-exact figma-console-mcp@1.40.0

Identity

Canonical slugfigma-console-mcp-e65114bcDeploymentHybrid
Canonical packagenpm:figma-console-mcpRepositorysouthleft/figma-console-mcp
First publishedLatest release
Last security verificationClassification confidence82%
PublicationDraftOfficial distributionNot verified

Distributions

ChannelIdentifierCurrent versionVersionsSource
npmfigma-console-mcp1.40.088Repository

Current release

PackageVersionPublished / observedInventorySecurity scan
npmfigma-console-mcp1.40.0CurrentSep 5, 2026121 toolsSucceeded · 0 resources · 0 promptsEvidence restricted
Enterprise protection

Continuously monitor this MCP for security risk

Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.

  • Independent exact-version security scans
  • Continuous release and vulnerability monitoring
  • Risk-change alerts with capability context
  • Historical evidence and API exports
Custom pricingContact salesTailored to your organization, integrations, data needs, and support requirements.

Current version evidence

No public current-version evidence is available yet.

Current protocol inventory

2025-06-18Negotiated protocol
Figma Console MCP (Local)Server-reported name
1Capability groups
Aug 21, 2026Observed

Tools 121

ToolCategoryAnnotationsRisk
figjam_auto_arrangeArrange nodes on a FigJam board in a grid, horizontal row, or vertical column layout. Use after batch-creating elements to organize them neatly.
Input schema
{
  "type": "object",
  "properties": {
    "nodeIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "description": "Array of node IDs to arrange (max 500)"
    },
    "layout": {
      "type": "string",
      "enum": [
        "grid",
        "horizontal",
        "vertical"
      ],
      "default": "grid",
      "description": "Layout type: grid, horizontal, or vertical"
    },
    "spacing": {
      "type": "number",
      "default": 40,
      "description": "Spacing between nodes in pixels"
    },
    "columns": {
      "type": "number",
      "description": "Number of columns for grid layout (defaults to sqrt of node count)"
    }
  },
  "required": [
    "nodeIds"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_code_blockCreate a code block on a FigJam board. Use for sharing code snippets, config examples, or technical documentation in collaborative boards.
Input schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "maxLength": 50000,
      "description": "The code content"
    },
    "language": {
      "type": "string",
      "description": "Programming language (e.g., 'JAVASCRIPT', 'PYTHON', 'TYPESCRIPT', 'JSON', 'HTML', 'CSS')"
    },
    "x": {
      "type": "number",
      "description": "X position on canvas"
    },
    "y": {
      "type": "number",
      "description": "Y position on canvas"
    }
  },
  "required": [
    "code"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_connectorConnect two nodes with a connector line in FigJam. Use to create flowcharts, diagrams, and relationship maps. Nodes must exist on the board (stickies, shapes, etc.). Use their node IDs from creation results. **Magnet positions:** AUTO (default), TOP, BOTTOM, LEFT, RIGHT — controls where the connector attaches to each node.
Input schema
{
  "type": "object",
  "properties": {
    "startNodeId": {
      "type": "string",
      "description": "Node ID of the start element"
    },
    "endNodeId": {
      "type": "string",
      "description": "Node ID of the end element"
    },
    "label": {
      "type": "string",
      "maxLength": 5000,
      "description": "Optional text label on the connector"
    },
    "startMagnet": {
      "type": "string",
      "enum": [
        "AUTO",
        "TOP",
        "BOTTOM",
        "LEFT",
        "RIGHT"
      ],
      "default": "AUTO",
      "description": "Magnet position on the start node"
    },
    "endMagnet": {
      "type": "string",
      "enum": [
        "AUTO",
        "TOP",
        "BOTTOM",
        "LEFT",
        "RIGHT"
      ],
      "default": "AUTO",
      "description": "Magnet position on the end node"
    }
  },
  "required": [
    "startNodeId",
    "endNodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_sectionCreate a section on a FigJam board. Sections are containers that can hold other elements. Use for grouping related content. **Note:** After creating a section, place elements inside it by setting their x/y coordinates within the section's bounds, then use figma_execute to call section.appendChild(node) to parent them.
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 500,
      "description": "Section name/title"
    },
    "x": {
      "type": "number",
      "description": "X position on canvas"
    },
    "y": {
      "type": "number",
      "description": "Y position on canvas"
    },
    "width": {
      "type": "number",
      "minimum": 1,
      "maximum": 20000,
      "default": 1000,
      "description": "Section width in pixels"
    },
    "height": {
      "type": "number",
      "minimum": 1,
      "maximum": 20000,
      "default": 800,
      "description": "Section height in pixels"
    },
    "fillColor": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "description": "Fill color as hex"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_shape_with_textCreate a labeled shape on a FigJam board with optional size, colors, and font control. Use for flowchart nodes, process diagrams, and visual organization. **Shape types:** ROUNDED_RECTANGLE (default), DIAMOND, ELLIPSE, TRIANGLE_UP, TRIANGLE_DOWN, PARALLELOGRAM_RIGHT, PARALLELOGRAM_LEFT, ENG_DATABASE, ENG_QUEUE, ENG_FILE, ENG_FOLDER
Input schema
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "maxLength": 5000,
      "description": "Text label for the shape"
    },
    "shapeType": {
      "type": "string",
      "enum": [
        "ROUNDED_RECTANGLE",
        "DIAMOND",
        "ELLIPSE",
        "TRIANGLE_UP",
        "TRIANGLE_DOWN",
        "PARALLELOGRAM_RIGHT",
        "PARALLELOGRAM_LEFT",
        "ENG_DATABASE",
        "ENG_QUEUE",
        "ENG_FILE",
        "ENG_FOLDER"
      ],
      "description": "Shape type"
    },
    "x": {
      "type": "number",
      "description": "X position on canvas"
    },
    "y": {
      "type": "number",
      "description": "Y position on canvas"
    },
    "width": {
      "type": "number",
      "minimum": 1,
      "maximum": 10000,
      "description": "Width in pixels"
    },
    "height": {
      "type": "number",
      "minimum": 1,
      "maximum": 10000,
      "description": "Height in pixels"
    },
    "fillColor": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "description": "Fill color as hex (e.g., '#E1F5EE')"
    },
    "strokeColor": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "description": "Stroke/border color as hex"
    },
    "fontSize": {
      "type": "number",
      "minimum": 1,
      "maximum": 200,
      "description": "Text font size in pixels"
    },
    "strokeDashPattern": {
      "type": "string",
      "description": "Dash pattern as comma-separated numbers (e.g., '10,5' for dashed)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_stickiesBatch create multiple sticky notes on a FigJam board (max 200). Use this to populate boards from structured data (meeting notes, brainstorm ideas, etc.). **Colors:** YELLOW, BLUE, GREEN, PINK, ORANGE, PURPLE, RED, LIGHT_GRAY, GRAY
Input schema
{
  "type": "object",
  "properties": {
    "stickies": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "maxLength": 5000,
            "description": "Text content"
          },
          "color": {
            "type": "string",
            "enum": [
              "YELLOW",
              "BLUE",
              "GREEN",
              "PINK",
              "ORANGE",
              "PURPLE",
              "RED",
              "LIGHT_GRAY",
              "GRAY"
            ],
            "description": "Sticky color"
          },
          "x": {
            "type": "number",
            "description": "X position"
          },
          "y": {
            "type": "number",
            "description": "Y position"
          }
        },
        "required": [
          "text"
        ],
        "additionalProperties": false
      },
      "maxItems": 200,
      "description": "Array of sticky note specifications (max 200)"
    }
  },
  "required": [
    "stickies"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_stickyCreate a sticky note on a FigJam board. Only works in FigJam files. **Colors:** YELLOW, BLUE, GREEN, PINK, ORANGE, PURPLE, RED, LIGHT_GRAY, GRAY (default: YELLOW)
Input schema
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "maxLength": 5000,
      "description": "Text content for the sticky note"
    },
    "color": {
      "type": "string",
      "enum": [
        "YELLOW",
        "BLUE",
        "GREEN",
        "PINK",
        "ORANGE",
        "PURPLE",
        "RED",
        "LIGHT_GRAY",
        "GRAY"
      ],
      "description": "Sticky color"
    },
    "x": {
      "type": "number",
      "description": "X position on canvas"
    },
    "y": {
      "type": "number",
      "description": "Y position on canvas"
    }
  },
  "required": [
    "text"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_create_tableCreate a table on a FigJam board with optional cell data. Use for structured data display, comparison matrices, and organized information. **Data format:** 2D array of strings, e.g. [["Header1", "Header2"], ["Row1Col1", "Row1Col2"]]
Input schema
{
  "type": "object",
  "properties": {
    "rows": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "description": "Number of rows (1-100)"
    },
    "columns": {
      "type": "number",
      "minimum": 1,
      "maximum": 50,
      "description": "Number of columns (1-50)"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 5000
        }
      },
      "description": "2D array of cell text content (row-major order)"
    },
    "x": {
      "type": "number",
      "description": "X position on canvas"
    },
    "y": {
      "type": "number",
      "description": "Y position on canvas"
    }
  },
  "required": [
    "rows",
    "columns"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_get_board_contentsRead all content from a FigJam board. Returns stickies, shapes, connectors, tables, code blocks, and sections with their text content and positions. Use this to understand what's on a board before modifying it, or to extract structured data from collaborative sessions. **Filters:** Pass nodeTypes to limit results (e.g., ["STICKY"] for only stickies). Omit for everything.
Input schema
{
  "type": "object",
  "properties": {
    "nodeTypes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "STICKY",
          "SHAPE_WITH_TEXT",
          "CONNECTOR",
          "TABLE",
          "CODE_BLOCK",
          "SECTION",
          "FRAME",
          "TEXT"
        ]
      },
      "description": "Filter by node types. Omit for all."
    },
    "maxNodes": {
      "type": "number",
      "minimum": 1,
      "maximum": 1000,
      "default": 500,
      "description": "Maximum nodes to return (1-1000, default: 500)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figjam_get_connectionsRead the connection graph from a FigJam board. Returns all connectors with their start/end node references and labels. Use this to understand relationships, flowcharts, and diagrams. Returns edges as {startNodeId, endNodeId, label} plus a summary of connected nodes.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_add_component_propertyAdd a new component property to a component or component set. Properties enable dynamic content and behavior in component instances. Supported types: BOOLEAN (toggle), TEXT (string), INSTANCE_SWAP (component swap), VARIANT (variant selection), SLOT (freeform slot — prefer figma_create_slot for new slots).
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The component or component set node ID"
    },
    "propertyName": {
      "type": "string",
      "description": "Name for the new property (e.g., 'Show Icon', 'Button Label', 'Content')"
    },
    "type": {
      "type": "string",
      "enum": [
        "BOOLEAN",
        "TEXT",
        "INSTANCE_SWAP",
        "VARIANT",
        "SLOT"
      ],
      "description": "Property type: BOOLEAN for toggles, TEXT for strings, INSTANCE_SWAP for component swaps, VARIANT for variant selection, SLOT for freeform slot areas"
    },
    "defaultValue": {
      "type": [
        "string",
        "number",
        "boolean"
      ],
      "description": "Default value. Required for TEXT (string), INSTANCE_SWAP (component id), and VARIANT (a non-empty variant option name — Figma rejects empty). Optional for BOOLEAN (defaults false). Omit for SLOT."
    },
    "description": {
      "type": "string",
      "description": "Property description (SLOT properties only)"
    },
    "preferredValues": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "COMPONENT",
              "COMPONENT_SET"
            ]
          },
          "key": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "key"
        ],
        "additionalProperties": false
      },
      "description": "Preferred components (INSTANCE_SWAP and SLOT only)"
    }
  },
  "required": [
    "nodeId",
    "propertyName",
    "type"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_add_modeAdd a new mode to an existing Figma variable collection. Modes allow variables to have different values for different contexts (e.g., Light/Dark themes, device sizes). Requires the Desktop Bridge plugin to be running.
Input schema
{
  "type": "object",
  "properties": {
    "collectionId": {
      "type": "string",
      "description": "The collection ID to add the mode to (e.g., 'VariableCollectionId:123:456'). Get this from figma_get_variables."
    },
    "modeName": {
      "type": "string",
      "description": "The name for the new mode (e.g., 'Dark', 'Mobile', 'High Contrast')."
    }
  },
  "required": [
    "collectionId",
    "modeName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_add_shape_to_slideAdd a rectangle or ellipse shape to a specific slide with optional fill color.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    },
    "shapeType": {
      "type": "string",
      "enum": [
        "RECTANGLE",
        "ELLIPSE"
      ],
      "description": "Shape type"
    },
    "x": {
      "type": "number",
      "description": "X position"
    },
    "y": {
      "type": "number",
      "description": "Y position"
    },
    "width": {
      "type": "number",
      "minimum": 1,
      "maximum": 10000,
      "description": "Width in pixels"
    },
    "height": {
      "type": "number",
      "minimum": 1,
      "maximum": 10000,
      "description": "Height in pixels"
    },
    "fillColor": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "default": "#CCCCCC",
      "description": "Hex color e.g. '#FF5733'"
    }
  },
  "required": [
    "slideId",
    "shapeType",
    "x",
    "y",
    "width",
    "height"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_add_slot_propertyManually add a SLOT component property and bind it to an existing frame (alternative to figma_create_slot). The frame must be a direct child of the component, must not use GRID layout, and must not be nested inside another slot. Supports description and preferredValues.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "COMPONENT or COMPONENT_SET node ID"
    },
    "propertyName": {
      "type": "string",
      "description": "Slot property name (e.g. 'Content')"
    },
    "frameNodeId": {
      "type": "string",
      "description": "Frame node ID to bind as the slot content area"
    },
    "description": {
      "type": "string",
      "description": "Slot property description (SLOT-only)"
    },
    "preferredValues": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "COMPONENT",
              "COMPONENT_SET"
            ],
            "description": "Type of preferred value"
          },
          "key": {
            "type": "string",
            "description": "Component or component set key"
          }
        },
        "required": [
          "type",
          "key"
        ],
        "additionalProperties": false
      },
      "description": "Preferred components for slot content (SLOT-only)"
    }
  },
  "required": [
    "nodeId",
    "propertyName",
    "frameNodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_add_text_to_slideAdd a new text element to a specific slide. Supports custom fonts, colors, alignment, and text formatting.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    },
    "text": {
      "type": "string",
      "maxLength": 10000,
      "description": "The text content"
    },
    "x": {
      "type": "number",
      "default": 100,
      "description": "X position"
    },
    "y": {
      "type": "number",
      "default": 100,
      "description": "Y position"
    },
    "fontSize": {
      "type": "number",
      "minimum": 1,
      "maximum": 1000,
      "default": 24,
      "description": "Font size in pixels"
    },
    "fontFamily": {
      "type": "string",
      "default": "Inter",
      "description": "Font family (e.g., 'Manrope', 'IBM Plex Sans')"
    },
    "fontStyle": {
      "type": "string",
      "default": "Regular",
      "description": "Font style/weight (e.g., 'Bold', 'SemiBold', 'Medium')"
    },
    "color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "description": "Text fill color as hex (e.g., '#FFFFFF')"
    },
    "textAlign": {
      "type": "string",
      "enum": [
        "LEFT",
        "CENTER",
        "RIGHT"
      ],
      "description": "Horizontal text alignment"
    },
    "width": {
      "type": "number",
      "minimum": 1,
      "maximum": 10000,
      "description": "Text box width for wrapping. When set, enables text wrapping."
    },
    "lineHeight": {
      "type": "number",
      "minimum": 1,
      "maximum": 500,
      "description": "Line height in pixels"
    },
    "letterSpacing": {
      "type": "number",
      "description": "Letter spacing in pixels"
    },
    "textCase": {
      "type": "string",
      "enum": [
        "ORIGINAL",
        "UPPER",
        "LOWER",
        "TITLE"
      ],
      "description": "Text case transformation"
    }
  },
  "required": [
    "slideId",
    "text"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_analyze_component_setAnalyze a Figma COMPONENT_SET to extract variant state machine and cross-variant diffs for code generation. Returns: (1) variant axes (size, state) with all values, (2) CSS pseudo-class mappings for interaction states (hover→:hover, focus→:focus-visible, disabled→:disabled, error→[aria-invalid]), (3) visual diff from default state per variant (only changed properties — fill token, stroke token, stroke weight, text color, opacity, effects, visibility), (4) component property definitions mapped to code props (BOOLEAN→boolean, TEXT→string, INSTANCE_SWAP→slot/ReactNode), and (5) slots — Figma SLOT properties (name, preferredValues = the components a slot accepts, and limitViolations) to implement as named slots / children props (React {children} or named ReactNode; Web Components <slot name>). Use this on the parent COMPONENT_SET node, not individual variants. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "COMPONENT_SET node ID (the parent of all variants, e.g., '214:274')"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_append_to_slotAdd content to a slot on a component instance. Clones sourceNodeId into the slot, or creates a new node (nodeType). SLOT content cannot be set via figma_set_instance_properties — use this tool instead. Widgets, stickies, and raw ComponentNodes cannot be appended to slots.
Input schema
{
  "type": "object",
  "properties": {
    "slotId": {
      "type": "string",
      "description": "Direct SlotNode ID (from figma_get_slots)"
    },
    "instanceId": {
      "type": "string",
      "description": "Instance ID — use with slotName when slotId is unknown"
    },
    "slotName": {
      "type": "string",
      "description": "Slot layer name on the instance (e.g. 'Content')"
    },
    "sourceNodeId": {
      "type": "string",
      "description": "Node to clone into the slot (default: clone=true)"
    },
    "nodeType": {
      "type": "string",
      "enum": [
        "FRAME",
        "RECTANGLE",
        "ELLIPSE",
        "TEXT",
        "LINE",
        "POLYGON",
        "STAR",
        "VECTOR"
      ],
      "description": "Create a new node in the slot instead of cloning"
    },
    "properties": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number"
        ]
      },
      "description": "Properties for created nodes: name, text, width, height"
    },
    "clone": {
      "type": "boolean",
      "default": true,
      "description": "When using sourceNodeId, clone the node (default true). Set false to move."
    },
    "clearExisting": {
      "type": "boolean",
      "default": false,
      "description": "Remove existing slot children before appending"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_arrange_component_setOrganize a component set with Figma's native purple dashed visualization. Use after creating variants, adding states (hover/disabled/pressed), or when component sets need cleanup. Non-destructive: rearranges the existing variants in place (grid positions on the existing set's children), so the component set keeps its node ID and all placed instances remain intact. Arranges variants in a labeled grid (columns = last property like State, rows = other properties like Type+Size) and wraps the set in a white container with title, row/column labels. Safe to run on component sets with placed instances, and safe to re-run.
Input schema
{
  "type": "object",
  "properties": {
    "componentSetId": {
      "type": "string",
      "description": "Node ID of the component set to arrange. If not provided, will look for a selected component set."
    },
    "componentSetName": {
      "type": "string",
      "description": "Name of the component set to find. Used if componentSetId not provided."
    },
    "options": {
      "type": "object",
      "properties": {
        "gap": {
          "type": "number",
          "default": 24,
          "description": "Gap between grid cells in pixels (default: 24)"
        },
        "cellPadding": {
          "type": "number",
          "default": 20,
          "description": "Padding inside each cell around the variant (default: 20)"
        },
        "columnProperty": {
          "type": "string",
          "description": "Property to use for columns (default: auto-detect last property, usually 'State')"
        }
      },
      "additionalProperties": false,
      "description": "Layout options"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_audit_component_accessibilityDeep accessibility audit for a specific component or component set. Produces a scorecard covering: state coverage (default/hover/focus/disabled/error/active/loading), focus indicator quality and contrast, non-color differentiation (WCAG 1.4.1), target size consistency (WCAG 2.5.8), annotation completeness, and color-blind simulation (protanopia/deuteranopia/tritanopia). Returns per-category scores (0-100) and prioritized recommendations. Use after designing a component to validate accessibility before handoff. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Node ID of a COMPONENT_SET, COMPONENT, or INSTANCE to audit. Falls back to current selection if omitted."
    },
    "targetSize": {
      "type": "number",
      "description": "Minimum touch target size in px (default: 24 per WCAG 2.5.8). Use 44 for iOS or 48 for Android guidelines."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_audit_design_system_reportRun the design-system health audit and return the scored report as data (no UI required). Same deterministic engine as the Design System Dashboard app: naming & semantics, token architecture, component metadata, accessibility, consistency, coverage — each 0-100 plus a weighted overall. Start with the default summary, then drill into one category at a time via `category` (chunked; avoids one giant payload). Results are cached ~5 minutes; pass forceRefresh after editing the file. Every finding includes whether this MCP can fix it (design-side write tools vs. design decision vs. manual).
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. If not provided, uses the currently active file."
    },
    "format": {
      "type": "string",
      "enum": [
        "summary",
        "full"
      ],
      "default": "summary",
      "description": "'summary' (default) — bounded readable report: overall + category scores + non-pass findings + remediation. 'full' — complete scored JSON (examples/locations clamped); prefer per-category calls over 'full' when working interactively."
    },
    "category": {
      "type": "string",
      "enum": [
        "naming-semantics",
        "token-architecture",
        "component-metadata",
        "accessibility",
        "consistency",
        "coverage"
      ],
      "description": "Return full findings (including passes, examples, locations) for ONE category — the chunked drill-down path after a summary call."
    },
    "forceRefresh": {
      "type": "boolean",
      "default": false,
      "description": "Bypass the 5-minute audit cache and re-crawl the file. Only needed after editing the file."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_batch_create_variablesCreate multiple variables in one operation. Use instead of calling figma_create_variable repeatedly — up to 50x faster for bulk operations. Get collection IDs from figma_get_variables first. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "collectionId": {
      "type": "string",
      "description": "Collection ID to create all variables in (e.g., 'VariableCollectionId:123:456')"
    },
    "variables": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Variable name (e.g., 'primary-blue')"
          },
          "resolvedType": {
            "type": "string",
            "enum": [
              "COLOR",
              "FLOAT",
              "STRING",
              "BOOLEAN"
            ],
            "description": "Variable type"
          },
          "description": {
            "type": "string",
            "description": "Optional description"
          },
          "valuesByMode": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "number",
                "boolean"
              ]
            },
            "description": "Values by mode ID. For COLOR: hex like '#FF0000'. Example: { '1:0': '#FF0000' }"
          }
        },
        "required": [
          "name",
          "resolvedType"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 100,
      "description": "Array of variables to create (1-100)"
    }
  },
  "required": [
    "collectionId",
    "variables"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_batch_update_variablesUpdate multiple variable values in one operation. Use instead of calling figma_update_variable repeatedly — up to 50x faster for bulk updates. Get variable/mode IDs from figma_get_variables first. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "updates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "variableId": {
            "type": "string",
            "description": "Variable ID (e.g., 'VariableID:123:456')"
          },
          "modeId": {
            "type": "string",
            "description": "Mode ID (e.g., '1:0')"
          },
          "value": {
            "type": [
              "string",
              "number",
              "boolean"
            ],
            "description": "New value. COLOR: hex like '#FF0000'. FLOAT: number. STRING: text. BOOLEAN: true/false."
          }
        },
        "required": [
          "variableId",
          "modeId",
          "value"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 100,
      "description": "Array of updates to apply (1-100)"
    }
  },
  "required": [
    "updates"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_blame_nodeFind the version that introduced a specific change to a node — answers 'who/when added this'. Walks version history backward via binary search (~log2(N) API calls instead of N) to localize the introduction point. Returns the version's metadata (label/author/timestamp). Default includes autosaves for finer attribution; system 'Figma' user appears occasionally for scheduled snapshots and is flagged via attribution_certainty='system_attributed'. Specify EXACTLY ONE of target_component_property or target_child_node_id. node_id is optional — if omitted, falls back to the first node in the current Figma selection.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "node_id": {
      "type": "string",
      "description": "The parent node ID to inspect (typically a COMPONENT_SET). If omitted, falls back to the first node in the current Figma selection."
    },
    "target_component_property": {
      "type": "string",
      "description": "A componentPropertyDefinitions key (e.g. 'Disabled#1:2') — find when this property was first added to the node."
    },
    "target_child_node_id": {
      "type": "string",
      "description": "A descendant node ID — find when this child was first added under node_id."
    },
    "start_version": {
      "type": "string",
      "default": "current",
      "description": "Version to walk backward from. Default 'current' (HEAD)."
    },
    "max_versions_to_walk": {
      "type": "integer",
      "minimum": 2,
      "maximum": 500,
      "default": 200,
      "description": "Lookback cap. Binary search probes ~log2(N) of these. Default 200, max 500."
    },
    "include_autosaves": {
      "type": "boolean",
      "default": true,
      "description": "Include auto-saved versions in the search range. Default true (better attribution accuracy; most autosaves carry the real human user)."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_capture_screenshotCapture a screenshot of a node using the plugin's exportAsync API. IMPORTANT: This tool captures the CURRENT state from the plugin runtime (not cloud state like REST API), making it reliable for validating changes immediately after making them. Use this instead of figma_get_component_image when you need to verify that changes were applied correctly. Defaults are AI-optimized: PNG at 1x with automatic downscaling so the longest side stays within the 1568px AI vision processing ceiling. PNG is the default because design tool content (flat colors, text, UI components) compresses significantly better as PNG. Use JPG for photographic or gradient-heavy content. Requires Desktop Bridge connection (Figma Desktop with plugin running).
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "ID of the node to capture (e.g., '1:234'). If not provided, captures the current page."
    },
    "format": {
      "type": "string",
      "enum": [
        "PNG",
        "JPG",
        "SVG"
      ],
      "default": "PNG",
      "description": "Image format (default: PNG). Use JPG for photographic or gradient-heavy content."
    },
    "scale": {
      "type": "number",
      "minimum": 0.5,
      "maximum": 4,
      "default": 1,
      "description": "Scale factor (default: 1). The plugin automatically caps the effective scale so the exported image does not exceed 1568px on its longest side (the AI vision processing ceiling)."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_check_design_parityCompare a Figma component's design specs against code-side data to find discrepancies. Returns a parity score, categorized discrepancies, and actionable fix items for both design-side (Figma tool calls) and code-side (file edits). Read the component source code first, then pass the data in codeSpec.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "nodeId": {
      "type": "string",
      "description": "Component node ID (e.g., '695:313')"
    },
    "codeSpec": {
      "type": "object",
      "properties": {
        "filePath": {
          "type": "string",
          "description": "Path to the component source file"
        },
        "visual": {
          "type": "object",
          "properties": {
            "backgroundColor": {
              "type": "string"
            },
            "borderColor": {
              "type": "string"
            },
            "borderWidth": {
              "type": "number"
            },
            "borderRadius": {
              "type": [
                "number",
                "string"
              ]
            },
            "opacity": {
              "type": "number"
            },
            "fills": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "color": {
                    "type": "string"
                  },
                  "opacity": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              }
            },
            "strokes": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "color": {
                    "type": "string"
                  },
                  "width": {
                    "type": "number"
                  }
                },
                "additionalProperties": false
              }
            },
            "effects": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string"
                  },
                  "color": {
                    "type": "string"
                  },
                  "offset": {
                    "type": "object",
                    "properties": {
                      "x": {
                        "type": "number"
                      },
                      "y": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "x",
                      "y"
                    ],
                    "additionalProperties": false
                  },
                  "blur": {
                    "type": "number"
                  }
                },
                "required": [
                  "type"
                ],
                "additionalProperties": false
              }
            }
          },
          "additionalProperties": false,
          "description": "Visual properties from code (colors, borders, effects)"
        },
        "spacing": {
          "type": "object",
          "properties": {
            "paddingTop": {
              "type": "number"
            },
            "paddingRight": {
              "type": "number"
            },
            "paddingBottom": {
              "type": "number"
            },
            "paddingLeft": {
              "type": "number"
            },
            "gap": {
              "type": "number"
            },
            "width": {
              "type": [
                "number",
                "string"
              ]
            },
            "height": {
              "type": [
                "number",
                "string"
              ]
            },
            "minWidth": {
              "type": "number"
            },
            "minHeight": {
              "type": "number"
            },
            "maxWidth": {
              "type": "number"
            },
            "maxHeight": {
              "type": "number"
            },
            "layoutDirection": {
              "type": "string",
              "enum": [
                "horizontal",
                "vertical"
              ]
            }
          },
          "additionalProperties": false,
          "description": "Spacing and layout properties from code"
        },
        "typography": {
          "type": "object",
          "properties": {
            "fontFamily": {
              "type": "string"
            },
            "fontSize": {
              "type": "number"
            },
            "fontWeight": {
              "type": [
                "number",
                "string"
              ]
            },
            "lineHeight": {
              "type": [
                "number",
                "string"
              ]
            },
            "letterSpacing": {
              "type": "number"
            },
            "textAlign": {
              "type": "string"
            },
            "textDecoration": {
              "type": "string"
            },
            "textTransform": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "description": "Typography properties from code"
        },
        "tokens": {
          "type": "object",
          "properties": {
            "usedTokens": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "hardcodedValues": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "property": {
                    "type": "string"
                  },
                  "value": {
                    "type": [
                      "string",
                      "number"
                    ]
                  }
                },
                "required": [
                  "property",
                  "value"
                ],
                "additionalProperties": false
              }
            },
            "tokenPrefix": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "description": "Design token usage in code"
        },
        "componentAPI": {
          "type": "object",
          "properties": {
            "props": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string"
                  },
                  "required": {
                    "type": "boolean"
                  },
                  "defaultValue": {
                    "type": [
                      "string",
                      "number",
                      "boolean"
                    ]
                  },
                  "description": {
                    "type": "string"
                  },
                  "values": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "name",
                  "type"
                ],
                "additionalProperties": false
              }
            },
            "events": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "slots": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false,
          "description": "Component API (props, events, slots)"
        },
        "accessibility": {
          "type": "object",
          "properties": {
            "role": {
              "type": "string"
            },
            "ariaLabel": {
              "type": "string"
            },
            "ariaRequired": {
              "type": "boolean"
            },
            "keyboardInteractions": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "contrastRatio": {
              "type": "number"
            },
            "focusVisible": {
              "type": "boolean"
            },
            "semanticElement": {
              "type": "string",
              "description": "Semantic HTML element (e.g., 'button', 'a', 'input')"
            },
            "supportsDisabled": {
              "type": "boolean",
              "description": "Whether code supports disabled/aria-disabled state"
            },
            "supportsError": {
              "type": "boolean",
              "description": "Whether code supports aria-invalid/error state"
            },
            "renderedSize": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "minItems": 2,
              "maxItems": 2,
              "description": "Rendered size [width, height] in px"
            }
          },
          "additionalProperties": false,
          "description": "Accessibility properties from code. Tip: use figma_scan_code_accessibility with mapToCodeSpec:true to auto-generate this from component HTML."
        },
        "metadata": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "description": {
              "type": "string"
            },
            "status": {
              "type": "string"
            },
            "version": {
              "type": "string"
            },
            "tags": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false,
          "description": "Component metadata from code"
        }
      },
      "additionalProperties": false,
      "description": "Structured code-side component data. Read the component source code first, then fill in the relevant sections."
    },
    "canonicalSource": {
      "type": "string",
      "enum": [
        "design",
        "code"
      ],
      "default": "design",
      "description": "Which source is the canonical truth. Fixes will target the other side. Default: 'design'"
    },
    "enrich": {
      "type": "boolean",
      "default": true,
      "description": "Enable token coverage and enrichment analysis. Default: true"
    }
  },
  "required": [
    "nodeId",
    "codeSpec"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_clear_consoleClear the console log buffer. Safely clears the buffer without disrupting the connection. Returns number of logs cleared.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_clone_nodeDuplicate a node. The clone is placed at a slight offset from the original.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to clone"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_childCreate a new child node inside a parent container. Always place inside an existing Section or Frame — never on a bare page. If no suitable parent exists, create a Section first. Clean up any empty or orphaned nodes if the operation fails.
Input schema
{
  "type": "object",
  "properties": {
    "parentId": {
      "type": "string",
      "description": "The parent node ID"
    },
    "nodeType": {
      "type": "string",
      "enum": [
        "RECTANGLE",
        "ELLIPSE",
        "FRAME",
        "TEXT",
        "LINE"
      ],
      "description": "Type of node to create"
    },
    "properties": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Name for the new node"
        },
        "x": {
          "type": "number",
          "description": "X position within parent"
        },
        "y": {
          "type": "number",
          "description": "Y position within parent"
        },
        "width": {
          "type": "number",
          "description": "Width (default: 100)"
        },
        "height": {
          "type": "number",
          "description": "Height (default: 100)"
        },
        "fills": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "SOLID"
              },
              "color": {
                "type": "string"
              }
            },
            "required": [
              "type",
              "color"
            ],
            "additionalProperties": false
          },
          "description": "Fill colors (hex strings)"
        },
        "text": {
          "type": "string",
          "description": "Text content (for TEXT nodes only)"
        }
      },
      "additionalProperties": false,
      "description": "Properties for the new node"
    }
  },
  "required": [
    "parentId",
    "nodeType"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_component_setCreate a component set with variants in one call — replaces hand-written figma.combineAsVariants scripts. Two modes: 1. **Generate from a base component**: pass baseComponentId + properties (variant axes). The base is cloned for every combination of the axes ({ State: ['default','hover','disabled'], Size: ['sm','lg'] } → 6 variants), each named 'Prop=Value' comma-joined (e.g. 'State=hover, Size=sm'), then combined into a set. The base component itself becomes the FIRST variant (same node ID), so existing instances of the base survive as instances of that variant. 2. **Combine existing components**: pass componentIds, optionally with variantProperties (aligned 1:1) to rename each component to Prop=Value form before combining. Figma derives the variant property definitions from the names; they live on the SET (componentPropertyDefinitions), not on individual variants. The result includes each variant's key — instantiate with a VARIANT's key/nodeId via figma_instantiate_component, not the set's key. Set autoArrange:true to lay the new set out as a labeled grid inside a white container (same layout as figma_arrange_component_set). Requires Desktop Bridge plugin. SIZE GUIDANCE: hard cap 100 variants. The timeout auto-scales with variant count (~1.2s/variant, 30s floor / 2min cap), but above ~40 variants the single-pass clone+combine gets slow and heavy base components may still push the limit — prefer splitting large matrices into multiple sets (e.g. one set per Size).
Input schema
{
  "type": "object",
  "properties": {
    "baseComponentId": {
      "type": "string",
      "description": "Node ID of an existing COMPONENT to use as the base. Cloned per property combination; becomes the set's first variant (keeps its node ID, so placed instances survive). Mutually exclusive with componentIds."
    },
    "properties": {
      "type": "object",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "description": "Variant property axes — required with baseComponentId. Example: { State: ['default','hover','disabled'], Size: ['sm','lg'] } creates 6 variants. Max 100 combinations. Names and values must not contain '=' or ','."
    },
    "componentIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Node IDs of existing COMPONENT nodes to combine as variants. Mutually exclusive with baseComponentId. Components already inside a component set are rejected."
    },
    "variantProperties": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": {
          "type": "string"
        }
      },
      "description": "Only with componentIds: one property map per component, aligned by index — e.g. [{ State: 'default' }, { State: 'hover' }]. Each component is renamed to 'Prop=Value, ...' before combining. Without this, existing names are kept (names lacking '=' become 'Property 1=<name>')."
    },
    "name": {
      "type": "string",
      "description": "Name for the component set (e.g., 'Button'). Defaults to Figma's derived name."
    },
    "parentId": {
      "type": "string",
      "description": "Node ID of the container (frame/section) to create the set in. Defaults to the current page."
    },
    "position": {
      "type": "object",
      "properties": {
        "x": {
          "type": "number"
        },
        "y": {
          "type": "number"
        }
      },
      "required": [
        "x",
        "y"
      ],
      "additionalProperties": false,
      "description": "Position of the set within its parent."
    },
    "autoArrange": {
      "type": "boolean",
      "default": false,
      "description": "If true, arrange the new set in a labeled grid (columns = last property, rows = other properties) inside a white container — same in-place layout as figma_arrange_component_set."
    },
    "arrangeOptions": {
      "type": "object",
      "properties": {
        "gap": {
          "type": "number",
          "description": "Gap between grid cells in pixels (default: 24)"
        },
        "cellPadding": {
          "type": "number",
          "description": "Padding inside each cell around the variant (default: 20)"
        },
        "columnProperty": {
          "type": "string",
          "description": "Property to use for columns (default: last property)"
        }
      },
      "additionalProperties": false,
      "description": "Grid layout options, used when autoArrange is true."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_slideCreate a new blank slide in the Figma Slides presentation. Optionally specify grid position.
Input schema
{
  "type": "object",
  "properties": {
    "row": {
      "type": "integer",
      "minimum": 0,
      "description": "Row index in the slide grid (0-based)"
    },
    "col": {
      "type": "integer",
      "minimum": 0,
      "description": "Column index in the slide grid (0-based)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_slotCreate a SlotNode inside a component using createSlot(). Automatically creates a linked SLOT component property named after the slot (renaming the slot renames the property). Slots are freeform drop zones for instance content — more flexible than INSTANCE_SWAP. Works on standalone COMPONENTs and variant COMPONENTs inside a COMPONENT_SET (call once per variant). GRID layout is not allowed on slots. Requires Desktop Bridge.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The COMPONENT node ID to add a slot to"
    },
    "name": {
      "type": "string",
      "description": "Slot layer name (e.g. 'Content', 'Footer')"
    },
    "width": {
      "type": "number",
      "description": "Initial slot width in pixels"
    },
    "height": {
      "type": "number",
      "description": "Initial slot height in pixels"
    },
    "layoutMode": {
      "type": "string",
      "enum": [
        "NONE",
        "HORIZONTAL",
        "VERTICAL"
      ],
      "description": "Auto-layout mode for the slot (GRID is not supported)"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_variableCreate a single Figma variable. For multiple variables, use figma_batch_create_variables instead (10-50x faster). Use figma_get_variables first to get collection IDs. Supports COLOR, FLOAT, STRING, BOOLEAN. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name for the new variable (e.g., 'primary-blue')"
    },
    "collectionId": {
      "type": "string",
      "description": "The collection ID to create the variable in (e.g., 'VariableCollectionId:123:456'). Get this from figma_get_variables."
    },
    "resolvedType": {
      "type": "string",
      "enum": [
        "COLOR",
        "FLOAT",
        "STRING",
        "BOOLEAN"
      ],
      "description": "The variable type: COLOR, FLOAT, STRING, or BOOLEAN"
    },
    "description": {
      "type": "string",
      "description": "Optional description for the variable"
    },
    "valuesByMode": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      },
      "description": "Optional initial values by mode ID. Example: { '1:0': '#FF0000', '1:1': '#0000FF' }"
    }
  },
  "required": [
    "name",
    "collectionId",
    "resolvedType"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_create_variable_collectionCreate an empty variable collection. To create a collection WITH variables and modes in one step, use figma_setup_design_tokens instead. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name for the new collection (e.g., 'Brand Colors')"
    },
    "initialModeName": {
      "type": "string",
      "description": "Name for the initial mode (default mode is created automatically). Example: 'Light'"
    },
    "additionalModes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Additional mode names to create. Example: ['Dark', 'High Contrast']"
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_commentDelete a comment from a Figma file by its comment ID. Use figma_get_comments to find comment IDs first.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "comment_id": {
      "type": "string",
      "description": "The ID of the comment to delete. Get IDs from figma_get_comments."
    }
  },
  "required": [
    "comment_id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_component_propertyDelete a component property. Works with BOOLEAN, TEXT, INSTANCE_SWAP, and SLOT properties (not VARIANT). This is a destructive operation.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The component or component set node ID"
    },
    "propertyName": {
      "type": "string",
      "description": "The full property name with suffix (e.g., 'Show Icon#123:456')"
    }
  },
  "required": [
    "nodeId",
    "propertyName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_nodeDelete a node from the canvas. WARNING: This is a destructive operation (can be undone with Figma's undo).
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to delete"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_slideDelete a slide from the presentation. WARNING: This is a destructive operation (can be undone with Figma's undo).
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide to delete"
    }
  },
  "required": [
    "slideId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_variableDelete a Figma variable. WARNING: This is a destructive operation that cannot be undone (except with Figma's undo). Use figma_get_variables first to get variable IDs. Requires the Desktop Bridge plugin to be running.
Input schema
{
  "type": "object",
  "properties": {
    "variableId": {
      "type": "string",
      "description": "The variable ID to delete (e.g., 'VariableID:123:456'). Get this from figma_get_variables."
    }
  },
  "required": [
    "variableId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_delete_variable_collectionDelete a Figma variable collection and ALL its variables. WARNING: This is a destructive operation that deletes all variables in the collection and cannot be undone (except with Figma's undo). Requires the Desktop Bridge plugin to be running.
Input schema
{
  "type": "object",
  "properties": {
    "collectionId": {
      "type": "string",
      "description": "The collection ID to delete (e.g., 'VariableCollectionId:123:456'). Get this from figma_get_variables."
    }
  },
  "required": [
    "collectionId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_diagnoseDesigner-readable health check for figma-console-mcp. Use this when something seems wrong — it self-identifies the server, reports plugin connection / file / token status in plain language, and disambiguates errors that may be coming from a different Figma-related MCP server. Recommended as the first step when a user reports a "token expired" or "plugin disconnected" issue.
Input schema
{
  "type": "object",
  "properties": {
    "verbose": {
      "type": "boolean",
      "default": false,
      "description": "Include the raw structured state alongside the human-readable report."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_diff_versionsDiff two versions of a Figma file. Always returns a cheap page-structure diff (added/removed/renamed pages, 2 API calls). Pass component_ids to additionally get per-node deep diffs at depth=2 (added/removed children, name/description changes, componentPropertyDefinitions changes for COMPONENT_SETs, boundVariables deltas) — costs 2 API calls per scoped node. Use 'current' for to_version to diff against HEAD. v1.25.0: when the Desktop Bridge plugin is connected, description and Dev Mode annotation changes are ALSO tracked via a session buffer and surfaced under `scoped_nodes[].metadata_changes[]` and `unscoped_metadata_changes[]` — Figma REST omits these from version snapshots so they're otherwise invisible. STILL NOT tracked: instances of components on the canvas, raw layout properties (layoutSizingHorizontal/Vertical, unbound paddings/widths), raw visual properties (cornerRadius, unbound fills), variable VALUE changes, style content, and metadata edits made while the plugin was disconnected. See `scope_coverage` and `notes[]` for the full coverage map and complementary tools.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "from_version": {
      "type": "string",
      "description": "The earlier version_id to compare from. Get from figma_get_file_versions."
    },
    "to_version": {
      "type": "string",
      "description": "The later version_id to compare to. Use 'current' for HEAD."
    },
    "component_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Node IDs (typically COMPONENT_SETs) to diff in detail. If omitted, falls back to the current Figma selection. If neither is available, only the page-structure diff is returned. Use figma_get_design_system_kit or figma_search_components to discover IDs explicitly."
    },
    "mode": {
      "type": "string",
      "enum": [
        "summary",
        "standard",
        "detailed"
      ],
      "default": "standard",
      "description": "Output verbosity. summary=counts only, standard=names+counts (default), detailed=full property/binding details."
    }
  },
  "required": [
    "from_version",
    "to_version"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_analyzeAnalyze one or more production app codebases as the first step of design system extraction. Detects framework (React/Next/Angular/Web Components), styling methods (Tailwind v3/v4, CSS Modules, SCSS, Emotion, styled-components), and vendor component layers (shadcn/ui, Radix, MUI, Chakra, etc.); builds a component inventory with per-component classification (vendored / wrapped / pure-vendor / bespoke), prop contracts, real usage counts (porting rank), observed prop values (variant inference), and duplicate detection. Pass multiple targets to find the shared design language across several apps. Writes the full manifest to <outDir>/.extraction/analysis.json and returns a compressed summary — read slices of the manifest for detail. Run this before figma_ds_extract_tokens and figma_ds_scaffold. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "targets": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "description": "App root directories to analyze. Absolute paths strongly recommended (the MCP server's working directory is not the project). Multiple targets = cross-app extraction: the inventory merges and duplicate components across apps are flagged."
    },
    "outDir": {
      "type": "string",
      "description": "Directory where the design-system package will be generated (manifests persist under <outDir>/.extraction/). Default: '<first target>/design-system'."
    },
    "include": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Substring filters on relative paths — when set, only matching files are scanned (e.g. ['src/', 'app/'])."
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Substring filters on relative paths to skip (node_modules, dist, .next etc. are always skipped)."
    },
    "maxFiles": {
      "type": "number",
      "minimum": 100,
      "maximum": 20000,
      "default": 5000,
      "description": "Hard cap on files scanned per target (default 5000)."
    }
  },
  "required": [
    "targets"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_extract_componentDeep-extract ONE component from the inventory for porting into the design system: returns its source (capped), local import closure (relative imports to follow), prop contract, observed call-site variants, vendor classification, style touchpoints (classNames, CSS-module imports, custom properties referenced), and a ready-to-adapt CSF3 story scaffold with variant stories inferred from real usage. The agent then ports the component into <outDir>/src/components/<Name>/ and records progress with figma_ds_status. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The outDir used in figma_ds_analyze (manifest is read from it)."
    },
    "component": {
      "type": "string",
      "description": "Component name from the inventory (see figma_ds_analyze topByUsage, or the analysis manifest for the full list)."
    }
  },
  "required": [
    "outDir",
    "component"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_extract_tokensExtract design tokens from analyzed codebases into canonical DTCG JSON (plus optional CSS variables / Tailwind / SCSS / TypeScript projections). Mines declared styling intent first — :root and @theme custom properties (light+dark → multi-mode tokens), SCSS variables, tailwind.config theme values, shadcn HSL triples — then promotes recurring raw values (hex colors, spacing/radius/font sizes) above a frequency threshold. Every token carries provenance (source file:line, confidence, frequency) in $extensions. Names are structural as-mined; do a semantic-naming review pass with the user afterwards. The DTCG output is directly importable into Figma variables with figma_import_tokens (top-level groups become collections). Requires figma_ds_analyze to have run for the same outDir. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The outDir used in figma_ds_analyze (reads .extraction/analysis.json from it). Default: '<first target of the analysis run>/design-system' — pass explicitly when in doubt."
    },
    "targets": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Override: scan these app roots instead of the analysis manifest's targets (rarely needed)."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "dtcg",
          "css-vars",
          "tailwind-v4",
          "tailwind-v3",
          "scss",
          "ts-module",
          "json-nested",
          "json-flat",
          "tokens-studio",
          "style-dictionary-v3"
        ]
      },
      "default": [
        "dtcg",
        "css-vars"
      ],
      "description": "Token file formats to write under <outDir>/tokens/. 'dtcg' (canonical) is always written. Match the app's styling method — e.g. add 'tailwind-v4' for a Tailwind app, 'scss' for SCSS."
    },
    "dtcgDialect": {
      "type": "string",
      "enum": [
        "legacy",
        "2025"
      ],
      "default": "legacy",
      "description": "DTCG dialect: 'legacy' hex-string colors (max compatibility) or '2025' DTCG 2025.10 object colors/dimensions."
    },
    "minFrequency": {
      "type": "number",
      "minimum": 2,
      "maximum": 100,
      "default": 4,
      "description": "How often a raw (undeclared) value must recur to be promoted to a token (default 4). Values below the threshold are listed in the report for review."
    },
    "write": {
      "type": "boolean",
      "default": true,
      "description": "Write token files to <outDir>/tokens/ (default true). False returns the DTCG document inline instead (dry run)."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_scaffoldGenerate the design-system package skeleton at outDir from a completed analysis + token extraction: package.json (app framework as peer deps), src/components layout, token files via the shared formatter engine, a framework-neutral token-showcase MDX docs page (the bird's-eye view), and a README with the workflow. Storybook itself is NOT installed by this tool — after scaffolding, run `npm create storybook@latest` inside outDir (the CLI auto-detects the framework and installs the current Storybook version). Additive by default: existing files are skipped unless force. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The outDir used in figma_ds_analyze / figma_ds_extract_tokens."
    },
    "packageName": {
      "type": "string",
      "description": "npm package name for the design system (e.g. '@acme/design-system'). Default: '@extracted/design-system'."
    },
    "framework": {
      "type": "string",
      "enum": [
        "react",
        "next",
        "astro",
        "angular",
        "web-components",
        "vue",
        "svelte"
      ],
      "description": "Override the scaffold framework. Default: the first framework detected by figma_ds_analyze. Note: Storybook has no .astro renderer — 'astro' scaffolds a react-vite workshop whose stories mirror the component markup."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "dtcg",
          "css-vars",
          "tailwind-v4",
          "tailwind-v3",
          "scss",
          "ts-module",
          "json-nested",
          "json-flat",
          "tokens-studio",
          "style-dictionary-v3"
        ]
      },
      "default": [
        "dtcg",
        "css-vars"
      ],
      "description": "Token formats to (re)generate under tokens/."
    },
    "dtcgDialect": {
      "type": "string",
      "enum": [
        "legacy",
        "2025"
      ],
      "default": "legacy",
      "description": "DTCG dialect for dtcg/json outputs."
    },
    "force": {
      "type": "boolean",
      "default": false,
      "description": "Overwrite existing scaffold files (token files always refresh)."
    }
  },
  "required": [
    "outDir"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_setup_storybookWire a freshly-initialized Storybook workshop to the extracted design system — run AFTER `npm create storybook@latest` inside outDir. Generates .storybook/preview.css (Tailwind entry importing the extracted tokens plus the SOURCE app's @theme utility mapping, custom @utility definitions, @layer base, and @font-face rules mined from its stylesheets, with a dark variant covering both .dark and [data-theme] conventions), copies self-hosted font files into staticDirs, and patches main.js (tailwind vite plugin + automatic JSX runtime — without it stories throw 'React is not defined') and preview.jsx (preview.css import + a theme toolbar/decorator using the extracted mode names). Idempotent; anything it can't patch safely is returned as a manual step. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The design-system package dir (same outDir as figma_ds_analyze) containing the freshly-initialized .storybook/."
    }
  },
  "required": [
    "outDir"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_statusRead or update design-system extraction porting progress (persisted in <outDir>/.extraction/status.json so long engagements survive session boundaries). Call with only outDir to get a progress summary; pass update to record a component's porting status. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The outDir used in figma_ds_analyze."
    },
    "update": {
      "type": "object",
      "properties": {
        "component": {
          "type": "string",
          "description": "Component name from the inventory."
        },
        "status": {
          "type": "string",
          "enum": [
            "pending",
            "in-progress",
            "ported",
            "skipped"
          ],
          "description": "New porting status."
        },
        "notes": {
          "type": "string",
          "description": "Why skipped / consolidation decisions / gotchas."
        },
        "storyFile": {
          "type": "string",
          "description": "Relative path of the story file, once written."
        }
      },
      "required": [
        "component",
        "status"
      ],
      "additionalProperties": false,
      "description": "Status update to record. Omit to just read progress."
    }
  },
  "required": [
    "outDir"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_ds_verifyRun the deterministic fidelity evals on an extracted design system package — the governance gate before handing off or pushing to Figma. Checks: tokens.json parses as DTCG and every alias resolves (import-ready); no quoted CSS functional expressions in generated token files (kills transitions); every var() consumed in component/preview CSS resolves in the workshop; every component directory has a stories file and index barrel; every portable inventory component has a porting status. Each check encodes a failure class found in real extraction runs. Also reports Figma round-trip readiness with the exact figma_import_tokens call for design-led orgs (ask the user code-led vs design-led). Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "outDir": {
      "type": "string",
      "description": "The design-system package dir (same outDir as figma_ds_analyze)."
    }
  },
  "required": [
    "outDir"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_duplicate_slideDuplicate an existing slide. The clone is placed adjacent to the original.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide to duplicate"
    }
  },
  "required": [
    "slideId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_edit_component_propertyEdit an existing component property. Can change the name, default value, or preferred values (for INSTANCE_SWAP). Use the full property name including the unique suffix.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The component or component set node ID"
    },
    "propertyName": {
      "type": "string",
      "description": "The full property name with suffix (e.g., 'Show Icon#123:456')"
    },
    "newValue": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "New name for the property"
        },
        "defaultValue": {
          "type": [
            "string",
            "number",
            "boolean"
          ],
          "description": "New default value"
        },
        "preferredValues": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "COMPONENT",
                  "COMPONENT_SET"
                ],
                "description": "Type of preferred value"
              },
              "key": {
                "type": "string",
                "description": "Component or component set key"
              }
            },
            "required": [
              "type",
              "key"
            ],
            "additionalProperties": false
          },
          "description": "Preferred values (INSTANCE_SWAP only)"
        }
      },
      "additionalProperties": false,
      "description": "Object with the values to update"
    }
  },
  "required": [
    "nodeId",
    "propertyName",
    "newValue"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_executeExecute arbitrary JavaScript in Figma's plugin context with full access to the figma API. Use for complex operations not covered by other tools. Requires Desktop Bridge plugin. CAUTION: Can modify your document. **COMPONENT INSTANCES:** For instances (node.type === 'INSTANCE'), use figma_set_instance_properties — direct text editing FAILS SILENTLY. Check instance.componentProperties for available props (may have #nodeId suffixes). **RESULT ANALYSIS:** Check resultAnalysis.warning for silent failures (empty arrays, null returns). **VALIDATION:** After creating/modifying visuals: screenshot with figma_capture_screenshot, check alignment/spacing/proportions, iterate up to 3x. **PLACEMENT:** Always create components inside a Section or Frame, never on blank canvas. Use parent.insertChild(0, bg) for z-ordering backgrounds behind content. **HOUSEKEEPING (MANDATORY):** Before creating: screenshot the target page to see existing content and find clear space. When creating: place inside a named Section, positioned BELOW or AWAY from existing content. Never overlap. After creating: screenshot to verify clean placement and no overlaps. On failure/retry: DELETE any partial artifacts (empty frames, orphaned layers, blank pages) before retrying. Use node.remove() to clean up. Pages: NEVER create a new page if one with that name already exists — use the existing one. If you created a blank page during a failed attempt, delete it. Layers: If your code creates helper frames, placeholder nodes, or intermediate layers that aren't part of the final result, remove them. **MULTI-FILE (Local Mode only):** Pass fileKey to run this in a specific connected file without switching the active file/target lock (see figma_list_open_files). To run the same code across several connected files at once, use figma_execute_across_files instead. Cloud Mode pairs with a single plugin instance and rejects fileKey.
Input schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "JavaScript code to execute. Has access to the 'figma' global object. Example: 'const rect = figma.createRectangle(); rect.resize(100, 100); return { id: rect.id };'"
    },
    "timeout": {
      "type": "number",
      "default": 5000,
      "description": "Execution timeout in milliseconds (default: 5000, max: 30000)"
    },
    "fileKey": {
      "type": "string",
      "description": "Local Mode only. Run against this specific connected file instead of the active file. Does not change the active file or target lock. Get connected fileKeys from figma_list_open_files. Rejected in Cloud Mode, which pairs with a single plugin instance."
    }
  },
  "required": [
    "code"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_execute_across_filesRun the same JavaScript against multiple Figma files connected via the Desktop Bridge plugin, IN PARALLEL, without touching the active file or target lock. Built for cross-file consistency work — e.g. running the same structural check or fix against every file in a multi-file design system and diffing the results — instead of switching the active file and running figma_execute once per file in sequence. Each file's code runs in that file's own plugin context (same 'figma' global as figma_execute). You must say which files to target: pass fileKeys (read them from figma_list_open_files first — strongly preferred for anything that writes), or pass allFiles: true to hit every connected file. Requires Desktop Bridge plugin open in each target file. Local Mode only.
Input schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "JavaScript code to execute in each targeted file. Has access to the 'figma' global object, same as figma_execute. Example: 'return { pageCount: figma.root.children.length };'"
    },
    "fileKeys": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Which connected files to target, by fileKey. Get fileKeys from figma_list_open_files. Required unless allFiles is true."
    },
    "allFiles": {
      "type": "boolean",
      "default": false,
      "description": "Run against EVERY currently connected file. Opt-in on purpose: this executes the code in files the user may be actively working in, including any file pinned by target lock. Prefer naming fileKeys explicitly for anything that writes."
    },
    "timeout": {
      "type": "number",
      "default": 10000,
      "description": "Per-file execution timeout in milliseconds (default: 10000, max: 30000). Applies independently to each file — one slow/unresponsive file does not delay the others."
    }
  },
  "required": [
    "code"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_export_tokensExport Figma variables to design token files in your codebase. Bidirectional with figma_import_tokens — together they replace Style Dictionary and Tokens Studio's export pipeline for the popular styling methods. FULLY-IMPLEMENTED OUTPUT FORMATS: • dtcg — W3C DTCG JSON. Canonical pivot format. Round-trip safe via `$extensions["figma-console-mcp"]`. • css-vars — CSS custom properties with mode-aware selectors (`:root`, `.dark`, `[data-theme=...]`). • tailwind-v4 — Tailwind v4 `@theme inline` block. Token-to-namespace mapping (color/*, spacing/*, radius/*, etc.) generates Tailwind utility classes. • tailwind-v3 — `tailwind.config.js` theme.extend object grouped under Tailwind's theme keys (colors, spacing, fontFamily, etc.). • scss — `$var: value;` declarations. Multi-mode emits a primary variable + a mode-keyed SCSS map for runtime access. • ts-module — `export const tokens = { ... } as const` with derived `Tokens` type. Multi-mode tokens emit as `{ Light: ..., Dark: ... }` objects. • json-flat — flat key-value JSON (`{"ds-color-primary": "#4085F2"}`) for custom build scripts. • json-nested — nested object JSON mirroring the token path tree. • style-dictionary-v3 — SD v3 source format with bare `value`/`type` keys (back-compat for existing SD users). • tokens-studio — Tokens Studio multi-file layout (`$themes.json` + `$metadata.json` + per-set files). Preserves Figma collection/mode bindings for round-trip with the TS plugin. ZERO-ARG USAGE: With a tokens.config.json at your project root, just call the tool with no args — it picks up source dir, output formats, modes, prefix, etc. from config. See the response's `suggestedScaffold` payload when no config is detected — present it to the user, write the scaffold via your file tools, then call again. MERGE STRATEGY: Default `strategy: "merge"` only writes tokens that actually changed in Figma since the last sync. Use `dry-run` to preview what would change. Use `replace` to wipe and rewrite (rare; for resetting drift). DTCG DIALECT (`dtcgDialect`, applies to dtcg/json-flat/json-nested outputs): legacy (default): hex-string colors, maximum compatibility (Style Dictionary v4, Tokens Studio). 2025: DTCG 2025.10 object colors/dimensions (Style Dictionary v5+). figma_import_tokens accepts BOTH dialects regardless of this setting. ROUND-TRIP SAFETY: Figma variable IDs are preserved in DTCG `$extensions["figma-console-mcp"]` so renames on either side don't create duplicates. The same metadata enables non-destructive incremental sync via figma_import_tokens. Variable scopes (when non-default) and per-platform codeSyntax (when set) are stashed there too and round-trip through import.
Input schema
{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "enum": [
        "file",
        "collection"
      ],
      "description": "Whether to export the entire file's variables ('file', default) or just specific collections via collectionIds."
    },
    "collectionIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Specific Figma collection IDs to export. Required when scope is 'collection'. Use figma_get_variables to enumerate available collections."
    },
    "modes": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string",
          "const": "all"
        }
      ],
      "description": "Modes to include in the output. 'all' (default) exports every mode in every collection. Pass an array like ['Light', 'Dark'] to filter."
    },
    "format": {
      "type": "string",
      "enum": [
        "dtcg",
        "tokens-studio",
        "css-vars",
        "tailwind-v4",
        "tailwind-v3",
        "scss",
        "less",
        "ts-module",
        "json-flat",
        "json-nested",
        "style-dictionary-v3"
      ],
      "description": "Specific output format to emit. When omitted, formats come from tokens.config.json's generated.formats list. Common starting choices: 'dtcg' for the canonical JSON, 'css-vars' for runtime CSS custom properties, 'tailwind-v4' for Tailwind v4 @theme blocks."
    },
    "outputPath": {
      "type": "string",
      "description": "Filesystem path to write the output file(s) to. Relative paths resolve against the project root (the directory containing tokens.config.json) or cwd if no config. When omitted, the output is returned inline in the response (suitable for the AI to inspect or write via its own file tools)."
    },
    "configPath": {
      "type": "string",
      "description": "Explicit path to a tokens.config.json file. When omitted, the tool walks up from cwd looking for one — typical case is zero-arg."
    },
    "strategy": {
      "type": "string",
      "enum": [
        "merge",
        "replace",
        "dry-run"
      ],
      "description": "How to handle existing output files. 'merge' (default) diffs against current contents and writes only changed tokens, preserving code-only additions. 'replace' wipes and rewrites. 'dry-run' computes the diff and reports what would change without writing."
    },
    "prefix": {
      "type": "string",
      "description": "Prefix prepended to every output token name (e.g. 'ds-', 'al-'). Only affects formatters that emit named tokens — DTCG and JSON outputs use unmodified paths."
    },
    "resolveAliases": {
      "type": "boolean",
      "description": "If true, alias references are resolved to literal values in the output. Default is false for JSON formats (preserves alias semantics) and true for CSS/SCSS/Tailwind/etc. (which can't natively express aliases)."
    },
    "splitByMode": {
      "type": "boolean",
      "description": "Emit one file per mode (e.g. tokens-light.css, tokens-dark.css). Default false (single file with all modes)."
    },
    "splitByCollection": {
      "type": "boolean",
      "description": "Emit one file per Figma collection. Default false. Useful when collections map to different runtime themes."
    },
    "dtcgDialect": {
      "type": "string",
      "enum": [
        "legacy",
        "2025"
      ],
      "description": "DTCG dialect for dtcg/json-flat/json-nested outputs. legacy (default): hex-string colors, maximum compatibility (Style Dictionary v4, Tokens Studio). 2025: DTCG 2025.10 object colors/dimensions (Style Dictionary v5+). Other formats (css-vars, scss, tailwind, ts-module) render final code and ignore this option."
    },
    "colorFormat": {
      "type": "string",
      "enum": [
        "hex",
        "hex8",
        "rgba",
        "oklch",
        "hsl"
      ],
      "description": "Color value format in the output. Default: 'hex'. Use 'oklch' for modern Tailwind v4 charts."
    },
    "sizeUnit": {
      "type": "string",
      "enum": [
        "px",
        "rem",
        "pt",
        "dp"
      ],
      "description": "Unit for dimension tokens. Default: 'rem' for web outputs, 'pt' for iOS, 'dp' for Android."
    },
    "remBase": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Base font size in pixels for px→rem conversion. Default: 16."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_focus_slideNavigate to and focus a specific slide in single-slide view.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide to focus"
    }
  },
  "required": [
    "slideId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_generate_changelogGenerate a human-readable markdown changelog between two versions. Wraps figma_diff_versions and enriches the output with author labels and timestamps via figma_get_file_versions lookback (one extra cheap API call). Returns BOTH a `markdown` string (paste into release notes / PRs / Storybook MDX) and the structured diff data. Same component_ids and mode semantics as figma_diff_versions. Use 'current' for to_version to changelog against HEAD.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "from_version": {
      "type": "string",
      "description": "The earlier version_id. Get from figma_get_file_versions."
    },
    "to_version": {
      "type": "string",
      "description": "The later version_id. Use 'current' for HEAD."
    },
    "component_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Node IDs to include in the per-component changelog section. If omitted, falls back to the current Figma selection."
    },
    "mode": {
      "type": "string",
      "enum": [
        "summary",
        "standard",
        "detailed"
      ],
      "default": "standard",
      "description": "Output verbosity. summary=one-liner, standard=sectioned with counts (default), detailed=full per-property/per-binding bullets."
    }
  },
  "required": [
    "from_version",
    "to_version"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_generate_component_docGenerate AI-complete component documentation from a Figma component. Produces structured markdown with anatomy, per-variant color tokens, typography, content guidelines (parsed from Figma description), design annotations (animation timings, interaction specs, accessibility notes from Dev Mode), icon mapping, spacing tokens, and design-code parity analysis. Merges Figma design data with optional code-side info (CVA definitions, sub-component APIs, source files). Output works with any docs platform. For richest output, read the component source code first and pass codeInfo. Pass history: { figma: true, git: true } to add an ongoing '## History' section: per-version design changes pulled from Figma version history and scoped to this component, plus recent git commits touching its source files.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "nodeId": {
      "type": "string",
      "description": "Component node ID (e.g., '695:313')"
    },
    "codeInfo": {
      "type": "object",
      "properties": {
        "props": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "required": {
                "type": "boolean"
              },
              "defaultValue": {
                "type": "string"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "type"
            ],
            "additionalProperties": false
          },
          "description": "Component props"
        },
        "events": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "payload": {
                "type": "string"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          },
          "description": "Events emitted by the component"
        },
        "slots": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          },
          "description": "Named slots"
        },
        "importStatement": {
          "type": "string",
          "description": "Import statement for the component"
        },
        "usageExamples": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "code": {
                "type": "string"
              },
              "language": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "code"
            ],
            "additionalProperties": false
          },
          "description": "Usage examples"
        },
        "changelog": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "version": {
                "type": "string"
              },
              "date": {
                "type": "string"
              },
              "changes": {
                "type": "string"
              }
            },
            "required": [
              "version",
              "date",
              "changes"
            ],
            "additionalProperties": false
          },
          "description": "Changelog entries"
        },
        "filePath": {
          "type": "string",
          "description": "Component file path"
        },
        "packageName": {
          "type": "string",
          "description": "Package name"
        },
        "variantDefinition": {
          "type": "string",
          "description": "CVA or variant definition code block"
        },
        "subComponents": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "element": {
                "type": "string",
                "description": "HTML element rendered (e.g., 'div', 'span')"
              },
              "dataSlot": {
                "type": "string",
                "description": "data-slot attribute value"
              },
              "props": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "defaultValue": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "name",
                    "type"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          },
          "description": "Sub-components that compose this component (e.g., AlertTitle, AlertDescription)"
        },
        "sourceFiles": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "role": {
                "type": "string"
              },
              "variants": {
                "type": "number"
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "path",
              "role"
            ],
            "additionalProperties": false
          },
          "description": "All source files related to this component"
        },
        "baseComponent": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false,
          "description": "Base component this extends (e.g., shadcn/ui Alert)"
        }
      },
      "additionalProperties": false,
      "description": "Code-side documentation info. Read the component source code first, then fill in relevant sections. Include variantDefinition for CVA/variant code, subComponents for composable sub-parts, sourceFiles for all related files, and baseComponent for attribution."
    },
    "sections": {
      "type": "object",
      "properties": {
        "overview": {
          "type": "boolean",
          "default": true
        },
        "anatomy": {
          "type": "boolean",
          "default": true
        },
        "statesAndVariants": {
          "type": "boolean",
          "default": true
        },
        "visualSpecs": {
          "type": "boolean",
          "default": true
        },
        "typography": {
          "type": "boolean",
          "default": true
        },
        "contentGuidelines": {
          "type": "boolean",
          "default": true
        },
        "behavior": {
          "type": "boolean",
          "default": false
        },
        "implementation": {
          "type": "boolean",
          "default": true
        },
        "accessibility": {
          "type": "boolean",
          "default": true
        },
        "designAnnotations": {
          "type": "boolean",
          "default": true
        },
        "relatedComponents": {
          "type": "boolean",
          "default": false
        },
        "changelog": {
          "type": "boolean",
          "default": true
        },
        "parity": {
          "type": "boolean",
          "default": true
        }
      },
      "additionalProperties": false,
      "description": "Toggle which sections to include"
    },
    "outputPath": {
      "type": "string",
      "description": "Suggested output file path"
    },
    "systemName": {
      "type": "string",
      "description": "Design system name for headers"
    },
    "enrich": {
      "type": "boolean",
      "default": true,
      "description": "Enable enrichment for token data"
    },
    "includeFrontmatter": {
      "type": "boolean",
      "default": true,
      "description": "Include YAML frontmatter metadata"
    },
    "history": {
      "type": "object",
      "properties": {
        "figma": {
          "type": "boolean",
          "default": false,
          "description": "Pull design history from Figma version history, scoped to this component. Costs roughly one API call per version walked."
        },
        "git": {
          "type": "boolean",
          "default": false,
          "description": "Pull code history via `git log` for the component's source files. Local mode only."
        },
        "versions": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20,
          "default": 5,
          "description": "How many Figma versions to walk back. Default 5, max 20."
        },
        "includeAutosaves": {
          "type": "boolean",
          "default": false,
          "description": "Include unlabeled Figma auto-saves. Default false — autosaves are noisy and often unattributed."
        },
        "mode": {
          "type": "string",
          "enum": [
            "summary",
            "standard",
            "detailed"
          ],
          "default": "standard",
          "description": "Design-history verbosity. detailed names individual properties and variable bindings."
        },
        "gitLimit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50,
          "default": 10,
          "description": "How many commits to list. Default 10, max 50."
        },
        "gitPaths": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Explicit paths to log commits for. Defaults to codeInfo.filePath plus codeInfo.sourceFiles[].path."
        },
        "repoPath": {
          "type": "string",
          "description": "Repo directory to run git in. Defaults to the server's working directory."
        }
      },
      "additionalProperties": false,
      "description": "Pull an ongoing changelog from Figma version history and/or git. When enabled, replaces the manual '## Changelog' section with a richer '## History' section. Both sources are off by default so existing callers are unaffected."
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_annotation_categoriesList available annotation categories in the current Figma file. Categories group annotations by purpose (e.g., interactions, accessibility, development notes). Use the returned category IDs when creating annotations with figma_set_annotations. Requires Desktop Bridge plugin.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_get_annotationsRead annotations from a Figma node. Annotations are designer-authored specs attached to nodes — they can include notes (plain text or markdown), pinned design properties (fills, width, fontSize, etc.), and category labels. Use this to discover animation timings, interaction specs, accessibility requirements, and other implementation details that designers annotate directly on the design. Set include_children=true to get annotations from child nodes too (useful for full component documentation). Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Node ID to read annotations from (e.g., '695:313')"
    },
    "include_children": {
      "type": "boolean",
      "default": false,
      "description": "Also read annotations from child nodes. Useful for getting all annotations within a component tree."
    },
    "depth": {
      "type": "number",
      "default": 1,
      "description": "How many levels deep to traverse when include_children is true (default: 1, max recommended: 5)"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_changes_since_versionConvenience wrapper for figma_diff_versions: compares a given version against the current HEAD. Same output shape as figma_diff_versions, with to_version implicitly 'current'. Useful for 'what's changed since the last code-sync' workflows.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "since_version": {
      "type": "string",
      "description": "The version_id to compare against the current HEAD."
    },
    "component_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Node IDs to diff in detail. If omitted, falls back to the current Figma selection. Same semantics as figma_diff_versions otherwise."
    },
    "mode": {
      "type": "string",
      "enum": [
        "summary",
        "standard",
        "detailed"
      ],
      "default": "standard"
    }
  },
  "required": [
    "since_version"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_commentsGet comments on a Figma file. Returns comment threads with author, message, timestamps, and pinned node locations. Use include_resolved to also see resolved comments.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "as_md": {
      "type": "boolean",
      "default": false,
      "description": "Return comment message bodies as markdown. Default: false"
    },
    "include_resolved": {
      "type": "boolean",
      "default": false,
      "description": "Include resolved (completed) comment threads. Default: false (only active comments)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_componentGet a SINGLE component's metadata or reconstruction specification. Two export formats: (1) 'metadata' (default) - comprehensive documentation with properties, variants, and design tokens for style guides and references, (2) 'reconstruction' - node tree specification compatible with Figma Component Reconstructor plugin for programmatic component creation. IMPORTANT: For local/unpublished components with metadata format, ensure the Figma Desktop Bridge plugin is running (Right-click in Figma → Plugins → Development → Figma Desktop Bridge) to get complete description data. TIP: To get ALL components with visual specs in one call, prefer figma_get_design_system_kit instead.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). Auto-detected from WebSocket Desktop Bridge connection. Only required if not connected."
    },
    "nodeId": {
      "type": "string",
      "description": "Component node ID (e.g., '123:456')"
    },
    "format": {
      "type": "string",
      "enum": [
        "metadata",
        "reconstruction"
      ],
      "default": "metadata",
      "description": "Export format: 'metadata' (default) for comprehensive documentation, 'reconstruction' for node tree specification compatible with Figma Component Reconstructor plugin"
    },
    "enrich": {
      "type": "boolean",
      "description": "Set to true when user asks for: design token coverage, hardcoded value analysis, or component quality metrics. Adds token coverage analysis and hardcoded value detection. Default: false. Only applicable for metadata format."
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_component_detailsGet full details for a specific component including all variants, properties, and keys needed for instantiation. Use the component key or name from figma_search_components.
Input schema
{
  "type": "object",
  "properties": {
    "componentKey": {
      "type": "string",
      "description": "The component key (preferred for exact match)"
    },
    "componentName": {
      "type": "string",
      "description": "The component name (used if key not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_component_for_developmentGet component data optimized for high-fidelity UI implementation. Returns a deep component tree (depth 4) with design tokens (boundVariables), interaction states (reactions), sizing constraints (min/max/layoutSizing), text behavior (autoResize, truncation), Figma slots (named freeform-content regions on a component, with the components each accepts and any min/max limit violations), and design annotations. Automatically includes 2x rendered image. Use when user asks to: 'build this component', 'implement this in React/Vue', 'generate code for', or needs both visual reference and technical specs for production-quality, accessible, token-aware code. For just metadata/descriptions, use figma_get_component. For just image, use figma_get_component_image. For full annotation details, use figma_get_annotations. To resolve variable IDs to names/values, use figma_get_variables.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). REQUIRED unless figma_navigate was already called."
    },
    "nodeId": {
      "type": "string",
      "description": "Component node ID to get data for (e.g., '695:313')"
    },
    "includeImage": {
      "type": "boolean",
      "default": true,
      "description": "Include rendered image for visual reference (default: true)"
    },
    "codebasePath": {
      "type": "string",
      "description": "Path to target codebase components directory (e.g., '/Users/me/project/src/components'). When provided, scans for existing components and includes a registry in the response to prevent recreating components that already exist. Strongly recommended for design-to-code workflows."
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_component_for_development_deepGet a deeply nested component tree with full visual properties, resolved design token names, instance references, prototype interactions, and annotations at every level. Uses the Desktop Bridge Plugin API for unlimited depth traversal — essential for complex components like data tables, nested menus, date pickers, and compound form fields where the standard depth-4 REST API tool misses deeper structure. Returns boundVariables resolved to actual token names (not just IDs), mainComponent references for INSTANCE nodes, and reactions for interaction states. Requires Desktop Bridge plugin. For simpler components (depth ≤ 4), use figma_get_component_for_development instead.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Component node ID to extract (e.g., '695:313')"
    },
    "depth": {
      "type": "number",
      "default": 10,
      "description": "Maximum tree depth to traverse (default: 10, max: 20). Use higher values for deeply nested components."
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_component_imageRender a specific component or node as an image (PNG, JPG, SVG, PDF). Returns image URL valid for 30 days. Use when user asks for: component screenshot, visual preview, rendered output, or 'show me'. NOT for component metadata/properties (use figma_get_component). NOT for getting code/layout data (use figma_get_component_for_development). Best for: visual references, design review, documentation.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). Auto-detected from WebSocket Desktop Bridge connection. Only required if not connected."
    },
    "nodeId": {
      "type": "string",
      "description": "Component node ID to render as image (e.g., '695:313')"
    },
    "scale": {
      "type": "number",
      "minimum": 0.01,
      "maximum": 4,
      "default": 2,
      "description": "Image scale factor (0.01-4, default: 2 for high quality)"
    },
    "format": {
      "type": "string",
      "enum": [
        "png",
        "jpg",
        "svg",
        "pdf"
      ],
      "default": "png",
      "description": "Image format (default: png)"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_console_logsRetrieve console logs from Figma Desktop. FOR PLUGIN DEVELOPERS: This works immediately - no navigation needed! Just check logs, run your plugin in Figma Desktop, check logs again. All plugin logs ([Main], [Swapper], etc.) appear instantly.
Input schema
{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "default": 100,
      "description": "Number of recent logs to retrieve"
    },
    "level": {
      "type": "string",
      "enum": [
        "log",
        "info",
        "warn",
        "error",
        "debug",
        "all"
      ],
      "default": "all",
      "description": "Filter by log level"
    },
    "since": {
      "type": "number",
      "description": "Only logs after this timestamp (Unix ms)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_design_changesGet recent document changes detected in Figma. Returns buffered change events including which nodes changed, whether styles were modified, and change counts. WebSocket-only — events are captured via Desktop Bridge plugin. Use this to understand what changed since you last checked.
Input schema
{
  "type": "object",
  "properties": {
    "since": {
      "type": "number",
      "description": "Only return changes after this Unix timestamp (ms). Useful for incremental polling."
    },
    "count": {
      "type": "number",
      "description": "Maximum number of change events to return (chronological order, oldest to newest; returns the last N events)"
    },
    "clear": {
      "type": "boolean",
      "default": false,
      "description": "Clear the change buffer after reading. Set to true for polling workflows."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_design_system_kitPREFERRED TOOL for design system extraction — replaces separate figma_get_styles, figma_get_variables, and figma_get_component calls. Returns tokens, components, and styles in a single optimized response with adaptive compression for large systems. Includes component visual specs (exact colors, padding, typography, layout), rendered screenshots, token values per mode (light/dark), and resolved style values. Use this instead of calling individual tools to avoid context window overflow. Ideal for AI code generation — use visualSpec for pixel-accurate reproduction. Variant specs are delta-encoded: the base variant carries the full visualSpec, siblings carry visualSpecDelta with only the properties that differ. Tokens/variables are read through the connected Desktop Bridge or cloud relay and work on ANY Figma plan — no Enterprise required. If a tokens fetch ever reports the Variables REST API is plan-limited (403), the bridge/relay is the plan-independent path: ensure it's connected and retry rather than abandoning variables.
Input schema
{
  "type": "object",
  "properties": {
    "fileKey": {
      "type": "string",
      "description": "Figma file key. If omitted, extracted from the current browser URL."
    },
    "include": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "tokens",
          "components",
          "styles"
        ]
      },
      "default": [
        "tokens",
        "components",
        "styles"
      ],
      "description": "Which sections to include. Defaults to all."
    },
    "componentIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional list of specific component node IDs to include. If omitted, all published components are returned."
    },
    "includeImages": {
      "type": "boolean",
      "default": false,
      "description": "Include image URLs for components (adds latency). Default false."
    },
    "format": {
      "type": "string",
      "enum": [
        "full",
        "summary",
        "compact"
      ],
      "default": "full",
      "description": "'full' returns complete data with visual specs and resolved values. 'summary' strips variant-level visual specs (medium payload). 'compact' returns only names, types, and property definitions (smallest payload, best for large design systems). Auto-compresses if response exceeds safe size regardless of format setting."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_design_system_summaryGet a compact overview of the design system. Returns categories, component counts, and token collection names WITHOUT full details. Use this first to understand what's available, then use figma_search_components to find specific components. This tool is optimized for minimal token usage.
Input schema
{
  "type": "object",
  "properties": {
    "forceRefresh": {
      "type": "boolean",
      "default": false,
      "description": "Force refresh the cached data (use sparingly - extraction can take minutes for large files)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_file_at_versionFetch a Figma file (or specific nodes) as it existed at a past version_id. Thin snapshot tool — same shape as figma_get_file_data but bound to a historical version. Use figma_get_file_versions to discover version IDs. Combine with depth and node_ids to keep payloads small. Required scope: file_content:read (already standard).
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "version_id": {
      "type": "string",
      "description": "The version ID to snapshot (from figma_get_file_versions)."
    },
    "node_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional: snapshot only these node IDs instead of the full file. Reduces payload significantly for targeted inspection."
    },
    "depth": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "description": "How deep into the document tree to recurse. Lower is cheaper. Default: full depth (no limit)."
    }
  },
  "required": [
    "version_id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_file_dataGet full file structure and document tree. WARNING: Can consume large amounts of tokens. NOT recommended for component descriptions (use figma_get_component instead). Best for understanding file structure or finding component nodeIds. Start with verbosity='summary' and depth=1 for initial exploration.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). Auto-detected from WebSocket Desktop Bridge connection. Only required if not connected."
    },
    "depth": {
      "type": "number",
      "minimum": 0,
      "maximum": 3,
      "default": 1,
      "description": "How many levels of children to include (default: 1, max: 3). Start with 1 to prevent context exhaustion. Use 0 for full tree only when absolutely necessary."
    },
    "verbosity": {
      "type": "string",
      "enum": [
        "summary",
        "standard",
        "full"
      ],
      "default": "summary",
      "description": "Controls payload size: 'summary' (IDs/names/types only, ~90% smaller - RECOMMENDED), 'standard' (essential properties, ~50% smaller), 'full' (everything). Default: summary for token efficiency."
    },
    "nodeIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Specific node IDs to retrieve (optional)"
    },
    "enrich": {
      "type": "boolean",
      "description": "Set to true when user asks for: file statistics, health metrics, design system audit, or quality analysis. Adds statistics, health scores, and audit summaries. Default: false"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_file_for_pluginGet file data optimized for plugin development with filtered properties (IDs, structure, plugin data, component relationships). Excludes visual properties (fills, strokes, effects) to reduce payload. Use when user asks for: plugin development, file structure for manipulation, node IDs for plugin API. NOT for component descriptions (use figma_get_component). NOT for visual/styling data (use figma_get_component_for_development). Supports deeper tree traversal (max depth=5) than figma_get_file_data.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). REQUIRED unless figma_navigate was already called."
    },
    "depth": {
      "type": "number",
      "minimum": 0,
      "maximum": 5,
      "default": 2,
      "description": "How many levels of children to include (default: 2, max: 5). Higher depths are safe here due to filtering."
    },
    "nodeIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Specific node IDs to retrieve (optional)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_file_versionsList a Figma file's version history with metadata (label, description, author, timestamp). Auto-paginates up to max_versions. By default returns only labeled versions (skips auto-saves). Pass include_autosaves=true to see every saved state. Use the returned pagination.next_cursor to continue paging. Required scope: file_versions:read (OAuth) or 'Versions' Read (PAT).
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "include_autosaves": {
      "type": "boolean",
      "default": false,
      "description": "Include auto-saved versions (those without a label). Default: false."
    },
    "max_versions": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Hard cap on returned versions. Default 50, max 200."
    },
    "cursor": {
      "type": "string",
      "description": "Version ID returned as pagination.next_cursor on a previous call. Pass to continue from where the last call stopped."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_focused_slideGet the slide currently focused in single-slide view.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_get_library_component_by_keyGet full property definitions, variants, and visual specs for a SINGLE published library component using only its component key. **USE THIS when you have a component key** (the 40-char hex returned by figma_search_components, figma_get_library_components, or search_design_system) **and want to inspect what properties/variants it exposes** before instantiating it — without first needing the source library file's URL. **RESOLVES**: componentKey → file_key + node_id → componentPropertyDefinitions + variants + visualSpec. **WORKFLOW**: 1. Pass the componentKey from search results 2. Tool tries /v1/component_sets/{key} first (most common case — buttons, inputs with variants) 3. On 404 falls back to /v1/components/{key} (standalone components) 4. Fetches the parent COMPONENT_SET at depth=2 to read componentPropertyDefinitions and per-variant visual data 5. For COMPONENT_SET keys, also fetches the source file's /components list to map each variant's node to its published variant key (needed for figma_instantiate_component) **REQUIRES** FIGMA_ACCESS_TOKEN with library_assets:read and files:read scopes.
Input schema
{
  "type": "object",
  "properties": {
    "componentKey": {
      "type": "string",
      "minLength": 1,
      "description": "The component key (40-char hex string from search results, e.g., '806826503bbd2ab15d0ff77d076a9406a5a83197'). Works for both COMPONENT_SET and standalone COMPONENT keys."
    },
    "includeVisualSpecs": {
      "type": "boolean",
      "default": true,
      "description": "Include per-variant visual specs (fills, strokes, padding, typography). Default true. Auto-stripped if response exceeds 500KB."
    },
    "format": {
      "type": "string",
      "enum": [
        "full",
        "summary"
      ],
      "default": "full",
      "description": "'full' returns properties + variants + visual specs. 'summary' returns properties + variant names only (no visualSpec). Auto-downgrades to 'summary' on large responses."
    }
  },
  "required": [
    "componentKey"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_library_componentsDiscover published components from a shared/team library file. **USE THIS when you need to use components from a published design system library** (a different file than the one currently open). This bridges the gap between library discovery and instantiation. **WORKFLOW:** 1. Call this tool with the library file's URL or file key 2. Browse the returned components — results include COMPONENT_SET (with variants array) and standalone COMPONENT types 3. Use figma_instantiate_component with a VARIANT key (from the variants array inside a COMPONENT_SET result, NOT the component set key itself) **SEARCH NOTE:** The query filter matches both component names AND descriptions. If you get unexpected results (e.g., "Accordion" when searching "Button"), verify the result name matches what you need — it may have matched on a description mention. **MULTI-FILE TIP:** If you need to find a specific component and REST API search returns too many results, you can switch to the library file via figma_navigate, use figma_execute to find the exact component and its variant key, then switch back. **NOTE:** Requires FIGMA_ACCESS_TOKEN to be set (uses the Figma REST API to read the library file).
Input schema
{
  "type": "object",
  "properties": {
    "libraryFileUrl": {
      "type": "string",
      "description": "The URL of the library file (e.g., https://www.figma.com/design/abc123/My-Design-System). Either this or libraryFileKey is required."
    },
    "libraryFileKey": {
      "type": "string",
      "description": "The file key of the library file (e.g., 'abc123'). Either this or libraryFileUrl is required."
    },
    "query": {
      "type": "string",
      "description": "Search query to filter components by name (e.g., 'Button', 'Card'). Leave empty to get all components."
    },
    "limit": {
      "type": "number",
      "default": 25,
      "description": "Maximum results to return (default: 25, max: 100)"
    },
    "offset": {
      "type": "number",
      "default": 0,
      "description": "Offset for pagination"
    },
    "includeVariants": {
      "type": "boolean",
      "default": false,
      "description": "Include individual variant components (default: false, only returns component sets)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_library_variablesList all variables from team libraries the current file has subscribed. **USE THIS** when you want to see what design tokens (colors, spacing, typography sizes, booleans, strings) are available from shared libraries — without needing the library file's URL or REST API Enterprise plan. **HOW IT WORKS**: Calls figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync() + getVariablesInLibraryCollectionAsync() via the Desktop Bridge. Only libraries the user has explicitly enabled in the current file appear (Figma security model). **WORKFLOW**: 1. Call this tool to inventory available library variables 2. Find the variable you want (use libraryName + collectionName + variable name to identify) 3. Pass its key to figma_import_library_variable to bring it into the current file 4. Once imported, the variable's id can be used with figma_set_fills / figma_update_variable / any standard variable-binding tool **Filters**: libraryName/collectionName accept partial case-insensitive matches. **REQUIRES** the Desktop Bridge plugin to be running in Figma Desktop.
Input schema
{
  "type": "object",
  "properties": {
    "libraryName": {
      "type": "string",
      "description": "Optional: filter by library name (case-insensitive substring match). E.g., 'Northright' or 'Altitude'."
    },
    "collectionName": {
      "type": "string",
      "description": "Optional: filter by collection name within a library (case-insensitive substring match). E.g., 'Colors' or 'Spacing'."
    },
    "resolvedType": {
      "type": "string",
      "enum": [
        "COLOR",
        "FLOAT",
        "STRING",
        "BOOLEAN"
      ],
      "description": "Optional: filter by variable type. Useful when you only need color tokens or only spacing values."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_selectionGet the currently selected nodes in Figma. Returns node IDs, names, types, and dimensions. WebSocket-only — requires Desktop Bridge plugin. Use this to understand what the user is pointing at instead of asking them to describe it.
Input schema
{
  "type": "object",
  "properties": {
    "verbose": {
      "type": "boolean",
      "default": false,
      "description": "If true, fetches additional details (fills, strokes, styles) for each selected node via figma_execute"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_slide_contentGet the content tree of a specific slide including all text, shapes, and frames. Returns node hierarchy with properties.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide, e.g. '1:23'"
    }
  },
  "required": [
    "slideId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_slide_gridGet the 2D slide grid layout showing how slides are organized in rows and columns.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_get_slide_transitionGet the current transition settings for a slide (style, duration, easing curve, timing).
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    }
  },
  "required": [
    "slideId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_slotsList SlotNode children on a component, component set, or instance. Returns slot IDs, names, property keys, dimensions, and current child nodes. Use on instances before figma_append_to_slot to discover slot names/IDs.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "COMPONENT, COMPONENT_SET, or INSTANCE node ID"
    }
  },
  "required": [
    "nodeId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_statusCheck connection status to Figma Desktop. Reports transport status and connection health via the Desktop Bridge plugin (WebSocket transport). Use probe:true for an active roundtrip verification that the plugin is actually responding.
Input schema
{
  "type": "object",
  "properties": {
    "probe": {
      "type": "boolean",
      "description": "When true, sends a live roundtrip command to the plugin to verify the connection is actually responsive (not just TCP-open). Returns probeResult with success/latency. Recommended for health checks."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_stylesGet all styles (color, text, effects, grids) from a Figma file with optional code exports. Use when user asks for: text styles, color palette, design system styles, typography, or style documentation. Returns organized style definitions with resolved values. NOT for design tokens/variables (use figma_get_variables). Set enrich=true for CSS/Tailwind/Sass code examples. Supports verbosity control to manage payload size. TIP: For full design system extraction (tokens + components + styles combined), prefer figma_get_design_system_kit instead — it returns everything in one optimized call.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). Auto-detected from WebSocket Desktop Bridge connection. Only required if not connected."
    },
    "verbosity": {
      "type": "string",
      "enum": [
        "summary",
        "standard",
        "full"
      ],
      "default": "standard",
      "description": "Controls payload size: 'summary' (names/types only, ~85% smaller), 'standard' (essential properties, ~40% smaller), 'full' (everything). Default: standard"
    },
    "enrich": {
      "type": "boolean",
      "description": "Set to true when user asks for: CSS/Sass/Tailwind code, export formats, usage information, code examples, or design system exports. Adds resolved values, usage analysis, and export format examples. Default: false for backward compatibility"
    },
    "include_usage": {
      "type": "boolean",
      "description": "Include component usage information (requires enrich=true)"
    },
    "include_exports": {
      "type": "boolean",
      "description": "Include export format examples (requires enrich=true)"
    },
    "export_formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "css",
          "sass",
          "tailwind",
          "typescript",
          "json"
        ]
      },
      "description": "Which code formats to generate examples for. Use when user mentions specific formats like 'CSS', 'Tailwind', 'SCSS', 'TypeScript', etc. Automatically enables enrichment. Default: all formats"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_text_stylesGet all local text styles in the current file. Returns style IDs, names, font info, and sizes. Use these IDs when setting textStyleId on text nodes via figma_execute.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_get_token_valuesGet actual values for design tokens (colors, spacing, etc). Use after figma_get_design_system_summary to get specific token values for implementation.
Input schema
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "colors",
        "spacing",
        "all"
      ],
      "default": "all",
      "description": "Type of tokens to retrieve"
    },
    "filter": {
      "type": "string",
      "description": "Filter token names (e.g., 'primary' to get all primary colors)"
    },
    "limit": {
      "type": "number",
      "default": 50,
      "description": "Maximum tokens to return (default: 50)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_get_variablesExtract design tokens and variables from a Figma file with code export support (CSS, Tailwind, TypeScript, Sass). Use when user asks for: design system tokens, variables, color/spacing values, theme data, or code exports. Handles multi-mode variables (Light/Dark themes). NOT for component metadata (use figma_get_component). Returns a compact summary by default — pass format='full' for the complete dataset or format='filtered' with collection/namePattern/mode filters for specific variables. Supports verbosity control to prevent token exhaustion. Resolution order: Desktop Bridge plugin (works on any plan) → Variables REST API (Enterprise only) → Styles API as a partial fallback. TIP: For full design system extraction (tokens + components + styles combined), prefer figma_get_design_system_kit instead — it returns everything in one optimized call.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL (e.g., https://figma.com/design/abc123). Auto-detected from WebSocket Desktop Bridge connection. Only required if not connected."
    },
    "includePublished": {
      "type": "boolean",
      "default": true,
      "description": "Include published variables from libraries"
    },
    "verbosity": {
      "type": "string",
      "enum": [
        "inventory",
        "summary",
        "standard",
        "full"
      ],
      "default": "standard",
      "description": "Controls payload size: 'inventory' (names/IDs only, ~95% smaller, use with filtered), 'summary' (names/values only, ~80% smaller), 'standard' (essential properties, ~45% smaller), 'full' (everything). Default: standard"
    },
    "enrich": {
      "type": "boolean",
      "description": "Set to true when user asks for: CSS/Sass/Tailwind exports, code examples, design tokens, usage information, dependencies, or any export format. Adds resolved values, dependency graphs, and usage analysis. Default: false"
    },
    "include_usage": {
      "type": "boolean",
      "description": "Include usage in styles and components (requires enrich=true)"
    },
    "include_dependencies": {
      "type": "boolean",
      "description": "Include variable dependency graph (requires enrich=true)"
    },
    "include_exports": {
      "type": "boolean",
      "description": "Include export format examples (requires enrich=true)"
    },
    "export_formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "css",
          "sass",
          "tailwind",
          "typescript",
          "json"
        ]
      },
      "description": "Which code formats to generate examples for. Use when user mentions specific formats like 'CSS', 'Tailwind', 'SCSS', 'TypeScript', etc. Automatically enables enrichment."
    },
    "format": {
      "type": "string",
      "enum": [
        "summary",
        "filtered",
        "full"
      ],
      "description": "Response format: 'summary' (~2K tokens with overview and names only), 'filtered' (apply collection/name/mode filters), 'full' (complete dataset from cache or fetch). Default: summary (token-efficient). When format is omitted, filter params (collection/namePattern/mode) auto-select 'filtered', and enrichment/export/resolveAliases/returnAsLinks params auto-select 'full'. Full format returns all data but may be auto-summarized if >25K tokens."
    },
    "collection": {
      "type": "string",
      "description": "Filter variables by collection name or ID. Case-insensitive substring match. Only applies when format='filtered'. Example: 'Primitives' or 'VariableCollectionId:123'"
    },
    "namePattern": {
      "type": "string",
      "description": "Filter variables by name using regex pattern or substring. Case-insensitive. Only applies when format='filtered'. Example: 'color/brand' or '^typography'"
    },
    "mode": {
      "type": "string",
      "description": "Filter variables by mode name or ID. Only returns variables that have values for this mode. Only applies when format='filtered'. Example: 'Light' or 'Dark'"
    },
    "returnAsLinks": {
      "type": "boolean",
      "default": false,
      "description": "Return variables as resource_link references instead of full data. Drastically reduces payload size (100+ variables = ~20KB vs >1MB). Recommended for large variable sets — combine with format='filtered' + namePattern/collection/mode to fetch only the variables you need. Default: false"
    },
    "refreshCache": {
      "type": "boolean",
      "default": false,
      "description": "Force refresh cache by fetching fresh data from Figma. Use when data may have changed since last fetch. Default: false (use cached data if available and fresh)"
    },
    "useConsoleFallback": {
      "type": "boolean",
      "default": true,
      "description": "DEPRECATED — has no effect. The console-snippet workflow was removed in the Phase 3 CDP cleanup; the Desktop Bridge plugin now handles all non-REST variable extraction automatically. Kept for parameter compatibility only — safe to ignore."
    },
    "parseFromConsole": {
      "type": "boolean",
      "default": false,
      "description": "DEPRECATED — setting this to true now raises an explicit error. The Puppeteer-based console parser no longer exists. Open the Figma Console MCP Desktop Bridge plugin in Figma Desktop and call figma_get_variables() without parseFromConsole; the plugin returns full variable data through the WebSocket bridge."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number for paginated results (1-based). Use when response is too large (>1MB). Each page returns up to 50 variables."
    },
    "pageSize": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 50,
      "description": "Number of variables per page (1-100). Default: 50. Smaller values reduce response size."
    },
    "resolveAliases": {
      "type": "boolean",
      "default": false,
      "description": "Automatically resolve variable aliases to their final values (hex colors, numbers, etc.). When true, each variable will include a 'resolvedValuesByMode' field with the actual values instead of just alias references. Useful for getting color hex values without manual resolution. Default: false."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_import_library_variableImport a single variable from a subscribed team library into the current file. After import, the variable becomes locally addressable by its returned 'id' and can be passed to any tool that binds variables to nodes (fills, strokes, paddings, etc.). The import is idempotent — calling it twice returns the same local id. **WORKFLOW**: 1. Run figma_get_library_variables to find the variable key 2. Call this tool with that key 3. Use the returned 'id' with figma_set_fills (boundVariables), figma_update_variable, or other binding tools **REQUIRES** the Desktop Bridge plugin and that the source library is subscribed by the current file (otherwise importVariableByKeyAsync rejects).
Input schema
{
  "type": "object",
  "properties": {
    "variableKey": {
      "type": "string",
      "minLength": 1,
      "description": "The variable key from figma_get_library_variables (collections[].variables[].key). Distinct from the variable's local id."
    }
  },
  "required": [
    "variableKey"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_import_tokensPush design tokens from your codebase into Figma as variables. Bidirectional with figma_export_tokens. ACCEPTS: DTCG JSON (canonical, fully supported including round-trip metadata preservation). Tokens Studio JSON, CSS custom properties, Tailwind v4 @theme, SCSS, and Style Dictionary v3 are scaffolded but return a NotImplementedError — convert to DTCG first via figma_export_tokens or hand-author DTCG. Use `format: "auto"` to sniff the input. APPLY PHASE (full bidirectional sync): toCreate entries create missing collections (with the token file's full mode list) and missing variables in one batched plugin round-trip — literal values first, alias values in a second pass so aliases between newly-created variables resolve. toUpdate entries push value updates in a batched round-trip, INCLUDING alias-target updates: when a token's value is a reference, it's written as a Figma variable alias if the reference resolves to an existing or just-created variable (unresolvable references skip with a warning). toDelete entries are STRICTLY gated behind `strategy: "replace"` — in replace mode, Figma variables absent from the token file are permanently deleted (a loud warning lists the count); merge (default) preserves them and only reports. TIMING/EASING variables cannot be created or written via the Plugin API and are skipped with a warning. Variable scopes and per-platform codeSyntax (from `$extensions["figma-console-mcp"].scopes/.codeSyntax`) are diffed and applied too — absent fields mean "no opinion" (Figma-side metadata is preserved), an explicit value is authoritative. Partial-success semantics: per-item errors surface in applyResult.errors[] without failing the batch. DIFF-AWARE: Default `strategy: "merge"` diffs against current Figma state and applies only deltas. The hacked-color scenario — designer edits one hex value in their CSS — produces exactly one Figma API update, not a full collection rewrite. Match priority: Figma variable ID (in `$extensions["figma-console-mcp"].variableId`), then exact token path, then value fingerprint. CONFLICT HANDLING: When BOTH Figma and code changed the same token since the last sync, `onConflict: "ask"` (default) surfaces the conflict and writes nothing. Use `figma-wins` / `code-wins` to auto-resolve, or `skip` to leave conflicts alone and proceed with the rest. DRY-RUN: Default first call after detecting changes is dry-run for safety. The response includes the full diff plan; user confirms, then call again with `dryRun: false` (or `strategy` other than dry-run) to apply.
Input schema
{
  "type": "object",
  "properties": {
    "format": {
      "type": "string",
      "enum": [
        "auto",
        "dtcg",
        "tokens-studio",
        "css-vars",
        "tailwind-v4",
        "tailwind-v3-config",
        "scss",
        "style-dictionary-v3",
        "json-flat",
        "json-nested"
      ],
      "description": "Format of the input payload. 'auto' (default) detects from payload shape or file extension. Pass an explicit format if auto-detection misfires."
    },
    "payload": {
      "type": "string",
      "description": "Single-file content to import. Use this for one-shot imports without setting up tokens.config.json. Mutually exclusive with `files` and `configPath`."
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "description": "Relative or absolute filesystem path."
          },
          "content": {
            "type": "string",
            "description": "File contents."
          }
        },
        "required": [
          "path",
          "content"
        ],
        "additionalProperties": false
      },
      "description": "Multi-file import (used for Tokens Studio's split-set format, or for projects with many DTCG source files). Mutually exclusive with `payload` and `configPath`."
    },
    "configPath": {
      "type": "string",
      "description": "Explicit path to tokens.config.json. When omitted, the tool autodiscovers and uses the config's source.dir to find files. Mutually exclusive with `payload` and `files`."
    },
    "strategy": {
      "type": "string",
      "enum": [
        "merge",
        "replace",
        "dry-run"
      ],
      "description": "How to apply changes. 'merge' (default) diffs against current Figma state and applies only deltas, preserving Figma-only variables. 'replace' wipes the target collections and rewrites. 'dry-run' computes the diff and reports without touching Figma."
    },
    "collectionMapping": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Map input token set names to Figma collection names. Example: {'primitives': 'Primitive Tokens'}. When omitted, set names map 1:1 to collection names."
    },
    "modeMapping": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Map input mode names to Figma mode names. Useful when source uses 'light'/'dark' and Figma uses 'Light'/'Dark'. Defaults to 1:1 mapping with case preservation."
    },
    "prefix": {
      "type": "string",
      "description": "Prefix to strip from input token names on import. E.g. with prefix 'ds-', a token named '--ds-color-primary' becomes 'color/primary'."
    },
    "onConflict": {
      "type": "string",
      "enum": [
        "ask",
        "figma-wins",
        "code-wins",
        "skip"
      ],
      "description": "How to resolve true two-sided conflicts (both Figma and code changed the same token since last sync). 'ask' (default) surfaces the conflict and writes nothing. 'figma-wins' / 'code-wins' apply the corresponding side. 'skip' leaves conflicted tokens alone but proceeds with the rest."
    },
    "dryRun": {
      "type": "boolean",
      "description": "Shorthand for strategy: 'dry-run'. Computes the diff and returns a preview without applying any changes to Figma."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_instantiate_componentCreate an instance of a component from the design system. **CRITICAL: Always pass BOTH componentKey AND nodeId together!** Search results return both identifiers. Pass both so the tool can automatically fall back to nodeId if the component isn't published to a library. Most local/unpublished components require nodeId. **IMPORTANT: Always re-search before instantiating!** NodeIds are session-specific and may be stale from previous conversations. ALWAYS search for components at the start of each design session to get current, valid identifiers. **VISUAL VALIDATION WORKFLOW:** After instantiating components, use figma_take_screenshot to verify the result looks correct. Check placement, sizing, and visual balance.
Input schema
{
  "type": "object",
  "properties": {
    "componentKey": {
      "type": "string",
      "description": "The component key from search results. Pass this WITH nodeId for automatic fallback."
    },
    "nodeId": {
      "type": "string",
      "description": "The node ID from search results. ALWAYS pass this alongside componentKey - most local components need it."
    },
    "variant": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Variant properties to set (e.g., { Type: 'Simple', State: 'Active' })"
    },
    "overrides": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      },
      "description": "Property overrides (e.g., { 'Button Label': 'Click Me' })"
    },
    "position": {
      "type": "object",
      "properties": {
        "x": {
          "type": "number"
        },
        "y": {
          "type": "number"
        }
      },
      "required": [
        "x",
        "y"
      ],
      "additionalProperties": false,
      "description": "Position on canvas (default: 0, 0)"
    },
    "parentId": {
      "type": "string",
      "description": "Parent node ID to append the instance to"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_lint_designRun comprehensive accessibility (WCAG 2.2) and design quality checks on the current page or a specific node tree. WCAG conformance checks (10 rules): color contrast (AA), non-text contrast (1.4.11), color-only differentiation (1.4.1), focus indicators (2.4.7), touch targets (2.5.8), image alt text (1.1.1), heading hierarchy (1.3.1), reflow/responsive (1.4.10), reading order (1.3.2), and disabled context (4.1.2). Best-practice readability hints (opt-in via rules: ['best-practice'] or ['all']): text sizing, line height, letter spacing, paragraph spacing. Note: line/paragraph spacing below 1.5x/2x is NOT a WCAG 1.4.12 failure — 1.4.12 requires supporting user spacing overrides without breaking (a code concern, see figma_scan_code_accessibility), not specific design values — so these are non-normative hints scoped to multi-line text only. Design system checks (5 rules): hardcoded colors, missing text styles, default names, detached components, and token misuse (a semantic token bound to the wrong property, e.g. a bg/* or surface/* variable used as a text fill). Layout checks: missing auto-layout, empty containers. Default audit runs WCAG + design-system + layout (best-practice hints excluded). Returns categorized findings with severity levels (critical/warning/info) and WCAG conformance level (a/aa/aaa/best-practice) so teams can filter by target level. Use natural language like 'check my design for accessibility issues' or 'lint this page'. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Node ID to lint (defaults to current page)"
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Rule filter. Default (omitted) = ['wcag','design-system','layout'] — real WCAG conformance plus quality checks, with best-practice hints excluded. Groups: ['wcag'] (10 conformance rules), ['best-practice'] (text-size, line-height, letter-spacing, paragraph-spacing), ['all'] (everything incl. best-practice), ['design-system'], ['layout']. Or specific rule IDs like ['wcag-contrast', 'wcag-focus-indicator', 'wcag-disabled-no-context']."
    },
    "maxDepth": {
      "type": "number",
      "description": "Maximum tree depth to traverse (default: 10)"
    },
    "maxFindings": {
      "type": "number",
      "description": "Maximum findings before stopping (default: 100)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_list_open_filesList all Figma files currently connected via the Desktop Bridge plugin. Shows which files have the plugin open and which one is the active target for tool calls. Use figma_navigate to switch between files. WebSocket multi-client mode — each file with the Desktop Bridge plugin maintains its own connection.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_list_slidesList all slides in the current Figma Slides presentation with their IDs, names, grid positions, and skip status. Only works in Slides files.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_move_nodeMove a node to a new position within its parent.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to move"
    },
    "x": {
      "type": "number",
      "description": "New X position"
    },
    "y": {
      "type": "number",
      "description": "New Y position"
    }
  },
  "required": [
    "nodeId",
    "x",
    "y"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_navigateSwitch the active Figma file target among files that already have the Desktop Bridge plugin running. Local mode is WebSocket-only — this tool does NOT launch a browser or open files. If the requested URL is already the active file, it confirms the connection. If another connected plugin matches the URL, it switches the active target so subsequent tool calls hit that file. If no connected plugin matches, returns guidance for the user to open the Desktop Bridge plugin in the target file. Use figma_list_open_files to see all connected files. Pass lock: true to PIN this file as the target — new connections, reconnects, and the user's own selection/page changes in other files will no longer move the target. Use this for parallel work (agent edits one file while the user works in another) so commands can't silently route to the wrong file. Switching to another file (or lock: false) releases the pin; it also releases automatically if the pinned file disconnects.
Input schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Figma URL to navigate to (e.g., https://www.figma.com/design/abc123)"
    },
    "lock": {
      "type": "boolean",
      "description": "Pin this file as the active target so connections, reconnects, and user interaction in other files won't move it. Defaults to false."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_post_commentPost a comment on a Figma file, optionally pinned to a specific design node. Use after figma_check_design_parity to notify designers of drift when code is the canonical source. Supports replies to existing comment threads. Limitation: @mentions are a Figma UI-only feature — including '@name' in the message renders as plain text, not a clickable mention tag, and does not trigger Figma notifications.
Input schema
{
  "type": "object",
  "properties": {
    "fileUrl": {
      "type": "string",
      "format": "uri",
      "description": "Figma file URL. Uses current URL if omitted."
    },
    "message": {
      "type": "string",
      "description": "The comment message text. Supports basic formatting."
    },
    "node_id": {
      "type": "string",
      "description": "Node ID to pin the comment to (e.g., '695:313'). Comment appears on that element in Figma."
    },
    "x": {
      "type": "number",
      "description": "X coordinate for comment placement (absolute canvas position). Used with node_id."
    },
    "y": {
      "type": "number",
      "description": "Y coordinate for comment placement (absolute canvas position). Used with node_id."
    },
    "reply_to_comment_id": {
      "type": "string",
      "description": "ID of an existing comment to reply to. Creates a threaded reply instead of a new top-level comment."
    }
  },
  "required": [
    "message"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_reconnectForce a complete reconnection to Figma Desktop. Use when connection seems stale or after switching files.
Input schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
figma_reload_pluginReload the current Figma page/plugin to test code changes. Optionally clears console logs before reload. Use when user says: 'reload plugin', 'refresh page', 'restart plugin', 'test my changes'. Returns reload confirmation and current URL. Best for rapid iteration during plugin development.
Input schema
{
  "type": "object",
  "properties": {
    "clearConsole": {
      "type": "boolean",
      "default": true,
      "description": "Clear console logs before reload"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_rename_modeRename an existing mode in a Figma variable collection. Requires the Desktop Bridge plugin to be running.
Input schema
{
  "type": "object",
  "properties": {
    "collectionId": {
      "type": "string",
      "description": "The collection ID containing the mode (e.g., 'VariableCollectionId:123:456'). Get this from figma_get_variables."
    },
    "modeId": {
      "type": "string",
      "description": "The mode ID to rename (e.g., '123:0'). Get this from the collection's modes array in figma_get_variables."
    },
    "newName": {
      "type": "string",
      "description": "The new name for the mode (e.g., 'Dark Theme', 'Tablet')."
    }
  },
  "required": [
    "collectionId",
    "modeId",
    "newName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_rename_nodeRename a node in the layer panel.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to rename"
    },
    "newName": {
      "type": "string",
      "description": "The new name for the node"
    }
  },
  "required": [
    "nodeId",
    "newName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_rename_variableRename an existing Figma variable. This updates the variable's name while preserving all its values and settings. Requires the Desktop Bridge plugin to be running.
Input schema
{
  "type": "object",
  "properties": {
    "variableId": {
      "type": "string",
      "description": "The variable ID to rename (e.g., 'VariableID:123:456'). Get this from figma_get_variables."
    },
    "newName": {
      "type": "string",
      "description": "The new name for the variable. Can include slashes for grouping (e.g., 'colors/primary/background')."
    }
  },
  "required": [
    "variableId",
    "newName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_reorder_slidesReorder slides by providing a new 2D array of slide IDs. Each inner array represents a row in the grid. WARNING: This is a destructive operation.
Input schema
{
  "type": "object",
  "properties": {
    "grid": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 50
        },
        "maxItems": 50
      },
      "maxItems": 50,
      "description": "2D array of slide IDs representing the new order, e.g. [['1:2','1:3'],['1:4']]"
    }
  },
  "required": [
    "grid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_reset_slotReset a slot on a component instance to its default (empty) state from the main component. Uses SlotNode.resetSlot().
Input schema
{
  "type": "object",
  "properties": {
    "slotId": {
      "type": "string",
      "description": "Direct SlotNode ID"
    },
    "instanceId": {
      "type": "string",
      "description": "Instance ID — use with slotName when slotId is unknown"
    },
    "slotName": {
      "type": "string",
      "description": "Slot layer name on the instance"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_resize_nodeResize a node to specific dimensions. By default respects child constraints; use withConstraints=false to ignore them.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to resize"
    },
    "width": {
      "type": "number",
      "description": "New width in pixels"
    },
    "height": {
      "type": "number",
      "description": "New height in pixels"
    },
    "withConstraints": {
      "type": "boolean",
      "default": true,
      "description": "Whether to apply child constraints during resize (default: true)"
    }
  },
  "required": [
    "nodeId",
    "width",
    "height"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_scan_code_accessibilityScan HTML code for accessibility violations using axe-core (Deque). Runs structural/semantic checks via JSDOM: ARIA attributes, roles, labels, alt text, form labels, heading order, landmarks, semantic HTML, tabindex, duplicate IDs, lang attribute, and ~50 more rules. Visual checks (color contrast, focus visibility) are disabled in this mode — use figma_lint_design for visual a11y on the design side. Also surfaces a WCAG 1.4.12 (Text Spacing) / 1.4.4 (Resize Text) advisory when typography is locked to fixed px units — the code side is where text-spacing override support is actually verified (a sub-1.5 line height in a design is not itself a failure). Together, these two tools provide full-spectrum accessibility coverage across design and code. Pass component HTML directly or use with figma_check_design_parity for design-to-code a11y comparison. No Figma connection required — this is a standalone code analysis tool.
Input schema
{
  "type": "object",
  "properties": {
    "html": {
      "type": "string",
      "description": "HTML string to scan. Can be a full document or a component fragment (will be wrapped in a valid document)."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "WCAG tag filter. Examples: ['wcag2a'], ['wcag2aa'], ['wcag21aa'], ['wcag22aa'], ['best-practice']. Defaults to all structural rules if omitted."
    },
    "context": {
      "type": "string",
      "description": "CSS selector to scope the scan to a specific element (e.g., '#my-component', '.card'). Scans entire document if omitted."
    },
    "includePassingRules": {
      "type": "boolean",
      "description": "If true, includes count of passing and incomplete rules in the response (default: false)."
    },
    "mapToCodeSpec": {
      "type": "boolean",
      "description": "If true, includes a codeSpec.accessibility object auto-extracted from the HTML + scan results. Pass this directly into figma_check_design_parity's codeSpec.accessibility field for automated design-to-code a11y parity checking."
    }
  },
  "required": [
    "html"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_search_componentsSearch for components by name, category, or description. Returns paginated results with component keys for instantiation. Automatically loads the design system cache if needed. **NEW: Cross-file library search!** Pass a libraryFileKey or libraryFileUrl to search for components in a published shared library (different file). This uses the REST API and requires FIGMA_ACCESS_TOKEN. Without libraryFileKey/libraryFileUrl, searches the currently open file (local components via Plugin API).
Input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "default": "",
      "description": "Search query to match component names or descriptions"
    },
    "category": {
      "type": "string",
      "description": "Filter by category (e.g., 'Button', 'Input', 'Card')"
    },
    "libraryFileKey": {
      "type": "string",
      "description": "File key of a published library to search in (for cross-file library access). Overrides local search."
    },
    "libraryFileUrl": {
      "type": "string",
      "description": "URL of a published library file to search in (e.g., https://www.figma.com/design/abc123/...). Alternative to libraryFileKey."
    },
    "limit": {
      "type": "number",
      "default": 10,
      "description": "Maximum results to return (default: 10, max: 25)"
    },
    "offset": {
      "type": "number",
      "default": 0,
      "description": "Offset for pagination"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_annotationsWrite or clear annotations on a Figma node. Annotations communicate design specs to developers — use them to document animation timings, easing curves, interaction behaviors, accessibility requirements, and implementation notes. Supports plain text labels, rich markdown labels, pinned design properties, and annotation categories. Pass an empty array to clear all annotations. Use mode='append' to add to existing annotations, or mode='replace' (default) to overwrite. Requires Desktop Bridge plugin. This operation is undoable in Figma (Cmd+Z).
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Node ID to write annotations to (e.g., '695:313')"
    },
    "annotations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "Plain text annotation label"
          },
          "labelMarkdown": {
            "type": "string",
            "description": "Rich text annotation label with markdown formatting. Supports bold, italic, links, lists, code, and headers."
          },
          "properties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "width",
                    "height",
                    "maxWidth",
                    "minWidth",
                    "maxHeight",
                    "minHeight",
                    "fills",
                    "strokes",
                    "effects",
                    "strokeWeight",
                    "cornerRadius",
                    "textStyleId",
                    "textAlignHorizontal",
                    "fontFamily",
                    "fontStyle",
                    "fontSize",
                    "fontWeight",
                    "lineHeight",
                    "letterSpacing",
                    "itemSpacing",
                    "padding",
                    "layoutMode",
                    "alignItems",
                    "opacity",
                    "mainComponent",
                    "gridRowGap",
                    "gridColumnGap",
                    "gridRowCount",
                    "gridColumnCount",
                    "gridRowAnchorIndex",
                    "gridColumnAnchorIndex",
                    "gridRowSpan",
                    "gridColumnSpan"
                  ],
                  "description": "Design property to pin (e.g., 'fills', 'width', 'fontSize')"
                }
              },
              "required": [
                "type"
              ],
              "additionalProperties": false
            },
            "description": "Design properties to pin to this annotation (e.g., fills, width, fontSize)"
          },
          "categoryId": {
            "type": "string",
            "description": "Annotation category ID. Use figma_get_annotation_categories to list available categories."
          }
        },
        "additionalProperties": false
      },
      "description": "Array of annotations to set. Each annotation can have a label (plain or markdown), pinned properties, and a category. Pass an empty array [] to clear all annotations."
    },
    "mode": {
      "type": "string",
      "enum": [
        "replace",
        "append"
      ],
      "default": "replace",
      "description": "'replace' (default) overwrites all existing annotations. 'append' adds new annotations while keeping existing ones."
    }
  },
  "required": [
    "nodeId",
    "annotations"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_descriptionSet the description text on a component, component set, or style. Descriptions appear in Dev Mode and help document design intent. Supports plain text and markdown formatting.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID of the component or style to update (e.g., '123:456')"
    },
    "description": {
      "type": "string",
      "description": "The plain text description to set"
    },
    "descriptionMarkdown": {
      "type": "string",
      "description": "Optional rich text description using markdown formatting"
    }
  },
  "required": [
    "nodeId",
    "description"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_fillsSet the fill colors on a node. Accepts hex color strings (e.g., '#FF0000'). To bind a fill to a design token / color variable, pass that fill's variableId — the variable drives the color and this works on any Figma plan via the bridge (no raw figma_execute needed).
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to modify"
    },
    "fills": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "const": "SOLID",
            "description": "Fill type (currently only SOLID supported)"
          },
          "color": {
            "type": "string",
            "description": "Hex color string (e.g., '#FF0000', '#FF000080' for transparency). Optional when variableId is provided."
          },
          "opacity": {
            "type": "number",
            "description": "Opacity 0-1 (default: 1)"
          },
          "variableId": {
            "type": "string",
            "description": "Bind this fill's color to a Figma variable by id (e.g. 'VariableID:1:23' from figma_get_variables). When set, the variable drives the color. Import library variables first via figma_import_library_variable."
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false
      },
      "description": "Array of fill objects"
    }
  },
  "required": [
    "nodeId",
    "fills"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_image_fillSet an image fill on one or more Figma nodes. The imageData parameter accepts a base64-encoded image string (JPEG/PNG). The image is decoded in the browser bridge and passed as raw bytes to the Figma plugin. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "nodeIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Array of node IDs to apply the image fill to"
    },
    "imageData": {
      "type": "string",
      "description": "Base64-encoded image data (JPEG/PNG)"
    },
    "scaleMode": {
      "type": "string",
      "enum": [
        "FILL",
        "FIT",
        "CROP",
        "TILE"
      ],
      "description": "How the image fills the node (default: FILL)"
    }
  },
  "required": [
    "nodeIds",
    "imageData"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_instance_propertiesUpdate component properties on a component instance. IMPORTANT: Use this tool instead of trying to edit text nodes directly when working with component instances. Components often expose TEXT, BOOLEAN, INSTANCE_SWAP, and VARIANT properties that control their content. SLOT properties CANNOT be set here — use figma_append_to_slot to populate slot content. Direct text node editing may fail silently if the component uses properties. This tool handles the #nodeId suffix pattern automatically. Requires Desktop Bridge connection.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "ID of the INSTANCE node to update (e.g., '1:234'). Must be a component instance, not a regular frame."
    },
    "properties": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "boolean"
        ]
      },
      "description": "Properties to set. Keys are property names (e.g., 'Label', 'Show Icon', 'Size'). Values are strings for TEXT/VARIANT properties, booleans for BOOLEAN properties. The tool automatically handles the #nodeId suffix for TEXT/BOOLEAN/INSTANCE_SWAP properties."
    }
  },
  "required": [
    "nodeId",
    "properties"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_slide_backgroundSet the background color of a slide. Creates or updates a full-slide background rectangle.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    },
    "color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "description": "Background color as hex (e.g., '#181818')"
    }
  },
  "required": [
    "slideId",
    "color"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_slide_transitionSet the transition effect for a slide (style, duration, easing curve). Triggers on click by default.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    },
    "style": {
      "type": "string",
      "enum": [
        "NONE",
        "DISSOLVE",
        "SLIDE_FROM_LEFT",
        "SLIDE_FROM_RIGHT",
        "SLIDE_FROM_TOP",
        "SLIDE_FROM_BOTTOM",
        "PUSH_FROM_LEFT",
        "PUSH_FROM_RIGHT",
        "PUSH_FROM_TOP",
        "PUSH_FROM_BOTTOM",
        "MOVE_FROM_LEFT",
        "MOVE_FROM_RIGHT",
        "MOVE_FROM_TOP",
        "MOVE_FROM_BOTTOM",
        "SLIDE_OUT_TO_LEFT",
        "SLIDE_OUT_TO_RIGHT",
        "SLIDE_OUT_TO_TOP",
        "SLIDE_OUT_TO_BOTTOM",
        "MOVE_OUT_TO_LEFT",
        "MOVE_OUT_TO_RIGHT",
        "MOVE_OUT_TO_TOP",
        "MOVE_OUT_TO_BOTTOM",
        "SMART_ANIMATE"
      ],
      "description": "Transition style"
    },
    "duration": {
      "type": "number",
      "minimum": 0.01,
      "maximum": 10,
      "default": 0.4,
      "description": "Duration in seconds (0.01 to 10)"
    },
    "curve": {
      "type": "string",
      "enum": [
        "LINEAR",
        "EASE_IN",
        "EASE_OUT",
        "EASE_IN_AND_OUT",
        "GENTLE",
        "QUICK",
        "BOUNCY",
        "SLOW"
      ],
      "default": "EASE_IN_AND_OUT",
      "description": "Easing curve"
    }
  },
  "required": [
    "slideId",
    "style"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_slides_view_modeToggle the Figma Slides viewport between grid view and single-slide view.
Input schema
{
  "type": "object",
  "properties": {
    "mode": {
      "type": "string",
      "enum": [
        "grid",
        "single-slide"
      ],
      "description": "View mode"
    }
  },
  "required": [
    "mode"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_strokesSet the stroke (border) on a node. Accepts hex color strings and optional stroke weight. To bind a stroke to a design token / color variable, pass that stroke's variableId — works on any Figma plan via the bridge.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The node ID to modify"
    },
    "strokes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "const": "SOLID",
            "description": "Stroke type"
          },
          "color": {
            "type": "string",
            "description": "Hex color string. Optional when variableId is provided."
          },
          "opacity": {
            "type": "number",
            "description": "Opacity 0-1"
          },
          "variableId": {
            "type": "string",
            "description": "Bind this stroke's color to a Figma variable by id (e.g. 'VariableID:1:23' from figma_get_variables). When set, the variable drives the color."
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false
      },
      "description": "Array of stroke objects"
    },
    "strokeWeight": {
      "type": "number",
      "description": "Stroke thickness in pixels"
    }
  },
  "required": [
    "nodeId",
    "strokes"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_set_textSet the text content of a text node. Optionally adjust font size and the font family/style. Font style names are space-sensitive ('Semi Bold', not 'SemiBold'), but this tool auto-corrects common no-space variants and falls back gracefully — so you don't need raw figma_execute to change typography.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "The text node ID"
    },
    "text": {
      "type": "string",
      "description": "The new text content"
    },
    "fontSize": {
      "type": "number",
      "description": "Optional font size to set"
    },
    "fontFamily": {
      "type": "string",
      "description": "Optional font family to apply (e.g., 'Inter')"
    },
    "fontStyle": {
      "type": "string",
      "description": "Optional font style/weight to apply (e.g., 'Bold', 'Semi Bold'). No-space variants like 'SemiBold' are auto-corrected."
    }
  },
  "required": [
    "nodeId",
    "text"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_setup_design_tokensCreate a complete design token structure in one operation: collection, modes, and all variables. Ideal for importing CSS custom properties or design tokens into Figma. Values may be literals OR DTCG-style brace references ('{color.blue.600}', or set-qualified '{primitives.color.blue.600}') that resolve to variable ALIASES — first against variables created in this same call, then against existing local variables. Unresolvable references skip that value with a per-item warning (the rest of the batch still applies), so semantic collections referencing primitives no longer need raw figma_execute. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "collectionName": {
      "type": "string",
      "description": "Name for the token collection (e.g., 'Brand Tokens')"
    },
    "modes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 4,
      "description": "Mode names (first becomes default). Example: ['Light', 'Dark']"
    },
    "tokens": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Token name (e.g., 'color/primary')"
          },
          "resolvedType": {
            "type": "string",
            "enum": [
              "COLOR",
              "FLOAT",
              "STRING",
              "BOOLEAN"
            ],
            "description": "Token type"
          },
          "description": {
            "type": "string",
            "description": "Optional description"
          },
          "values": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "number",
                "boolean"
              ]
            },
            "description": "Values keyed by mode NAME (not ID). Example: { 'Light': '#FFFFFF', 'Dark': '#000000' }. A string value wrapped in braces is an ALIAS reference resolved to another variable: '{color.blue.600}' matches variable name 'color/blue/600' — first among variables created in THIS call, then existing local variables (exact match, then case-insensitive). Set-qualified references ('{primitives.color.blue.600}') strip the leading collection name. Unresolvable references skip that value and surface in the response's warnings[]."
          }
        },
        "required": [
          "name",
          "resolvedType",
          "values"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 100,
      "description": "Token definitions (1-100)"
    }
  },
  "required": [
    "collectionName",
    "modes",
    "tokens"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_skip_slideToggle whether a slide is skipped during presentation mode.
Input schema
{
  "type": "object",
  "properties": {
    "slideId": {
      "type": "string",
      "maxLength": 50,
      "description": "The node ID of the slide"
    },
    "skip": {
      "type": "boolean",
      "description": "True to skip the slide, false to include it"
    }
  },
  "required": [
    "slideId",
    "skip"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_take_screenshotExport an image of the current Figma page or specific node. Uses the Desktop Bridge plugin (exportAsync) when connected — works on any plan, no REST token needed, reflects current runtime state. Falls back to the Figma REST API when the bridge is unavailable or for PDF format. Use for visual validation after design changes — check alignment, spacing, proportions. Pass nodeId to target specific elements. For components, prefer figma_get_component_image.
Input schema
{
  "type": "object",
  "properties": {
    "nodeId": {
      "type": "string",
      "description": "Optional node ID to screenshot (e.g., '123:456'). If omitted, uses the node-id from the Desktop Bridge plugin's reported file URL when present. To screenshot what the user is currently looking at on the canvas, prefer figma_capture_screenshot (uses the plugin's exportAsync and reflects the current state)."
    },
    "scale": {
      "type": "number",
      "minimum": 0.01,
      "maximum": 4,
      "default": 2,
      "description": "Image scale factor (0.01-4, default: 2 for high quality)"
    },
    "format": {
      "type": "string",
      "enum": [
        "png",
        "jpg",
        "svg",
        "pdf"
      ],
      "default": "png",
      "description": "Image format (default: png)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_update_variableUpdate a single variable's value and/or its description. Pass modeId+value to change the value in a mode; pass description to set the 'How to use this variable' text shown in the Variables panel (and exported as DTCG $description). At least one of {modeId+value} or {description} is required. For many value updates at once, use figma_batch_update_variables (10-50x faster). Use figma_get_variables first for IDs. COLOR: hex '#FF0000', FLOAT: number, STRING: text, BOOLEAN: true/false. Requires Desktop Bridge plugin.
Input schema
{
  "type": "object",
  "properties": {
    "variableId": {
      "type": "string",
      "description": "The variable ID to update (e.g., 'VariableID:123:456'). Get this from figma_get_variables."
    },
    "modeId": {
      "type": "string",
      "description": "The mode ID to update the value in (e.g., '1:0'). Required when updating a value. Get this from the variable's collection modes."
    },
    "value": {
      "type": [
        "string",
        "number",
        "boolean"
      ],
      "description": "The new value (requires modeId). For COLOR: hex string like '#FF0000'. For FLOAT: number. For STRING: text. For BOOLEAN: true/false."
    },
    "description": {
      "type": "string",
      "description": "Set the variable's description (the 'How to use this variable' field; exported as DTCG $description). Pass an empty string to clear it."
    }
  },
  "required": [
    "variableId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
figma_watch_consoleStream console logs in real-time for a specified duration (max 5 minutes). Use for monitoring plugin execution while user tests manually. Returns all logs captured during watch period with summary statistics. NOT for retrieving past logs (use figma_get_console_logs). Best for: watching plugin output during manual testing, debugging race conditions, monitoring async operations.
Input schema
{
  "type": "object",
  "properties": {
    "duration": {
      "type": "number",
      "default": 30,
      "description": "How long to watch in seconds"
    },
    "level": {
      "type": "string",
      "enum": [
        "log",
        "info",
        "warn",
        "error",
        "debug",
        "all"
      ],
      "default": "all",
      "description": "Filter by log level"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Resources 0

  • None observed.

Resource templates 0

  • None observed.

Prompts 0

  • None observed.

Remote endpoints

EndpointTransportAuthenticationHealthObserved
No verified remote endpoint is linked.

figma-console-mcp Server questions

How do I install figma-console-mcp Server?

Install the selected package version with: npm install --save-exact figma-console-mcp@1.40.0

What tools does figma-console-mcp Server provide?

figma-console-mcp Server exposed 121 tools during independent protocol observation, including figjam_auto_arrange, figjam_create_code_block, figjam_create_connector, figjam_create_section, figjam_create_shape_with_text, figjam_create_stickies, figjam_create_sticky, figjam_create_table, and others.

Is figma-console-mcp Server secure?

The selected current version does not yet have completed public verification. Unknown does not mean clean or vulnerable.

Explore related MCP server guides

Curated product and capability guides containing this catalog record.

Official vs Community MCP Servers

Let’s talk about MCP security.

Share your details and our security team will contact you.