figma-mcp-express 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +324 -0
  2. package/bin/run.js +30 -0
  3. package/package.json +37 -0
package/README.md ADDED
@@ -0,0 +1,324 @@
1
+ # figma-mcp-express
2
+
3
+ ![Figma MCP Express hero: the fast lane for AI agents into Figma](assets/figma-mcp-express-hero.png)
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6
+ [![Go](https://img.shields.io/badge/Go-1.21+-blue.svg)](https://go.dev)
7
+ [![npm](https://img.shields.io/npm/v/figma-mcp-express.svg)](https://www.npmjs.com/package/figma-mcp-express)
8
+ [![Works with Claude Code](https://img.shields.io/badge/Claude%20Code-compatible-8A2BE2?logo=anthropic)](https://claude.ai/code)
9
+ [![Works with Codex](https://img.shields.io/badge/Codex-compatible-000000)](https://github.com/openai/codex)
10
+
11
+ Enhanced fork of [vkhanhqui/figma-mcp-go](https://github.com/vkhanhqui/figma-mcp-go).
12
+
13
+ ---
14
+
15
+ **Fast, quota-free, agent-ready Figma MCP.** Give AI agents direct read/write access to Figma through a local Desktop plugin, with batch execution, multi-file routing, and stable concurrent sessions that are not capped by Figma's official MCP server tool-call limits.
16
+
17
+ > **Claude Code, Codex, and other coding agents** that can use the local filesystem is **recommended.** Unlike cloud-only MCPs, figma-mcp-express uses the filesystem to optimize the performance and stability.
18
+
19
+ If you are building design migration, audit, or handoff agents, give it a try.
20
+
21
+ | Promise | What it means in practice |
22
+ | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | **Fast** | Build with fewer LLM ↔ plugin round-trips by batching dependent operations into one call. |
24
+ | **Quota-free** | Plugin-side work is not capped by Figma's official MCP server limits, such as 6 calls/month for View/Collab seats or 200-600 calls/day for Dev/Full seats. |
25
+ | **Agent-ready** | Multiple agents can share a session safely through channel routing, reconnects, read dedup, and a hardened request queue. |
26
+
27
+ ### Why this fork exists
28
+
29
+ | Compared with | What blocks real automation | What figma-mcp-express adds |
30
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
31
+ | Official Figma MCP | Seat-based MCP server limits: View/Collab seats get up to 6 calls/month, while Dev/Full seats get daily and per-minute caps. | Local plugin-side read/write access for open files without those official MCP tool-call quotas. |
32
+ | Plain figma-mcp-go | Single-connection assumptions, no batching, no parallel agents, weaker library automation, and reconnect flapping under multi-file or long-running sessions. | Multi-file channels, batch ops, library tooling, response spill-to-disk, reconnect safety, and concurrent agent handling. |
33
+ | Manual Figma cleanup | Repetitive token binding, component replacement, audits, and design-to-code extraction. | Agent workflows that can scan, modify, verify, and report across large files. |
34
+
35
+ ---
36
+
37
+ ## Who this is for
38
+
39
+ - **Coding agents (Claude Code, Codex)** — the primary target. Skills ship with the server and load from the local filesystem, so the agent has structured guidance without burning context on docs. Spill-to-disk keeps large Figma reads out of the context window entirely.
40
+ - Design systems teams migrating products to a new component library or token system
41
+ - Product designers cleaning up large production files without doing every replacement by hand
42
+ - Frontend engineers who need better design-to-code context than screenshots and comments
43
+ - Teams experimenting with multi-agent workflows for audits, migrations, and handoff generation
44
+
45
+ ### Before / After
46
+
47
+ | Situation | Without figma-mcp-express | With figma-mcp-express |
48
+ | ---------------------------------------- | --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
49
+ | Official Figma MCP on a restricted seat | You hit seat-based call caps quickly and have to ration automation. | Normal plugin-side work is not capped by the official MCP server limits. |
50
+ | Moving a product to a new design library | Designers swap components and fix spacing one screen at a time. | An agent can inspect the old file, map the new library, and migrate frames in bulk. |
51
+ | Large file audit | The model gets flooded with raw node data or times out on huge reads. | Large reads spill to disk and the agent can inspect only the relevant slice. |
52
+ | Parallel work | Multiple agents easily collide or queue uselessly on the same file. | The bridge isolates channels, coordinates queueing, and supports safer multi-agent sessions. |
53
+
54
+ ### Example prompts
55
+
56
+ ```text
57
+ Migrate these 120 product frames to the new library. Keep the new library's UX patterns, spacing rules, and component variants consistent.
58
+ ```
59
+
60
+ ```text
61
+ Scan this file for detached buttons, hardcoded spacing, and off-system color usage. Group the findings by severity and suggest the cleanest replacement path.
62
+ ```
63
+
64
+ ```text
65
+ Turn this React settings page into a Figma review artifact using the correct library components, token bindings, and dark-mode variables.
66
+ ```
67
+
68
+ ```text
69
+ Read this design system file and generate a DESIGN.md with token scale, text styles, component inventory, and obvious consistency gaps.
70
+ ```
71
+
72
+ ```text
73
+ Open the product file and the source library at the same time. Compare their components, then replace outdated instances page by page without touching unaffected areas.
74
+ ```
75
+
76
+ ---
77
+
78
+ ## Use cases
79
+
80
+ **For designers**
81
+
82
+ - Automate dull work — find detached components, rebind hardcoded values to tokens, fix deviations from the design system at scale
83
+ - Library swap — migrate a file from one design system to another: remap component keys, rebind tokens, update variants in bulk
84
+ - Frame and layout setup — scaffold auto layout, bind spacing variables, pin color modes — Claude handles the structural work while you focus on designing
85
+ - Design audit — scan for raw values, off-system components, token gaps, and repeated visuals that could become reusable local components
86
+
87
+ **For developers**
88
+
89
+ - Prompt → Figma — generate a Figma counterpart for an existing component or page for design review, using the correct library variants
90
+ - Code handoff — extract token names, auto layout spec, and component references per frame, ready to implement without guessing
91
+ - Learn a file — generate a DESIGN.md (token scale, text styles, color modes, component inventory) from any Figma file
92
+
93
+ **For creators**
94
+
95
+ - Prompt → Figma — describe a screen and have Claude build it end-to-end with real library components and bound tokens
96
+ - Stitch → Figma — take a [Stitch](https://stitch.withgoogle.com) wireframe draft and re-render it in Figma with the correct components, spacing tokens, and variable modes
97
+ - Pattern report — scan a file for what's there, what's reusable, and what's inconsistent before you start building
98
+
99
+ ---
100
+
101
+ ## Capabilities
102
+
103
+ | Track | Capability | Why it matters |
104
+ | --------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
105
+ | Speed | Fewer back-and-forth steps | The agent can do several related Figma actions in one go, so building or editing a screen feels much faster. |
106
+ | Speed | Large reads stay manageable | Big files do not dump huge walls of data into the model at once, so the agent can stay focused on the part that matters. |
107
+ | Free | No official MCP quota limits | You are not blocked by the official Figma MCP server's monthly or daily call caps for normal plugin-side work. |
108
+ | Access | Direct Figma editing | The agent works on the open Figma file itself, not a disconnected copy or a limited export. |
109
+ | Access | Uses your real design system | It can work with your actual components, variables, and styles instead of rebuilding everything from raw shapes. |
110
+ | Access | Can inspect shared libraries | It can still look up published library assets when the plugin cannot run inside that file. |
111
+ | Stability | Multiple files stay separate | Working on one file does not knock another file offline or mix their state together. |
112
+ | Stability | Safe under parallel agent work | Multiple agents can share the same session without stepping on each other as easily. |
113
+ | Stability | Better recovery from drops | If the connection breaks or the MCP client restarts, the system is designed to recover without forcing a full restart. |
114
+ | Scale | Handles large production files | Big design files stay usable instead of freezing the plugin during long reads or scans. |
115
+ | Handoff | Better design-to-code context | Developers get cleaner output about tokens, layout rules, and component references when turning designs into code. |
116
+
117
+ ### One short demo story
118
+
119
+ A single automated run migrated **100+ production design frames** to a new library while following that library's UX patterns, components, and guidelines. Instead of swapping visuals one by one, the agent could inspect the old file, map the new system, replace structures in bulk, and keep the migration consistent across the whole set.
120
+
121
+ ### Architecture at a glance
122
+
123
+ ```
124
+ typed MCP tools
125
+ AI client ─────────────────────────▶ Go MCP server
126
+ Claude / Codex bridge + queue + gate
127
+
128
+ │ JSON over WebSocket
129
+
130
+ Figma Desktop plugin
131
+ live file read/write
132
+
133
+ large payloads ─▶ .figma-mcp-cache/ library catalog ─▶ Figma REST only when needed
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Limitations
139
+
140
+ - RAM usage can be high on very large files, especially when reads spill large payloads to disk and multiple agents are active at once.
141
+ - Some runs may still feel slow because the Figma plugin itself is single-threaded. This fork reduces the bottleneck, but it does not remove the underlying Figma execution model.
142
+ - Most live workflows require the target file to be open in Figma Desktop with the plugin running. This includes reading nodes, editing frames, applying styles or variables, importing components into the file, and multi-file channel-based work.
143
+ - The plugin cannot operate on unopened files.
144
+ - Catalog-only workflows are the main exception, but they still need a `FIGMA_TOKEN` because published library discovery uses the REST path when the plugin cannot run in that file.
145
+
146
+ ---
147
+
148
+ ## Installation
149
+
150
+ Two paths depending on what you need.
151
+
152
+ ### Option A — Plugin install (recommended)
153
+
154
+ Includes the MCP server + three skills (`/figma-mcp-express`, `/figma-design-patterns`, `/figma-design-md`) + a PreToolUse hook. No clone or build step required.
155
+
156
+ **Claude Code:**
157
+
158
+ ```bash
159
+ claude plugin marketplace add sunhome243/figma-mcp-express
160
+ claude plugin install figma-mcp-express@figma-mcp-express
161
+ ```
162
+
163
+ **Codex:**
164
+
165
+ ```bash
166
+ codex plugin marketplace add sunhome243/figma-mcp-express
167
+ codex plugin install figma-mcp-express@figma-mcp-express
168
+ ```
169
+
170
+ Both commands pull the plugin manifest directly from GitHub. For project-scoped install (Claude Code only):
171
+
172
+ ```bash
173
+ claude plugin install figma-mcp-express@figma-mcp-express --scope project
174
+ ```
175
+
176
+ ### Option B — Build from source
177
+
178
+ For integrating into other MCP clients, or if you want to modify the server.
179
+
180
+ ```bash
181
+ git clone https://github.com/sunhome243/figma-mcp-express.git
182
+ cd figma-mcp-express
183
+ make build # produces bin/figma-mcp-express + plugin/dist/
184
+ ```
185
+
186
+ Add to your `.mcp.json` (or `claude_desktop_config.json` for Claude Desktop):
187
+
188
+ ```json
189
+ {
190
+ "mcpServers": {
191
+ "figma-mcp-express": {
192
+ "command": "/absolute/path/to/bin/figma-mcp-express",
193
+ "args": ["--port", "1994"]
194
+ }
195
+ }
196
+ }
197
+ ```
198
+
199
+ > The `command` path must match the Makefile output (`bin/figma-mcp-express`). Run `figma-mcp-express --version` to confirm the server reloaded your fresh build.
200
+
201
+ Restart Claude Code / Codex. Tools load on demand.
202
+
203
+ ---
204
+
205
+ ## Figma Desktop plugin setup
206
+
207
+ The plugin runs inside **Figma Desktop** (not the browser). It connects to the local MCP server over WebSocket and gives the AI agent direct access to the open file.
208
+
209
+ ### Option A — Download from Releases (no clone required)
210
+
211
+ 1. Go to the [Releases page](https://github.com/sunhome243/figma-mcp-express/releases/latest) and download **plugin.zip**
212
+ 2. Unzip it anywhere — e.g. `~/figma-mcp-express-plugin/`
213
+ 3. In Figma Desktop: **Plugins → Development → Import plugin from manifest...**
214
+ 4. Navigate to the unzipped folder and select `manifest.json`
215
+
216
+ ### Option B — From a cloned repo (build from source)
217
+
218
+ After running `make build` (see [DEV-SETUP.md](DEV-SETUP.md)):
219
+
220
+ 1. In Figma Desktop: **Plugins → Development → Import plugin from manifest...**
221
+ 2. Navigate to `plugin/` inside the cloned repo and select `manifest.json`
222
+
223
+ > **Where is "Import plugin from manifest..."?**
224
+ > Open any file in Figma Desktop → top menu bar → **Plugins** → hover **Development** → click **Import plugin from manifest...** in the submenu. If you don't see the Development submenu, make sure you are on Figma Desktop (not the web app).
225
+
226
+ ### Running the plugin
227
+
228
+ 1. Open a Figma file
229
+ 2. **Plugins → Development → Figma MCP Express**
230
+ 3. The plugin panel shows:
231
+ - **Status** — `Connected` once the MCP server is running, `Waiting for server` otherwise
232
+ - **WebSocket URL** — the address the plugin connected to (default `ws://127.0.0.1:1994`)
233
+ - **Channel ID** — a unique ID for this file's session (pass this as `channel:` in multi-file workflows)
234
+ 4. Minimize the panel with the **−** button — it collapses to a small pill and stays out of the way
235
+
236
+ **Multiple files:** open each file and run the plugin in each — every file gets its own channel ID and can be targeted independently.
237
+
238
+ ---
239
+
240
+ ## Environment variables
241
+
242
+ | Variable | Default | Description |
243
+ | ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
244
+ | `FIGMA_TOKEN` | — | Figma Personal Access Token. Required only for `fetch_library_catalog`. Auto-loaded from `.env`. |
245
+ | `FIGMA_MCP_SPILL_BYTES` | `25000` | Response size threshold. Larger responses spill to `.figma-mcp-cache/`. |
246
+ | `FIGMA_MCP_TIMEOUT` | `120` | Inactivity ceiling in seconds for lightweight ops (writes, metadata reads, styles). Resets on each progress heartbeat. |
247
+ | `FIGMA_MCP_READ_TIMEOUT` | `600` | Inactivity ceiling in seconds for heavy reads (`get_node`, `get_nodes_info`, `get_design_context`, `get_document`, scan/search tools) and `batch`. Resets on each progress heartbeat. A firing timer means retry narrower, not raise the ceiling. |
248
+
249
+ ### FIGMA_TOKEN
250
+
251
+ Most tools work without a token — the plugin talks directly to Figma Desktop. You only need `FIGMA_TOKEN` for `fetch_library_catalog`, which hits the REST API to enumerate published components from a read-only shared library.
252
+
253
+ **Generate a token:** Figma → Account Settings → Personal access tokens → Generate new token. Read-only scope (`File content: Read`) is sufficient.
254
+
255
+ **Setting it — depends on your install path:**
256
+
257
+ **Option A (plugin):**
258
+
259
+ ```bash
260
+ echo 'export FIGMA_TOKEN=your_token_here' >> ~/.${SHELL##*/}rc && source ~/.${SHELL##*/}rc
261
+ ```
262
+
263
+ **Option B (build from source):** Add a `.env` file in the project root (already gitignored).
264
+
265
+ ```bash
266
+ FIGMA_TOKEN=your_token_here
267
+ ```
268
+
269
+ The binary loads `.env` from its working directory at startup. Shell env always takes precedence over `.env`.
270
+
271
+ > Treat it like a password — it grants read access to all Figma files visible to your account. Never commit it.
272
+
273
+ ---
274
+
275
+ ## See also
276
+
277
+ - [TOOLS.md](TOOLS.md) — full tool catalog with parameter tables
278
+ - [ARCHITECTURE.md](ARCHITECTURE.md) — batch ref resolution, response gating, singleflight, multi-channel routing
279
+ - [DEV-SETUP.md](DEV-SETUP.md) — build instructions, plugin rebuild, test commands
280
+
281
+ ---
282
+
283
+ ## Credits
284
+
285
+ Built on [vkhanhqui/figma-mcp-go](https://github.com/vkhanhqui/figma-mcp-go) (MIT). The original established the core insight: skip the REST API, talk directly to Figma Desktop over WebSocket. figma-mcp-express adds multi-channel routing, batch ops, response spill-to-disk, library automation, codegen context, REST catalog, cooperative yield, and depth-limited traversal.
286
+
287
+ ---
288
+
289
+ ## Known limitations
290
+
291
+ ### Community UI kits are not importable by key unless published as a library
292
+
293
+ If a community kit has only been published to Community, its components are still **unpublished local components**. This is a Figma platform constraint, not a server bug.
294
+
295
+ Figma has two _unrelated_ meanings of "published" — community kits satisfy only the first:
296
+
297
+ | "Published" | Means | Community kits |
298
+ | -------------------------- | ------------------------------------------------------------- | -------------- |
299
+ | Published **to Community** | the _file_ is shared so anyone can view / duplicate it | ✅ yes |
300
+ | Published **as a library** | the _components_ are importable via `import_component_by_key` | ❌ no |
301
+
302
+ So even the kit's _own_ file cannot import its components by key, and the Plugin API has **no cross-file copy** — this server bridges several open files and moves _data_ between them, but it cannot fabricate a cross-document component _link_. (REST `components: 0` / `404` is **not** the arbiter, either — a kit published as a library after the fact imports fine even while REST still 404s. The live `import_component_by_key` probe decides.)
303
+
304
+ In that state:
305
+
306
+ - `import_component_by_key` fails with `Cannot import component ... since it is unpublished`
307
+ - `fetch_library_catalog` may return `components: 0`
308
+ - cross-file linked instances are not possible; only detached copies
309
+
310
+ > **Workaround**
311
+ >
312
+ > **Option A — publish the duplicated kit as a library**
313
+ >
314
+ > 1. Duplicate the community kit into your drafts or team workspace.
315
+ > 2. Open that duplicate in Figma and publish it from the **Assets** panel.
316
+ > 3. Re-run `import_component_by_key` and then `create_instance` in the target file.
317
+ > 4. This gives you real linked instances with normal variant behavior.
318
+ >
319
+ > **Option B — no publish**
320
+ >
321
+ > 1. Open both the kit file and the target file.
322
+ > 2. Copy the needed components from the kit and paste them into the target file once.
323
+ > 3. Use those pasted local components for future instances in the target file.
324
+ > 4. This works, but the instances are detached local copies, not links back to the kit.
package/bin/run.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { spawnSync } = require('node:child_process');
5
+ const { existsSync } = require('node:fs');
6
+ const path = require('node:path');
7
+
8
+ const PLATFORM_MAP = { darwin: 'darwin', linux: 'linux', win32: 'windows' };
9
+ const ARCH_MAP = { x64: 'amd64', arm64: 'arm64' };
10
+
11
+ const goos = PLATFORM_MAP[process.platform];
12
+ const goarch = ARCH_MAP[process.arch];
13
+
14
+ if (!goos || !goarch) {
15
+ process.stderr.write(`[figma-mcp-express] Unsupported platform: ${process.platform}/${process.arch}\n`);
16
+ process.exit(1);
17
+ }
18
+
19
+ const binaryName = process.platform === 'win32' ? 'figma-mcp-express.exe' : 'figma-mcp-express';
20
+ const binaryPath = path.join(__dirname, `${goos}-${goarch}`, binaryName);
21
+
22
+ if (!existsSync(binaryPath)) {
23
+ process.stderr.write(
24
+ '[figma-mcp-express] Binary not found. Try reinstalling: npm install figma-mcp-express\n'
25
+ );
26
+ process.exit(1);
27
+ }
28
+
29
+ const result = spawnSync(binaryPath, process.argv.slice(2), { stdio: 'inherit' });
30
+ process.exit(result.status ?? 1);
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "figma-mcp-express",
3
+ "version": "1.0.0",
4
+ "description": "Fast, quota-free, agent-ready Figma MCP server — local plugin bridge, no seat-based limits. 70 tools: multi-file routing, batch ops, library automation.",
5
+ "mcpName": "io.github.sunhome243/figma-mcp-express",
6
+ "bin": {
7
+ "figma-mcp-express": "bin/run.js"
8
+ },
9
+ "files": [
10
+ "bin/run.js",
11
+ "bin/darwin-amd64/",
12
+ "bin/darwin-arm64/",
13
+ "bin/linux-amd64/",
14
+ "bin/linux-arm64/",
15
+ "bin/windows-amd64/",
16
+ "bin/windows-arm64/"
17
+ ],
18
+ "keywords": [
19
+ "figma",
20
+ "mcp",
21
+ "model-context-protocol",
22
+ "ai",
23
+ "design"
24
+ ],
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/sunhome243/figma-mcp-express.git"
29
+ },
30
+ "homepage": "https://github.com/sunhome243/figma-mcp-express#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/sunhome243/figma-mcp-express/issues"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ }
37
+ }