MCP server that reads local Figma .fig files, fully offline
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
.fig files from an AI agentfigme is an MCP server that lets an AI agent read
everything inside a local .fig / .figma file β document structure, geometry, fills,
strokes, effects, auto-layout, text (including mixed-format runs), components and instances,
variables, prototype links and embedded bitmaps.
It is fully offline. No Figma account, no access token, no REST API, no network at runtime.
It parses the file's own bytes, using the Kiwi schema that Figma ships inside every .fig.
It is also token-aware: the reference file used to develop it holds 116,142 nodes, and no tool response ever exceeds ~20 KB. Everything is shallow by default, filterable, and paginated with cursors.
These are deliberate, permanent limits β not missing features:
.fig contains no rendered pixels of your
frames, but it does contain everything needed to draw them again: Figma bakes outlined
strokes, combined booleans, per-glyph outlines and per-instance geometry into the file at save
time. fig_render uses that to produce a real picture offline β see
Rendering for exactly what is exact and what is approximated. It is
not a screenshot of Figma and never will be: read the report before trusting fine detail..fig. The only write paths in the whole
server are fig_image { savePath } and fig_render { savePath }, which write to a path you
name.assetRef so you can see that they exist and where they point.fig_node reports the blob indices and fig_blob hands you the raw bytes, but this server
does not interpret them..fig is a full snapshot, not a delta.zlib.zstdDecompressSync; developed on Node 24).@modelcontextprotocol/sdk and zod. The parser itself uses only
Node built-ins.figme is published on npm, so there is nothing to clone and nothing to build β your MCP
client downloads it on first start with npx.
You need two things:
.fig file on disk. This server reads a local file and never contacts figma.com, so
there is no account, token or sign-in β but there is also nothing to read until you save
one. In Figma: File -> Save local copy....Nearly every MCP client spawns a stdio server from the same two fields:
On Windows, some clients cannot resolve npx on their own. If the server fails to start,
route it through cmd:
Or commit a .mcp.json at the repository root so collaborators get it too:
The Claude Code extensions for VS Code and JetBrains run Claude Code underneath and share its configuration: register the server once with the command above and the extension sees it. They do not read the editor's own MCP settings.
~/.cursor/mcp.json for every project, or .cursor/mcp.json for a single one:
VS Code uses its own key, servers rather than mcpServers, in .vscode/mcp.json:
The same entry works in your user settings.json under "mcp". From a terminal:
Then pick Agent mode in the Chat view.
~/.codeium/windsurf/mcp_config.json:
Spawn npx -y figme-mcp and talk MCP over stdio.
Client UIs and config paths move between releases. The
commandandargspair above is the stable part; if a path here does not match what you see, check that client's own MCP documentation.
Use absolute paths. A file argument may be relative, but it resolves against the server's
working directory β whichever directory your client happened to launch it from. An absolute
path removes the guesswork:
Using figme, run
fig_overviewon /Users/me/Desktop/design.fig
Watch memory. --max-files N (default 4) caps how many parsed files stay cached. A 39 MB
.fig decodes to roughly 900 MB of live objects, so lower it on a small machine and raise it
only with memory to spare:
The usual job: implement this component from our design, starting from a link someone pasted into a ticket.
This server reads a .fig on your disk and never contacts figma.com, so a link by itself is not
enough. Open it in Figma and use File -> Save local copy.... For a Community file, click
Open in Figma first β that duplicates it into your drafts, which is what makes the copy
possible.
Figma writes node ids with a dash in links; the .fig format uses a colon, so
node-id=3017-121 is guid 3017:121. You do not have to convert it yourself β every guid
argument accepts all of these:
| You pass | Server reads |
|---|---|
3017:121 | 3017:121 |
3017-121 | 3017:121 |
3017%3A121 | 3017:121 |
node-id=3017-121 | 3017:121 |
the whole https://www.figma.com/design/...?node-id=3017-121 | 3017:121 |
Anything else is passed through untouched, so a typo still fails loudly rather than being guessed at.
The file key is a cloud identifier with no counterpart in the saved file, so nothing can work
out which local .fig a link refers to. Always give the path yourself.
Using figme, read
/abs/path/UX Case Study Template.figand implement node3017:121as a React component.
A good agent then works roughly in this order:
fig_render β see it. The fastest orientation there is; check the approximated and
unsupported lists before trusting fine detail.fig_node β size, corner radii, auto-layout, constraints, children.fig_style β resolved fills, strokes, effects and typography, already shaped for code.fig_text β the exact copy, including per-run styling.fig_instance β if the node is an INSTANCE, what it came from and what is overridden.
This is what decides reusable component against one-off.fig_variables β token names, so the code references your theme instead of raw hex.fig_render again, and compare it against a screenshot of what you built.That last step is why the renderer exists: you get a pixel oracle, not just a description.
Node ids are intrinsic to the document, so the id in the link should be the id in the saved
file. If it is reported missing anyway you are most likely in the wrong file β compare
fig_overview's document name with the link's slug β or find the layer by name with fig_find,
or browse the page with fig_tree.
A Figma URL is auth-gated and rendered by JavaScript, so fetching it yields nothing useful. Worse, the slug reads like a description, which is enough for a model to invent a plausible component and present it with confidence. The server says as much to every agent at connect time; if yours reaches for the web regardless, tell it not to.
For development, or to run a revision that is not published yet:
Register node /abs/path/to/figme-mcp/dist/mcp/server.js in place of npx -y figme-mcp. This
repository ships a .mcp.json that already does so for Claude Code.
Every tool takes file (path to the .fig). Node references are guid strings of the form
"sessionID:localID", e.g. "2:1339". Responses that were cut set truncated: true and return
an opaque nextCursor you can pass back.
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/figme)<a href="https://allmcps.com/mcp/figme"><img src="https://allmcps.com/api/badge/figme?style=directory" alt="Figme on AllMCPs" /></a>