Figma Ui Mcp

io.github.TranHoaiHung由 GitHub 账号 TranHoaiHung 发布v2.5.30更新于 Oct 26, 2026

Bidirectional Figma MCP — AI draws UI on Figma canvas, reads designs back

发布方自己的服务:Figma MCP Server

已验证STDIO仅桌面开发者工具媒体与设计

概览

AI 生成的概览

双向 Figma 桥接服务,让 AI 助手在 Figma 画布上绘制和修改界面,并把现有设计读回为结构化数据、截图或设计令牌。

可以做什么
  • 检查插件桥接连接状态与当前 Figma 会话
  • 通过执行 JavaScript 在画布上创建和修改框架、形状、文字、组件、令牌与原型交互
  • 读取节点树、颜色、字体、间距、设计上下文、CSS 与 SVG,并截取画面
  • 获取 API 参考与设计规则,并从当前文件生成设计系统规则表
适用场景
适合让助手直接在 Figma 中生成界面稿、迭代已有画框,或把 Figma 设计转成可用于代码的令牌与 CSS。适用于支持 MCP 的 IDE 中的设计转代码和快速原型流程。
运行要求
通过 npx(Node.js)以 stdio 方式在本机运行,无需 Figma API 密钥。需要 Figma 桌面版并导入、运行配套插件,因为网页版无法访问 localhost。桥接服务监听 localhost:38451,添加服务器后需重启 IDE 或客户端。
安装前请注意
figma_write 会执行 JavaScript 在 Figma 文件中创建、修改和删除节点,改动是真实且可能具有破坏性的。插件更新后需手动重新关联。流量仅在本机,但助手可读取你的设计内容与截图。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Figma Ui Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

figma-ui-mcp

[figma-ui-mcp — Claude Code to Figma, AI to Figma, MCP Figma Bridge]

[npm version] [MCP Registry] [License: MIT] [GitHub stars] [MCPVault: claimed]

Claude Code to Figma · Antigravity to Figma · Cursor to Figma · Any MCP IDE to Figma

✅ Tested: Claude Code, Antigravity  |  🔧 Compatible: Cursor, VS Code, Windsurf, Zed (any MCP stdio client)

Bidirectional Figma MCP bridge — let AI assistants (Claude Code, Cursor, Windsurf, Antigravity, VS Code Copilot, or any MCP-compatible IDE) draw UI directly on Figma canvas and read existing designs back as structured data, screenshots, or code-ready tokens. No Figma API key needed — works entirely over localhost.

Requires Figma Desktop — the plugin communicates with the MCP server over localhost HTTP polling. Figma's web app does not allow localhost network access, so Figma Desktop is required.

Claude ──figma_write──▶ MCP Server ──HTTP (localhost:38451)──▶ Figma Plugin ──▶ Figma DocumentClaude ◀─figma_read──── MCP Server ◀──HTTP (localhost:38451)── Figma Plugin ◀── Figma Document

How the localhost bridge works

The MCP server starts a small HTTP server bound to localhost:38451. The Figma plugin (running inside Figma Desktop) uses long polling — the server holds requests up to 8s until work arrives, flushing immediately when new ops are queued (near-realtime latency <100ms). All traffic stays on your machine — nothing is sent to any external server.

Multi-instance support (v2.3.0+): Multiple Figma files/tabs can connect simultaneously. Each plugin instance sends a sessionId, and the bridge routes operations to the correct session. Use the optional sessionId param in figma_write/figma_read to target a specific file.


Features

DirectionToolWhat it does
Writefigma_writeDraw frames, shapes, text, prototypes via JS code
Readfigma_readExtract node trees, colors, typography, screenshots
Infofigma_statusCheck plugin connection + active sessions
Docsfigma_docsGet full API reference + examples
Rulesfigma_rulesGenerate design system rule sheet — tokens, typography, components

What's new in v2.5

