@mp3wizard/figma-console-mcp 1.25.1 → 1.27.2

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 (205) hide show
  1. package/README.md +49 -33
  2. package/dist/cloudflare/core/config.js +0 -8
  3. package/dist/cloudflare/core/console-monitor.js +3 -3
  4. package/dist/cloudflare/core/diagnose-tool.js +96 -0
  5. package/dist/cloudflare/core/figma-tools.js +69 -229
  6. package/dist/cloudflare/core/identity.js +96 -0
  7. package/dist/cloudflare/core/tokens/alias-resolver.js +98 -0
  8. package/dist/cloudflare/core/tokens/config.js +284 -0
  9. package/dist/cloudflare/core/tokens/figma-converter.js +195 -0
  10. package/dist/cloudflare/core/tokens/formatters/css-vars.js +329 -0
  11. package/dist/cloudflare/core/tokens/formatters/dtcg.js +300 -0
  12. package/dist/cloudflare/core/tokens/formatters/index.js +45 -0
  13. package/dist/cloudflare/core/tokens/formatters/json.js +7 -0
  14. package/dist/cloudflare/core/tokens/formatters/less.js +4 -0
  15. package/dist/cloudflare/core/tokens/formatters/scss.js +4 -0
  16. package/dist/cloudflare/core/tokens/formatters/stubs.js +11 -0
  17. package/dist/cloudflare/core/tokens/formatters/style-dictionary-v3.js +4 -0
  18. package/dist/cloudflare/core/tokens/formatters/tailwind-v3.js +4 -0
  19. package/dist/cloudflare/core/tokens/formatters/tailwind-v4.js +4 -0
  20. package/dist/cloudflare/core/tokens/formatters/tokens-studio.js +4 -0
  21. package/dist/cloudflare/core/tokens/formatters/ts-module.js +4 -0
  22. package/dist/cloudflare/core/tokens/index.js +15 -0
  23. package/dist/cloudflare/core/tokens/parsers/css-vars.js +4 -0
  24. package/dist/cloudflare/core/tokens/parsers/dtcg.js +253 -0
  25. package/dist/cloudflare/core/tokens/parsers/index.js +138 -0
  26. package/dist/cloudflare/core/tokens/parsers/json.js +7 -0
  27. package/dist/cloudflare/core/tokens/parsers/scss.js +4 -0
  28. package/dist/cloudflare/core/tokens/parsers/stubs.js +13 -0
  29. package/dist/cloudflare/core/tokens/parsers/style-dictionary-v3.js +4 -0
  30. package/dist/cloudflare/core/tokens/parsers/tailwind-v3.js +4 -0
  31. package/dist/cloudflare/core/tokens/parsers/tailwind-v4.js +4 -0
  32. package/dist/cloudflare/core/tokens/parsers/tokens-studio.js +4 -0
  33. package/dist/cloudflare/core/tokens/schemas.js +148 -0
  34. package/dist/cloudflare/core/tokens/transforms/color.js +12 -0
  35. package/dist/cloudflare/core/tokens/transforms/index.js +29 -0
  36. package/dist/cloudflare/core/tokens/transforms/size.js +7 -0
  37. package/dist/cloudflare/core/tokens/types.js +18 -0
  38. package/dist/cloudflare/core/tokens-tools.js +849 -0
  39. package/dist/cloudflare/core/websocket-server.js +5 -55
  40. package/dist/cloudflare/index.js +37 -26
  41. package/dist/core/config.d.ts.map +1 -1
  42. package/dist/core/config.js +0 -8
  43. package/dist/core/config.js.map +1 -1
  44. package/dist/core/console-monitor.d.ts +2 -2
  45. package/dist/core/console-monitor.d.ts.map +1 -1
  46. package/dist/core/console-monitor.js +3 -3
  47. package/dist/core/console-monitor.js.map +1 -1
  48. package/dist/core/diagnose-tool.d.ts +33 -0
  49. package/dist/core/diagnose-tool.d.ts.map +1 -0
  50. package/dist/core/diagnose-tool.js +97 -0
  51. package/dist/core/diagnose-tool.js.map +1 -0
  52. package/dist/core/figma-connector.d.ts +1 -1
  53. package/dist/core/figma-connector.d.ts.map +1 -1
  54. package/dist/core/figma-tools.d.ts +1 -2
  55. package/dist/core/figma-tools.d.ts.map +1 -1
  56. package/dist/core/figma-tools.js +69 -229
  57. package/dist/core/figma-tools.js.map +1 -1
  58. package/dist/core/identity.d.ts +41 -0
  59. package/dist/core/identity.d.ts.map +1 -0
  60. package/dist/core/identity.js +97 -0
  61. package/dist/core/identity.js.map +1 -0
  62. package/dist/core/tokens/alias-resolver.d.ts +40 -0
  63. package/dist/core/tokens/alias-resolver.d.ts.map +1 -0
  64. package/dist/core/tokens/alias-resolver.js +99 -0
  65. package/dist/core/tokens/alias-resolver.js.map +1 -0
  66. package/dist/core/tokens/config.d.ts +352 -0
  67. package/dist/core/tokens/config.d.ts.map +1 -0
  68. package/dist/core/tokens/config.js +285 -0
  69. package/dist/core/tokens/config.js.map +1 -0
  70. package/dist/core/tokens/figma-converter.d.ts +81 -0
  71. package/dist/core/tokens/figma-converter.d.ts.map +1 -0
  72. package/dist/core/tokens/figma-converter.js +196 -0
  73. package/dist/core/tokens/figma-converter.js.map +1 -0
  74. package/dist/core/tokens/formatters/css-vars.d.ts +24 -0
  75. package/dist/core/tokens/formatters/css-vars.d.ts.map +1 -0
  76. package/dist/core/tokens/formatters/css-vars.js +330 -0
  77. package/dist/core/tokens/formatters/css-vars.js.map +1 -0
  78. package/dist/core/tokens/formatters/dtcg.d.ts +28 -0
  79. package/dist/core/tokens/formatters/dtcg.d.ts.map +1 -0
  80. package/dist/core/tokens/formatters/dtcg.js +301 -0
  81. package/dist/core/tokens/formatters/dtcg.js.map +1 -0
  82. package/dist/core/tokens/formatters/index.d.ts +30 -0
  83. package/dist/core/tokens/formatters/index.d.ts.map +1 -0
  84. package/dist/core/tokens/formatters/index.js +46 -0
  85. package/dist/core/tokens/formatters/index.js.map +1 -0
  86. package/dist/core/tokens/formatters/json.d.ts +5 -0
  87. package/dist/core/tokens/formatters/json.d.ts.map +1 -0
  88. package/dist/core/tokens/formatters/json.js +8 -0
  89. package/dist/core/tokens/formatters/json.js.map +1 -0
  90. package/dist/core/tokens/formatters/less.d.ts +4 -0
  91. package/dist/core/tokens/formatters/less.d.ts.map +1 -0
  92. package/dist/core/tokens/formatters/less.js +5 -0
  93. package/dist/core/tokens/formatters/less.js.map +1 -0
  94. package/dist/core/tokens/formatters/scss.d.ts +4 -0
  95. package/dist/core/tokens/formatters/scss.d.ts.map +1 -0
  96. package/dist/core/tokens/formatters/scss.js +5 -0
  97. package/dist/core/tokens/formatters/scss.js.map +1 -0
  98. package/dist/core/tokens/formatters/stubs.d.ts +9 -0
  99. package/dist/core/tokens/formatters/stubs.d.ts.map +1 -0
  100. package/dist/core/tokens/formatters/stubs.js +12 -0
  101. package/dist/core/tokens/formatters/stubs.js.map +1 -0
  102. package/dist/core/tokens/formatters/style-dictionary-v3.d.ts +4 -0
  103. package/dist/core/tokens/formatters/style-dictionary-v3.d.ts.map +1 -0
  104. package/dist/core/tokens/formatters/style-dictionary-v3.js +5 -0
  105. package/dist/core/tokens/formatters/style-dictionary-v3.js.map +1 -0
  106. package/dist/core/tokens/formatters/tailwind-v3.d.ts +4 -0
  107. package/dist/core/tokens/formatters/tailwind-v3.d.ts.map +1 -0
  108. package/dist/core/tokens/formatters/tailwind-v3.js +5 -0
  109. package/dist/core/tokens/formatters/tailwind-v3.js.map +1 -0
  110. package/dist/core/tokens/formatters/tailwind-v4.d.ts +4 -0
  111. package/dist/core/tokens/formatters/tailwind-v4.d.ts.map +1 -0
  112. package/dist/core/tokens/formatters/tailwind-v4.js +5 -0
  113. package/dist/core/tokens/formatters/tailwind-v4.js.map +1 -0
  114. package/dist/core/tokens/formatters/tokens-studio.d.ts +4 -0
  115. package/dist/core/tokens/formatters/tokens-studio.d.ts.map +1 -0
  116. package/dist/core/tokens/formatters/tokens-studio.js +5 -0
  117. package/dist/core/tokens/formatters/tokens-studio.js.map +1 -0
  118. package/dist/core/tokens/formatters/ts-module.d.ts +4 -0
  119. package/dist/core/tokens/formatters/ts-module.d.ts.map +1 -0
  120. package/dist/core/tokens/formatters/ts-module.js +5 -0
  121. package/dist/core/tokens/formatters/ts-module.js.map +1 -0
  122. package/dist/core/tokens/index.d.ts +17 -0
  123. package/dist/core/tokens/index.d.ts.map +1 -0
  124. package/dist/core/tokens/index.js +16 -0
  125. package/dist/core/tokens/index.js.map +1 -0
  126. package/dist/core/tokens/parsers/css-vars.d.ts +3 -0
  127. package/dist/core/tokens/parsers/css-vars.d.ts.map +1 -0
  128. package/dist/core/tokens/parsers/css-vars.js +5 -0
  129. package/dist/core/tokens/parsers/css-vars.js.map +1 -0
  130. package/dist/core/tokens/parsers/dtcg.d.ts +21 -0
  131. package/dist/core/tokens/parsers/dtcg.d.ts.map +1 -0
  132. package/dist/core/tokens/parsers/dtcg.js +254 -0
  133. package/dist/core/tokens/parsers/dtcg.js.map +1 -0
  134. package/dist/core/tokens/parsers/index.d.ts +37 -0
  135. package/dist/core/tokens/parsers/index.d.ts.map +1 -0
  136. package/dist/core/tokens/parsers/index.js +139 -0
  137. package/dist/core/tokens/parsers/index.js.map +1 -0
  138. package/dist/core/tokens/parsers/json.d.ts +4 -0
  139. package/dist/core/tokens/parsers/json.d.ts.map +1 -0
  140. package/dist/core/tokens/parsers/json.js +8 -0
  141. package/dist/core/tokens/parsers/json.js.map +1 -0
  142. package/dist/core/tokens/parsers/scss.d.ts +3 -0
  143. package/dist/core/tokens/parsers/scss.d.ts.map +1 -0
  144. package/dist/core/tokens/parsers/scss.js +5 -0
  145. package/dist/core/tokens/parsers/scss.js.map +1 -0
  146. package/dist/core/tokens/parsers/stubs.d.ts +11 -0
  147. package/dist/core/tokens/parsers/stubs.d.ts.map +1 -0
  148. package/dist/core/tokens/parsers/stubs.js +14 -0
  149. package/dist/core/tokens/parsers/stubs.js.map +1 -0
  150. package/dist/core/tokens/parsers/style-dictionary-v3.d.ts +3 -0
  151. package/dist/core/tokens/parsers/style-dictionary-v3.d.ts.map +1 -0
  152. package/dist/core/tokens/parsers/style-dictionary-v3.js +5 -0
  153. package/dist/core/tokens/parsers/style-dictionary-v3.js.map +1 -0
  154. package/dist/core/tokens/parsers/tailwind-v3.d.ts +3 -0
  155. package/dist/core/tokens/parsers/tailwind-v3.d.ts.map +1 -0
  156. package/dist/core/tokens/parsers/tailwind-v3.js +5 -0
  157. package/dist/core/tokens/parsers/tailwind-v3.js.map +1 -0
  158. package/dist/core/tokens/parsers/tailwind-v4.d.ts +3 -0
  159. package/dist/core/tokens/parsers/tailwind-v4.d.ts.map +1 -0
  160. package/dist/core/tokens/parsers/tailwind-v4.js +5 -0
  161. package/dist/core/tokens/parsers/tailwind-v4.js.map +1 -0
  162. package/dist/core/tokens/parsers/tokens-studio.d.ts +3 -0
  163. package/dist/core/tokens/parsers/tokens-studio.d.ts.map +1 -0
  164. package/dist/core/tokens/parsers/tokens-studio.js +5 -0
  165. package/dist/core/tokens/parsers/tokens-studio.js.map +1 -0
  166. package/dist/core/tokens/schemas.d.ts +152 -0
  167. package/dist/core/tokens/schemas.d.ts.map +1 -0
  168. package/dist/core/tokens/schemas.js +149 -0
  169. package/dist/core/tokens/schemas.js.map +1 -0
  170. package/dist/core/tokens/transforms/color.d.ts +9 -0
  171. package/dist/core/tokens/transforms/color.d.ts.map +1 -0
  172. package/dist/core/tokens/transforms/color.js +13 -0
  173. package/dist/core/tokens/transforms/color.js.map +1 -0
  174. package/dist/core/tokens/transforms/index.d.ts +36 -0
  175. package/dist/core/tokens/transforms/index.d.ts.map +1 -0
  176. package/dist/core/tokens/transforms/index.js +30 -0
  177. package/dist/core/tokens/transforms/index.js.map +1 -0
  178. package/dist/core/tokens/transforms/size.d.ts +7 -0
  179. package/dist/core/tokens/transforms/size.d.ts.map +1 -0
  180. package/dist/core/tokens/transforms/size.js +8 -0
  181. package/dist/core/tokens/transforms/size.js.map +1 -0
  182. package/dist/core/tokens/types.d.ts +228 -0
  183. package/dist/core/tokens/types.d.ts.map +1 -0
  184. package/dist/core/tokens/types.js +19 -0
  185. package/dist/core/tokens/types.js.map +1 -0
  186. package/dist/core/tokens-tools.d.ts +42 -0
  187. package/dist/core/tokens-tools.d.ts.map +1 -0
  188. package/dist/core/tokens-tools.js +850 -0
  189. package/dist/core/tokens-tools.js.map +1 -0
  190. package/dist/core/types/index.d.ts +0 -8
  191. package/dist/core/types/index.d.ts.map +1 -1
  192. package/dist/core/websocket-connector.d.ts +1 -1
  193. package/dist/core/websocket-connector.d.ts.map +1 -1
  194. package/dist/core/websocket-server.d.ts +4 -3
  195. package/dist/core/websocket-server.d.ts.map +1 -1
  196. package/dist/core/websocket-server.js +5 -55
  197. package/dist/core/websocket-server.js.map +1 -1
  198. package/dist/local.d.ts +0 -12
  199. package/dist/local.d.ts.map +1 -1
  200. package/dist/local.js +959 -3406
  201. package/dist/local.js.map +1 -1
  202. package/figma-desktop-bridge/code.js +11 -63
  203. package/figma-desktop-bridge/ui.html +72 -11
  204. package/package.json +10 -9
  205. package/figma-desktop-bridge/ui-full.html +0 -1353
