Figma MCP server with full read/write access via plugin β no API token, no rate limits. 73 tools.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Figma MCP β Local Plugin Integration
Open-source Figma MCP server with full read/write access via plugin. Turn text into designs and designs into real code. Works with Cursor, Claude, GitHub Copilot, and any MCP-compatible AI tool.
Highlights
Styles, Variables, Components, Prototypes, and Content
https://github.com/user-attachments/assets/eae41471-fc72-4574-8261-4f42c38b8c99
Text to Design, Design to Code
https://github.com/user-attachments/assets/17bda971-0e83-4f18-8758-8ac2b8dcba62
Most Figma MCP servers rely on the cloud-based Figma REST API.
While the REST API is excellent for server-to-server integrations, experimenting with AI tools often involves making hundreds of rapid tool calls per session. A cloud-based approach can introduce network latency and overhead.
This project takes a different approach by running as a local Figma Plugin. By bridging directly to the Figma Plugin API on your desktop, it provides instant, real-time read/write access to your active documents without relying on external cloud APIs or requiring an API token.
Install via npx or bunx β no build step required. Watch the setup video or follow the steps below.
Claude Code CLI
Codex CLI
.mcp.json (Claude and other MCP-compatible tools)
.vscode/mcp.json (Cursor / VS Code / GitHub Copilot)
The panel shows the connected file, the current selection, and what the AI is doing right now. Three controls sit above the connection row:
| Control | What it does |
|---|---|
| Guard | off runs every request (default, and how the plugin has always behaved). confirm holds deletes and bulk rewrites until you allow them. read-only blocks every change while still answering reads. |
| Undo | Reverses the last change. A whole batch_execute_pipeline run is one undo step, not one per action. |
| Log | Opens the activity log β every request with its tool name, duration, and error. Copy dumps it as text for a bug report. |
| Pin | Holds the current selection still. get_selection(source: "pinned") then returns those nodes however the selection moves, so a conversation keeps the same context without copying node ids by hand. |
Guard, log, and the panel's size are remembered per machine. Drag the corner to resize it. The panel follows Figma's light and dark themes.
Figma's Dev Mode Code panel shows the code you attach to a node with
set_codegen_result. The code lives in the Figma file, so every teammate's Dev
Mode shows it β not only the machine that generated it.
The panel looks for code on the node itself, then on the component an instance
came from, then on its ancestors. Attaching code to a COMPONENT or
COMPONENT_SET therefore covers every instance of it.
This is deliberately not live generation. Generating on demand would mean the Code panel asking your editor for a completion mid-render, which needs MCP sampling β optional in the protocol, and not implemented by the clients this server targets. Writing the code from your editor, where the repository is in front of it, produces better code anyway.
The Code panel has a Language selector. A node often carries several blocks β the component, its styles, the query behind it β and picking a language shows only those. A language with nothing stored for the node falls back to showing everything, so the setting never reads as "this node has no code".
manifest.json from the plugin.zipEvery MCP client starts its own copy of the server, but only one process can hold the plugin connection on a given port. There are two ways to share, and they do different things.
Same Figma file, no configuration. Leave the default config everywhere. The first process to bind port 1994 owns the WebSocket to the plugin; the others detect the port is taken and proxy their tool calls to it over HTTP. Every client drives the one file the plugin is open in. If the process holding the port exits, another takes over within a few seconds.
Different Figma files, one port each. Give each client its own port and point a separate plugin instance at it:
Then open the plugin in the second Figma file and set the port to match under the settings gear. Each client now talks to its own file, with no proxying.
Note that the plugin stores host and port in figma.clientStorage, which is
shared across files β changing the port makes it the default the next time you
open the plugin anywhere, so expect to set it on whichever instance should use
1994.
--ip moves the listener off 127.0.0.1 (use 0.0.0.0 to accept connections
from another machine).
The plugin connection is not authenticated. On the default 127.0.0.1 bind
that costs nothing: only this machine can reach it. Move it off loopback and
anyone who can reach the port can read and edit whatever file the plugin is open
in. The server warns at startup when you do, and the plugin panel turns its
confirm guard on and says so, which gates the destructive tools rather than
the connection. Prefer an SSH tunnel to opening the port.
Re-download the plugin when you update the server. The server updates itself
through npx, but the Figma plugin is installed by hand, so the two can drift
apart. A plugin older than the server will reject commands it does not know with
Unknown request type.
No tool changed its name or its arguments. Five things behave differently:
time=β¦ level=INFO msg=β¦ component=bridge β¦) rather than prefixed
([bridge] β¦). Anything grepping for [bridge] needs updating. Logs still go
to stderr; stdout still carries only the MCP protocol.FIGMA_MCP_LOG to debug, info, warn or error. The
default is info, and tool parameters β your text, colours and names β now
appear only at debug.connection refused. A call made while the
plugin is reconnecting after a leader handover waits for it rather than
reporting the plugin as absent./ping returns role, connected, pending and uptimeSeconds
alongside status and version.Eighteen tools were removed by folding each into one that already covered it. No capability was lost β everything possible before is still one call:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/figma-mcp-go)<a href="https://allmcps.com/mcp/figma-mcp-go"><img src="https://allmcps.com/api/badge/figma-mcp-go?style=directory" alt="Figma MCP Go on AllMCPs" /></a>