join_channel
Join a named channel on the Figma Vector MCP socket relay. Must be called before any drawing commands if the channel was not set via env/arg.
channelrequired
io.github.workingmodelPublished by GitHub account workingmodelv0.3.3Updated Oct 30, 2026
Let Claude create and edit fully editable vector nodes on the Figma canvas.
The publisher's own server: Figma MCP Server
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.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
A Figma plugin + MCP server that lets Claude (or any MCP client) create and manipulate fully-editable vector nodes on the Figma canvas — paths, shapes, gradients, text, effects, image fills, and more — via a local WebSocket relay.
Developed by Working Model Inc
Version 0.3.3 — 58 tools across creation, styling, layout, components, effects, pages, and export.
cursor-talk-to-figma-mcp is great for reading Figma state and creating basic primitives, but it has no vector path creation, gradient, effects, or compositing tools. This plugin fills that gap:
The socket relay runs locally. The Figma plugin connects and joins a named channel. The MCP server joins the same channel and sends commands. Results flow back the same path.
For AI agents (Claude Code, Cursor, etc.) — the recommended call sequence to start any session:
Color convention: All RGB values are 0–1 throughout (matching Figma's internal format). r: 1, g: 0, b: 0 = red. Never use 0–255.
Gradient workflow:
Image fill workflow (with generative AI):
Batch compositions — use $prev.id to chain commands without extra round-trips:
Known SVG limits: figma.createNodeFromSvg() strips <defs>, gradients, filters, masks, and animations. Use set_gradient_fill for gradients instead of SVG <linearGradient>.
Reconnection: If the plugin disconnects, it auto-reconnects with exponential backoff (1s→30s max) and replays queued commands (up to 30s old). No manual intervention needed for short interruptions.
src/figma-plugin/manifest.jsonListens on ws://localhost:3055. Auto-start on login (macOS):
Manual config (~/.claude/settings.json or ~/.cursor/mcp.json):
ws://localhost:3055) → Connectfigma-vector-mcp) → JoinThe plugin saves your last URL and channel — pre-filled on next open. Keep the plugin panel open during your session — closing it terminates the WebSocket connection.
Per-tool timeout overrides: health_check → 3s, export_node_as_png → 30s, export_node_as_svg → 15s, create_batch → 60s.
The plugin main thread (code.js) runs in Figma's restricted QuickJS sandbox. The UI (ui.html) is a normal browser context and is not affected.
Run bun run lint:plugin to check code.src.js for violations before building. A pre-commit hook can be installed via ./scripts/install-hooks.sh.
code.jscreate_vector_from_svg)src/figma-plugin/code.src.jsbun run lint:plugin — catch sandbox violations before buildingbun run build:plugin — esbuild outputs code.js (ES2017)code.jssrc/socket.ts) adapted from cursor-talk-to-figma-mcp — Copyright (c) 2025 sonnylazuardi, MIT LicensesetCharacters helpers in code.src.js adapted from the same project — Copyright (c) 2025 sonnylazuardi, MIT LicenseMIT © Working Model — see LICENSE and THIRD_PARTY_NOTICES.md.
Developed by Working Model Inc
Source: README.md at commit ec9dccc
Join a named channel on the Figma Vector MCP socket relay. Must be called before any drawing commands if the channel was not set via env/arg.
channelrequiredPing the Figma plugin and confirm connectivity. Returns plugin version and current page.
Takes no parameters.
Place a fully editable vector node on the Figma canvas from an SVG string. Supports any valid SVG including paths, polylines, polygons, circles, and groups. The created node is fully editable in Figma.
xysvgrequirednameparentIdCreate an editable vector from a single SVG path `d` attribute string. Shorthand for simple paths without a full SVG wrapper.
drequiredxynameparentIdfillColorstrokeColorstrokeWeightCreate an editable vector from an array of [x, y] point pairs. Use closed=true to produce a filled polygon.
xynameclosedpointsrequiredparentIdstrokeColorstrokeWeightCreate a Figma frame (container) on the canvas.
xynamewidthrequiredheightrequiredparentIdfillColorCreate a rectangle on the Figma canvas.
xynamewidthrequiredheightrequiredparentIdfillColorCreate an ellipse (or circle) on the Figma canvas.
xynamewidthrequiredheightrequiredparentIdfillColorCreate a text node on the Figma canvas. Use width to fix the column width and enable text wrapping.
xynametextrequiredwidthheightfontSizeparentIdfillColorfontStylefontFamilytextAutoResizeApply a gradient fill to a Figma node. Supports LINEAR, RADIAL, ANGULAR (conic), and DIAMOND types. Replaces any existing fills. Stops must be sorted by position (0 → 1).
typeanglestopsrequiredcenternodeIdrequiredgradientTransformEnable auto-layout on a frame and configure direction, spacing, padding, and alignment. Set direction to NONE to disable auto-layout.
wrapnodeIdrequiredpaddingspacingdirectioncounterAxisAlignprimaryAxisAligncounterAxisSizingModeprimaryAxisSizingModeConvert an existing frame or group into a reusable Figma component.
namenodeIdrequiredPlace an instance of a local component on the canvas by component ID.
xynameparentIdcomponentIdrequiredSet the fill color of a Figma node.
abrequiredgrequiredrrequirednodeIdrequiredSet the stroke color (and optional weight) of a Figma node.
abrequiredgrequiredrrequirednodeIdrequiredweightSet comprehensive stroke properties on a node: color, weight, position, dash pattern, line cap, and line join.
colornodeIdrequiredweightlineCaplineJoinpositiondashPatternModify typographic properties of an existing text node without replacing its content. Also use to set or update text box width and wrapping.
widthheightnodeIdrequiredfontSizefillColorfontStyletextAlignfontFamilylineHeightletterSpacingtextAutoResizeSet corner radius of a rectangle or frame. Use radius for uniform corners or topLeft/topRight/bottomLeft/bottomRight for individual corners (e.g. pill, tab, card shapes).
nodeIdrequiredradiustopLefttopRightbottomLeftbottomRightSet the opacity of a Figma node (0 = invisible, 1 = fully opaque).
nodeIdrequiredopacityrequiredMove a Figma node to a new position on the canvas.
xrequiredyrequirednodeIdrequiredResize a Figma node to the given width and height.
widthrequiredheightrequirednodeIdrequiredDelete a node from the Figma canvas.
nodeIdrequiredDuplicate a Figma node, optionally repositioning the clone.
xynodeIdrequiredparentIdRename a Figma node.
namerequirednodeIdrequiredShow or hide a Figma node.
nodeIdrequiredvisiblerequiredChange a node's Z-order within its parent. Use action for relative moves or index for an absolute position (0 = bottom of stack).
indexactionnodeIdrequiredGroup multiple Figma nodes into a group layer.
namenodeIdsrequiredparentIdUngroup a group node, returning its children to the parent.
nodeIdrequiredExecute multiple commands in a single round-trip. Commands run sequentially. Each result includes success/error status. Use this for complex compositions (e.g. place an SVG, add a label, group them) to avoid multiple round-trips.
commandsrequiredGet information about the current Figma document: name, current page, all pages, and top-level nodes.
Takes no parameters.
Get the currently selected nodes in Figma, including position and size.
Takes no parameters.
Get detailed information about a specific node by ID: type, position, size, opacity, children.
nodeIdrequiredScroll the Figma viewport to focus on a node and select it.
nodeIdrequiredList all pages in the current Figma document.
Takes no parameters.
Switch to a different page in the Figma document by ID or name.
pageIdpageNameGet all local paint styles and text styles defined in the Figma document. Use these IDs with apply_style to keep output on-brand.
Takes no parameters.
Apply a named document style (paint or text) to a node by style ID.
nodeIdrequiredstyleIdrequiredstyleTypeList all fonts available in this Figma environment (system fonts + Figma font agent). Use before create_text to verify a font is loadable. Optionally filter by family name substring.
queryList all local components in the Figma document.
Takes no parameters.
Export a Figma node as an SVG string. Useful for round-tripping: create a vector, modify it in Figma, export back.
nodeIdrequiredExport a Figma node as a base64-encoded PNG at the specified pixel scale.
scalenodeIdrequiredSearch for nodes by name (case-insensitive contains) and/or type. Scoped to a page (defaults to current page). Recursive by default.
typequerypageIdrecursiveCreate a new page in the Figma document.
namerequiredCopy a node to a target page at an optional position.
xynodeIdrequiredtargetPageIdrequiredUpdate fill color, stroke color, opacity, position, and/or size on multiple nodes in a single round-trip.
operationsrequiredApply effects (drop shadow, inner shadow, layer blur, background blur) to a node. Use mode REPLACE (default) to overwrite all effects, or APPEND to add to existing ones.
modenodeIdrequiredeffectsrequiredSet the blend mode of a node layer.
moderequirednodeIdrequiredSet a node's fill to a base64-encoded image. Use with image generation APIs (Replicate, fal.ai) to place rendered imagery directly on canvas.
base64requirednodeIdrequiredopacitymimeTypescaleModePerform a boolean operation (union, subtract, intersect, exclude) on 2 or more vector nodes.
namenodeIdsrequiredoperationrequiredApply column, row, or uniform grid guides to a frame.
gridsrequirednodeIdrequiredSave a named alias for a node ID, persisted in the Figma document. Use resolve_node to retrieve it later.
aliasrequirednodeIdrequiredLook up a node ID by its registered alias. Returns the node ID previously saved with register_node.
aliasrequiredSave a named color alias to the document palette. All RGB values are 0–1. Use resolve_color or list_colors to retrieve.
abrequiredgrequiredrrequiredaliasrequiredLook up a color by its registered alias. Returns r, g, b, a values (0–1).
aliasrequiredList all color aliases registered in this document's palette.
Takes no parameters.
Export the current Figma page as a base64-encoded PNG. Useful for visual verification of the canvas state.
scaleList components available for use. Returns local document components. Filter by name with optional query.
queryApply a clip mask — maskNode defines the shape, targetNode is clipped to it. Both nodes are grouped.
namemaskNodeIdrequiredtargetNodeIdrequired90% 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 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.

