@gethopp/figma-mcp-bridge 0.0.11 → 0.0.12
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 +11 -4
- package/dist/bridge.d.ts +12 -4
- package/dist/bridge.js +78 -19
- package/dist/bridge.js.map +1 -1
- package/dist/follower.d.ts +4 -3
- package/dist/follower.js +21 -3
- package/dist/follower.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/leader.js +15 -3
- package/dist/leader.js.map +1 -1
- package/dist/node.d.ts +4 -3
- package/dist/node.js +12 -5
- package/dist/node.js.map +1 -1
- package/dist/schema.d.ts +47 -0
- package/dist/schema.js +29 -1
- package/dist/schema.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +48 -19
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@ The limit for free accounts is 6 requests per month, yes **per month**.
|
|
|
21
21
|
|
|
22
22
|
Figma MCP Bridge is a solution to this problem. It is a plugin + MCP server that streams live Figma document data to AI tools without hitting Figma API rate limits, so its Figma MCP for the rest of us ✊
|
|
23
23
|
|
|
24
|
+
It supports **multiple Figma files connected simultaneously**; open the plugin in each file and your AI agent can query any of them by `fileKey`. Single-file setups work exactly as before with no changes required.
|
|
25
|
+
|
|
24
26
|
## Demo
|
|
25
27
|
|
|
26
28
|
[Watch a demo of building a UI in Cursor with Figma MCP Bridge](https://youtu.be/ouygIhFBx0g)
|
|
@@ -53,12 +55,15 @@ Download the plugin from the [latest release](https://github.com/gethopp/figma-m
|
|
|
53
55
|
|
|
54
56
|
Open a Figma file, run the plugin, and start prompting your AI tool. The MCP server will automatically connect to the plugin.
|
|
55
57
|
|
|
58
|
+
To work across multiple files, just open the plugin in each Figma file. The bridge keeps all connections active and your AI agent can target any of them by `fileKey`.
|
|
59
|
+
|
|
56
60
|
If you want to know more about how it works, read the [How it works](#how-it-works) section.
|
|
57
61
|
|
|
58
62
|
## Available Tools
|
|
59
63
|
|
|
60
64
|
| Tool | Description |
|
|
61
65
|
|------|-------------|
|
|
66
|
+
| `list_files` | List all connected Figma files (supports multi-file workflows) |
|
|
62
67
|
| `get_document` | Get the current Figma page document tree |
|
|
63
68
|
| `get_selection` | Get the currently selected nodes in Figma |
|
|
64
69
|
| `get_node` | Get a specific Figma node by ID (colon format, e.g. `4029:12345`) |
|
|
@@ -69,6 +74,8 @@ If you want to know more about how it works, read the [How it works](#how-it-wor
|
|
|
69
74
|
| `get_screenshot` | Export nodes as PNG/SVG/JPG/PDF (base64-encoded) |
|
|
70
75
|
| `save_screenshots` | Export and save screenshots directly to the local filesystem |
|
|
71
76
|
|
|
77
|
+
All tools accept an optional `fileKey` parameter when multiple Figma files are connected. Use `list_files` to discover connected files and their keys.
|
|
78
|
+
|
|
72
79
|
## Local development
|
|
73
80
|
|
|
74
81
|
#### 1. Clone this repository locally
|
|
@@ -129,10 +136,10 @@ The Figma plugin is the user interface for the Figma MCP Bridge. You run this in
|
|
|
129
136
|
|
|
130
137
|
### 2. The MCP Server
|
|
131
138
|
|
|
132
|
-
The MCP server is the core of the Figma MCP Bridge.
|
|
133
|
-
- Handling WebSocket connections from
|
|
134
|
-
-
|
|
135
|
-
-
|
|
139
|
+
The MCP server is the core of the Figma MCP Bridge. It maintains a registry of WebSocket connections keyed by `fileKey`, so multiple Figma files can be connected simultaneously. The server is responsible for:
|
|
140
|
+
- Handling WebSocket connections from one or more Figma plugin instances
|
|
141
|
+
- Routing tool calls to the correct file based on `fileKey`
|
|
142
|
+
- Forwarding responses back to the AI client
|
|
136
143
|
- Handling leader election (as we can have only one WS connection to an MCP server at a time)
|
|
137
144
|
|
|
138
145
|
|
package/dist/bridge.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import type { IncomingMessage } from "node:http";
|
|
2
2
|
import type { Duplex } from "node:stream";
|
|
3
|
-
import type { BridgeResponse } from "./types.js";
|
|
3
|
+
import type { BridgeResponse, ConnectedFile } from "./types.js";
|
|
4
4
|
export declare class Bridge {
|
|
5
5
|
private wss;
|
|
6
|
-
private
|
|
6
|
+
private connections;
|
|
7
7
|
private pending;
|
|
8
8
|
private counter;
|
|
9
9
|
constructor();
|
|
10
10
|
handleUpgrade(request: IncomingMessage, socket: Duplex, head: Buffer): void;
|
|
11
11
|
private handleConnection;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Resolve which connection to use.
|
|
14
|
+
* - If fileKey is provided, use that specific connection.
|
|
15
|
+
* - If only one file is connected and no fileKey given, use it (backward compat).
|
|
16
|
+
* - If multiple files connected and no fileKey, throw with a helpful message.
|
|
17
|
+
*/
|
|
18
|
+
private resolveConnection;
|
|
19
|
+
listConnectedFiles(): ConnectedFile[];
|
|
20
|
+
send(requestType: string, nodeIds?: string[], fileKey?: string): Promise<BridgeResponse>;
|
|
21
|
+
sendWithParams(requestType: string, nodeIds?: string[], params?: Record<string, unknown>, fileKey?: string): Promise<BridgeResponse>;
|
|
14
22
|
private nextId;
|
|
15
23
|
close(): void;
|
|
16
24
|
}
|
package/dist/bridge.js
CHANGED
|
@@ -1,23 +1,37 @@
|
|
|
1
1
|
import { WebSocketServer, WebSocket } from "ws";
|
|
2
2
|
export class Bridge {
|
|
3
3
|
wss;
|
|
4
|
-
|
|
4
|
+
connections = new Map();
|
|
5
5
|
pending = new Map();
|
|
6
6
|
counter = 0;
|
|
7
7
|
constructor() {
|
|
8
8
|
this.wss = new WebSocketServer({ noServer: true });
|
|
9
9
|
}
|
|
10
10
|
handleUpgrade(request, socket, head) {
|
|
11
|
+
if (request.url == undefined) {
|
|
12
|
+
console.error("Plugin connected without url, rejecting");
|
|
13
|
+
socket.destroy();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const url = new URL(request.url, "http://localhost");
|
|
17
|
+
const { fileKey, fileName = "Unknown" } = Object.fromEntries(url.searchParams);
|
|
18
|
+
if (!fileKey) {
|
|
19
|
+
console.error("Plugin connected without fileKey, rejecting");
|
|
20
|
+
socket.destroy();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
11
23
|
this.wss.handleUpgrade(request, socket, head, (ws) => {
|
|
12
|
-
this.handleConnection(ws);
|
|
24
|
+
this.handleConnection(ws, fileKey, fileName);
|
|
13
25
|
});
|
|
14
26
|
}
|
|
15
|
-
handleConnection(ws) {
|
|
16
|
-
// Replace existing connection
|
|
17
|
-
|
|
18
|
-
|
|
27
|
+
handleConnection(ws, fileKey, fileName) {
|
|
28
|
+
// Replace existing connection for the same file
|
|
29
|
+
const existing = this.connections.get(fileKey);
|
|
30
|
+
if (existing) {
|
|
31
|
+
existing.ws.close();
|
|
19
32
|
}
|
|
20
|
-
this.
|
|
33
|
+
this.connections.set(fileKey, { ws, fileKey, fileName });
|
|
34
|
+
console.error(`Plugin connected: ${fileName} (${fileKey})`);
|
|
21
35
|
ws.on("message", (data) => {
|
|
22
36
|
try {
|
|
23
37
|
const resp = JSON.parse(data.toString());
|
|
@@ -33,23 +47,68 @@ export class Bridge {
|
|
|
33
47
|
}
|
|
34
48
|
});
|
|
35
49
|
ws.on("close", () => {
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
const current = this.connections.get(fileKey);
|
|
51
|
+
if (current?.ws === ws) {
|
|
52
|
+
this.connections.delete(fileKey);
|
|
53
|
+
console.error(`Plugin disconnected: ${fileName} (${fileKey})`);
|
|
38
54
|
}
|
|
39
55
|
});
|
|
40
56
|
ws.on("error", (err) => {
|
|
41
57
|
console.error("WebSocket error:", err.message);
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
const current = this.connections.get(fileKey);
|
|
59
|
+
if (current?.ws === ws) {
|
|
60
|
+
this.connections.delete(fileKey);
|
|
44
61
|
}
|
|
45
62
|
});
|
|
46
63
|
}
|
|
47
|
-
|
|
48
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Resolve which connection to use.
|
|
66
|
+
* - If fileKey is provided, use that specific connection.
|
|
67
|
+
* - If only one file is connected and no fileKey given, use it (backward compat).
|
|
68
|
+
* - If multiple files connected and no fileKey, throw with a helpful message.
|
|
69
|
+
*/
|
|
70
|
+
resolveConnection(fileKey) {
|
|
71
|
+
if (fileKey) {
|
|
72
|
+
const entry = this.connections.get(fileKey);
|
|
73
|
+
if (!entry) {
|
|
74
|
+
const available = this.listConnectedFiles();
|
|
75
|
+
const hint = available.length > 0
|
|
76
|
+
? ` Connected files: ${available.map((f) => `"${f.fileName}" (fileKey: ${f.fileKey})`).join(", ")}`
|
|
77
|
+
: " No files are currently connected.";
|
|
78
|
+
throw new Error(`No plugin connected for fileKey "${fileKey}".${hint}`);
|
|
79
|
+
}
|
|
80
|
+
return entry.ws;
|
|
81
|
+
}
|
|
82
|
+
if (this.connections.size === 0) {
|
|
83
|
+
throw new Error("No plugin connected. Open a Figma file and run the bridge plugin.");
|
|
84
|
+
}
|
|
85
|
+
if (this.connections.size === 1) {
|
|
86
|
+
const entry = this.connections.values().next().value;
|
|
87
|
+
return entry.ws;
|
|
88
|
+
}
|
|
89
|
+
const files = this.listConnectedFiles();
|
|
90
|
+
throw new Error(`Multiple files connected. Specify a fileKey to choose which file to query. Connected files: ${files.map((f) => `"${f.fileName}" (fileKey: ${f.fileKey})`).join(", ")}. Use the list_files tool to see all connected files.`);
|
|
91
|
+
}
|
|
92
|
+
listConnectedFiles() {
|
|
93
|
+
return [...this.connections.values()].map((entry) => ({
|
|
94
|
+
fileKey: entry.fileKey,
|
|
95
|
+
fileName: entry.fileName,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
send(requestType, nodeIds, fileKey) {
|
|
99
|
+
return this.sendWithParams(requestType, nodeIds, undefined, fileKey);
|
|
49
100
|
}
|
|
50
|
-
sendWithParams(requestType, nodeIds, params) {
|
|
101
|
+
sendWithParams(requestType, nodeIds, params, fileKey) {
|
|
51
102
|
return new Promise((resolve, reject) => {
|
|
52
|
-
|
|
103
|
+
let conn;
|
|
104
|
+
try {
|
|
105
|
+
conn = this.resolveConnection(fileKey);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
reject(err);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (conn.readyState !== WebSocket.OPEN) {
|
|
53
112
|
reject(new Error("Plugin not connected"));
|
|
54
113
|
return;
|
|
55
114
|
}
|
|
@@ -69,7 +128,7 @@ export class Bridge {
|
|
|
69
128
|
reject(new Error("Request timed out"));
|
|
70
129
|
}, 30_000);
|
|
71
130
|
this.pending.set(requestId, { resolve, reject, timeout });
|
|
72
|
-
|
|
131
|
+
conn.send(JSON.stringify(request), (err) => {
|
|
73
132
|
if (err) {
|
|
74
133
|
clearTimeout(timeout);
|
|
75
134
|
this.pending.delete(requestId);
|
|
@@ -93,10 +152,10 @@ export class Bridge {
|
|
|
93
152
|
reject(new Error("Bridge closed"));
|
|
94
153
|
}
|
|
95
154
|
this.pending.clear();
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.conn = null;
|
|
155
|
+
for (const [, entry] of this.connections) {
|
|
156
|
+
entry.ws.close();
|
|
99
157
|
}
|
|
158
|
+
this.connections.clear();
|
|
100
159
|
this.wss.close();
|
|
101
160
|
}
|
|
102
161
|
}
|
package/dist/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/follower.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { BridgeResponse } from "./types.js";
|
|
1
|
+
import type { BridgeResponse, ConnectedFile } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Follower proxies MCP tool calls to the leader via HTTP /rpc.
|
|
4
4
|
*/
|
|
5
5
|
export declare class Follower {
|
|
6
6
|
private leaderUrl;
|
|
7
7
|
constructor(leaderUrl: string);
|
|
8
|
-
send(requestType: string, nodeIds?: string[]): Promise<BridgeResponse>;
|
|
9
|
-
sendWithParams(requestType: string, nodeIds?: string[], params?: Record<string, unknown
|
|
8
|
+
send(requestType: string, nodeIds?: string[], fileKey?: string): Promise<BridgeResponse>;
|
|
9
|
+
sendWithParams(requestType: string, nodeIds?: string[], params?: Record<string, unknown>, fileKey?: string): Promise<BridgeResponse>;
|
|
10
|
+
listConnectedFiles(): Promise<ConnectedFile[]>;
|
|
10
11
|
ping(): Promise<boolean>;
|
|
11
12
|
}
|
package/dist/follower.js
CHANGED
|
@@ -6,15 +6,17 @@ export class Follower {
|
|
|
6
6
|
constructor(leaderUrl) {
|
|
7
7
|
this.leaderUrl = leaderUrl;
|
|
8
8
|
}
|
|
9
|
-
send(requestType, nodeIds) {
|
|
10
|
-
return this.sendWithParams(requestType, nodeIds);
|
|
9
|
+
send(requestType, nodeIds, fileKey) {
|
|
10
|
+
return this.sendWithParams(requestType, nodeIds, undefined, fileKey);
|
|
11
11
|
}
|
|
12
|
-
async sendWithParams(requestType, nodeIds, params) {
|
|
12
|
+
async sendWithParams(requestType, nodeIds, params, fileKey) {
|
|
13
13
|
const rpcReq = { tool: requestType };
|
|
14
14
|
if (nodeIds && nodeIds.length > 0)
|
|
15
15
|
rpcReq.nodeIds = nodeIds;
|
|
16
16
|
if (params && Object.keys(params).length > 0)
|
|
17
17
|
rpcReq.params = params;
|
|
18
|
+
if (fileKey)
|
|
19
|
+
rpcReq.fileKey = fileKey;
|
|
18
20
|
const response = await fetch(`${this.leaderUrl}/rpc`, {
|
|
19
21
|
method: "POST",
|
|
20
22
|
headers: { "Content-Type": "application/json" },
|
|
@@ -34,6 +36,22 @@ export class Follower {
|
|
|
34
36
|
data: rpcResp.data,
|
|
35
37
|
};
|
|
36
38
|
}
|
|
39
|
+
async listConnectedFiles() {
|
|
40
|
+
const response = await fetch(`${this.leaderUrl}/rpc`, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: { "Content-Type": "application/json" },
|
|
43
|
+
body: JSON.stringify({ tool: "list_files" }),
|
|
44
|
+
signal: AbortSignal.timeout(5_000),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(`Leader returned status ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
const rpcResp = (await response.json());
|
|
50
|
+
if (rpcResp.error) {
|
|
51
|
+
throw new Error(rpcResp.error);
|
|
52
|
+
}
|
|
53
|
+
return rpcResp.data ?? [];
|
|
54
|
+
}
|
|
37
55
|
async ping() {
|
|
38
56
|
try {
|
|
39
57
|
const response = await fetch(`${this.leaderUrl}/ping`, {
|
package/dist/follower.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follower.js","sourceRoot":"","sources":["../src/follower.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAEzC,IAAI,CACF,WAAmB,EACnB,OAAkB;
|
|
1
|
+
{"version":3,"file":"follower.js","sourceRoot":"","sources":["../src/follower.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ async function main() {
|
|
|
24
24
|
name: "figma-bridge",
|
|
25
25
|
version: VERSION,
|
|
26
26
|
});
|
|
27
|
-
registerTools(server, node);
|
|
27
|
+
registerTools(server, node, PORT);
|
|
28
28
|
console.error(`Starting MCP server (role: ${node.roleName})`);
|
|
29
29
|
const transport = new StdioServerTransport();
|
|
30
30
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAElC,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/leader.js
CHANGED
|
@@ -37,7 +37,7 @@ export class Leader {
|
|
|
37
37
|
res.end("Not found");
|
|
38
38
|
});
|
|
39
39
|
server.on("upgrade", (req, socket, head) => {
|
|
40
|
-
if (req.url
|
|
40
|
+
if (req.url?.startsWith("/ws")) {
|
|
41
41
|
this.bridge.handleUpgrade(req, socket, head);
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
@@ -65,20 +65,32 @@ export class Leader {
|
|
|
65
65
|
req.on("end", async () => {
|
|
66
66
|
try {
|
|
67
67
|
const rpcReq = JSON.parse(body);
|
|
68
|
+
// Handle list_files as a special RPC (not forwarded to plugin)
|
|
69
|
+
if (rpcReq.tool === "list_files") {
|
|
70
|
+
this.sendJSON(res, 200, {
|
|
71
|
+
data: this.bridge.listConnectedFiles(),
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
68
75
|
const validationError = validateRpc(rpcReq.tool, rpcReq.nodeIds, rpcReq.params);
|
|
69
76
|
if (validationError) {
|
|
70
77
|
this.sendJSON(res, 400, { error: validationError });
|
|
71
78
|
return;
|
|
72
79
|
}
|
|
80
|
+
const fileKey = rpcReq.fileKey;
|
|
73
81
|
// Currently the only tool that is not forwarded to the plugin is save_screenshots
|
|
74
82
|
// If more are added we need to refactor to a better abstraction.
|
|
75
83
|
if (rpcReq.tool === "save_screenshots") {
|
|
76
84
|
const params = rpcReq.params ?? {};
|
|
77
|
-
|
|
85
|
+
// Create a sender bound to the specific fileKey
|
|
86
|
+
const sender = {
|
|
87
|
+
sendWithParams: (requestType, nodeIds, sendParams) => this.bridge.sendWithParams(requestType, nodeIds, sendParams, fileKey),
|
|
88
|
+
};
|
|
89
|
+
const result = await executeSaveScreenshots(sender, params.items, params.format, params.scale);
|
|
78
90
|
this.sendJSON(res, 200, { data: result });
|
|
79
91
|
return;
|
|
80
92
|
}
|
|
81
|
-
const resp = await this.bridge.sendWithParams(rpcReq.tool, rpcReq.nodeIds, rpcReq.params);
|
|
93
|
+
const resp = await this.bridge.sendWithParams(rpcReq.tool, rpcReq.nodeIds, rpcReq.params, fileKey);
|
|
82
94
|
this.sendJSON(res, 200, resp.error ? { error: resp.error } : { data: resp.data });
|
|
83
95
|
}
|
|
84
96
|
catch (err) {
|
package/dist/leader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leader.js","sourceRoot":"","sources":["../src/leader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,OAAO,MAAM;IAIG;IAHZ,MAAM,CAAS;IACf,MAAM,GAAuB,IAAI,CAAC;IAE1C,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5C,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC5D,OAAO;gBACT,CAAC;gBAED,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAChD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACzB,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CACP,SAAS,EACT,CAAC,GAAyB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;gBAC1D,IAAI,GAAG,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"leader.js","sourceRoot":"","sources":["../src/leader.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Role } from "./types.js";
|
|
2
|
-
import type { BridgeResponse } from "./types.js";
|
|
2
|
+
import type { BridgeResponse, ConnectedFile } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Node is the dynamic handler that switches between leader and follower roles.
|
|
5
5
|
* It routes MCP tool calls to the appropriate backend based on its current role.
|
|
@@ -12,8 +12,9 @@ export declare class Node {
|
|
|
12
12
|
constructor(port: number);
|
|
13
13
|
get role(): Role;
|
|
14
14
|
get roleName(): string;
|
|
15
|
-
send(requestType: string, nodeIds?: string[]): Promise<BridgeResponse>;
|
|
16
|
-
sendWithParams(requestType: string, nodeIds?: string[], params?: Record<string, unknown
|
|
15
|
+
send(requestType: string, nodeIds?: string[], fileKey?: string): Promise<BridgeResponse>;
|
|
16
|
+
sendWithParams(requestType: string, nodeIds?: string[], params?: Record<string, unknown>, fileKey?: string): Promise<BridgeResponse>;
|
|
17
|
+
listConnectedFiles(): ConnectedFile[] | undefined;
|
|
17
18
|
becomeLeader(): Promise<void>;
|
|
18
19
|
becomeFollower(): void;
|
|
19
20
|
stop(): void;
|
package/dist/node.js
CHANGED
|
@@ -27,16 +27,23 @@ export class Node {
|
|
|
27
27
|
return "UNKNOWN";
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
send(requestType, nodeIds) {
|
|
31
|
-
return this.sendWithParams(requestType, nodeIds);
|
|
30
|
+
send(requestType, nodeIds, fileKey) {
|
|
31
|
+
return this.sendWithParams(requestType, nodeIds, undefined, fileKey);
|
|
32
32
|
}
|
|
33
|
-
sendWithParams(requestType, nodeIds, params) {
|
|
33
|
+
sendWithParams(requestType, nodeIds, params, fileKey) {
|
|
34
34
|
if (this._role === Role.Leader && this.leader) {
|
|
35
35
|
return this.leader
|
|
36
36
|
.getBridge()
|
|
37
|
-
.sendWithParams(requestType, nodeIds, params);
|
|
37
|
+
.sendWithParams(requestType, nodeIds, params, fileKey);
|
|
38
38
|
}
|
|
39
|
-
return this.follower.sendWithParams(requestType, nodeIds, params);
|
|
39
|
+
return this.follower.sendWithParams(requestType, nodeIds, params, fileKey);
|
|
40
|
+
}
|
|
41
|
+
listConnectedFiles() {
|
|
42
|
+
if (this._role === Role.Leader && this.leader) {
|
|
43
|
+
return this.leader.getBridge().listConnectedFiles();
|
|
44
|
+
}
|
|
45
|
+
// Followers return undefined — the tool handler falls back to RPC
|
|
46
|
+
return undefined;
|
|
40
47
|
}
|
|
41
48
|
async becomeLeader() {
|
|
42
49
|
if (this._role === Role.Leader)
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC;;;GAGG;AACH,MAAM,OAAO,IAAI;IAKK;IAJZ,KAAK,GAAS,IAAI,CAAC,OAAO,CAAC;IAC3B,MAAM,GAAkB,IAAI,CAAC;IAC7B,QAAQ,CAAW;IAE3B,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ;QACV,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,MAAM;gBACd,OAAO,QAAQ,CAAC;YAClB,KAAK,IAAI,CAAC,QAAQ;gBAChB,OAAO,UAAU,CAAC;YACpB;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,CACF,WAAmB,EACnB,OAAkB;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -2,29 +2,73 @@ import { z } from "zod";
|
|
|
2
2
|
/** Figma node IDs use colon-separated format, e.g. "4029:12345". */
|
|
3
3
|
export declare const figmaNodeId: z.ZodString;
|
|
4
4
|
export declare const toolInputSchemas: {
|
|
5
|
+
readonly get_document: z.ZodObject<{
|
|
6
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
fileKey?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
fileKey?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
readonly get_selection: z.ZodObject<{
|
|
13
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
fileKey?: string | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
fileKey?: string | undefined;
|
|
18
|
+
}>;
|
|
5
19
|
readonly get_node: z.ZodObject<{
|
|
6
20
|
nodeId: z.ZodString;
|
|
21
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
7
22
|
}, "strip", z.ZodTypeAny, {
|
|
8
23
|
nodeId: string;
|
|
24
|
+
fileKey?: string | undefined;
|
|
9
25
|
}, {
|
|
10
26
|
nodeId: string;
|
|
27
|
+
fileKey?: string | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
readonly get_styles: z.ZodObject<{
|
|
30
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
fileKey?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
fileKey?: string | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
readonly get_metadata: z.ZodObject<{
|
|
37
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, "strip", z.ZodTypeAny, {
|
|
39
|
+
fileKey?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
fileKey?: string | undefined;
|
|
11
42
|
}>;
|
|
12
43
|
readonly get_design_context: z.ZodObject<{
|
|
13
44
|
depth: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
14
46
|
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
fileKey?: string | undefined;
|
|
15
48
|
depth?: number | undefined;
|
|
16
49
|
}, {
|
|
50
|
+
fileKey?: string | undefined;
|
|
17
51
|
depth?: number | undefined;
|
|
18
52
|
}>;
|
|
53
|
+
readonly get_variable_defs: z.ZodObject<{
|
|
54
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
fileKey?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
fileKey?: string | undefined;
|
|
59
|
+
}>;
|
|
19
60
|
readonly get_screenshot: z.ZodObject<{
|
|
20
61
|
nodeIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
21
62
|
format: z.ZodOptional<z.ZodEnum<["PNG", "SVG", "JPG", "PDF"]>>;
|
|
22
63
|
scale: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
23
65
|
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
fileKey?: string | undefined;
|
|
24
67
|
nodeIds?: string[] | undefined;
|
|
25
68
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
26
69
|
scale?: number | undefined;
|
|
27
70
|
}, {
|
|
71
|
+
fileKey?: string | undefined;
|
|
28
72
|
nodeIds?: string[] | undefined;
|
|
29
73
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
30
74
|
scale?: number | undefined;
|
|
@@ -48,6 +92,7 @@ export declare const toolInputSchemas: {
|
|
|
48
92
|
}>, "many">;
|
|
49
93
|
format: z.ZodOptional<z.ZodEnum<["PNG", "SVG", "JPG", "PDF"]>>;
|
|
50
94
|
scale: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
51
96
|
}, "strip", z.ZodTypeAny, {
|
|
52
97
|
items: {
|
|
53
98
|
nodeId: string;
|
|
@@ -55,6 +100,7 @@ export declare const toolInputSchemas: {
|
|
|
55
100
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
56
101
|
scale?: number | undefined;
|
|
57
102
|
}[];
|
|
103
|
+
fileKey?: string | undefined;
|
|
58
104
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
59
105
|
scale?: number | undefined;
|
|
60
106
|
}, {
|
|
@@ -64,6 +110,7 @@ export declare const toolInputSchemas: {
|
|
|
64
110
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
65
111
|
scale?: number | undefined;
|
|
66
112
|
}[];
|
|
113
|
+
fileKey?: string | undefined;
|
|
67
114
|
format?: "PNG" | "SVG" | "JPG" | "PDF" | undefined;
|
|
68
115
|
scale?: number | undefined;
|
|
69
116
|
}>;
|
package/dist/schema.js
CHANGED
|
@@ -4,15 +4,36 @@ export const figmaNodeId = z
|
|
|
4
4
|
.string()
|
|
5
5
|
.regex(/^\d+:\d+$/, "Node ID must use colon format, e.g. '4029:12345'");
|
|
6
6
|
const exportFormat = z.enum(["PNG", "SVG", "JPG", "PDF"]);
|
|
7
|
+
const fileKeyField = z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("The fileKey of the Figma file to query. Required when multiple files are connected. Use list_files to see connected files.");
|
|
7
11
|
export const toolInputSchemas = {
|
|
12
|
+
get_document: z.object({
|
|
13
|
+
fileKey: fileKeyField,
|
|
14
|
+
}),
|
|
15
|
+
get_selection: z.object({
|
|
16
|
+
fileKey: fileKeyField,
|
|
17
|
+
}),
|
|
8
18
|
get_node: z.object({
|
|
9
19
|
nodeId: figmaNodeId.describe("The node ID to fetch"),
|
|
20
|
+
fileKey: fileKeyField,
|
|
21
|
+
}),
|
|
22
|
+
get_styles: z.object({
|
|
23
|
+
fileKey: fileKeyField,
|
|
24
|
+
}),
|
|
25
|
+
get_metadata: z.object({
|
|
26
|
+
fileKey: fileKeyField,
|
|
10
27
|
}),
|
|
11
28
|
get_design_context: z.object({
|
|
12
29
|
depth: z
|
|
13
30
|
.number()
|
|
14
31
|
.optional()
|
|
15
32
|
.describe("How many levels deep to traverse the node tree (default 2)"),
|
|
33
|
+
fileKey: fileKeyField,
|
|
34
|
+
}),
|
|
35
|
+
get_variable_defs: z.object({
|
|
36
|
+
fileKey: fileKeyField,
|
|
16
37
|
}),
|
|
17
38
|
get_screenshot: z.object({
|
|
18
39
|
nodeIds: z
|
|
@@ -26,6 +47,7 @@ export const toolInputSchemas = {
|
|
|
26
47
|
.number()
|
|
27
48
|
.optional()
|
|
28
49
|
.describe("Export scale for raster formats (default 2)"),
|
|
50
|
+
fileKey: fileKeyField,
|
|
29
51
|
}),
|
|
30
52
|
save_screenshots: z.object({
|
|
31
53
|
items: z
|
|
@@ -52,6 +74,7 @@ export const toolInputSchemas = {
|
|
|
52
74
|
.number()
|
|
53
75
|
.optional()
|
|
54
76
|
.describe("Default export scale for raster formats (default 2)"),
|
|
77
|
+
fileKey: fileKeyField,
|
|
55
78
|
}),
|
|
56
79
|
};
|
|
57
80
|
/**
|
|
@@ -60,8 +83,13 @@ export const toolInputSchemas = {
|
|
|
60
83
|
* without a mapper is a compile error.
|
|
61
84
|
*/
|
|
62
85
|
const rpcToArgs = {
|
|
63
|
-
|
|
86
|
+
get_document: (_nodeIds, params) => ({ ...params }),
|
|
87
|
+
get_selection: (_nodeIds, params) => ({ ...params }),
|
|
88
|
+
get_node: (nodeIds, params) => ({ nodeId: nodeIds?.[0], ...params }),
|
|
89
|
+
get_styles: (_nodeIds, params) => ({ ...params }),
|
|
90
|
+
get_metadata: (_nodeIds, params) => ({ ...params }),
|
|
64
91
|
get_design_context: (_nodeIds, params) => ({ ...params }),
|
|
92
|
+
get_variable_defs: (_nodeIds, params) => ({ ...params }),
|
|
65
93
|
get_screenshot: (nodeIds, params) => ({ nodeIds, ...params }),
|
|
66
94
|
save_screenshots: (_nodeIds, params) => ({ ...params }),
|
|
67
95
|
};
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,EAAE;KACR,KAAK,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC;AAC1E,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,EAAE;KACR,KAAK,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC;AAC1E,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE1D,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACP,4HAA4H,CAC7H,CAAC;AAEJ,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpD,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC;QAC3B,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;QACzE,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC;QACvB,OAAO,EAAE,CAAC;aACP,KAAK,CAAC,WAAW,CAAC;aAClB,QAAQ,EAAE;aACV,QAAQ,CACP,8IAA8I,CAC/I;QACH,MAAM,EAAE,YAAY;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,mDAAmD,CAAC;QAChE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACrD,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,yFAAyF,CAC1F;YACH,MAAM,EAAE,YAAY;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;YACrE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mDAAmD,CAAC;SACjE,CAAC,CACH;aACA,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,wDAAwD,CAAC;QACrE,MAAM,EAAE,YAAY;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;QACxE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qDAAqD,CAAC;QAClE,OAAO,EAAE,YAAY;KACtB,CAAC;CACM,CAAC;AAIX;;;;GAIG;AACH,MAAM,SAAS,GAGX;IACF,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACpD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACpE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACzD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACxD,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7D,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;CACxD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,OAAkB,EAClB,MAAgC;IAEhC,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAgB,CAAC;IAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,CAC7C,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CACjC,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAChE,CAAC"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ interface SaveScreenshotItemResult {
|
|
|
23
23
|
success: boolean;
|
|
24
24
|
error?: string;
|
|
25
25
|
}
|
|
26
|
-
export declare function registerTools(server: McpServer, node: Node): void;
|
|
26
|
+
export declare function registerTools(server: McpServer, node: Node, port: number): void;
|
|
27
27
|
export declare function executeSaveScreenshots(sender: ScreenshotSender, items: SaveScreenshotItemInput[], format?: ExportFormat, scale?: number): Promise<{
|
|
28
28
|
total: number;
|
|
29
29
|
succeeded: number;
|
package/dist/tools.js
CHANGED
|
@@ -1,43 +1,72 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { toolInputSchemas } from "./schema.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { Follower } from "./follower.js";
|
|
5
|
+
export function registerTools(server, node, port) {
|
|
6
|
+
server.tool("list_files", "List all currently connected Figma files. Returns fileKey and fileName for each. Use the fileKey to target a specific file in other tools.", async () => {
|
|
7
|
+
try {
|
|
8
|
+
let files = node.listConnectedFiles();
|
|
9
|
+
if (files === undefined) {
|
|
10
|
+
// Follower: fetch via RPC from leader
|
|
11
|
+
const follower = new Follower(`http://localhost:${port}`);
|
|
12
|
+
files = await follower.listConnectedFiles();
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: "text", text: JSON.stringify(files) }],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: "text",
|
|
23
|
+
text: err instanceof Error ? err.message : String(err),
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
isError: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
7
29
|
});
|
|
8
|
-
server.tool("
|
|
9
|
-
return renderResponse(() => node.send("
|
|
30
|
+
server.tool("get_document", "Get the current Figma page document tree. When multiple files are connected, specify fileKey.", toolInputSchemas.get_document.shape, async ({ fileKey }) => {
|
|
31
|
+
return renderResponse(() => node.send("get_document", undefined, fileKey));
|
|
10
32
|
});
|
|
11
|
-
server.tool("
|
|
12
|
-
return renderResponse(() => node.send("
|
|
33
|
+
server.tool("get_selection", "Get the currently selected nodes in Figma. When multiple files are connected, specify fileKey.", toolInputSchemas.get_selection.shape, async ({ fileKey }) => {
|
|
34
|
+
return renderResponse(() => node.send("get_selection", undefined, fileKey));
|
|
13
35
|
});
|
|
14
|
-
server.tool("
|
|
15
|
-
return renderResponse(() => node.send("
|
|
36
|
+
server.tool("get_node", "Get a specific Figma node by ID. Must use colon format, e.g. '4029:12345', never use hyphens. When multiple files are connected, specify fileKey.", toolInputSchemas.get_node.shape, async ({ nodeId, fileKey }) => {
|
|
37
|
+
return renderResponse(() => node.send("get_node", [nodeId], fileKey));
|
|
16
38
|
});
|
|
17
|
-
server.tool("
|
|
18
|
-
return renderResponse(() => node.send("
|
|
39
|
+
server.tool("get_styles", "Get all local styles in the document. When multiple files are connected, specify fileKey.", toolInputSchemas.get_styles.shape, async ({ fileKey }) => {
|
|
40
|
+
return renderResponse(() => node.send("get_styles", undefined, fileKey));
|
|
19
41
|
});
|
|
20
|
-
server.tool("
|
|
42
|
+
server.tool("get_metadata", "Get metadata about the current Figma document including file name, pages, and current page info. When multiple files are connected, specify fileKey.", toolInputSchemas.get_metadata.shape, async ({ fileKey }) => {
|
|
43
|
+
return renderResponse(() => node.send("get_metadata", undefined, fileKey));
|
|
44
|
+
});
|
|
45
|
+
server.tool("get_design_context", "Get the design context for the current selection or page. Returns a summarized tree structure optimized for understanding the current design context. When multiple files are connected, specify fileKey.", toolInputSchemas.get_design_context.shape, async ({ depth, fileKey }) => {
|
|
21
46
|
const params = {};
|
|
22
47
|
if (depth !== undefined && depth > 0) {
|
|
23
48
|
params.depth = depth;
|
|
24
49
|
}
|
|
25
|
-
return renderResponse(() => node.sendWithParams("get_design_context", undefined, params));
|
|
50
|
+
return renderResponse(() => node.sendWithParams("get_design_context", undefined, params, fileKey));
|
|
26
51
|
});
|
|
27
|
-
server.tool("get_variable_defs", "Get all local variable definitions including variable collections, modes, and variable values. Variables are Figma's system for design tokens (colors, numbers, strings, booleans).", async () => {
|
|
28
|
-
return renderResponse(() => node.send("get_variable_defs"));
|
|
52
|
+
server.tool("get_variable_defs", "Get all local variable definitions including variable collections, modes, and variable values. Variables are Figma's system for design tokens (colors, numbers, strings, booleans). When multiple files are connected, specify fileKey.", toolInputSchemas.get_variable_defs.shape, async ({ fileKey }) => {
|
|
53
|
+
return renderResponse(() => node.send("get_variable_defs", undefined, fileKey));
|
|
29
54
|
});
|
|
30
|
-
server.tool("get_screenshot", "Export a screenshot of the selected nodes or specific nodes by ID. Returns base64-encoded image data.", toolInputSchemas.get_screenshot.shape, async ({ nodeIds, format, scale }) => {
|
|
55
|
+
server.tool("get_screenshot", "Export a screenshot of the selected nodes or specific nodes by ID. Returns base64-encoded image data. When multiple files are connected, specify fileKey.", toolInputSchemas.get_screenshot.shape, async ({ nodeIds, format, scale, fileKey }) => {
|
|
31
56
|
const params = {};
|
|
32
57
|
if (format)
|
|
33
58
|
params.format = format;
|
|
34
59
|
if (scale !== undefined && scale > 0)
|
|
35
60
|
params.scale = scale;
|
|
36
|
-
return renderResponse(() => node.sendWithParams("get_screenshot", nodeIds, params));
|
|
61
|
+
return renderResponse(() => node.sendWithParams("get_screenshot", nodeIds, params, fileKey));
|
|
37
62
|
});
|
|
38
|
-
server.tool("save_screenshots", "Export screenshots for multiple nodes and save them directly to the local filesystem. Returns metadata only (no base64).", toolInputSchemas.save_screenshots.shape, async ({ items, format, scale }) => {
|
|
63
|
+
server.tool("save_screenshots", "Export screenshots for multiple nodes and save them directly to the local filesystem. Returns metadata only (no base64). When multiple files are connected, specify fileKey.", toolInputSchemas.save_screenshots.shape, async ({ items, format, scale, fileKey }) => {
|
|
39
64
|
try {
|
|
40
|
-
|
|
65
|
+
// Create a sender bound to the specific fileKey
|
|
66
|
+
const sender = {
|
|
67
|
+
sendWithParams: (requestType, nodeIds, params) => node.sendWithParams(requestType, nodeIds, params, fileKey),
|
|
68
|
+
};
|
|
69
|
+
const result = await executeSaveScreenshots(sender, items, format, scale);
|
|
41
70
|
return {
|
|
42
71
|
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
43
72
|
};
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -14,11 +14,16 @@ export interface RPCRequest {
|
|
|
14
14
|
tool: string;
|
|
15
15
|
nodeIds?: string[];
|
|
16
16
|
params?: Record<string, unknown>;
|
|
17
|
+
fileKey?: string;
|
|
17
18
|
}
|
|
18
19
|
export interface RPCResponse {
|
|
19
20
|
data?: unknown;
|
|
20
21
|
error?: string;
|
|
21
22
|
}
|
|
23
|
+
export interface ConnectedFile {
|
|
24
|
+
fileKey: string;
|
|
25
|
+
fileName: string;
|
|
26
|
+
}
|
|
22
27
|
export declare enum Role {
|
|
23
28
|
Unknown = 0,
|
|
24
29
|
Leader = 1,
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+BA,MAAM,CAAN,IAAY,IAIX;AAJD,WAAY,IAAI;IACd,qCAAW,CAAA;IACX,mCAAU,CAAA;IACV,uCAAY,CAAA;AACd,CAAC,EAJW,IAAI,KAAJ,IAAI,QAIf"}
|