About Figma Local MCP
Figma Local MCP is an MCP server published by MiHarsh in the Content category.
The repository has 31 stars and 1 forks, with the last commit 5 months ago. Recent commit activity is the strongest signal that reported issues will get attention.
Install
git clone https://github.com/MiHarsh/Figma-local-MCPThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Figma Local MCP
Powered by Claude · Grounded in docs
Security checks
Static checks derived from the repository 2 days ago. Heuristics on the source, not an audit.
- ✓README presentThe repository ships documentation.
- ✓License declaredUsable under a stated license.
- ✓Tests presentA test suite exists in the repository.
- ✓Dependencies pinnedA lockfile pins dependency versions.
- ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
1 check has not been run yet.
Releases
README
A Model Context Protocol server + Figma desktop plugin that lets AI coding agents (Cursor, VS Code Copilot, Claude Desktop, Windsurf, Cline, etc.) consume Figma design data from local files — no Figma API key, no rate limits, no internet required.
The plugin packages your design as a single ZIP containing the JSON tree plus pre-rendered PNG screenshots (for multimodal visual grounding), pre-rendered SVG icons (no path-data reconstruction), and image-fill bytes. The server then exposes three composable tools that hand the agent exactly what it needs to generate pixel-accurate, semantically-correct UI code.
Built on top of Framelink MCP — uses the same extractor pipeline to simplify raw Figma data into compact, LLM-friendly output. This project adds the offline export path, visual grounding, semantic enrichment, and an agent-directing protocol.
🤖 Fully vibe-coded — this entire project (plugin + MCP tool + docs) was generated via AI-assisted development. Contributions are welcome!
Why this over the official Framelink MCP?
The official Framelink MCP is excellent for real-time API workflows. This project optimizes for a different shape: offline, designer-curated exports with visual context baked in. Concrete differences:
| Capability | Framelink MCP (API-based) | figma-local-mcp (this project) |
|---|---|---|
| Figma API key / OAuth | Required | Not needed |
| Free-tier rate limits | Hit aggressively on real designs | None — fully local |
| Internet during use | Required for every request | Not required after export |
| Visual grounding | Image download tool on demand | Pre-rendered PNG @2x of top-level frames, bundled in ZIP, returned as native MCP image content block |
| Icon fidelity | SVG via API (multiple round-trips) | Pre-rendered SVG markup in sidecar files; agent inlines verbatim |
| Image fills | imageRef → API download |
Bytes bundled locally; assetPath injected into the simplified output |
| Component semantics | componentId + name |
+ heuristic semanticRole (button, textbox, dropdown, checkbox, dialog, …) on every INSTANCE so the agent generates <input> / <select> / <button> instead of generic <div> |
| Agent guidance | Tool description only | Top-level REQUIRED_NEXT_ACTIONS checklist + per-node renderHint + ABSENT-ASSET RULE that explicitly forbids fabricating stock icons / placeholder URLs / invented SVG when an asset wasn't exported |
| Cross-page components | API resolves automatically | Plugin walks INSTANCE → mainComponent across pages and bundles the missing definitions in scope |
| Per-node named styles | Available via API | Per-node styles map captured by plugin, named styles resolved end-to-end |
| Workflow shape | Real-time: agent ↔ Figma API | Designer exports once → commits ZIP to repo → agents work offline forever |
| Reproducibility | Live data shifts with edits | ZIP is checked-in, deterministic, code-review-able |
Use this when you want zero-friction, reproducible, visually-grounded design context in your repo.
Use Framelink when you need live API access (continuously syncing screens, programmatic image downloads outside a designer workflow).
They also compose cleanly side-by-side in the same MCP config.
Why?
The official Framelink MCP server is excellent, but it requires a Figma API key. Free-tier Figma accounts hit aggressive rate limits, making it impractical for heavy use. This project solves that:
- Export design data + assets from Figma using a desktop plugin (one-time, no API key)
- Process the exported JSON through the same extractor pipeline, enriched with asset paths + semantic roles
- Feed the simplified output to your AI coding agent, which chains into
get_node_image/get_node_svgfor pixel-perfect output
Same quality output as the API-based approach — zero API calls.
How It Works
┌──────────────┐ Export ZIP ┌────────────────────────────┐ Unzip into project ┌──────────────────────────┐
│ Figma │ ──────────────► │ myfile.zip │ ─────────────────────► │ your-project/designs/ │
│ (Plugin) │ │ ├─ myfile.json │ │ ├─ myfile.json │
│ │ │ └─ myfile.assets/ │ │ └─ myfile.assets/ │
│ │ │ ├─ node_*.png (frames)│ │ ├─ *.png (frames) │
│ │ │ ├─ icon_*.svg (icons) │ │ ├─ *.svg (icons) │
│ │ │ └─ image_*.png (fills) │ │ └─ *.png (fills) │
└──────────────┘ └────────────────────────────┘ └────────────┬─────────────┘
│
Agent prompt:
"Implement the design
from ./designs/myfile.json"
│
▼
┌──────────────┐ Simplified JSON ┌──────────────────┐ Reads JSON ┌──────────────────────────┐
│ Agent │ ◄───────────────── │ MCP Server │ ◄──────────────── │ get_figma_data_from_json│
│ writes code │ + asset paths + │ (extractor │ + manifest │ │
│ │ REQUIRED_NEXT_… │ pipeline + │ + asset paths │ Agent then chains: │
│ │ ◄─ PNG bytes ── │ asset wiring) │ ◄──── reads ──── │ get_node_image ──┐ │
│ │ ◄─ SVG markup ─ │ │ sidecars │ get_node_svg ──┤ │
└──────────────┘ └──────────────────┘ └────────────────────┘ │
│
▼
Pixel-accurate,
semantically-correct
UI code
The agent doesn't just see coordinates and colors — it views the rendered design (multimodal PNG) and inlines real SVGs, so generated UI matches the design instead of drifting from it.
Quick Start
Option A: Use via npx (recommended)
No clone required. Just configure your editor's MCP config:
{
"mcpServers": {
"figma-local": {
"command": "npx",
"args": ["-y", "figma-local-mcp", "--stdio"]
}
}
}
Then skip to step 2 (build the Figma plugin).
Option B: Clone and build locally
1. Build the MCP server
git clone https://github.com/MiHarsh/figma-local-mcp.git
cd figma-local-mcp
pnpm install
pnpm build
2. Install the Figma plugin
Option A: Install from the Figma Community (recommended) — zero build, auto-updates.
- Open the plugin's Community page: https://www.figma.com/community/plugin/1626137893880787983/framelink-exporter
- Click Open in… → your Figma file (or Try it out)
- The plugin is now available under Plugins → Framelink Exporter in every file
Option B: Sideload the pre-built plugin
- Go to the latest GitHub Release
- Download
figma-plugin.zip - Unzip to any folder
- Open the Figma desktop app
- Go to Plugins → Development → Import plugin from manifest...
- Select
manifest.jsonfrom the unzipped folder - The plugin appears under Plugins → Development → Framelink Exporter
Option C: Build from source
cd figma-plugin
npm install
npm run build
Then import figma-plugin/manifest.json in Figma as above.
3. Export design data
- Open any Figma file
- Run the plugin: Plugins → Development → Framelink Exporter
- Select the nodes/frames you want to export
- Pick which assets to include (PNG frame renders, SVG icons, image-fill bytes — all on by default)
- Click Export as ZIP — a
.zipdownloads automatically containing your JSON + an<filename>.assets/folder - Unzip into your project (e.g.
./designs/); the plugin auto-closes with a Figma toast confirming the export
4. Configure MCP in your editor
Add to your editor's MCP config (mcp.json, .cursor/mcp.json, etc.):
Via npx (recommended — no clone needed):
{
"mcpServers": {
"figma-local": {
"command": "npx",
"args": ["-y", "figma-local-mcp", "--stdio"]
}
}
}
Via local clone — Mac / Linux:
{
"mcpServers": {
"figma-local": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/figma-local-mcp/dist/bin.js", "--stdio"]
}
}
}
Via local clone — Windows:
{
"mcpServers": {
"figma-local": {
"type": "stdio",
"command": "node",
"args": ["C:\\path\\to\\figma-local-mcp\\dist\\bin.js", "--stdio"]
}
}
}
No
FIGMA_API_KEYneeded. Noenvblock needed. NoPORTneeded (stdio mode doesn't use HTTP). Just the path todist/bin.js.
5. Use it
Open your editor's agent/chat mode and ask:
Build a React component matching
./designs/my_dashboard.json
A capable agent will then chain three tool calls automatically:
get_figma_data_from_json({ filePath })→ simplified design tree +REQUIRED_NEXT_ACTIONSchecklist + per-nodeimagePath/svgPath/renderHint/semanticRoleget_node_image({ filePath, nodeId })→ rendered PNG of the root frame as a native MCP image content block (the agent sees the design)get_node_svg({ filePath, nodeId })for every node carryingsvgPath→ exact icon markup, inlined verbatim
The result: code that uses <input type="email"> not <div> (because semanticRole: textbox), real SVGs not invented path data, and matches the layout/spacing of the actual design because the agent grounded its output in the rendered image.
MCP Tools
get_figma_data_from_json
Reads a Framelink-exported JSON file and returns the simplified design tree. When the export carries an asset manifest, the response is enriched with:
REQUIRED_NEXT_ACTIONS— top-level checklist of follow-up tool calls (e.g. "View root frame screenshot: get_node_image(filePath, '1:23')")renderHinton every node with an exported asset — imperative directive to callget_node_image/get_node_svgcomponentName+semanticRoleon every INSTANCE — heuristic mapping to UI primitives (button,textbox,dropdown,checkbox,dialog,card,tab,navigation,badge,icon, …)assetPathon every image fill — local sidecar PNG path so agents reference real bytes, not placeholder URLs- ABSENT-ASSET RULE in the metadata
usagefield — explicitly forbids the agent from fabricating stock icons / placeholder image URLs / invented SVG when an asset wasn't exported
| Parameter | Required | Description |
|---|---|---|
filePath |
Yes | Absolute or relative path to the exported JSON file |
depth |
No | Max tree traversal depth. Only use if explicitly requested |
get_node_image
Returns the rendered PNG screenshot of a Figma node as an MCP image content block that multimodal agents (Claude, GPT-4o, Gemini) view directly. Call this for any node carrying imagePath — it's the single biggest fidelity unlock for code generation.
| Parameter | Required | Description |
|---|---|---|
filePath |
Yes | Same JSON path you passed to get_figma_data_from_json |
nodeId |
Yes | Figma node id (e.g. "1:23") — must carry imagePath in the simplified output |
get_node_svg
Returns the exact SVG markup of an icon / vector subtree. Use for every node tagged IMAGE-SVG that carries svgPath. Inline the output verbatim into your React/Vue/Svelte component — no path-data reconstruction needed.
| Parameter | Required | Description |
|---|---|---|
filePath |
Yes | Same JSON path you passed to get_figma_data_from_json |
nodeId |
Yes | Figma node id of the vector subtree |
Example prompts:
Implement the design from
./designs/dashboard.json
Build the login page from the exported Figma file at
C:\projects\app\designs\login_2026-04-14.json
Figma Plugin
The figma-plugin/ directory contains a Figma desktop plugin that exports design data + assets as a single ZIP. See figma-plugin/README.md for the full plugin docs.
Export Options
- Scope — selected nodes (
GetFileNodesResponseshape) or current page (GetFileResponseshape) - Assets (all on by default)
- Render selected frames as PNG (@2x) — visual grounding
- Export icon subtrees as SVG — actual vector markup
- Include image-fill bytes — raster fills referenced by
imageRef
- Limit traversal depth — cap how deep the tree serialization goes
What Gets Captured
| Category | Properties |
|---|---|
| Layout | absoluteBoundingBox, constraints, auto-layout (layoutMode, itemSpacing, padding*, sizing modes) |
| Visuals | fills, strokes, effects, opacity, cornerRadius, blendMode, clipsContent |
| Per-node named-style refs | styles map ({fill, text, effect, stroke} → styleId) so the extractor resolves design-system style names |
| Text | characters, style (font family/size/weight/alignment/line height/letter spacing), styleOverrideTable |
| Components | componentProperties, componentPropertyDefinitions, componentId, component set metadata, plus cross-scope component metadata for instances whose main component lives outside the export scope |
| Assets | Top-level framelinkExport block carrying the manifest for PNGs, SVGs, and image-fill bytes |
| Structure | Full node tree with id, name, type, visible, children |
Plugin Development
cd figma-plugin
npm run watch # Rebuild on file changes
CLI Flags
| Flag | Description |
|---|---|
--stdio |
Run in stdio mode (required for MCP clients) |
--json |
Output in JSON instead of YAML |
--port <n> |
HTTP server port (default: 3333) |
--host <h> |
HTTP server host (default: 127.0.0.1) |
Run alongside the official Framelink MCP
If you also need real-time API access (live data, programmatic image downloads outside a designer-curated export), the two servers compose cleanly — different tool names, different workflows, no conflict:
{
"mcpServers": {
"figma-api": {
"command": "npx",
"args": ["-y", "figma-developer-mcp", "--figma-api-key=YOUR-KEY", "--stdio"]
},
"figma-local": {
"command": "npx",
"args": ["-y", "figma-local-mcp", "--stdio"]
}
}
}
Contributing
Contributions are welcome! Some directions still on the table:
- Smarter cross-scope component definition resolution (variants, nested instances)
get_node/list_figma_framestools for non-truncating navigation of large filesboundVariables(Figma Variables → design tokens) capture in the plugin- Better naming-hygiene normalization (collapse
Frame 23,Group 4boilerplate names) - Prototype interaction data (hover / click / transitions)
Fork it, hack on it, open a PR.
Credits
Built on top of Framelink MCP for Figma by GLips. The extractor pipeline that simplifies raw Figma data is theirs — this project adds the offline export layer.
License
MIT
README fetched from the repository 2 days ago. The original is authoritative.