FeatureDescription
get_design_contextAI-optimized payload for a node — flex layout, token-resolved colors (var(--name)), typography with style names, component instances with variant properties. Best single call for design→React/Vue/Swift code.
get_component_mapList every component instance in a frame with componentSetName, variantLabel, properties, and suggestedImport path. Scaffold import statements in one call.
get_unmapped_componentsFind component instances that have no description in Figma (no code mapping yet). Prompts AI to ask user for correct import paths.
figma_rules toolNew top-level MCP tool — aggregates color tokens, typography styles, variables (all modes), and component catalog into a single markdown rule sheet. Equivalent to official Figma MCP's create_design_system_rules. Call once at session start.
get_css operationfigma_read get_css { nodeId } → ready-to-use CSS string (flex, typography, fill, border, shadow, opacity, transform). One call, paste into code.
Resolved variablesget_node_detail now resolves boundVariables IDs → { name, resolvedType, value }. No more manual ID lookup.
Resolved style refsfillStyleId / textStyleId now include fillStyle: { name, hex } and textStyle: { name, fontSize, fontFamily }.
Instance overrides detailoverrides: [{ id, overriddenFields: ["fills","characters",...] }] — full diff vs mainComponent, not just count.
componentSetName + variantLabelINSTANCE nodes now expose set name ("Button") and variant label ("State=Primary, Size=Large") separately.
insertIndex for createfigma.create({ ..., insertIndex: 2 }) — insert node at exact position in parent, not always at end.
Typography tokenssetupDesignTokens({ fontSizes, fonts, textStyles }) — 1 call bootstrap full typography system with variable-bound text styles. Multi-mode (Compact/Comfortable/Large) supported.
applyTextStyleApply a local text style to a TEXT node by name in 1 call — auto-loads font.
STRING variables for fontsapplyVariable now binds fontFamily, fontStyle, characters (swap Inter → SF Pro via 1 variable).
Effectseffects: [{ type: "DROP_SHADOW" | "INNER_SHADOW" | "LAYER_BLUR" | "BACKGROUND_BLUR", ... }] on any node.
Gradient fillsfill: { type: "LINEAR_GRADIENT" | "RADIAL_GRADIENT", angle, stops } in create/modify.
Individual corner radiitopLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius on FRAME/RECT.
8-digit hex + rgba alphafill: "#FFFFFF80" or "rgba(255,255,255,0.5)" — alpha auto-applied to paint opacity.
SVG arc (A) + commasVECTOR d paths accept A arc command (auto-converted to cubic Bézier) and commas.
Icon libraries7 free open-source libraries, iOS-filled first: Ionicons → Fluent → Bootstrap → Phosphor → Tabler Filled → Tabler Outline → Lucide.
Instance overridesfigma.instantiate({ overrides: { "LayerName": { text, fill, fontSize } } }) — override props per-layer.
Batch deletefigma.delete({ ids: [...] }) — delete multiple nodes in 1 round-trip.
PrototypingsetReactions — click/hover/press → navigate/overlay/swap with Smart Animate.
Scroll behaviorsetScrollBehavior — HORIZONTAL / VERTICAL / BOTH overflow.
Variants & instance swapsetComponentProperties / swapComponent — variants + instance swap.
Component property definitions (v2.5.24)addComponentProperty + bindComponentProperty — create TEXT / BOOLEAN / INSTANCE_SWAP properties on master components. Instance text overrides now actually re-measure auto-layout (button grows to fit longer label).
Multi-instanceMultiple Figma tabs connect simultaneously via sessions.

Full version history: see CHANGELOG.md.


Quick Start

Step 1 — Add the MCP server to your AI client

Choose your platform:

Claude Code (CLI)
bash
# Project scope (default)claude mcp add figma-ui-mcp -- npx figma-ui-mcp
# Global scope (all projects)claude mcp add --scope user figma-ui-mcp -- npx figma-ui-mcp
Claude Desktop

Edit config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
json
{  "mcpServers": {    "figma": {      "command": "npx",      "args": ["-y", "figma-ui-mcp"]    }  }}
Cursor

