@mp3wizard/figma-console-mcp 1.14.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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +816 -0
  3. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
  4. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
  5. package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
  6. package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
  7. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
  8. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
  9. package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
  10. package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
  11. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
  12. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
  13. package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
  14. package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
  15. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
  16. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
  17. package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
  18. package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
  19. package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
  20. package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
  21. package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
  22. package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
  23. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
  24. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
  25. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
  26. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
  27. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
  28. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
  29. package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
  30. package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
  31. package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
  32. package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
  33. package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
  34. package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
  35. package/dist/apps/design-system-dashboard/server.d.ts +24 -0
  36. package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
  37. package/dist/apps/design-system-dashboard/server.js +160 -0
  38. package/dist/apps/design-system-dashboard/server.js.map +1 -0
  39. package/dist/apps/token-browser/server.d.ts +26 -0
  40. package/dist/apps/token-browser/server.d.ts.map +1 -0
  41. package/dist/apps/token-browser/server.js +137 -0
  42. package/dist/apps/token-browser/server.js.map +1 -0
  43. package/dist/browser/base.d.ts +58 -0
  44. package/dist/browser/base.d.ts.map +1 -0
  45. package/dist/browser/base.js +6 -0
  46. package/dist/browser/base.js.map +1 -0
  47. package/dist/browser/local.d.ts +87 -0
  48. package/dist/browser/local.d.ts.map +1 -0
  49. package/dist/browser/local.js +318 -0
  50. package/dist/browser/local.js.map +1 -0
  51. package/dist/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
  52. package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
  53. package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
  54. package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
  55. package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
  56. package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
  57. package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
  58. package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
  59. package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
  60. package/dist/cloudflare/apps/token-browser/server.js +136 -0
  61. package/dist/cloudflare/browser/base.js +5 -0
  62. package/dist/cloudflare/browser/cloudflare.js +156 -0
  63. package/dist/cloudflare/browser-manager.js +157 -0
  64. package/dist/cloudflare/core/cloud-websocket-connector.js +267 -0
  65. package/dist/cloudflare/core/cloud-websocket-relay.js +199 -0
  66. package/dist/cloudflare/core/comment-tools.js +292 -0
  67. package/dist/cloudflare/core/config.js +161 -0
  68. package/dist/cloudflare/core/console-monitor.js +427 -0
  69. package/dist/cloudflare/core/design-code-tools.js +2504 -0
  70. package/dist/cloudflare/core/design-system-manifest.js +260 -0
  71. package/dist/cloudflare/core/design-system-tools.js +863 -0
  72. package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
  73. package/dist/cloudflare/core/enrichment/index.js +7 -0
  74. package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
  75. package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
  76. package/dist/cloudflare/core/figma-api.js +409 -0
  77. package/dist/cloudflare/core/figma-connector.js +7 -0
  78. package/dist/cloudflare/core/figma-desktop-connector.js +1184 -0
  79. package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
  80. package/dist/cloudflare/core/figma-style-extractor.js +311 -0
  81. package/dist/cloudflare/core/figma-tools.js +2947 -0
  82. package/dist/cloudflare/core/logger.js +53 -0
  83. package/dist/cloudflare/core/port-discovery.js +282 -0
  84. package/dist/cloudflare/core/snippet-injector.js +96 -0
  85. package/dist/cloudflare/core/types/design-code.js +4 -0
  86. package/dist/cloudflare/core/types/enriched.js +5 -0
  87. package/dist/cloudflare/core/types/index.js +4 -0
  88. package/dist/cloudflare/core/websocket-connector.js +256 -0
  89. package/dist/cloudflare/core/websocket-server.js +646 -0
  90. package/dist/cloudflare/core/write-tools.js +2091 -0
  91. package/dist/cloudflare/index.js +2899 -0
  92. package/dist/cloudflare/test-browser.js +88 -0
  93. package/dist/core/comment-tools.d.ts +11 -0
  94. package/dist/core/comment-tools.d.ts.map +1 -0
  95. package/dist/core/comment-tools.js +293 -0
  96. package/dist/core/comment-tools.js.map +1 -0
  97. package/dist/core/config.d.ts +17 -0
  98. package/dist/core/config.d.ts.map +1 -0
  99. package/dist/core/config.js +162 -0
  100. package/dist/core/config.js.map +1 -0
  101. package/dist/core/console-monitor.d.ts +82 -0
  102. package/dist/core/console-monitor.d.ts.map +1 -0
  103. package/dist/core/console-monitor.js +428 -0
  104. package/dist/core/console-monitor.js.map +1 -0
  105. package/dist/core/design-code-tools.d.ts +127 -0
  106. package/dist/core/design-code-tools.d.ts.map +1 -0
  107. package/dist/core/design-code-tools.js +2505 -0
  108. package/dist/core/design-code-tools.js.map +1 -0
  109. package/dist/core/design-system-manifest.d.ts +272 -0
  110. package/dist/core/design-system-manifest.d.ts.map +1 -0
  111. package/dist/core/design-system-manifest.js +261 -0
  112. package/dist/core/design-system-manifest.js.map +1 -0
  113. package/dist/core/design-system-tools.d.ts +17 -0
  114. package/dist/core/design-system-tools.d.ts.map +1 -0
  115. package/dist/core/design-system-tools.js +864 -0
  116. package/dist/core/design-system-tools.js.map +1 -0
  117. package/dist/core/enrichment/enrichment-service.d.ts +52 -0
  118. package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
  119. package/dist/core/enrichment/enrichment-service.js +273 -0
  120. package/dist/core/enrichment/enrichment-service.js.map +1 -0
  121. package/dist/core/enrichment/index.d.ts +8 -0
  122. package/dist/core/enrichment/index.d.ts.map +1 -0
  123. package/dist/core/enrichment/index.js +8 -0
  124. package/dist/core/enrichment/index.js.map +1 -0
  125. package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
  126. package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
  127. package/dist/core/enrichment/relationship-mapper.js +352 -0
  128. package/dist/core/enrichment/relationship-mapper.js.map +1 -0
  129. package/dist/core/enrichment/style-resolver.d.ts +80 -0
  130. package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
  131. package/dist/core/enrichment/style-resolver.js +327 -0
  132. package/dist/core/enrichment/style-resolver.js.map +1 -0
  133. package/dist/core/figma-api.d.ts +201 -0
  134. package/dist/core/figma-api.d.ts.map +1 -0
  135. package/dist/core/figma-api.js +410 -0
  136. package/dist/core/figma-api.js.map +1 -0
  137. package/dist/core/figma-connector.d.ts +48 -0
  138. package/dist/core/figma-connector.d.ts.map +1 -0
  139. package/dist/core/figma-connector.js +8 -0
  140. package/dist/core/figma-connector.js.map +1 -0
  141. package/dist/core/figma-desktop-connector.d.ts +265 -0
  142. package/dist/core/figma-desktop-connector.d.ts.map +1 -0
  143. package/dist/core/figma-desktop-connector.js +1184 -0
  144. package/dist/core/figma-desktop-connector.js.map +1 -0
  145. package/dist/core/figma-reconstruction-spec.d.ts +166 -0
  146. package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
  147. package/dist/core/figma-reconstruction-spec.js +403 -0
  148. package/dist/core/figma-reconstruction-spec.js.map +1 -0
  149. package/dist/core/figma-style-extractor.d.ts +76 -0
  150. package/dist/core/figma-style-extractor.d.ts.map +1 -0
  151. package/dist/core/figma-style-extractor.js +312 -0
  152. package/dist/core/figma-style-extractor.js.map +1 -0
  153. package/dist/core/figma-tools.d.ts +23 -0
  154. package/dist/core/figma-tools.d.ts.map +1 -0
  155. package/dist/core/figma-tools.js +2948 -0
  156. package/dist/core/figma-tools.js.map +1 -0
  157. package/dist/core/logger.d.ts +22 -0
  158. package/dist/core/logger.d.ts.map +1 -0
  159. package/dist/core/logger.js +54 -0
  160. package/dist/core/logger.js.map +1 -0
  161. package/dist/core/port-discovery.d.ts +110 -0
  162. package/dist/core/port-discovery.d.ts.map +1 -0
  163. package/dist/core/port-discovery.js +283 -0
  164. package/dist/core/port-discovery.js.map +1 -0
  165. package/dist/core/snippet-injector.d.ts +24 -0
  166. package/dist/core/snippet-injector.d.ts.map +1 -0
  167. package/dist/core/snippet-injector.js +97 -0
  168. package/dist/core/snippet-injector.js.map +1 -0
  169. package/dist/core/types/design-code.d.ts +262 -0
  170. package/dist/core/types/design-code.d.ts.map +1 -0
  171. package/dist/core/types/design-code.js +5 -0
  172. package/dist/core/types/design-code.js.map +1 -0
  173. package/dist/core/types/enriched.d.ts +213 -0
  174. package/dist/core/types/enriched.d.ts.map +1 -0
  175. package/dist/core/types/enriched.js +6 -0
  176. package/dist/core/types/enriched.js.map +1 -0
  177. package/dist/core/types/index.d.ts +112 -0
  178. package/dist/core/types/index.d.ts.map +1 -0
  179. package/dist/core/types/index.js +5 -0
  180. package/dist/core/types/index.js.map +1 -0
  181. package/dist/core/websocket-connector.d.ts +55 -0
  182. package/dist/core/websocket-connector.d.ts.map +1 -0
  183. package/dist/core/websocket-connector.js +257 -0
  184. package/dist/core/websocket-connector.js.map +1 -0
  185. package/dist/core/websocket-server.d.ts +191 -0
  186. package/dist/core/websocket-server.d.ts.map +1 -0
  187. package/dist/core/websocket-server.js +647 -0
  188. package/dist/core/websocket-server.js.map +1 -0
  189. package/dist/core/write-tools.d.ts +7 -0
  190. package/dist/core/write-tools.d.ts.map +1 -0
  191. package/dist/core/write-tools.js +2092 -0
  192. package/dist/core/write-tools.js.map +1 -0
  193. package/dist/local.d.ts +84 -0
  194. package/dist/local.d.ts.map +1 -0
  195. package/dist/local.js +5039 -0
  196. package/dist/local.js.map +1 -0
  197. package/figma-desktop-bridge/README.md +313 -0
  198. package/figma-desktop-bridge/code.js +2818 -0
  199. package/figma-desktop-bridge/manifest.json +67 -0
  200. package/figma-desktop-bridge/ui.html +1236 -0
  201. package/package.json +87 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Design System Dashboard MCP App - Server Registration