io.scalably
Local MCP server for the Figma REST API that lets an assistant list a file's top-level frames and download one frame's PNG, node JSON and image-fill map.
Claude (MCP client) ↕ stdio (MCP protocol)server.ts (MCP server) ↕ WebSocket (ws://localhost:3055)socket.ts (relay — channel-based routing) ↕ WebSocketFigma plugin (ui.html ↔ code.js) ↕ postMessageFigma Plugin API → canvas1. health_check → confirm plugin is connected2. get_document_info → get page IDs, current page, top-level nodes3. get_available_fonts → discover loadable fonts before create_text4. get_styles → load brand colours/text styles if available1. create_frame({ width, height }) → get frameId2. set_gradient_fill({ nodeId: frameId, type: "LINEAR", angle: 135, stops: [{ color: { r:0.2, g:0.1, b:0.9 }, position: 0 }, { color: { r:0.9, g:0.2, b:0.4 }, position: 1 }] })1. Generate image via Replicate/fal.ai → get base64 PNG2. create_frame({ width: 512, height: 512 })3. set_image_fill({ nodeId, base64, scaleMode: "FILL" }){ "commands": [ { "command": "create_frame", "params": { "width": 400, "height": 300, "name": "Card" } }, { "command": "set_gradient_fill", "params": { "nodeId": "$prev.id", "type": "LINEAR", "stops": [{"color":{"r":0.1,"g":0.1,"b":0.9},"position":0}, {"color":{"r":0.8,"g":0.2,"b":0.5},"position":1}] } }, { "command": "create_text", "params": { "parentId": "$results.0.id", "text": "Hello", "fontSize": 32, "x": 24, "y": 24 } }]}npm install -g figma-vector-mcp# or use without installing via npx / bunx (see MCP config below)bun run socket./scripts/setup.sh --launchd# Auto-detect Claude Code / Cursor and write config:./scripts/setup.sh
# Local build:./scripts/setup.sh --local
# Install git pre-commit sandbox lint hook:./scripts/setup.sh --hooks{ "mcpServers": { "FigmaVectorMCP": { "command": "bunx", "args": ["figma-vector-mcp@latest"], "env": { "FVMCP_CHANNEL": "figma-vector-mcp" } } }}health_check → { "status": "ok", "version": "0.3.3", "currentPage": { ... } }bun install # install depsbun run socket # start relay on :3055bun run build # build MCP server → dist/server.jsbun run build:plugin # build plugin: code.src.js → code.jsbun run lint:plugin # check code.src.js for sandbox violations./scripts/install-hooks.sh # install pre-commit lint hook