Edit .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):

json
{  "mcpServers": {    "figma": {      "command": "npx",      "args": ["-y", "figma-ui-mcp"]    }  }}
VS Code / GitHub Copilot

Edit .vscode/mcp.json (project) or add to settings.json (global):

json
{  "mcp": {    "servers": {      "figma": {        "command": "npx",        "args": ["-y", "figma-ui-mcp"]      }    }  }}
Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

json
{  "mcpServers": {    "figma": {      "command": "npx",      "args": ["-y", "figma-ui-mcp"]    }  }}
Antigravity (Google)
  1. Open "..." dropdown at the top of the agent panel
  2. Click "Manage MCP Servers" → "View raw config"
  3. Add to mcp_config.json:
json
{  "mcpServers": {    "figma": {      "command": "npx",      "args": ["-y", "figma-ui-mcp"]    }  }}
From source (any client)
bash
git clone https://github.com/TranHoaiHung/figma-ui-mcpcd figma-ui-mcpnpm install# Then point your MCP client to: node /path/to/figma-ui-mcp/server/index.js

⚠️ IMPORTANT: After adding the MCP server, you MUST restart your IDE / AI client (quit and reopen). The MCP server only loads on startup — simply saving the config file is not enough. This applies to Claude Code, Cursor, VS Code, Windsurf, and Antigravity.

Step 2 — Install the Figma plugin

⬇ Download plugin.zip — no git clone needed

  1. Download and unzip plugin.zip anywhere on your machine
  2. Open Figma Desktop (required — web app cannot access localhost)
  3. Go to Plugins → Development → Import plugin from manifest...
  4. Select manifest.json from the unzipped folder
  5. Run Plugins → Development → Figma UI MCP Bridge

The plugin UI shows a green dot when the MCP server is connected.

Updating to a newer version

bash
# Step 1 — get the new version + plugin pathnpx figma-ui-mcp@latest --version# figma-ui-mcp v2.5.12  —  plugin: /.../.npm/_npx/.../figma-ui-mcp/plugin
# Step 2 — restart Claude / your IDE so the MCP server reloads
# Step 3 — re-link the Figma plugin (manual, one-time per update)#   Figma Desktop → Plugins → Development → Manage plugins in development#   Remove old "Figma UI MCP Bridge" → "+" → Import plugin from manifest...#   Select manifest.json from the plugin path printed in Step 1
# Step 4 — verify#   Ask your AI: "figma_status"#   pluginVersion in the response should match the npm version above

The Figma plugin does not auto-update — re-linking (Step 3) is required whenever the plugin changes.

Step 3 — Connect AI to Figma

Tell your AI assistant to connect:

"Connect to figma-ui-mcp"

The AI will call figma_status and confirm:

✅ Connected — File: "My Project", Page: "Page 1", Plugin v2.5.5

If you see "Plugin not connected", make sure the Figma plugin is running (Step 2).

Step 4 — Start designing with prompts

Once connected, just describe what you want in natural language:

"Use figma-ui-mcp to draw a login screen for mobile"

The AI will automatically:

  1. Call figma_docs to load the API reference and design rules
  2. Call figma_read get_page_nodes to understand the current canvas
  3. Call figma_write to create the design on your Figma canvas
  4. Call figma_read screenshot to verify the result

Prompt examples

PromptWhat happens
"Draw a mobile login screen with social login buttons"Creates a 390×844 frame with email/password inputs, Apple/Google buttons
"Read the selected frame and describe the design"Extracts colors, typography, spacing from your selection
"Take a screenshot of the current frame"Returns an inline image the AI can analyze
"Create a dark theme dashboard with KPI cards"Draws a full dashboard layout with charts and stats
"Design an e-commerce product card"Creates a product card with image, price, rating, CTA
"Draw a settings page with toggle switches"Creates grouped settings with icons and toggles

