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

io.github.TranHoaiHungPublished by GitHub account TranHoaiHungv2.5.30Updated Oct 26, 2026
Bidirectional Figma MCP — AI draws UI on Figma canvas, reads designs back
The publisher's own server: Figma MCP Server
Bidirectional Figma bridge that lets an AI assistant draw and modify UI on the Figma canvas and read existing designs back as data, screenshots or tokens.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
[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
localhostHTTP polling. Figma's web app does not allow localhost network access, so Figma Desktop is required.
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.
Full version history: see CHANGELOG.md.
Choose your platform:
Edit config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonEdit .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
Edit .vscode/mcp.json (project) or add to settings.json (global):
Edit ~/.codeium/windsurf/mcp_config.json:
mcp_config.json:⚠️ 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.
⬇ Download plugin.zip — no git clone needed
plugin.zip anywhere on your machinemanifest.json from the unzipped folderThe plugin UI shows a green dot when the MCP server is connected.
The Figma plugin does not auto-update — re-linking (Step 3) is required whenever the plugin changes.
Tell your AI assistant to connect:
The AI will call figma_status and confirm:
If you see "Plugin not connected", make sure the Figma plugin is running (Step 2).
Once connected, just describe what you want in natural language:
The AI will automatically:
figma_docs to load the API reference and design rulesfigma_read get_page_nodes to understand the current canvasfigma_write to create the design on your Figma canvasfigma_read screenshot to verify the result"dark theme", "glassmorphism", "minimal white" gives the AI clear direction"mobile" (390×844), "tablet" (768×1024), "desktop" (1440×900)"fix the spacing" or "make the buttons bigger" — the AI reads and modifies existing nodes"improve this design" — the AI reads your selection first"Now draw the signup screen next to the login screen" — the AI positions frames side by sideAsk Claude: "Draw a dark dashboard with a sidebar, header, and 4 KPI cards"
Claude calls figma_write with code like:
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.
Returns a base64 PNG Claude can analyze and describe.
figma_write)create / modify — advanced props available on any node:
applyVariable supported fields — bind FLOAT/COLOR/STRING/BOOLEAN variables to:
fill, strokeopacity, width, height, strokeWeightcornerRadius + individual topLeftRadius / topRightRadius / bottomLeftRadius / bottomRightRadiuspaddingTop, paddingBottom, paddingLeft, paddingRight, itemSpacing, counterAxisSpacingfontSize, letterSpacing, lineHeight, paragraphSpacing, paragraphIndentfontFamily, fontStyle, characters — swap Inter → SF Pro via 1 variablevisibleloadIcon 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.
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
figma_read)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.
When opening a Figma file that already has a design system, always read before drawing.
Full API reference and all design rules: run
figma_docsin your AI client.
If figma-ui-mcp helps you, please give it a star — it helps others discover the project!
MIT © TranHoaiHung — free to use, modify, and distribute. See LICENSE for details.
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
Source: README.md at commit f001ff8
Check whether the Figma plugin bridge is connected. Always call this first to confirm the plugin is running before any other tool.
Takes no parameters.
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.
coderequiredsessionIdREAD 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.
depthscaledetailformatnodeIdnodeNameoperationrequiredsessionIdincludeHiddenGet 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.
sectionGenerate 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.
sessionId90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

com.figma.mcpOfficial publisher
Figma's remote MCP server that gives AI coding agents design context from Figma files so they can generate and update code.

Published by GitHub account workingmodel
Local MCP server plus Figma plugin that lets an assistant create and edit fully editable vector nodes, shapes, text and components on the Figma canvas.

Published by GitHub account Mehmoodqureshi
Converts a Figma frame into HTML, React or Next.js code and pixel-diffs the rendered result against the design until it converges.

Published by GitHub account Mehmoodqureshi
Converts a Figma frame into deterministic HTML, React or Next.js code, then renders it in Chromium and pixel-diffs it against the design until it matches.

Published by GitHub account NBhey
A local MCP server that lets an assistant read Figma designs pulled once into a vault, offline and without a Figma token or rate limits.
Claude ──figma_write──▶ MCP Server ──HTTP (localhost:38451)──▶ Figma Plugin ──▶ Figma DocumentClaude ◀─figma_read──── MCP Server ◀──HTTP (localhost:38451)── Figma Plugin ◀── Figma Document# 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{ "mcpServers": { "figma": { "command": "npx", "args": ["-y", "figma-ui-mcp"] } }}{ "mcpServers": { "figma": { "command": "npx", "args": ["-y", "figma-ui-mcp"] } }}{ "mcp": { "servers": { "figma": { "command": "npx", "args": ["-y", "figma-ui-mcp"] } } }}{ "mcpServers": { "figma": { "command": "npx", "args": ["-y", "figma-ui-mcp"] } }}{ "mcpServers": { "figma": { "command": "npx", "args": ["-y", "figma-ui-mcp"] } }}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# 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"Connect to figma-ui-mcp"✅ Connected — File: "My Project", Page: "Page 1", Plugin v2.5.5"Use figma-ui-mcp to draw a login screen for mobile"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 sidefigma_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, SVGawait 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",});// ... continuefigma_read → operation: "screenshot" → nodeId: "123:456"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 dotfigma_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// 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; });// 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"] });// 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" } } });}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" });