The Figma file you have open, as MCP tools. Extract, edit, and keep a saved set.
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.
The Figma file you have open, as MCP tools β and nothing else.
Those install the MCP server. It answers nothing until the daemon is running and the Figma plugin is open β see Getting it running, which is five steps and takes about two minutes.
A Figma plugin, a local daemon, and an MCP server. Your coding agent reads the design, extracts a node as PNG, React, HTML or CSS, edits the canvas when you allow it, and shares a saved set of components with you. No relay, no account, no network beyond loopback.
Three processes and one rule: figma.* exists only while the plugin is open, so
the plugin holds the connection and everything else asks questions down it.
This repo is a derivative of Figsnap, cut down to one job. Figsnap
ships four products from one package.json β the plugin, a Cloudflare Worker
relay with accounts, an ACP chat client, and this MCP server. If all you want is
MCP tools and a saved set, you had to clone all of it, build a 4,200-line panel
you would never open, and load a plugin whose manifest whitelists a Worker you
would never sign in to.
So: no ACP client, no harness discovery, no session store, no relay, no accounts, no chat, no API browser, no code-export UI. What is left is the extraction engine, the 41 tools, and a panel with three panes.
Figsnap is not modified by any of this, and the two can run side by side β this
daemon is on port 3058 with its token in ~/.figsnap-mcp/agent-token, where
Figsnap's is on 3056 with its token in ~/.figsnap/agent-token.
One caution on that manifest: Figma validates allowedDomains and refuses an IP
literal β Invalid value for allowedDomains. 'ws://127.0.0.1:3058' must be a valid URL β and a manifest it refuses is a manifest it does not load, so the
plugin quietly keeps running the last good one. Name localhost, and check the
console after any change here, because nothing else reports it.
They are kept apart in Figma too. clientStorage is keyed by plugin id, so the
manifest carries an id of its own rather than Figsnap's REPLACE_ON_PUBLISH, and
every key this plugin writes is prefixed figsnap-mcp: on top of that. Sharing
either one means sharing the stored daemon address, and a panel that inherits
ws://localhost:3056 is then blocked by its own manifest's CSP β with a console
error the designer never sees. The panel also refuses any stored or typed address
outside the port its manifest allows, and drops the token that came with it.
Two commands come with it:
figsnap-mcp-daemon | the bridge; leave it running while you work |
figsnap-mcp | the MCP server, spawned by your client β not run by hand |
You can skip the install and let npx fetch it, which is what an MCP client
config usually does. The Figma plugin ships in the package too: after a global
install its manifest is at
Or clone the repository and npm install && npm run build, which is the same
thing with the sources beside it.
Five steps, once.
1. Build it.
From a clone instead: npm install && npm run build.
2. Start the daemon. Leave it running; it is the only thing that talks to Figma.
From a clone: npm run daemon. figsnap-mcp-daemon --help lists the rest.
It prints its address and its token:
3. Load the plugin. In Figma desktop: Plugins β Development β Import
plugin from manifest, pick the package's manifest.json (npm root -g finds
it, or it is in the repository root), then run Figsnap MCP.
4. Pair the panel. Copy the token line from step 2 into the panel's
Connect pane and press Connect. The dot turns green and the Address
reads ws://localhost:3058/panel.
This is the only place a token is ever typed. It is stored in Figma's own per-user storage, so the panel reconnects itself every time from now on.
5. Register the MCP server.
Restart the client, then claude mcp list shows figsnap-mcp Β· β Connected.
From a clone, name the file instead: -- node /path/to/FigsnapMCP/agent/mcp-stdio.mjs.
Check the whole chain:
panelConnected: true is the line that matters β it means Figma is on the
other end.
An MCP client never needs it. This is the part that surprises people:
claude mcp add takes no token, no environment variable, no config. The MCP
server reads the daemon's own file on the way past.
Only two things use the token, and only one of them is you:
| Who | How it gets it |
|---|---|
| The Figma panel | You paste it, once, in Connect |
agent/mcp-stdio.mjs | Reads ~/.figsnap-mcp/agent-token by itself |
Where it comes from. The first time the daemon starts it makes one β 24
random bytes, base64url β and writes it to ~/.figsnap-mcp/agent-token with
mode 600. Every later start reads that same file back, so the token is stable
and the panel is not re-paired every morning.
How to see it again without restarting anything:
Why there is one at all. The daemon listens on a loopback port, and any web
page you happen to visit can open a socket to localhost. Two things stop it:
the Origin header, checked on upgrade, which a browser cannot forge; and this
token, because a browser WebSocket cannot set headers. Only GET /health is
reachable without it β so the panel can tell you the daemon is running before it
has been paired.
If it leaks, rotate it:
That writes a fresh one and invalidates the old. Re-paste it in Connect; MCP clients pick the new one up on their own, because they read the file.
To use one of your own β a fixed token in a script, say β set
FIGSNAP_MCP_TOKEN and the daemon uses it instead of the file. Set the same
variable for the MCP client if it cannot read your home directory.
FIGSNAP_MCP_URL moves the address the client dials.
For a client that takes JSON:
figsnap-mcp-daemon --mcp prints both, with paths already filled in.
Then claude mcp list should show figsnap-mcp Β· β Connected, and in a session
figma_get_selection answers about whatever is selected on the canvas.
Three things can be wrong, and each says so differently:
| What the tool says | What to do |
|---|---|
No figsnap-mcp daemon at http://127.0.0.1:3058 | npm run daemon |
The Figsnap MCP plugin is not open in Figma | Open the file and run the plugin |
The figsnap-mcp daemon rejected the token | cat ~/.figsnap-mcp/agent-token, or set FIGSNAP_MCP_TOKEN |
Editing the file is switched off | Turn on Allow edits in the plugin's Tools pane |
Three things a question about a Figma file almost always needs are addressable
rather than called for, so a client can @-mention them:
| URI | What it is |
|---|---|
figma://selection | Everything selected, extracted |
figma://page | The layer tree, three levels deep |
figma://library | Components, styles and variables, with ids |
figma://node/{nodeId} | One layer β figma://node/21:10314 |
Four panes, and the one it opens on is Selection.
Selection is a preview of whatever you have picked on the canvas β the picture, its name, type, size, child count and node id β with a folder picker and a Save button beside it. Saving from here is the short way round: no switching panes, no hunting for the layer again in a list.
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/figsnap-mcp)<a href="https://allmcps.com/mcp/figsnap-mcp"><img src="https://allmcps.com/api/badge/figsnap-mcp?style=directory" alt="Figsnap MCP on AllMCPs" /></a>