Tips for better results

  • Be specific about style: "dark theme", "glassmorphism", "minimal white" gives the AI clear direction
  • Mention platform: "mobile" (390×844), "tablet" (768×1024), "desktop" (1440×900)
  • Iterate: After the first draw, say "fix the spacing" or "make the buttons bigger" — the AI reads and modifies existing nodes
  • Use selection: Select a frame in Figma and ask "improve this design" — the AI reads your selection first
  • Multi-screen flows: "Now draw the signup screen next to the login screen" — the AI positions frames side by side

Workflow summary

You: "Connect to figma-ui-mcp"AI:  ✅ Connected to Figma
You: "Draw a mobile onboarding screen with 3 steps"AI:  [calls figma_docs → figma_write → figma_read screenshot]AI:  ✅ Done — here's what I created: [inline screenshot]
You: "The title text is not centered"AI:  [calls figma_read get_selection → figma_write modify → screenshot]AI:  ✅ Fixed — text is now centered
You: "Now draw the next onboarding screen beside it"AI:  [reads page_nodes to find position → draws at x+440]AI:  ✅ Done — 2 screens side by side
figma_status     — check connection (always call first)figma_docs       — load API reference (call before drawing)figma_write      — draw / modify UI on canvasfigma_read       — extract design data, screenshots, SVG

Usage Examples

Draw a screen

Ask Claude: "Draw a dark dashboard with a sidebar, header, and 4 KPI cards"

Claude calls figma_write with code like:

js
await figma.createPage({ name: "Dashboard" });await figma.setPage({ name: "Dashboard" });
const root = await figma.create({  type: "FRAME", name: "Dashboard",  x: 0, y: 0, width: 1440, height: 900,  fill: "#0f172a",});
const sidebar = await figma.create({  type: "FRAME", name: "Sidebar",  parentId: root.id,  x: 0, y: 0, width: 240, height: 900,  fill: "#1e293b", stroke: "#334155", strokeWeight: 1,});
await figma.create({  type: "TEXT", name: "App Name",  parentId: sidebar.id,  x: 20, y: 24, content: "My App",  fontSize: 16, fontWeight: "SemiBold", fill: "#f8fafc",});// ... continue

Read a design

Ask Claude: "Read my selected frame and convert it to Tailwind CSS"

Claude calls figma_read with operation: "get_selection", receives the full node tree, then generates corresponding code.

Screenshot a frame

figma_read  →  operation: "screenshot"  →  nodeId: "123:456"

Returns a base64 PNG Claude can analyze and describe.


Architecture

figma-ui-mcp/├── server/│   ├── index.js            MCP server (stdio transport)│   ├── bridge-server.js    HTTP bridge on localhost:38451 (long-poll, multi-session)│   ├── code-executor.js    VM sandbox — safe JS execution + 7-lib icon fetcher│   ├── tool-definitions.js MCP tool schemas (figma_status / _write / _read / _docs)│   └── api-docs.js         API reference text (served to AI via figma_docs)├── src/plugin/             Plugin source (concat-built into plugin/code.js)│   ├── utils.js, svg-path-helpers.js, paint-and-effects.js, read-helpers.js│   ├── handlers-write.js, handlers-read.js, handlers-read-detail.js,│   │   handlers-library.js, handlers-tokens.js, handlers-write-ops.js│   └── main.js└── plugin/    ├── manifest.json       Figma plugin manifest    ├── code.js             Plugin main (auto-generated — 3600+ LOC)    └── ui.html             Plugin UI — long-poll client + status dot

Security

LayerProtection
VM sandboxvm.runInContext() — blocks require, process, fs, fetch
Localhost onlyBridge binds localhost:38451, never exposed to network
Operation allowlist56 predefined operations accepted (WRITE_OPS + READ_OPS)
Timeout30s VM execution + 60-90s per plugin operation (adaptive by op type)
Body size limit5 MB max per request
Session isolationMulti-instance sessions scoped by Figma file ID

Available Write Operations (figma_write)