package/README.md CHANGED
@@ -6,21 +6,25 @@
6
6
  [![Documentation](https://img.shields.io/badge/docs-docs.figma--console--mcp.southleft.com-0D9488)](https://docs.figma-console-mcp.southleft.com)
7
7
  [![Sponsor](https://img.shields.io/badge/Sponsor-southleft-ea4aaa?logo=github-sponsors&logoColor=white)](https://github.com/sponsors/southleft)
8
8
 
9
- > **Your design system as an API.** Model Context Protocol server that bridges design and development—giving AI assistants complete access to Figma for **extraction**, **creation**, and **debugging**.
9
+ > **Your design system as an API.** Model Context Protocol server that bridges design and development—giving AI assistants complete access to Figma for **extraction**, **creation**, **debugging**, and **bidirectional token sync**.
10
10
 
11
- > **🆕 Version History & Time-Series Awareness (v1.23.0):** Six new tools turn a Figma file from a static snapshot into a queryable history list versions, snapshot any past version, diff two versions for component/binding deltas, generate markdown changelogs ready for release notes, and trace exactly when (and by whom) a property or variant was introduced via a binary-search blame walker. Author attribution flows from autosaves, not just labeled releases. [See what's new →](CHANGELOG.md#1230---2026-05-09)
11
+ > **🆕 Bidirectional Token Sync (v1.27.0, patched v1.27.1):** Two new tools `figma_export_tokens` and `figma_import_tokens` replace Style Dictionary and Tokens Studio's export pipeline for popular styling methods. Pull every variable across every collection and mode as canonical DTCG JSON + CSS custom properties; edit a hex value in code; push the delta back to Figma. Diff-aware merge produces exactly one API call per changed value, not a full collection rewrite. 103 tools total. [See what's new →](CHANGELOG.md#1271---2026-05-16)
12
12
 
13
13
  ## What is this?
14
14
 
15
15
  Figma Console MCP connects AI assistants (like Claude) to Figma, enabling:
16
16
 
17
17
  - **🎨 Design system extraction** - Pull variables, components, and styles
18
+ - **🔁 Bidirectional token sync** - Export Figma variables to DTCG JSON + CSS custom properties; push code-side edits back to Figma. Replaces Style Dictionary and Tokens Studio's export pipeline.
18
19
  - **📸 Visual debugging** - Take screenshots for context
19
20
  - **✏️ Design creation** - Create UI components, frames, and layouts directly in Figma
20
21
  - **🔧 Variable management** - Create, update, rename, and delete design tokens
22
+ - **🕰 Version history & time-series awareness** - List versions, diff snapshots, generate markdown changelogs, trace property/variant introduction via binary-search blame
21
23
  - **⚡ Real-time monitoring** - Watch console logs from the Desktop Bridge plugin
22
24
  - **📌 FigJam boards** - Create stickies, flowcharts, tables, and code blocks on collaborative boards
25
+ - **🎞️ Slides presentations** - Build and manage Figma Slides decks programmatically
23
26
  - **♿ Accessibility scanning** - 14 WCAG design checks with conformance level tagging, component scorecards, axe-core code scanning, design-to-code parity
27
+ - **🛡 Cross-MCP identity** - Every tool response carries `_mcp: "figma-console-mcp"` and errors are prefixed `[figma-console-mcp]` so attribution stays unambiguous in agents running multiple Figma MCPs
24
28
  - **☁️ Cloud Write Relay** - Web AI clients (Claude.ai, v0, Replit) can design in Figma via cloud pairing
25
29
  - **🔄 Four ways to connect** - Remote SSE, Cloud Mode, NPX, or Local Git
26
30
 
@@ -51,9 +55,9 @@ Figma Console MCP connects AI assistants (like Claude) to Figma, enabling:
51
55
  | Real-time monitoring (console, selection) | ✅ | ❌ | ❌ |
52
56
  | Desktop Bridge plugin | ✅ | ✅ | ❌ |
53
57
  | Requires Node.js | Yes | **No** | No |
54
- | **Total tools available** | **100+** | **83** | **9** |
58
+ | **Total tools available** | **103** | **93** | **9** |
55
59
 
56
- > **Bottom line:** Remote SSE is **read-only** with ~38% of the tools. **Cloud Mode** unlocks write access from web AI clients without Node.js. NPX/Local Git gives the full 100+ tools with real-time monitoring.
60
+ > **Bottom line:** Remote SSE is **read-only** with ~38% of the tools. **Cloud Mode** unlocks write access from web AI clients without Node.js. NPX/Local Git gives the full 103 tools with real-time monitoring.
57
61
 
58
62
  ---
59
63
 
@@ -61,7 +65,7 @@ Figma Console MCP connects AI assistants (like Claude) to Figma, enabling:
61
65
 
62
66
  **Best for:** Designers who want full AI-assisted design capabilities.
63
67
 
64
- **What you get:** All 100+ tools including design creation, variable management, and component instantiation.
68
+ **What you get:** All 103 tools including design creation, variable management, and component instantiation.
65
69
 
66
70
  #### Prerequisites
67
71
 
@@ -126,11 +130,13 @@ If you're not sure where to put the JSON configuration above, here's where each
126
130
  1. Open Figma Desktop normally (no special flags needed) and open a file
127
131
  2. Go to **Plugins → Development → Import plugin from manifest...**
128
132
  3. Select `~/.figma-console-mcp/plugin/manifest.json` (stable path, auto-created by the MCP server)
129
- 4. Run the plugin in your Figma file — the bootloader finds the MCP server and loads the latest UI automatically
133
+ 4. Run the plugin in your Figma file — it scans ports 9223–9232 and connects automatically to your running MCP server
130
134
 
131
- > One-time setup. The plugin uses a bootloader that dynamically loads fresh code from the MCP server no need to re-import when the server updates.
132
-
133
- > **Upgrading from v1.14 or earlier?** Your existing plugin still works, but to get the bootloader benefits (no more re-importing), do one final re-import from `~/.figma-console-mcp/plugin/manifest.json`. The path is created automatically when the MCP server starts. Run `npx figma-console-mcp@latest --print-path` to see it. After this one-time upgrade, you're done forever.
135
+ > **Heads-up on plugin updates.** Figma caches plugin files (`code.js` and `ui.html`) at the application level. The MCP server refreshes the files at `~/.figma-console-mcp/plugin/` on every startup, but Figma keeps using its cached copy until you re-import the manifest.
136
+ >
137
+ > **Re-importing is _required_ only when a release notes entry says so** typically when the plugin adds a new method the server needs (e.g. v1.22.4, v1.10.0). For most upgrades the new server stays wire-compatible with the previous plugin, and re-importing is **optional**: you'll still get every functional change, just not the cosmetic plugin-side touches (status-pill copy, `pluginVersion` reporting).
138
+ >
139
+ > When you do re-import: Plugins → Manage plugins → re-import `~/.figma-console-mcp/plugin/manifest.json`. The stable path never changes, so it's a one-click step.
134
140
 
135
141
  #### Step 4: Restart Your MCP Client
136
142
 
@@ -156,7 +162,7 @@ Create a simple frame with a blue background
156
162
 
157
163
  **Best for:** Developers who want to modify source code or contribute to the project.
158
164
 
159
- **What you get:** Same 100+ tools as NPX, plus full source code access.
165
+ **What you get:** Same 103 tools as NPX, plus full source code access.
160
166
 
161
167
  #### Quick Setup
162
168
 
@@ -245,7 +251,7 @@ Ready for design creation? Follow the [NPX Setup](#-npx-setup-recommended) guide
245
251
 
246
252
  **Best for:** Using Claude.ai, v0, Replit, or Lovable to create and modify Figma designs — no Node.js required.
247
253
 
248
- **What you get:** 83 tools including full write access — design creation, variable management, component instantiation, and all REST API tools. Only real-time monitoring (console logs, selection tracking, document changes) requires Local Mode.
254
+ **What you get:** 95 tools including full write access — design creation, variable management, component instantiation, and all REST API tools. Only real-time monitoring (console logs, selection tracking, document changes) requires Local Mode.
249
255
 
250
256
  #### Prerequisites
251
257
 
@@ -302,7 +308,7 @@ AI Client → Cloud MCP Server → Durable Object Relay → Desktop Bridge Plugi
302
308
  | Feature | NPX (Recommended) | Cloud Mode | Local Git | Remote SSE |
303
309
  |---------|-------------------|------------|-----------|------------|
304
310
  | **Setup time** | ~10 minutes | ~5 minutes | ~15 minutes | ~2 minutes |
305
- | **Total tools** | **100+** | **83** | **100+** | **9** (read-only) |
311
+ | **Total tools** | **103** | **93** | **103** | **9** (read-only) |
306
312
  | **Design creation** | ✅ | ✅ | ✅ | ❌ |
307
313
  | **Variable management** | ✅ | ✅ | ✅ | ❌ |
308
314
  | **Component instantiation** | ✅ | ✅ | ✅ | ❌ |
@@ -317,7 +323,7 @@ AI Client → Cloud MCP Server → Durable Object Relay → Desktop Bridge Plugi
317
323
  | **Automatic updates** | ✅ (`@latest`) | ✅ | Manual (`git pull`) | ✅ |
318
324
  | **Source code access** | ❌ | ❌ | ✅ | ❌ |
319
325
 
320
- > **Key insight:** Remote SSE is read-only. Cloud Mode adds write access for web AI clients without Node.js. NPX/Local Git give the full 100+ tools.
326
+ > **Key insight:** Remote SSE is read-only. Cloud Mode adds write access for web AI clients without Node.js. NPX/Local Git give the full 103 tools.
321
327
 
322
328
  **📖 [Complete Feature Comparison](docs/mode-comparison.md)**
323
329
 
@@ -370,9 +376,11 @@ When you first use design system tools:
370
376
 
371
377
  ## 🛠️ Available Tools
372
378
 
373
- ### Navigation & Status
374
- - `figma_navigate` - Open Figma URLs
375
- - `figma_get_status` - Check connection status
379
+ ### Status & Diagnostics
380
+ - `figma_get_status` - Check WebSocket bridge connection and file context
381
+ - `figma_diagnose` - Designer-readable health check + setup guidance
382
+ - `figma_reconnect` - Force reconnect to the Desktop Bridge plugin
383
+ - `figma_navigate` - Switch the active file target among connected plugins (Local), or navigate the cloud headless browser (Remote/Cloud)
376
384
 
377
385
  ### Console Debugging
378
386
  - `figma_get_console_logs` - Retrieve console logs
@@ -417,6 +425,10 @@ When you first use design system tools:
417
425
  - `figma_check_design_parity` - Compare Figma component specs against code implementation, producing a scored diff report with actionable fix items
418
426
  - `figma_generate_component_doc` - Generate platform-agnostic markdown documentation by merging Figma design data with code-side info
419
427
 
428
+ ### 🔁 Token Sync (Local Mode + Cloud Mode)
429
+ - `figma_export_tokens` - **Export Figma variables to design token files in your codebase.** Canonical DTCG JSON + CSS custom properties out of the box. Diff-aware merge against existing source files (only writes what changed). `tokens.config.json` autodiscovery means zero-arg calls after first setup. Replaces Style Dictionary and Tokens Studio's export pipeline for popular styling methods.
430
+ - `figma_import_tokens` - **Push code-side token edits back to Figma.** Diff against current Figma state, apply only the deltas. Round-trip safe — Figma variable IDs preserved in DTCG `$extensions["figma-console-mcp"]` so renames on either side don't create duplicates. Dry-run default for safety. In Cloud Mode, pass tokens inline via `payload` or `files` (no local filesystem access).
431
+
420
432
  ### 🔧 Variable Management (Local Mode + Cloud Mode)
421
433
  - `figma_create_variable_collection` - Create new variable collections with modes
422
434
  - `figma_create_variable` - Create COLOR, FLOAT, STRING, or BOOLEAN variables
@@ -651,7 +663,7 @@ The **Figma Desktop Bridge** plugin is the recommended way to connect Figma to t
651
663
  - The MCP server communicates via **WebSocket** through the Desktop Bridge plugin
652
664
  - The server tries port 9223 first, then automatically falls back through ports 9224–9232 if needed
653
665
  - The plugin scans all ports in the range and connects to every active server it finds
654
- - All 100+ tools work through the WebSocket transport
666
+ - All 103 tools work through the WebSocket transport
655
667
 
656
668
  **Multiple files:** The WebSocket server supports multiple simultaneous plugin connections — one per open Figma file. Each connection is tracked by file key with independent state (selection, document changes, console logs).
657
669
 
@@ -693,9 +705,11 @@ When two processes tried to start the MCP server (e.g., Claude Desktop's Chat ta
693
705
 
694
706
  **Nothing.** Multi-instance support is fully automatic:
695
707
  - Each MCP server claims the next available port in the range
696
- - The bootloader plugin scans all ports and connects to every active server
708
+ - The Desktop Bridge plugin scans all ports and connects to every active server
697
709
  - Orphaned processes from closed tabs are automatically cleaned up on startup
698
- - No re-importing, no manual port management
710
+ - No manual port management — the plugin already scans the whole range
711
+
712
+ (Re-importing the manifest is only required when the plugin code itself changes — e.g. after a package update. Port-range scanning is already in the shipped plugin.)
699
713
 
700
714
  ---
701
715
 
@@ -788,27 +802,29 @@ The architecture supports adding new apps with minimal boilerplate — each app
788
802
 
789
803
  ## 🛤️ Roadmap
790
804
 
791
- **Current Status:** v1.23.0 (Stable) - Production-ready with version history & time-series awareness, FigJam + Slides support, Cloud Write Relay, Design System Kit, WebSocket-only connectivity, smart multi-file tracking, 100+ tools, Comments API, and MCP Apps
805
+ **Current Status:** v1.27.1 (Stable) - Production-ready with bidirectional Figma↔code token sync, version history & time-series awareness, FigJam + Slides support, Cloud Write Relay, Design System Kit, WebSocket-only connectivity, smart multi-file tracking, **103 tools** (Local) / **95 tools** (Cloud) / **9 tools** (Remote read-only), Comments API, cross-MCP identity disambiguation, and MCP Apps.
792
806
 
793
807
  **Recent Releases:**
794
- - [x] **v1.17.0** - Figma Slides Support: 15 new tools for managing presentations slides, transitions, content, reordering, and navigation. Inspired by Toni Haidamous (PR #11).
795
- - [x] **v1.16.0** - FigJam Support: 9 new tools for creating and reading FigJam boards stickies, flowcharts, tables, code blocks, and connection graphs. Community-contributed by klgral and lukemoderwell.
796
- - [x] **v1.12.0** - Cloud Write Relay: web AI clients (Claude.ai, v0, Replit, Lovable) can create and modify Figma designs via cloud relay pairing no Node.js required
797
- - [x] **v1.11.2** - Screenshot fix: `figma_take_screenshot` works without explicit `nodeId` in WebSocket mode
798
- - [x] **v1.11.1** - Doc generator fixes: clean markdown tables, Storybook links, property metadata filtering
799
- - [x] **v1.11.0** - Complete CDP removal, improved multi-file active tracking with focus detection
800
- - [x] **v1.10.0** - Multi-instance support (dynamic port fallback 9223–9232, multi-connection plugin, instance discovery)
801
- - [x] **v1.9.0** - Figma Comments tools, improved port conflict detection
802
- - [x] **v1.8.0** - WebSocket Bridge transport (CDP-free connectivity), real-time selection/document tracking, `figma_get_selection` + `figma_get_design_changes` tools
803
- - [x] **v1.7.0** - MCP Apps (Token Browser, Design System Dashboard), batch variable operations, design-code parity tools
804
- - [x] **v1.5.0** - Node manipulation tools, component property management, component set arrangement
805
- - [x] **v1.3.0** - Design creation via `figma_execute`, variable CRUD operations
808
+ - [x] **v1.27.1** - Documentation patch. No code behavior changes. Sweeps stale "Phase 1 ships with DTCG only" claims across tool descriptions, error messages, and internal comments after CSS variables formatter and the apply phase shipped during the v1.27.0 dev cycle. Refreshes README banner + capability bullets + roadmap. Adds `Phase 3.5: Stale-Content Audit` to the release runbook so future releases get a strict pre-publish grep sweep across banners, tool descriptions, error messages, source comments, and tool-count consistency.
809
+ - [x] **v1.27.0** - Bidirectional token sync: `figma_export_tokens` + `figma_import_tokens` replace Style Dictionary and Tokens Studio's export pipeline. Canonical DTCG JSON + CSS custom properties. Diff-aware merge with round-trip ID preservation via `$extensions["figma-console-mcp"]`. Apply phase pushes hex-value edits back to Figma via the plugin bridge. Verified end-to-end against 713-token + 280-token design systems.
810
+ - [x] **v1.26.0** - Internal cleanup + cross-MCP identity: Local-mode CDP/Puppeteer transport removed entirely (WebSocket-only). `figma_diagnose` tool for designer-readable health checks. Every response tagged `_mcp: "figma-console-mcp"`; errors prefixed `[figma-console-mcp]` so attribution is unambiguous when running multiple Figma MCPs. Plugin status pill now reads `Local · ready` / `Cloud · ready` / `Local + Cloud · ready`. Net diff: −7,299 lines, plugin re-import optional.
811
+ - [x] **v1.25.0** - Description + Dev Mode annotation tracking in `figma_diff_versions` via plugin session buffer. Description and annotation edits made during a session now appear in diff output (REST API doesn't return these — bridged through the plugin's `documentchange` listener).
812
+ - [x] **v1.24.0** - Honest scope coverage on version diffs. `scope_coverage` object surfaces what `figma_diff_versions` does and doesn't track; always-on coverage warnings prevent silent invisibility on token-value changes and component-instance placements.
813
+ - [x] **v1.23.0** - Version History & Time-Series Awareness: 6 new tools (list versions, snapshot any past version, diff two versions for component/binding deltas, generate markdown changelogs, trace property/variant introduction via binary-search blame walker). Author attribution flows from autosaves, not just labeled releases.
814
+ - [x] **v1.17.0** - Figma Slides support: 15 tools for managing presentations.
815
+ - [x] **v1.16.0** - FigJam support: 9 tools for creating and reading FigJam boards.
816
+ - [x] **v1.12.0** - Cloud Write Relay: web AI clients can create and modify Figma designs without Node.js.
817
+ - [x] **v1.11.0** - Complete CDP removal, improved multi-file active tracking with focus detection.
818
+ - [x] **v1.10.0** - Multi-instance support (dynamic port fallback 9223–9232, multi-connection plugin, instance discovery).
819
+ - [x] **v1.9.0** - Figma Comments tools, improved port conflict detection.
820
+ - [x] **v1.8.0** - WebSocket Bridge transport (CDP-free connectivity), real-time selection/document tracking.
821
+ - [x] **v1.7.0** - MCP Apps (Token Browser, Design System Dashboard), batch variable operations, design-code parity tools.
806
822
 
807
823
  **Coming Next:**
824
+ - [ ] **Token sync Phase 2** - Tailwind v4 `@theme`, SCSS, TypeScript module, Style Dictionary v3 source format, `toCreate` apply orchestration, `toDelete` for `replace` strategy, cross-library variable resolution via `getVariableByIdAsync`.
808
825
  - [ ] **Component template library** - Common UI pattern generation
809
826
  - [ ] **Visual regression testing** - Screenshot diff capabilities
810
827
  - [ ] **Design linting** - Automated compliance and accessibility checks
811
- - [ ] **AI enhancements** - Intelligent component suggestions and auto-layout optimization
812
828
 
813
829
  **📖 [Full Roadmap](docs/ROADMAP.md)**
814
830
 
@@ -48,10 +48,6 @@ const DEFAULT_CONFIG = {
48
48
  quality: 90,
49
49
  storePath: join(process.env.TMPDIR || '/tmp', 'figma-console-mcp', 'screenshots'),
50
50
  },
51
- local: {
52
- debugHost: process.env.FIGMA_DEBUG_HOST || 'localhost',
53
- debugPort: parseInt(process.env.FIGMA_DEBUG_PORT || '9222', 10),
54
- },
55
51
  };
56
52
  /**
57
53
  * Possible config file locations (checked in order)
@@ -111,10 +107,6 @@ function mergeConfig(defaults, overrides) {
111
107
  ...defaults.screenshots,
112
108
  ...(overrides.screenshots || {}),
113
109
  },
114
- local: {
115
- ...defaults.local,
116
- ...(overrides.local || {}),
117
- },
118
110
  };
119
111
  }
120
112
  /**
@@ -14,14 +14,14 @@ export class ConsoleMonitor {
14
14
  constructor(config) {
15
15
  this.logs = [];
16
16
  this.isMonitoring = false;
17
- this.page = null; // Supports both puppeteer-core and @cloudflare/puppeteer
17
+ this.page = null; // @cloudflare/puppeteer Page (this class is cloud-mode-only after Phase 3).
18
18
  this.workers = new Set();
19
19
  this.lastUrl = ''; // Track the last URL to detect real navigations vs hash changes
20
20
  this.config = config;
21
21
  }
22
22
  /**
23
- * Start monitoring console logs on a page
24
- * Accepts any puppeteer Page type (puppeteer-core or @cloudflare/puppeteer)
23
+ * Start monitoring console logs on a page.
24
+ * Accepts the @cloudflare/puppeteer Page type (cloud mode only).
25
25
  */
26
26
  async startMonitoring(page) {
27
27
  if (this.isMonitoring && this.page === page) {
@@ -0,0 +1,96 @@
1
+ /**
2
+ * figma_diagnose — a designer-readable health check for figma-console-mcp.
3
+ *
4
+ * This is the one tool to point a confused user at. It self-identifies the
5
+ * server, reports the transport / plugin / token state in plain language,
6
+ * and explicitly disclaims any token or OAuth error a user might be seeing
7
+ * in chat (those typically come from a different MCP). The response is
8
+ * structured so an LLM is likely to surface the `report` field verbatim.
9
+ */
10
+ import { z } from "zod";
11
+ import { MCP_NAME, withIdentity } from "./identity.js";
12
+ function buildReport(opts) {
13
+ const lines = [];
14
+ lines.push(`# ${MCP_NAME} diagnostic`);
15
+ lines.push("");
16
+ lines.push(`Server version: ${opts.getServerVersion()}`);
17
+ lines.push(`Mode: ${opts.mode === "local" ? "Local (stdio + WebSocket plugin bridge)" : "Cloud (Cloudflare Workers)"}`);
18
+ lines.push("");
19
+ const plugin = opts.getPluginState?.();
20
+ lines.push("## Plugin connection");
21
+ if (!plugin) {
22
+ lines.push("- No WebSocket server (cloud mode runs without a local plugin bridge unless paired).");
23
+ }
24
+ else if (plugin.connected) {
25
+ const portInfo = plugin.portFallbackFrom && plugin.port && plugin.port !== plugin.portFallbackFrom
26
+ ? `port ${plugin.port} (fallback from ${plugin.portFallbackFrom})`
27
+ : plugin.port
28
+ ? `port ${plugin.port}`
29
+ : "connected";
30
+ lines.push(`- ✅ Desktop Bridge plugin connected on ${portInfo}.`);
31
+ if (plugin.fileName) {
32
+ lines.push(`- Active file: **${plugin.fileName}**${plugin.currentPage ? ` (page: ${plugin.currentPage})` : ""}.`);
33
+ }
34
+ if (plugin.editorType && plugin.editorType !== "figma") {
35
+ lines.push(`- Editor type: ${plugin.editorType}.`);
36
+ }
37
+ }
38
+ else {
39
+ lines.push(`- ⚠️ Desktop Bridge plugin not connected${plugin.port ? ` (server is listening on port ${plugin.port})` : ""}.`);
40
+ lines.push("- To fix: open the Figma Desktop Bridge plugin in Figma Desktop. If it was already running, close and reopen it once.");
41
+ }
42
+ lines.push("");
43
+ const token = opts.getTokenState?.();
44
+ lines.push("## REST API token");
45
+ if (!token) {
46
+ lines.push("- Token state not available in this mode.");
47
+ }
48
+ else if (token.hasToken) {
49
+ lines.push(`- ✅ Figma access token detected (source: ${token.source ?? "unknown"}). REST-based tools should work.`);
50
+ }
51
+ else {
52
+ lines.push("- ⚠️ No Figma access token detected. Plugin-based tools still work; REST-only tools (file data, version history, image rendering) will return an auth error.");
53
+ if (opts.mode === "local") {
54
+ lines.push("- To enable REST tools: set FIGMA_ACCESS_TOKEN in your MCP client config. Generate a token at https://www.figma.com/developers/api#access-tokens.");
55
+ }
56
+ else {
57
+ lines.push("- To enable REST tools: authenticate via your MCP client's OAuth flow or pass a Figma personal access token (figd_...) as a Bearer token.");
58
+ }
59
+ }
60
+ lines.push("");
61
+ lines.push("## If you're seeing token / OAuth errors in chat");
62
+ lines.push(`If you see messages like "API token has expired" or "Bearer token has expired" and the response above does NOT show a token problem, the error is most likely coming from a **different MCP server**, not from ${MCP_NAME}.`);
63
+ lines.push("");
64
+ lines.push("Common cause: Figma's native MCP (often listed as just `Figma` in your MCP client) is also installed and its OAuth session expired. Check your MCP client's server list. Errors from those servers are not produced by figma-console-mcp.");
65
+ lines.push("");
66
+ return lines.join("\n");
67
+ }
68
+ export function registerDiagnoseTool(server, options) {
69
+ server.tool("figma_diagnose", `Designer-readable health check for ${MCP_NAME}. Use this when something seems wrong — it self-identifies the server, reports plugin connection / file / token status in plain language, and disambiguates errors that may be coming from a different Figma-related MCP server. Recommended as the first step when a user reports a "token expired" or "plugin disconnected" issue.`, {
70
+ verbose: z
71
+ .boolean()
72
+ .optional()
73
+ .default(false)
74
+ .describe("Include the raw structured state alongside the human-readable report."),
75
+ }, async ({ verbose }) => {
76
+ const report = buildReport(options);
77
+ const details = verbose
78
+ ? {
79
+ plugin: options.getPluginState?.() ?? null,
80
+ token: options.getTokenState?.() ?? null,
81
+ }
82
+ : undefined;
83
+ const payload = withIdentity({
84
+ report,
85
+ ...(details ? { details } : {}),
86
+ });
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: JSON.stringify(payload),
92
+ },
93
+ ],
94
+ };
95
+ });
96
+ }