3
+ *
4
+ * Registers tools and resource for the Design System Dashboard MCP App.
5
+ * Uses the official @modelcontextprotocol/ext-apps helpers for proper
6
+ * MCP Apps protocol compatibility with Claude Desktop.
7
+ *
8
+ * Data flow:
9
+ * 1. LLM calls figma_audit_design_system → server fetches + scores data,
10
+ * returns SHORT summary to LLM (avoids context exhaustion)
11
+ * 2. UI opens, connects, calls ds_dashboard_refresh (app-only visibility)
12
+ * 3. ds_dashboard_refresh returns full JSON → UI renders
13
+ */
14
+ import { readFile } from "node:fs/promises";
15
+ import { dirname, resolve } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import { RESOURCE_MIME_TYPE, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server";
18
+ import { z } from "zod";
19
+ import { scoreDesignSystem } from "./scoring/engine.js";
20
+ const DASHBOARD_URI = "ui://figma-console/design-system-dashboard";
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = dirname(__filename);
23
+ // Shared state
24
+ let lastFileUrl;
25
+ /**
26
+ * Register the Design System Dashboard MCP App with the server.
27
+ *
28
+ * @param server - The MCP server instance
29
+ * @param getDesignSystemData - Function to fetch raw design system data from Figma
30
+ * @param getCurrentUrl - Optional function to get the current browser URL (for lastFileUrl tracking)
31
+ */
32
+ export function registerDesignSystemDashboardApp(server, getDesignSystemData, getCurrentUrl) {
33
+ // Tool: fetches + scores data, returns SHORT summary to LLM
34
+ registerAppTool(server, "figma_audit_design_system", {
35
+ title: "Audit Design System Health",
36
+ description: "Analyze the health and AI-readiness of a Figma file's design system. Produces a scored dashboard evaluating naming conventions, token architecture, component metadata, accessibility, consistency, and coverage. Results are displayed in the dashboard UI.",
37
+ inputSchema: {
38
+ fileUrl: z
39
+ .string()
40
+ .url()
41
+ .optional()
42
+ .describe("Figma file URL. If not provided, uses the currently active file."),
43
+ },
44
+ _meta: {
45
+ ui: { resourceUri: DASHBOARD_URI },
46
+ },
47
+ }, async ({ fileUrl }) => {
48
+ try {
49
+ // Track the actual URL used (explicit or current browser URL)
50
+ // This ensures ds_dashboard_refresh uses the correct file
51
+ lastFileUrl = fileUrl || getCurrentUrl?.() || undefined;
52
+ const data = await getDesignSystemData(fileUrl);
53
+ const scored = scoreDesignSystem(data);
54
+ const categorySummaries = scored.categories
55
+ .map((c) => `${c.label}: ${c.score}/100`)
56
+ .join(", ");
57
+ const fileName = scored.fileInfo?.name || "Unknown file";
58
+ const unavailableNote = scored.dataAvailability && !scored.dataAvailability.variables
59
+ ? " Note: Variable/token data was unavailable (requires Enterprise plan or Desktop Bridge). Token Architecture scores reflect missing data, not actual quality."
60
+ : "";
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: `Design System: ${fileName}. Health: ${scored.overall}/100 — ${scored.status}. ${categorySummaries}.${unavailableNote} The dashboard UI is now showing detailed results.`,
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ catch (error) {
71
+ const errorMessage = error instanceof Error ? error.message : String(error);
72
+ return {
73
+ content: [
74
+ {
75
+ type: "text",
76
+ text: `Design System Dashboard error: ${errorMessage}`,
77
+ },
78
+ ],
79
+ isError: true,
80
+ };
81
+ }
82
+ });
83
+ // Tool: returns full JSON data (app-only, hidden from LLM)
84
+ registerAppTool(server, "ds_dashboard_refresh", {
85
+ title: "Dashboard Refresh",
86
+ description: "Refresh dashboard data (called from MCP App UI)",
87
+ inputSchema: {
88
+ fileUrl: z
89
+ .string()
90
+ .url()
91
+ .optional()
92
+ .describe("Figma file URL to refresh data for."),
93
+ },
94
+ _meta: {
95
+ ui: {
96
+ resourceUri: DASHBOARD_URI,
97
+ visibility: ["app"],
98
+ },
99
+ },
100
+ }, async ({ fileUrl }) => {
101
+ try {
102
+ const url = fileUrl || lastFileUrl;
103
+ const data = await getDesignSystemData(url);
104
+ const scored = scoreDesignSystem(data);
105
+ return {
106
+ content: [
107
+ {
108
+ type: "text",
109
+ text: JSON.stringify(scored),
110
+ },
111
+ ],
112
+ };
113
+ }
114
+ catch (error) {
115
+ const errorMessage = error instanceof Error ? error.message : String(error);
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: JSON.stringify({
121
+ error: errorMessage,
122
+ overall: 0,
123
+ status: "poor",
124
+ categories: [],
125
+ summary: [],
126
+ meta: {
127
+ componentCount: 0,
128
+ variableCount: 0,
129
+ collectionCount: 0,
130
+ styleCount: 0,
131
+ componentSetCount: 0,
132
+ standaloneCount: 0,
133
+ variantCount: 0,
134
+ timestamp: Date.now(),
135
+ },
136
+ }),
137
+ },
138
+ ],
139
+ isError: true,
140
+ };
141
+ }
142
+ });
143
+ // Resource: serves the Vite-built HTML
144
+ registerAppResource(server, "Design System Dashboard App", DASHBOARD_URI, {
145
+ description: "Interactive dashboard for evaluating design system health and AI-readiness",
146
+ }, async () => {
147
+ const htmlPath = resolve(__dirname, "mcp-app.html");
148
+ const html = await readFile(htmlPath, "utf-8");
149
+ return {
150
+ contents: [
151
+ {
152
+ uri: DASHBOARD_URI,
153
+ mimeType: RESOURCE_MIME_TYPE,
154
+ text: html,
155
+ },
156
+ ],
157
+ };
158
+ });
159
+ }
160
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/apps/design-system-dashboard/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Token Browser MCP App - Server Registration
3
+ *
4
+ * Registers tools and resource for the Token Browser MCP App.
5
+ * Uses the official @modelcontextprotocol/ext-apps helpers for proper
6
+ * MCP Apps protocol compatibility with Claude Desktop.
7
+ *
8
+ * Data flow:
9
+ * 1. LLM calls figma_browse_tokens → server fetches + caches data,
10
+ * returns SHORT summary to LLM (avoids context exhaustion)
11
+ * 2. UI opens, connects, calls token_browser_refresh (app-only visibility)
12
+ * 3. token_browser_refresh returns full JSON → UI renders
13
+ */
14
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ /**
16
+ * Register the Token Browser MCP App with the server.
17
+ *
18
+ * @param server - The MCP server instance
19
+ * @param getVariablesHandler - Function to fetch variables data
20
+ */
21
+ export declare function registerTokenBrowserApp(server: McpServer, getVariablesHandler: (fileUrl?: string) => Promise<{
22
+ variables: any[];
23
+ collections: any[];
24
+ [key: string]: any;
25
+ }>): void;
26
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/apps/token-browser/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,EACjB,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC,GACA,IAAI,CAwIN"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Token Browser MCP App - Server Registration
3
+ *
4
+ * Registers tools and resource for the Token Browser MCP App.
5
+ * Uses the official @modelcontextprotocol/ext-apps helpers for proper
6
+ * MCP Apps protocol compatibility with Claude Desktop.
7
+ *
8
+ * Data flow:
9
+ * 1. LLM calls figma_browse_tokens → server fetches + caches data,
10
+ * returns SHORT summary to LLM (avoids context exhaustion)
11
+ * 2. UI opens, connects, calls token_browser_refresh (app-only visibility)
12
+ * 3. token_browser_refresh returns full JSON → UI renders
13
+ */
14
+ import { readFile } from "node:fs/promises";
15
+ import { dirname, resolve } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import { RESOURCE_MIME_TYPE, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server";
18
+ import { z } from "zod";
19
+ const TOKEN_BROWSER_URI = "ui://figma-console/token-browser";
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = dirname(__filename);
22
+ /**
23
+ * Register the Token Browser MCP App with the server.
24
+ *
25
+ * @param server - The MCP server instance
26
+ * @param getVariablesHandler - Function to fetch variables data
27
+ */
28
+ export function registerTokenBrowserApp(server, getVariablesHandler) {
29
+ // Shared state: remember last URL so refresh tool can reuse it
30
+ let lastFileUrl;
31
+ // Tool: fetches + caches data, returns SHORT summary to LLM
32
+ registerAppTool(server, "figma_browse_tokens", {
33
+ title: "Browse Design Tokens",
34
+ description: "Open an interactive browser to explore design tokens (variables) from a Figma file. Shows tokens organized by collection with search, filtering, and mode switching. Data is displayed in the UI — do not attempt to list or describe the tokens in chat.",
35
+ inputSchema: {
36
+ fileUrl: z
37
+ .string()
38
+ .url()
39
+ .optional()
40
+ .describe("Figma file URL. If not provided, uses the currently active file."),
41
+ },
42
+ _meta: {
43
+ ui: { resourceUri: TOKEN_BROWSER_URI },
44
+ },
45
+ }, async ({ fileUrl }) => {
46
+ try {
47
+ lastFileUrl = fileUrl;
48
+ const result = await getVariablesHandler(fileUrl);
49
+ const varCount = result.variables?.length || 0;
50
+ const colCount = result.collections?.length || 0;
51
+ // Count by type
52
+ const colors = result.variables?.filter((v) => v.resolvedType === "COLOR")
53
+ .length || 0;
54
+ const numbers = result.variables?.filter((v) => v.resolvedType === "FLOAT")
55
+ .length || 0;
56
+ return {
57
+ content: [
58
+ {
59
+ type: "text",
60
+ text: `Token Browser opened: ${varCount} tokens across ${colCount} collections (${colors} colors, ${numbers} numbers). The interactive UI is now displaying the results — users can search, filter by type, and browse by collection.`,
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ catch (error) {
66
+ const errorMessage = error instanceof Error ? error.message : String(error);
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: `Token Browser error: ${errorMessage}`,
72
+ },
73
+ ],
74
+ isError: true,
75
+ };
76
+ }
77
+ });
78
+ // Tool: returns full JSON data (app-only, hidden from LLM)
79
+ registerAppTool(server, "token_browser_refresh", {
80
+ title: "Token Browser Refresh",
81
+ description: "Refresh token data (called from MCP App UI)",
82
+ inputSchema: {
83
+ fileUrl: z
84
+ .string()
85
+ .url()
86
+ .optional()
87
+ .describe("Figma file URL to refresh data for."),
88
+ },
89
+ _meta: {
90
+ ui: {
91
+ resourceUri: TOKEN_BROWSER_URI,
92
+ visibility: ["app"],
93
+ },
94
+ },
95
+ }, async ({ fileUrl }) => {
96
+ try {
97
+ const url = fileUrl || lastFileUrl;
98
+ const result = await getVariablesHandler(url);
99
+ return {
100
+ content: [{ type: "text", text: JSON.stringify(result) }],
101
+ };
102
+ }
103
+ catch (error) {
104
+ const errorMessage = error instanceof Error ? error.message : String(error);
105
+ return {
106
+ content: [
107
+ {
108
+ type: "text",
109
+ text: JSON.stringify({
110
+ error: errorMessage,
111
+ variables: [],
112
+ collections: [],
113
+ }),
114
+ },
115
+ ],
116
+ isError: true,
117
+ };
118
+ }
119
+ });
120
+ // Resource: serves the Vite-built HTML
121
+ registerAppResource(server, "Token Browser App", TOKEN_BROWSER_URI, {
122
+ description: "Interactive browser for exploring Figma design tokens and variables",
123
+ }, async () => {
124
+ const htmlPath = resolve(__dirname, "mcp-app.html");
125
+ const html = await readFile(htmlPath, "utf-8");
126
+ return {
127
+ contents: [
128
+ {
129
+ uri: TOKEN_BROWSER_URI,
130
+ mimeType: RESOURCE_MIME_TYPE,
131
+ text: html,
132
+ },
133
+ ],
134
+ };
135
+ });
136
+ }
137
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/apps/token-browser/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Browser Manager Interface
3
+ * Abstract interface for browser automation across different runtimes
4
+ */
5
+ /**
6
+ * Result of a navigateToFigma call indicating what action was taken
7
+ */
8
+ export interface NavigationResult {
9
+ page: any;
10
+ action: 'switched_to_existing' | 'navigated';
11
+ url: string;
12
+ }
13
+ /**
14
+ * Browser Manager Interface
15
+ * Provides unified API for browser automation regardless of runtime (Cloudflare/Local)
16
+ *
17
+ * Note: Uses 'any' for Page type to support both puppeteer-core and @cloudflare/puppeteer
18
+ * implementations which have incompatible type definitions but compatible runtime behavior
19
+ */
20
+ export interface IBrowserManager {
21
+ /**
22
+ * Launch or connect to browser instance
23
+ */
24
+ launch(): Promise<void>;
25
+ /**
26
+ * Get active page instance
27
+ */
28
+ getPage(): Promise<any>;
29
+ /**
30
+ * Navigate to Figma URL
31
+ */
32
+ navigateToFigma(url?: string): Promise<NavigationResult>;
33
+ /**
34
+ * Reload current page
35
+ */
36
+ reload(hardReload?: boolean): Promise<void>;
37
+ /**
38
+ * Evaluate JavaScript in page context
39
+ */
40
+ evaluate<T>(fn: () => T): Promise<T>;
41
+ /**
42
+ * Check if browser is running
43
+ */
44
+ isRunning(): boolean;
45
+ /**
46
+ * Close browser instance
47
+ */
48
+ close(): Promise<void>;
49
+ /**
50
+ * Get current URL
51
+ */
52
+ getCurrentUrl(): string | null;
53
+ /**
54
+ * Wait for navigation to complete
55
+ */
56
+ waitForNavigation(timeout?: number): Promise<void>;
57
+ }
58
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/browser/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,sBAAsB,GAAG,WAAW,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEzD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAKrC;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI,CAAC;IAE/B;;OAEG;IACH,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Browser Manager Interface
3
+ * Abstract interface for browser automation across different runtimes
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/browser/base.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Local Browser Manager (Legacy)
3
+ * Note: This module is maintained for backwards compatibility but is no longer
4
+ * the primary connection method. Use the WebSocket Desktop Bridge plugin instead.
5
+ */
6
+ import { type Page } from 'puppeteer-core';
7
+ import type { IBrowserManager, NavigationResult } from './base.js';
8
+ /**
9
+ * Local browser configuration
10
+ */
11
+ export interface LocalBrowserConfig {
12
+ debugPort: number;
13
+ debugHost: string;
14
+ }
15
+ /**
16
+ * Local Browser Manager
17
+ * Connects to existing Figma Desktop instance via remote debugging port
18
+ */
19
+ export declare class LocalBrowserManager implements IBrowserManager {
20
+ private browser;
21
+ private page;
22
+ private config;
23
+ constructor(config: LocalBrowserConfig);
24
+ /**
25
+ * Connect to Figma Desktop via remote debugging port
26
+ */
27
+ launch(): Promise<void>;
28
+ /**
29
+ * Find the best page for plugin debugging
30
+ * Actively searches for pages with workers across ALL tabs
31
+ */
32
+ private findBestPage;
33
+ /**
34
+ * Find an existing browser tab whose URL matches the given Figma file key
35
+ */
36
+ private findPageByFileKey;
37
+ /**
38
+ * Get active Figma page or create new one
39
+ * Prefers pages with active plugin workers for plugin debugging
40
+ */
41
+ getPage(): Promise<Page>;
42
+ /**
43
+ * Navigate to Figma URL
44
+ * If the target file is already open in a tab, switches to it instead of navigating.
45
+ */
46
+ navigateToFigma(figmaUrl?: string): Promise<NavigationResult>;
47
+ /**
48
+ * Reload current page
49
+ */
50
+ reload(hardReload?: boolean): Promise<void>;
51
+ /**
52
+ * Execute JavaScript in page context
53
+ */
54
+ evaluate<T>(fn: () => T): Promise<T>;
55
+ /**
56
+ * Check if browser is connected
57
+ */
58
+ isRunning(): boolean;
59
+ /**
60
+ * Disconnect from browser (doesn't close Figma Desktop)
61
+ */
62
+ close(): Promise<void>;
63
+ /**
64
+ * Get current page URL
65
+ */
66
+ getCurrentUrl(): string | null;
67
+ /**
68
+ * Check if the browser connection is still alive
69
+ * Returns false if connection is stale (e.g., after computer sleep)
70
+ */
71
+ isConnectionAlive(): Promise<boolean>;
72
+ /**
73
+ * Reconnect to Figma Desktop if connection was lost
74
+ * Call this before any operation that requires a live connection
75
+ */
76
+ ensureConnection(): Promise<void>;
77
+ /**
78
+ * Force a complete reconnection to Figma Desktop
79
+ * Use this when frames become detached or stale even though the browser appears connected
80
+ */
81
+ forceReconnect(): Promise<void>;
82
+ /**
83
+ * Wait for navigation
84
+ */
85
+ waitForNavigation(timeout?: number): Promise<void>;
86
+ }
87
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/browser/local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAkB,EAAgB,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAInE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IAC1D,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC7B;;;OAGG;YACW,YAAY;IA4C1B;;OAEG;YACW,iBAAiB;IAuB/B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC9B;;;OAGG;IACG,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsCnE;;OAEG;IACG,MAAM,CAAC,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/C;;OAEG;IACG,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ1C;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAQ9B;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAe3C;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBvC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrC;;OAEG;IACG,iBAAiB,CAAC,OAAO,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvD"}