figma-console-mcp 1.40.2 → 1.40.4
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/README.md +4 -2
- package/dist/cloudflare/core/cloud-websocket-connector.js +3 -1
- package/dist/cloudflare/core/design-code-tools.js +622 -168
- package/dist/cloudflare/core/figma-tools.js +5 -3
- package/dist/cloudflare/core/identity.js +48 -1
- package/dist/cloudflare/core/tokens-tools.js +1 -1
- package/dist/cloudflare/core/websocket-connector.js +4 -4
- package/dist/cloudflare/index.js +3 -3
- package/dist/core/design-code-tools.d.ts +82 -2
- package/dist/core/design-code-tools.d.ts.map +1 -1
- package/dist/core/design-code-tools.js +622 -168
- package/dist/core/design-code-tools.js.map +1 -1
- package/dist/core/figma-connector.d.ts +8 -2
- package/dist/core/figma-connector.d.ts.map +1 -1
- package/dist/core/figma-tools.d.ts.map +1 -1
- package/dist/core/figma-tools.js +5 -3
- package/dist/core/figma-tools.js.map +1 -1
- package/dist/core/identity.d.ts +16 -0
- package/dist/core/identity.d.ts.map +1 -1
- package/dist/core/identity.js +48 -1
- package/dist/core/identity.js.map +1 -1
- package/dist/core/tokens/schemas.d.ts +2 -2
- package/dist/core/tokens-tools.js +1 -1
- package/dist/core/websocket-connector.d.ts +2 -2
- package/dist/core/websocket-connector.d.ts.map +1 -1
- package/dist/core/websocket-connector.js +4 -4
- package/dist/core/websocket-connector.js.map +1 -1
- package/package.json +1 -1
|
@@ -2049,7 +2049,9 @@ export function registerFigmaAPITools(server, getFigmaAPI, getCurrentUrl, variab
|
|
|
2049
2049
|
try {
|
|
2050
2050
|
logger.info({ nodeId }, "Attempting to get component via Desktop Bridge plugin UI");
|
|
2051
2051
|
const connector = await getDesktopConnector();
|
|
2052
|
-
|
|
2052
|
+
// fileKey: node ids are file-local — without it the ACTIVE file answers,
|
|
2053
|
+
// and may return a different component that shares this id.
|
|
2054
|
+
const desktopResult = await connector.getComponentFromPluginUI(nodeId, fileKey);
|
|
2053
2055
|
if (desktopResult.success && desktopResult.component) {
|
|
2054
2056
|
logger.info({
|
|
2055
2057
|
componentName: desktopResult.component.name,
|
|
@@ -2739,7 +2741,7 @@ export function registerFigmaAPITools(server, getFigmaAPI, getCurrentUrl, variab
|
|
|
2739
2741
|
try {
|
|
2740
2742
|
const connector = await getDesktopConnector();
|
|
2741
2743
|
// Fetch annotations with child traversal (depth matches REST traversal)
|
|
2742
|
-
const annotResult = await connector.getAnnotations(nodeId, true, 4);
|
|
2744
|
+
const annotResult = await connector.getAnnotations(nodeId, true, 4, fileKey);
|
|
2743
2745
|
if (annotResult?.success !== false && annotResult?.data) {
|
|
2744
2746
|
const data = annotResult.data;
|
|
2745
2747
|
annotations = data.annotations || [];
|
|
@@ -2765,7 +2767,7 @@ export function registerFigmaAPITools(server, getFigmaAPI, getCurrentUrl, variab
|
|
|
2765
2767
|
}
|
|
2766
2768
|
// Also fetch description from bridge if REST returned empty
|
|
2767
2769
|
if (!componentData.description && !componentData.descriptionMarkdown) {
|
|
2768
|
-
const bridgeResult = await connector.getComponentFromPluginUI(nodeId);
|
|
2770
|
+
const bridgeResult = await connector.getComponentFromPluginUI(nodeId, fileKey);
|
|
2769
2771
|
if (bridgeResult?.success && bridgeResult.component) {
|
|
2770
2772
|
if (bridgeResult.component.descriptionMarkdown) {
|
|
2771
2773
|
componentData.descriptionMarkdown = bridgeResult.component.descriptionMarkdown;
|
|
@@ -58,6 +58,53 @@ function tagToolResponse(result) {
|
|
|
58
58
|
});
|
|
59
59
|
return { ...r, content: newContent };
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Largest tool result this server will hand to the client, in bytes of content.
|
|
63
|
+
*
|
|
64
|
+
* MCP clients read one JSON-RPC message at a time and defend themselves against
|
|
65
|
+
* runaway output: Claude Code disconnects the server outright once a single
|
|
66
|
+
* message passes 16 MB ("wrote >16MB to stdout without a JSON-RPC message
|
|
67
|
+
* boundary … Disconnecting"). The user sees only "Connection closed" and loses
|
|
68
|
+
* every tool for the rest of the session. 8 MB leaves room for JSON-RPC string
|
|
69
|
+
* escaping, which inflates nested JSON noticeably.
|
|
70
|
+
*/
|
|
71
|
+
export const MAX_TOOL_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
72
|
+
/**
|
|
73
|
+
* Replace an oversized tool result with an actionable error. Returning it would
|
|
74
|
+
* not deliver the data anyway — it would kill the connection.
|
|
75
|
+
*/
|
|
76
|
+
export function capToolResponse(result, maxBytes = MAX_TOOL_RESPONSE_BYTES) {
|
|
77
|
+
if (!result ||
|
|
78
|
+
typeof result !== "object" ||
|
|
79
|
+
!Array.isArray(result.content)) {
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
let bytes = 0;
|
|
83
|
+
for (const item of result.content) {
|
|
84
|
+
if (typeof item?.text === "string")
|
|
85
|
+
bytes += Buffer.byteLength(item.text, "utf8");
|
|
86
|
+
if (typeof item?.data === "string")
|
|
87
|
+
bytes += item.data.length; // base64 image/audio
|
|
88
|
+
}
|
|
89
|
+
if (bytes <= maxBytes)
|
|
90
|
+
return result;
|
|
91
|
+
const mb = (n) => (n / (1024 * 1024)).toFixed(1);
|
|
92
|
+
return {
|
|
93
|
+
content: [
|
|
94
|
+
{
|
|
95
|
+
type: "text",
|
|
96
|
+
text: JSON.stringify({
|
|
97
|
+
_mcp: MCP_NAME,
|
|
98
|
+
error: `${ERROR_PREFIX} This call produced a ${mb(bytes)} MB result, above the ${mb(maxBytes)} MB this server will return. It was withheld because MCP clients disconnect on oversized messages (Claude Code closes the connection above 16 MB), which would have ended this session instead of delivering the data.`,
|
|
99
|
+
resultBytes: bytes,
|
|
100
|
+
note: "Only the RESPONSE was withheld. If this call made changes in Figma, those changes still happened.",
|
|
101
|
+
hint: "Ask for less in one call: return counts or a summary instead of full node data, target fewer nodes, use a smaller depth, or page through the data across several calls.",
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
isError: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
61
108
|
/**
|
|
62
109
|
* Monkey-patch an MCP server instance so every tool registered on it gets
|
|
63
110
|
* identity tagging applied to its responses and an identity prefix on any
|
|
@@ -82,7 +129,7 @@ export function wrapServerForIdentity(server) {
|
|
|
82
129
|
const wrappedHandler = async (...handlerArgs) => {
|
|
83
130
|
try {
|
|
84
131
|
const result = await handler(...handlerArgs);
|
|
85
|
-
return tagToolResponse(result);
|
|
132
|
+
return capToolResponse(tagToolResponse(result));
|
|
86
133
|
}
|
|
87
134
|
catch (err) {
|
|
88
135
|
if (err instanceof Error && !err.message.startsWith(ERROR_PREFIX)) {
|
|
@@ -35,7 +35,7 @@ const logger = createChildLogger({ component: "tokens-tools" });
|
|
|
35
35
|
* on every exported token document. Kept in sync with package.json by
|
|
36
36
|
* scripts/release.sh — see step 3 of the release flow.
|
|
37
37
|
*/
|
|
38
|
-
const MCP_VERSION = "1.40.
|
|
38
|
+
const MCP_VERSION = "1.40.4";
|
|
39
39
|
const EXPORT_TOOL_DESCRIPTION = `Export Figma variables to design token files in your codebase. Bidirectional with figma_import_tokens — together they replace Style Dictionary and Tokens Studio's export pipeline for the popular styling methods.
|
|
40
40
|
|
|
41
41
|
FULLY-IMPLEMENTED OUTPUT FORMATS:
|
|
@@ -168,8 +168,8 @@ export class WebSocketConnector {
|
|
|
168
168
|
// ============================================================================
|
|
169
169
|
// Component operations
|
|
170
170
|
// ============================================================================
|
|
171
|
-
async getComponentFromPluginUI(nodeId) {
|
|
172
|
-
return this.wsServer.sendCommand('GET_COMPONENT', { nodeId }, 10000);
|
|
171
|
+
async getComponentFromPluginUI(nodeId, fileKey) {
|
|
172
|
+
return this.wsServer.sendCommand('GET_COMPONENT', { nodeId }, 10000, fileKey);
|
|
173
173
|
}
|
|
174
174
|
async getLocalComponents() {
|
|
175
175
|
return this.wsServer.sendCommand('GET_LOCAL_COMPONENTS', {}, 300000);
|
|
@@ -180,8 +180,8 @@ export class WebSocketConnector {
|
|
|
180
180
|
// ============================================================================
|
|
181
181
|
// Annotation operations
|
|
182
182
|
// ============================================================================
|
|
183
|
-
async getAnnotations(nodeId, includeChildren, depth) {
|
|
184
|
-
return this.wsServer.sendCommand('GET_ANNOTATIONS', { nodeId, includeChildren, depth }, 10000);
|
|
183
|
+
async getAnnotations(nodeId, includeChildren, depth, fileKey) {
|
|
184
|
+
return this.wsServer.sendCommand('GET_ANNOTATIONS', { nodeId, includeChildren, depth }, 10000, fileKey);
|
|
185
185
|
}
|
|
186
186
|
async setAnnotations(nodeId, annotations, mode) {
|
|
187
187
|
return this.wsServer.sendCommand('SET_ANNOTATIONS', { nodeId, annotations, mode: mode || 'replace' });
|
package/dist/cloudflare/index.js
CHANGED
|
@@ -75,7 +75,7 @@ export class FigmaConsoleMCPv3 extends McpAgent {
|
|
|
75
75
|
this.server = (() => {
|
|
76
76
|
const s = new McpServer({
|
|
77
77
|
name: "Figma Console MCP",
|
|
78
|
-
version: "1.40.
|
|
78
|
+
version: "1.40.4",
|
|
79
79
|
});
|
|
80
80
|
// Identity wrap — every tool's response and thrown error gets stamped
|
|
81
81
|
// with our MCP name so cross-MCP attribution is unambiguous.
|
|
@@ -1085,7 +1085,7 @@ export default {
|
|
|
1085
1085
|
});
|
|
1086
1086
|
const statelessServer = new McpServer({
|
|
1087
1087
|
name: "Figma Console MCP",
|
|
1088
|
-
version: "1.40.
|
|
1088
|
+
version: "1.40.4",
|
|
1089
1089
|
});
|
|
1090
1090
|
wrapServerForIdentity(statelessServer);
|
|
1091
1091
|
// ================================================================
|
|
@@ -1723,7 +1723,7 @@ export default {
|
|
|
1723
1723
|
return new Response(JSON.stringify({
|
|
1724
1724
|
status: "healthy",
|
|
1725
1725
|
service: "Figma Console MCP",
|
|
1726
|
-
version: "1.40.
|
|
1726
|
+
version: "1.40.4",
|
|
1727
1727
|
endpoints: {
|
|
1728
1728
|
mcp: ["/sse", "/mcp"],
|
|
1729
1729
|
oauth_mcp_spec: ["/.well-known/oauth-authorization-server", "/authorize", "/token", "/oauth/register"],
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
7
|
import type { FigmaAPI } from "./figma-api.js";
|
|
8
8
|
import type { EnrichedComponent } from "./types/enriched.js";
|
|
9
|
-
import type { CompanyDocsContentEntry } from "./types/design-code.js";
|
|
9
|
+
import type { CodeDocInfo, CompanyDocsContentEntry } from "./types/design-code.js";
|
|
10
10
|
export { figmaRGBAToHex, normalizeColor, numericClose } from "./diff/property-compare.js";
|
|
11
11
|
/** Calculate parity score from discrepancy counts */
|
|
12
12
|
export declare function calculateParityScore(critical: number, major: number, minor: number, info: number): number;
|
|
@@ -19,6 +19,14 @@ export declare function chunkMarkdownByHeaders(markdown: string): Array<{
|
|
|
19
19
|
* Clean a raw Figma variant name like "Type=Image, Size=12" into "Image / 12".
|
|
20
20
|
* Extracts just the values from "Key=Value" pairs, joined by " / ".
|
|
21
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* How many levels of a component's tree the doc tool fetches and walks. The REST
|
|
24
|
+
* fetch counts from the requested node, so for a COMPONENT_SET one level is
|
|
25
|
+
* spent on the variants themselves. Anything deeper is cut off by the API — and
|
|
26
|
+
* REST returns a cut-off container as `children: []`, indistinguishable from an
|
|
27
|
+
* empty frame, so the walkers report when they reach this limit.
|
|
28
|
+
*/
|
|
29
|
+
export declare const DOC_TREE_DEPTH = 8;
|
|
22
30
|
export declare function cleanVariantName(rawName: string): string;
|
|
23
31
|
/** Structured content extracted from a Figma component description */
|
|
24
32
|
interface ParsedDescription {
|
|
@@ -51,6 +59,8 @@ interface VariantColorEntry {
|
|
|
51
59
|
variableName?: string;
|
|
52
60
|
/** For icon artwork: layer name of the icon instance this color belongs to */
|
|
53
61
|
iconLabel?: string;
|
|
62
|
+
/** The layer (or an ancestor) has `visible: false` — real design intent, but not painted */
|
|
63
|
+
hidden?: boolean;
|
|
54
64
|
}
|
|
55
65
|
/** Color data collected from a specific variant */
|
|
56
66
|
interface VariantColorData {
|
|
@@ -69,6 +79,8 @@ interface VariantColorData {
|
|
|
69
79
|
iconColors: VariantColorEntry[];
|
|
70
80
|
strokes: VariantColorEntry[];
|
|
71
81
|
textColors: VariantColorEntry[];
|
|
82
|
+
/** Shadows, blurs and layer opacity — `hex` holds the description */
|
|
83
|
+
effects: VariantColorEntry[];
|
|
72
84
|
icons: Array<{
|
|
73
85
|
/** Main component name when resolvable, else the cleaned layer name */
|
|
74
86
|
name: string;
|
|
@@ -76,6 +88,8 @@ interface VariantColorData {
|
|
|
76
88
|
layerName?: string;
|
|
77
89
|
/** INSTANCE_SWAP property driving this instance — the icon is a default, not fixed */
|
|
78
90
|
swapProperty?: string;
|
|
91
|
+
/** The icon layer is hidden in this variant (typically toggled by a boolean property) */
|
|
92
|
+
hidden?: boolean;
|
|
79
93
|
}>;
|
|
80
94
|
}
|
|
81
95
|
/**
|
|
@@ -102,7 +116,18 @@ interface TextStyleData {
|
|
|
102
116
|
lineHeight: number;
|
|
103
117
|
letterSpacing: number;
|
|
104
118
|
variableBindings?: Record<string, string>;
|
|
119
|
+
/** The text layer (or an ancestor) is hidden */
|
|
120
|
+
hidden?: boolean;
|
|
121
|
+
/** The layer mixes styles (e.g. a bolded word) — the values shown are its base style only */
|
|
122
|
+
mixed?: boolean;
|
|
105
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* id → token name. Two collections can each hold a variable with the SAME name
|
|
126
|
+
* ("Primitive/2x" in both Spacing and Radius), which is ambiguous to paste into
|
|
127
|
+
* code — those, and only those, are qualified with their collection. Every other
|
|
128
|
+
* token keeps the plain name people already map to code.
|
|
129
|
+
*/
|
|
130
|
+
export declare function buildVariableNameMap(variables: any[], collections?: any[]): Map<string, string>;
|
|
106
131
|
/**
|
|
107
132
|
* Human-readable name of the main component behind an instance/component id.
|
|
108
133
|
* Variants resolve to "Set name (Value / Value)" since a bare "Size=16" is useless.
|
|
@@ -116,14 +141,47 @@ export declare function collectAllVariantData(node: any, varNameMap: Map<string,
|
|
|
116
141
|
/**
|
|
117
142
|
* Collect typography data from all text nodes in a component tree.
|
|
118
143
|
*/
|
|
119
|
-
export declare function collectTypographyData(node: any, depth?: number, maxDepth?: number): TextStyleData[];
|
|
144
|
+
export declare function collectTypographyData(node: any, depth?: number, maxDepth?: number, ancestorHidden?: boolean): TextStyleData[];
|
|
145
|
+
/** One row of the typography table: a text element in one style, and where it applies */
|
|
146
|
+
export interface TypographyRow {
|
|
147
|
+
style: TextStyleData;
|
|
148
|
+
/** Empty when every variant uses this style; otherwise which variants do */
|
|
149
|
+
scope: string;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Typography for EVERY variant of a set. Per text element: one row when all
|
|
153
|
+
* variants agree, otherwise one row per distinct style, scoped by the variant
|
|
154
|
+
* property that drives it ("Is Selected=True") or, failing that, by variant name.
|
|
155
|
+
*/
|
|
156
|
+
export declare function collectTypographyAcrossVariants(setNode: any): TypographyRow[];
|
|
120
157
|
/**
|
|
121
158
|
* Build an anatomy tree representation from a Figma node structure.
|
|
122
159
|
* Returns a formatted string showing the component's nested structure.
|
|
123
160
|
*/
|
|
124
161
|
export declare function buildAnatomyTree(node: any, depth?: number, maxDepth?: number): string;
|
|
162
|
+
/**
|
|
163
|
+
* The border width that actually RENDERS. With per-side weights (underlines,
|
|
164
|
+
* dividers, accent bars) the scalar `strokeWeight` is a leftover from before the
|
|
165
|
+
* override and appears nowhere in the component — `individualStrokeWeights` wins.
|
|
166
|
+
*/
|
|
167
|
+
export declare function describeStrokeWeight(node: any): number | string;
|
|
125
168
|
/** Parse "Size=lg, State=hover" into ordered [property, value] pairs */
|
|
126
169
|
export declare function parseVariantProperties(rawName: string): Array<[string, string]>;
|
|
170
|
+
/**
|
|
171
|
+
* Find ONE variant property that fully accounts for how a value differs across
|
|
172
|
+
* variants: grouping by that property leaves a single value per group.
|
|
173
|
+
*
|
|
174
|
+
* The explanation must be non-vacuous — with one variant per group any values
|
|
175
|
+
* at all would "fit" (single-property sets), so that doesn't count.
|
|
176
|
+
* Shared by spacing, typography and anatomy so they explain variation alike.
|
|
177
|
+
*/
|
|
178
|
+
export declare function explainByVariantProperty(samples: Array<{
|
|
179
|
+
props: Array<[string, string]>;
|
|
180
|
+
display: string;
|
|
181
|
+
}>): {
|
|
182
|
+
property: string;
|
|
183
|
+
groups: Array<[string, string]>;
|
|
184
|
+
} | null;
|
|
127
185
|
/** One row of the cross-variant spacing table */
|
|
128
186
|
export interface VariantSpacingRow {
|
|
129
187
|
property: string;
|
|
@@ -169,10 +227,32 @@ export declare function resolveVisualNode(node: any): any;
|
|
|
169
227
|
export declare function isVariantName(name: string): boolean;
|
|
170
228
|
/** Sanitize a component name for use as a file path */
|
|
171
229
|
export declare function sanitizeComponentName(name: string): string;
|
|
230
|
+
export declare function generateFrontmatter(componentName: string, description: string, node: any, componentMeta: any, fileUrl: string, codeInfo?: CodeDocInfo, canonicalSource?: "figma" | "code" | "reconciled", level?: string | null,
|
|
231
|
+
/**
|
|
232
|
+
* Newest Figma version that touched this component, when design history was
|
|
233
|
+
* pulled. Emitted as its own `figmaVersion` field rather than folded into
|
|
234
|
+
* `version` — that one is the code-side semver and means something different.
|
|
235
|
+
*/
|
|
236
|
+
latestDesignVersion?: {
|
|
237
|
+
version_id: string;
|
|
238
|
+
label: string | null;
|
|
239
|
+
created_at: string;
|
|
240
|
+
} | null): string;
|
|
241
|
+
export declare function generateOverviewSection(componentName: string, description: string, fileUrl: string, parsedDesc: ParsedDescription, codeInfo?: CodeDocInfo): string;
|
|
172
242
|
export declare function generateStatesAndVariantsSection(node: any, variantData?: VariantColorData[], lookup?: ComponentLookup): string;
|
|
173
243
|
export declare function generateVisualSpecsSection(node: any, enrichedData: EnrichedComponent | null, variantData?: VariantColorData[], varNameMap?: Map<string, string>,
|
|
174
244
|
/** The full COMPONENT_SET when `node` is its default variant — enables cross-variant spacing comparison */
|
|
175
245
|
setNode?: any): string;
|
|
246
|
+
/**
|
|
247
|
+
* Count containers sitting exactly at the fetch-depth limit with no children.
|
|
248
|
+
* REST cuts a tree off by returning `children: []`, which looks identical to an
|
|
249
|
+
* empty frame — so at that level an empty container MAY be hiding real content.
|
|
250
|
+
* `fetchedRoot` is the node the REST call requested (levels count from it).
|
|
251
|
+
*/
|
|
252
|
+
export declare function countPossiblyTruncated(fetchedRoot: any, fetchDepth?: number): number;
|
|
253
|
+
export declare function generateAnatomySection(node: any, fetchDepth?: number): string;
|
|
254
|
+
export declare function generateTypographySection(node: any): string;
|
|
255
|
+
export declare function generateParitySection(node: any, codeInfo: CodeDocInfo): string;
|
|
176
256
|
/** Convert generated markdown into a CompanyDocsMCP-compatible content entry */
|
|
177
257
|
export declare function toCompanyDocsEntry(markdown: string, componentName: string, figmaUrl: string, systemName?: string): CompanyDocsContentEntry;
|
|
178
258
|
export declare function registerDesignCodeTools(server: McpServer, getFigmaAPI: () => Promise<FigmaAPI>, getCurrentUrl: () => string | null, variablesCache?: Map<string, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-code-tools.d.ts","sourceRoot":"","sources":["../../src/core/design-code-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"design-code-tools.d.ts","sourceRoot":"","sources":["../../src/core/design-code-tools.ts"],"names":[],"mappings":"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"}
|