Core CRUD

OperationDescription
figma.create({ type, ... })Create FRAME / RECTANGLE / ELLIPSE / LINE / TEXT / SVG / VECTOR / IMAGE
figma.modify({ id, ... })Update node properties (fill, size, text, layout, etc.)
figma.delete({ id })Remove a single node
figma.delete({ ids: [...] })Batch delete multiple nodes in one call
figma.query({ type?, name?, id? })Find nodes by type, name, or ID
figma.append({ parentId, childId })Move node into parent

create / modify — advanced props available on any node:

PropExampleNotes
fill (solid)"#6C5CE7" or "#6C5CE780" (8-digit hex with alpha) or "rgba(108,92,231,0.5)"Alpha auto-extracted into paint opacity
fill (gradient){ type: "LINEAR_GRADIENT", angle: 135, stops: [{ pos: 0, color: "#7C3AED" }, { pos: 1, color: "#EC4899" }] }Also RADIAL_GRADIENT
stroke, strokeWeight, strokeOpacitySame hex/rgba rules
cornerRadius uniform12All 4 corners
Individual cornerstopLeftRadius: 20, topRightRadius: 20, bottomLeftRadius: 0, bottomRightRadius: 0Rounded top sheet pattern
effects array[{ type: "DROP_SHADOW", color: "#00000026", offset: {x:0,y:8}, radius: 24, spread: 0 }]Types: DROP_SHADOW, INNER_SHADOW, LAYER_BLUR, BACKGROUND_BLUR
TEXT centertextAlign: "CENTER" with explicit widthAuto-infers textAutoResize: "NONE" so centering works
VECTOR pathd: "M 150 7 A 143 143 0 1 1 29.26 226.62"SVG A arc auto-converted to cubic Bézier; commas accepted

Page Management

OperationDescription
figma.status()Current Figma context info
figma.listPages()List all pages
figma.setPage({ name })Switch active page
figma.createPage({ name })Add a new page

Node Operations

OperationDescription
figma.clone({ id, x?, y?, parentId? })Duplicate a node with optional repositioning
figma.group({ nodeIds, name? })Group multiple nodes
figma.ungroup({ id })Ungroup a GROUP/FRAME
figma.flatten({ id })Flatten/merge vectors into single path
figma.resize({ id, width, height })Resize any node
figma.set_selection({ ids })Programmatically select nodes
figma.set_viewport({ nodeId?, x?, y?, zoom? })Navigate viewport
figma.batch({ operations })Execute up to 50 ops in one call (10-25x faster)

Components

OperationDescription
figma.listComponents()List all components in document
figma.createComponent({ nodeId, name? })Convert FRAME/GROUP → reusable Component
figma.instantiate({ componentId/Name, parentId, x, y })Create component instance
figma.instantiate({ ..., overrides: { "LayerName": { text, fill, fontSize, visible, ... } } })Instantiate with per-layer overrides

Design Tokens & Styles

OperationDescription
figma.setupDesignTokens({ colors, numbers, fontSizes, fonts, textStyles, modes })Bootstrap complete token system (idempotent) — colors + spacing + typography + text styles + multi-mode in 1 call
figma.createVariableCollection({ name })Create variable collection ("Colors", "Spacing")
figma.createVariable({ name, collectionId, resolvedType, value })Create COLOR/FLOAT/STRING/BOOLEAN variable
figma.addVariableMode({ collectionId, modeName })Add mode (e.g. "dark", "compact")
figma.renameVariableMode({ collectionId, modeId, newName })Rename a mode
figma.removeVariableMode({ collectionId, modeId })Remove a mode
figma.setVariableValue({ variableId/Name, modeId/Name, value })Set per-mode value
figma.modifyVariable({ variableName, value })Change variable value — all bound nodes update
figma.applyVariable({ nodeId, field, variableId/Name })Bind variable to a node property
figma.applyTextStyle({ nodeId, styleName })Apply a local text style to a TEXT node by name (auto-loads font)
figma.setFrameVariableMode({ nodeId, collectionId, modeName })Pin frame to a variable mode (Light/Dark, Compact/Large)
figma.clearFrameVariableMode({ nodeId, collectionId })Reset frame to document default mode
figma.createPaintStyle({ name, color })Create reusable paint style
figma.createTextStyle({ name, fontFamily, fontSize, ... })Create reusable text style (manual — prefer setupDesignTokens.textStyles)
figma.ensure_library()Create/get Design Library frame
figma.get_library_tokens()Read library color + text tokens

