@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.
- package/LICENSE +21 -0
- package/README.md +816 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
- package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
- package/dist/apps/design-system-dashboard/server.d.ts +24 -0
- package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/server.js +160 -0
- package/dist/apps/design-system-dashboard/server.js.map +1 -0
- package/dist/apps/token-browser/server.d.ts +26 -0
- package/dist/apps/token-browser/server.d.ts.map +1 -0
- package/dist/apps/token-browser/server.js +137 -0
- package/dist/apps/token-browser/server.js.map +1 -0
- package/dist/browser/base.d.ts +58 -0
- package/dist/browser/base.d.ts.map +1 -0
- package/dist/browser/base.js +6 -0
- package/dist/browser/base.js.map +1 -0
- package/dist/browser/local.d.ts +87 -0
- package/dist/browser/local.d.ts.map +1 -0
- package/dist/browser/local.js +318 -0
- package/dist/browser/local.js.map +1 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
- package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
- package/dist/cloudflare/apps/token-browser/server.js +136 -0
- package/dist/cloudflare/browser/base.js +5 -0
- package/dist/cloudflare/browser/cloudflare.js +156 -0
- package/dist/cloudflare/browser-manager.js +157 -0
- package/dist/cloudflare/core/cloud-websocket-connector.js +267 -0
- package/dist/cloudflare/core/cloud-websocket-relay.js +199 -0
- package/dist/cloudflare/core/comment-tools.js +292 -0
- package/dist/cloudflare/core/config.js +161 -0
- package/dist/cloudflare/core/console-monitor.js +427 -0
- package/dist/cloudflare/core/design-code-tools.js +2504 -0
- package/dist/cloudflare/core/design-system-manifest.js +260 -0
- package/dist/cloudflare/core/design-system-tools.js +863 -0
- package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
- package/dist/cloudflare/core/enrichment/index.js +7 -0
- package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
- package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
- package/dist/cloudflare/core/figma-api.js +409 -0
- package/dist/cloudflare/core/figma-connector.js +7 -0
- package/dist/cloudflare/core/figma-desktop-connector.js +1184 -0
- package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
- package/dist/cloudflare/core/figma-style-extractor.js +311 -0
- package/dist/cloudflare/core/figma-tools.js +2947 -0
- package/dist/cloudflare/core/logger.js +53 -0
- package/dist/cloudflare/core/port-discovery.js +282 -0
- package/dist/cloudflare/core/snippet-injector.js +96 -0
- package/dist/cloudflare/core/types/design-code.js +4 -0
- package/dist/cloudflare/core/types/enriched.js +5 -0
- package/dist/cloudflare/core/types/index.js +4 -0
- package/dist/cloudflare/core/websocket-connector.js +256 -0
- package/dist/cloudflare/core/websocket-server.js +646 -0
- package/dist/cloudflare/core/write-tools.js +2091 -0
- package/dist/cloudflare/index.js +2899 -0
- package/dist/cloudflare/test-browser.js +88 -0
- package/dist/core/comment-tools.d.ts +11 -0
- package/dist/core/comment-tools.d.ts.map +1 -0
- package/dist/core/comment-tools.js +293 -0
- package/dist/core/comment-tools.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +162 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/console-monitor.d.ts +82 -0
- package/dist/core/console-monitor.d.ts.map +1 -0
- package/dist/core/console-monitor.js +428 -0
- package/dist/core/console-monitor.js.map +1 -0
- package/dist/core/design-code-tools.d.ts +127 -0
- package/dist/core/design-code-tools.d.ts.map +1 -0
- package/dist/core/design-code-tools.js +2505 -0
- package/dist/core/design-code-tools.js.map +1 -0
- package/dist/core/design-system-manifest.d.ts +272 -0
- package/dist/core/design-system-manifest.d.ts.map +1 -0
- package/dist/core/design-system-manifest.js +261 -0
- package/dist/core/design-system-manifest.js.map +1 -0
- package/dist/core/design-system-tools.d.ts +17 -0
- package/dist/core/design-system-tools.d.ts.map +1 -0
- package/dist/core/design-system-tools.js +864 -0
- package/dist/core/design-system-tools.js.map +1 -0
- package/dist/core/enrichment/enrichment-service.d.ts +52 -0
- package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
- package/dist/core/enrichment/enrichment-service.js +273 -0
- package/dist/core/enrichment/enrichment-service.js.map +1 -0
- package/dist/core/enrichment/index.d.ts +8 -0
- package/dist/core/enrichment/index.d.ts.map +1 -0
- package/dist/core/enrichment/index.js +8 -0
- package/dist/core/enrichment/index.js.map +1 -0
- package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
- package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
- package/dist/core/enrichment/relationship-mapper.js +352 -0
- package/dist/core/enrichment/relationship-mapper.js.map +1 -0
- package/dist/core/enrichment/style-resolver.d.ts +80 -0
- package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
- package/dist/core/enrichment/style-resolver.js +327 -0
- package/dist/core/enrichment/style-resolver.js.map +1 -0
- package/dist/core/figma-api.d.ts +201 -0
- package/dist/core/figma-api.d.ts.map +1 -0
- package/dist/core/figma-api.js +410 -0
- package/dist/core/figma-api.js.map +1 -0
- package/dist/core/figma-connector.d.ts +48 -0
- package/dist/core/figma-connector.d.ts.map +1 -0
- package/dist/core/figma-connector.js +8 -0
- package/dist/core/figma-connector.js.map +1 -0
- package/dist/core/figma-desktop-connector.d.ts +265 -0
- package/dist/core/figma-desktop-connector.d.ts.map +1 -0
- package/dist/core/figma-desktop-connector.js +1184 -0
- package/dist/core/figma-desktop-connector.js.map +1 -0
- package/dist/core/figma-reconstruction-spec.d.ts +166 -0
- package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
- package/dist/core/figma-reconstruction-spec.js +403 -0
- package/dist/core/figma-reconstruction-spec.js.map +1 -0
- package/dist/core/figma-style-extractor.d.ts +76 -0
- package/dist/core/figma-style-extractor.d.ts.map +1 -0
- package/dist/core/figma-style-extractor.js +312 -0
- package/dist/core/figma-style-extractor.js.map +1 -0
- package/dist/core/figma-tools.d.ts +23 -0
- package/dist/core/figma-tools.d.ts.map +1 -0
- package/dist/core/figma-tools.js +2948 -0
- package/dist/core/figma-tools.js.map +1 -0
- package/dist/core/logger.d.ts +22 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/port-discovery.d.ts +110 -0
- package/dist/core/port-discovery.d.ts.map +1 -0
- package/dist/core/port-discovery.js +283 -0
- package/dist/core/port-discovery.js.map +1 -0
- package/dist/core/snippet-injector.d.ts +24 -0
- package/dist/core/snippet-injector.d.ts.map +1 -0
- package/dist/core/snippet-injector.js +97 -0
- package/dist/core/snippet-injector.js.map +1 -0
- package/dist/core/types/design-code.d.ts +262 -0
- package/dist/core/types/design-code.d.ts.map +1 -0
- package/dist/core/types/design-code.js +5 -0
- package/dist/core/types/design-code.js.map +1 -0
- package/dist/core/types/enriched.d.ts +213 -0
- package/dist/core/types/enriched.d.ts.map +1 -0
- package/dist/core/types/enriched.js +6 -0
- package/dist/core/types/enriched.js.map +1 -0
- package/dist/core/types/index.d.ts +112 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +5 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/websocket-connector.d.ts +55 -0
- package/dist/core/websocket-connector.d.ts.map +1 -0
- package/dist/core/websocket-connector.js +257 -0
- package/dist/core/websocket-connector.js.map +1 -0
- package/dist/core/websocket-server.d.ts +191 -0
- package/dist/core/websocket-server.d.ts.map +1 -0
- package/dist/core/websocket-server.js +647 -0
- package/dist/core/websocket-server.js.map +1 -0
- package/dist/core/write-tools.d.ts +7 -0
- package/dist/core/write-tools.d.ts.map +1 -0
- package/dist/core/write-tools.js +2092 -0
- package/dist/core/write-tools.js.map +1 -0
- package/dist/local.d.ts +84 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +5039 -0
- package/dist/local.js.map +1 -0
- package/figma-desktop-bridge/README.md +313 -0
- package/figma-desktop-bridge/code.js +2818 -0
- package/figma-desktop-bridge/manifest.json +67 -0
- package/figma-desktop-bridge/ui.html +1236 -0
- 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 @@
|
|
|
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"}
|