applyVariable supported fields — bind FLOAT/COLOR/STRING/BOOLEAN variables to:

  • Color: fill, stroke
  • Geometry: opacity, width, height, strokeWeight
  • Corner radius: cornerRadius + individual topLeftRadius / topRightRadius / bottomLeftRadius / bottomRightRadius
  • Spacing (auto-layout): paddingTop, paddingBottom, paddingLeft, paddingRight, itemSpacing, counterAxisSpacing
  • Typography (TEXT nodes): fontSize, letterSpacing, lineHeight, paragraphSpacing, paragraphIndent
  • Font swap (STRING): fontFamily, fontStyle, characters — swap Inter → SF Pro via 1 variable
  • Visibility (BOOLEAN): visible

Image & Icon Helpers (server-side)

OperationDescription
figma.loadImage(url, opts)Download image → place on canvas
figma.loadIcon(name, opts)Fetch SVG icon with 7-library fallback (iOS-filled first)
figma.loadIconIn(name, opts)Icon inside centered circle background

loadIcon fallback priority (filled-first, iOS style preferred): Ionicons (iOS filled) → Fluent UI (Win11 filled) → Bootstrap (filled) → Phosphor (filled) → Tabler Filled (4,500+) → Tabler Outline → Lucide (outline fallback)

Free replacement for paid Icons8 ios-filled. Ionicons naming quirks: Bell→notifications, Back→chevron-back, Clock→time, Fire→flame, Lightning→flash, Lock→lock-closed.

Prototyping & Interactions

OperationDescription
figma.setReactions({ id, reactions })Add prototype interactions (ON_CLICK/ON_HOVER/ON_PRESS → NAVIGATE/OVERLAY/SWAP)
figma.getReactions({ id })Read all prototype interactions from a node
figma.removeReactions({ id })Clear all interactions from a node

Supported transitions: SMART_ANIMATE, DISSOLVE, MOVE_IN, MOVE_OUT, PUSH, SLIDE_IN, SLIDE_OUT, INSTANT Supported easings: LINEAR, EASE_IN, EASE_OUT, EASE_IN_AND_OUT, CUSTOM_BEZIER

Scroll Behavior

OperationDescription
figma.setScrollBehavior({ id, overflowDirection })Set overflow scrolling: NONE / HORIZONTAL / VERTICAL / BOTH

Variant & Component Swapping

OperationDescription
figma.setComponentProperties({ id, properties })Set variant, boolean, text, or instance swap properties on an INSTANCE
figma.swapComponent({ id, componentId })Swap the main component of an instance
figma.getComponentProperties({ id })Read all properties + definitions from component/instance

Available Read Operations (figma_read)

OperationDescription
get_selectionFull design tree of selected node(s) + design tokens
get_designFull node tree for a frame/page (depth param: default 10, or "full")
get_page_nodesTop-level frames on the current page
screenshotExport node as PNG — displays inline in Claude Code
export_svgExport node as SVG markup
export_imageExport node as base64 PNG/JPG — for saving to disk (format, scale params)
get_design_contextAI-optimized design→code payload — flex layout, token-resolved fills as var(--name), typography with style names, component instances with variant properties + componentsUsed / tokensUsed summaries. Best single call for generating React/Vue/Swift code.
get_component_mapComponent instance map — every INSTANCE in a frame with componentSetName, variantLabel, properties, and suggestedImport path. Deduplicates into uniqueComponents[] with usage counts.
get_unmapped_componentsCode-mapping audit — lists instances with no description in Figma (unmapped[]). Use to prompt user for correct import paths before code generation.
get_node_detailStructured properties for single node — fills, layout, typography, effects, bound variables (resolved to name+value), style refs (resolved to name+hex), instance overrides (full field list), componentSetName + variantLabel
get_cssReady-to-use CSS string for a node — background, flex, border, radius, shadow, typography, opacity, transform. Best for design-to-code.
get_stylesAll local paint, text, effect, grid styles
get_local_componentsComponent listing with descriptions + variant properties
get_viewportCurrent viewport position, zoom, bounds
get_variablesLocal variables (Design Tokens) — collections, modes, values
search_nodesFind nodes by type, name, fill color, font, size — supports includeHidden
scan_designProgressive scan for large files — all text, colors, fonts, images, icons

includeHidden param (boolean, default false) — available on get_selection, get_design, search_nodes, scan_design. When false (default), nodes with visible: false are skipped. Pass true to include hidden layers.


Working with an Existing Project

When opening a Figma file that already has a design system, always read before drawing.

Step 1 — Read what exists

figma_read get_variables      → load variable IDs (Design Tokens)figma_read get_styles         → load paint/text style IDs and hex valuesfigma_read get_local_components → load component IDsfigma_read get_page_nodes     → load top-level frame IDs

Step 2 — Build lookup maps in figma_write

js
// Load variables → build varMap: name → idvar vars = await figma.get_variables();var varMap = {};for (var ci = 0; ci < vars.collections.length; ci++) {  var col = vars.collections[ci];  for (var vi = 0; vi < col.variables.length; vi++) {    var v = col.variables[vi];    varMap[v.name] = v.id;  }}
// Load styles → build colorMap: name → hex, textMap: name → {fontSize, fontWeight}var styles = await figma.get_styles();var colorMap = {}, textMap = {};styles.paintStyles.forEach(function(s) { colorMap[s.name] = s.hex; });styles.textStyles.forEach(function(s)  { textMap[s.name]  = s; });
// Load components → build compMap: name → idvar comps = await figma.get_local_components();var compMap = {};comps.components.forEach(function(c) { compMap[c.name] = c.id; });

Step 3 — Create nodes using discovered values

js
// Use colorMap for fill (hex from existing styles)var card = await figma.create({  type: "FRAME", name: "Card",  fill: colorMap["color/bg-surface"] || "#FFFFFF",  width: 360, height: 200,  layoutMode: "VERTICAL", paddingTop: 16, paddingLeft: 16,  paddingBottom: 16, paddingRight: 16, itemSpacing: 12,});
// Then bind variables so light/dark mode switches propagateif (varMap["bg-surface"])  await figma.applyVariable({ nodeId: card.id, field: "fill",        variableId: varMap["bg-surface"] });if (varMap["radius-md"])  await figma.applyVariable({ nodeId: card.id, field: "cornerRadius",variableId: varMap["radius-md"] });if (varMap["spacing-md"])  await figma.applyVariable({ nodeId: card.id, field: "paddingTop",  variableId: varMap["spacing-md"] });

Step 4 — Instantiate components with overrides

js
// Prefer existing components over drawing from scratchif (compMap["btn/primary"]) {  await figma.instantiate({    componentId: compMap["btn/primary"],    parentId: card.id,    overrides: { "Label": { text: "Confirm", fill: "#FFFFFF" } }  });}

Step 5 — Pin frames to Light / Dark mode

js
var collection = vars.collections.find(function(c) { return c.name === "Design Tokens"; });
// Duplicate frame and preview both modes side by sidevar frames = await figma.get_page_nodes();var homeId  = frames.find(function(f) { return f.name === "Home"; }).id;var light   = await figma.clone({ id: homeId, x: 0,    name: "Preview/Light" });var dark    = await figma.clone({ id: homeId, x: 1540, name: "Preview/Dark"  });await figma.setFrameVariableMode({ nodeId: light.id, collectionId: collection.id, modeName: "light" });await figma.setFrameVariableMode({ nodeId: dark.id,  collectionId: collection.id, modeName: "dark"  });

Full API reference and all design rules: run figma_docs in your AI client.


Star History

If figma-ui-mcp helps you, please give it a star — it helps others discover the project!

[GitHub stars]

[Star History Chart]


License

[License: MIT]

MIT © TranHoaiHung — free to use, modify, and distribute. See LICENSE for details.


Keywords

figma mcp, claude code to figma, cursor to figma, ai to figma, figma ai plugin, figma mcp bridge, figma mcp server, figma design to code, code to figma design, ai ui design, figma automation, figma plugin ai, model context protocol figma, claude figma, windsurf figma, vs code figma, antigravity figma, ai design tool, figma api alternative, figma localhost plugin, draw ui with ai, ai generate figma design, figma design system ai, mcp server figma, figma read design, figma write design, bidirectional figma, figma desktop plugin, npx figma-ui-mcp

来源:README.md,提交 f001ff8

工具

5

figma_status

Check whether the Figma plugin bridge is connected. Always call this first to confirm the plugin is running before any other tool.

无需输入参数。

figma_write

Execute JavaScript code to CREATE or MODIFY designs in Figma. ⚠️ MANDATORY: Call figma_docs BEFORE writing any design code. Skipping figma_docs causes hardcoded colors, wrong sizing, broken layouts, and low-quality UI. Use the `figma` proxy object — all methods return Promises, use async/await. Operations: create, modify, delete, clone, group, ungroup, flatten, resize, set_selection, set_viewport, batch (multiple ops in one call). Design Tokens: createVariableCollection, createVariable, setVariableValue, addVariableMode, renameVariableMode, removeVariableMode, applyVariable, setFrameVariableMode, clearFrameVariableMode, createPaintStyle, createTextStyle, createComponent. Prototyping: setReactions, getReactions, removeReactions (click/hover/press → navigate/overlay/swap with Smart Animate transitions). Scroll: setScrollBehavior (overflowDirection: NONE/HORIZONTAL/VERTICAL/BOTH). Variants: setComponentProperties, swapComponent, getComponentProperties. Component property definitions (master-side, required for instance text overrides to recalc auto-layout): addComponentProperty (TEXT/BOOLEAN/INSTANCE_SWAP), bindComponentPropertyToText, removeComponentProperty. The code runs in a sandboxed VM: no access to require, process, fs, fetch, or network.

输入参数code必填sessionId

figma_read

READ design data from Figma — extract node trees, colors, typography, spacing, and screenshots. Use to understand an existing design before generating code, or to inspect what's on the canvas.

输入参数depthscaledetailformatnodeIdnodeNameoperation必填sessionIdincludeHidden

figma_docs

Get the API reference and design rules for figma_write. Call with no args first — returns quick-start guide + critical rules. Then load specific sections as needed: section='rules' (design principles, token rules, layer order, component-first), section='layout' (auto-layout, button/card/badge/progress/mobile rules), section='api' (create/modify/delete/clone/batch/read operations + workflow), section='tokens' (variables, multi-mode, paint styles, text styles), section='icons' (loadImage, loadIcon, loadIconIn, icon libraries, coloring, sizing). Always call figma_docs BEFORE any figma_write code.

输入参数section

figma_rules

Generate a design system rule sheet from the current Figma file — aggregates color tokens, typography styles, variables (all modes), and component catalog into a single markdown block. Equivalent to official Figma MCP's create_design_system_rules. Call once at the start of a design-to-code session to give the AI full context: what tokens to use, what text styles exist, which components are available. Re-run when the design system changes.

输入参数sessionId

版本历史

3
  1. v2.5.30最新Oct 26, 2026
  2. v2.5.29Oct 11, 2026
  3. v2.5.26Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Figma 集成