@sxl-studio/bridge 1.2.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -48
- package/dist/audit.d.ts +21 -0
- package/dist/audit.js +24 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.d.ts +18 -0
- package/dist/auth.js +39 -0
- package/dist/auth.js.map +1 -0
- package/dist/http-api.d.ts +13 -0
- package/dist/http-api.js +101 -5
- package/dist/http-api.js.map +1 -1
- package/dist/idempotency.d.ts +13 -0
- package/dist/idempotency.js +47 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/mcp-factory.d.ts +1 -1
- package/dist/mcp-factory.js +19 -3
- package/dist/mcp-factory.js.map +1 -1
- package/dist/mcp-server.d.ts +1 -1
- package/dist/mcp-server.js +1 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/sxl-mcp-instructions.d.ts +1 -1
- package/dist/sxl-mcp-instructions.js +123 -23
- package/dist/sxl-mcp-instructions.js.map +1 -1
- package/dist/tools/catalogue-bootstrap.d.ts +9 -0
- package/dist/tools/catalogue-bootstrap.js +168 -0
- package/dist/tools/catalogue-bootstrap.js.map +1 -0
- package/dist/tools/composition.d.ts +1 -1
- package/dist/tools/composition.js +30 -2
- package/dist/tools/composition.js.map +1 -1
- package/dist/tools/data.d.ts +1 -1
- package/dist/tools/diagnostics.d.ts +1 -1
- package/dist/tools/diagnostics.js +7 -5
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/figma-nodes.d.ts +1 -1
- package/dist/tools/figma-rc-extended.d.ts +1 -1
- package/dist/tools/figma-url.d.ts +20 -0
- package/dist/tools/figma-url.js +52 -0
- package/dist/tools/figma-url.js.map +1 -0
- package/dist/tools/git.d.ts +1 -1
- package/dist/tools/meta.d.ts +10 -0
- package/dist/tools/meta.js +36 -0
- package/dist/tools/meta.js.map +1 -0
- package/dist/tools/orchestration.d.ts +11 -0
- package/dist/tools/orchestration.js +112 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.js +26 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/resources.d.ts +17 -0
- package/dist/tools/resources.js +92 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/shared.d.ts +20 -0
- package/dist/tools/shared.js +61 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/styles.d.ts +8 -0
- package/dist/tools/styles.js +55 -0
- package/dist/tools/styles.js.map +1 -0
- package/dist/tools/tokens.d.ts +2 -2
- package/dist/tools/tokens.js +65 -34
- package/dist/tools/tokens.js.map +1 -1
- package/dist/tools/variables.d.ts +11 -0
- package/dist/tools/variables.js +55 -0
- package/dist/tools/variables.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency cache for POST /api/command.
|
|
3
|
+
*
|
|
4
|
+
* Clients may pass an `Idempotency-Key` HTTP header (or top-level
|
|
5
|
+
* `idempotencyKey` in the JSON body). Repeating the same key within the TTL
|
|
6
|
+
* window returns the original response without re-dispatching the command to
|
|
7
|
+
* the plugin — avoiding duplicate side effects on network retries.
|
|
8
|
+
*
|
|
9
|
+
* Cache is in-memory, per-process, and intentionally small.
|
|
10
|
+
*/
|
|
11
|
+
const TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
12
|
+
const MAX_ENTRIES = 200;
|
|
13
|
+
const store = new Map();
|
|
14
|
+
function prune() {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
for (const [k, v] of store) {
|
|
17
|
+
if (v.expiresAt < now)
|
|
18
|
+
store.delete(k);
|
|
19
|
+
}
|
|
20
|
+
if (store.size > MAX_ENTRIES) {
|
|
21
|
+
// Drop oldest by insertion order (Map preserves it).
|
|
22
|
+
const drop = store.size - MAX_ENTRIES;
|
|
23
|
+
let i = 0;
|
|
24
|
+
for (const k of store.keys()) {
|
|
25
|
+
store.delete(k);
|
|
26
|
+
i++;
|
|
27
|
+
if (i >= drop)
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function getIdempotent(key) {
|
|
33
|
+
prune();
|
|
34
|
+
const entry = store.get(key);
|
|
35
|
+
if (!entry)
|
|
36
|
+
return null;
|
|
37
|
+
if (entry.expiresAt < Date.now()) {
|
|
38
|
+
store.delete(key);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return entry.result;
|
|
42
|
+
}
|
|
43
|
+
export function putIdempotent(key, result) {
|
|
44
|
+
prune();
|
|
45
|
+
store.set(key, { result, expiresAt: Date.now() + TTL_MS });
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC5C,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,SAAS,KAAK;IACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;QAC7B,qDAAqD;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,IAAI,IAAI;gBAAE,MAAM;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,KAAK,EAAE,CAAC;IACR,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAqB;IAC9D,KAAK,EAAE,CAAC;IACR,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/mcp-factory.d.ts
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Shared MCP tool registration for SXL Studio Bridge.
|
|
3
3
|
* Used by stdio transport (Cursor spawn) and Streamable HTTP at /mcp (Cursor URL).
|
|
4
4
|
*/
|
|
5
|
-
import { McpServer } from "
|
|
5
|
+
import { McpServer } from "../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
|
|
6
6
|
import type { CommandQueue } from "./command-queue.js";
|
|
7
7
|
export declare function createBridgeMcpServer(commandQueue: CommandQueue): McpServer;
|
package/dist/mcp-factory.js
CHANGED
|
@@ -2,29 +2,45 @@
|
|
|
2
2
|
* Shared MCP tool registration for SXL Studio Bridge.
|
|
3
3
|
* Used by stdio transport (Cursor spawn) and Streamable HTTP at /mcp (Cursor URL).
|
|
4
4
|
*/
|
|
5
|
-
import { McpServer } from "
|
|
5
|
+
import { McpServer } from "../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
|
|
6
|
+
import { SXL_BRIDGE_MCP_INSTRUCTIONS } from "./sxl-mcp-instructions.js";
|
|
7
|
+
import { bootstrapBridgeToolCatalogue } from "./tools/catalogue-bootstrap.js";
|
|
6
8
|
import { registerCompositionTools } from "./tools/composition.js";
|
|
7
9
|
import { registerDataTools } from "./tools/data.js";
|
|
8
10
|
import { registerDiagnosticTools } from "./tools/diagnostics.js";
|
|
9
11
|
import { registerFigmaNodeTools } from "./tools/figma-nodes.js";
|
|
10
12
|
import { registerRcExtendedCanvasTools } from "./tools/figma-rc-extended.js";
|
|
11
13
|
import { registerGitTools } from "./tools/git.js";
|
|
14
|
+
import { registerMetaTools } from "./tools/meta.js";
|
|
15
|
+
import { registerOrchestrationTools } from "./tools/orchestration.js";
|
|
16
|
+
import { registerBridgeResources } from "./tools/resources.js";
|
|
17
|
+
import { registerStyleTools } from "./tools/styles.js";
|
|
12
18
|
import { registerTokenTools } from "./tools/tokens.js";
|
|
13
|
-
import {
|
|
19
|
+
import { registerVariableTools } from "./tools/variables.js";
|
|
20
|
+
let catalogueReady = false;
|
|
14
21
|
export function createBridgeMcpServer(commandQueue) {
|
|
22
|
+
if (!catalogueReady) {
|
|
23
|
+
bootstrapBridgeToolCatalogue();
|
|
24
|
+
catalogueReady = true;
|
|
25
|
+
}
|
|
15
26
|
const server = new McpServer({
|
|
16
27
|
name: "@sxl-studio/bridge",
|
|
17
|
-
version: "1.2
|
|
28
|
+
version: "1.3.2",
|
|
18
29
|
}, {
|
|
19
30
|
instructions: SXL_BRIDGE_MCP_INSTRUCTIONS,
|
|
20
31
|
});
|
|
21
32
|
registerTokenTools(server, commandQueue);
|
|
33
|
+
registerVariableTools(server, commandQueue);
|
|
34
|
+
registerStyleTools(server, commandQueue);
|
|
22
35
|
registerCompositionTools(server, commandQueue);
|
|
23
36
|
registerDataTools(server, commandQueue);
|
|
24
37
|
registerDiagnosticTools(server, commandQueue);
|
|
25
38
|
registerFigmaNodeTools(server, commandQueue);
|
|
26
39
|
registerRcExtendedCanvasTools(server, commandQueue);
|
|
27
40
|
registerGitTools(server, commandQueue);
|
|
41
|
+
registerOrchestrationTools(server, commandQueue);
|
|
42
|
+
registerMetaTools(server, commandQueue);
|
|
43
|
+
registerBridgeResources(server, commandQueue);
|
|
28
44
|
return server;
|
|
29
45
|
}
|
|
30
46
|
//# sourceMappingURL=mcp-factory.js.map
|
package/dist/mcp-factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-factory.js","sourceRoot":"","sources":["../src/mcp-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-factory.js","sourceRoot":"","sources":["../src/mcp-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kEAAkE,CAAC;AAE7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,qBAAqB,CAAC,YAA0B;IAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,4BAA4B,EAAE,CAAC;QAC/B,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE,2BAA2B;KAC1C,CACF,CAAC;IAEF,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/C,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC9C,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,6BAA6B,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,0BAA0B,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjD,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAExC,uBAAuB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/mcp-server.d.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Optional: Cursor can use HTTP MCP at http://127.0.0.1:{BRIDGE_PORT}/mcp instead
|
|
5
5
|
* (see http-api.ts) so the IDE does not need to spawn this process.
|
|
6
6
|
*/
|
|
7
|
+
import type { McpServer } from "../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
|
|
7
8
|
import type { CommandQueue } from "./command-queue.js";
|
|
8
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
9
|
export declare function startMcpServer(commandQueue: CommandQueue): Promise<McpServer>;
|
package/dist/mcp-server.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Optional: Cursor can use HTTP MCP at http://127.0.0.1:{BRIDGE_PORT}/mcp instead
|
|
5
5
|
* (see http-api.ts) so the IDE does not need to spawn this process.
|
|
6
6
|
*/
|
|
7
|
-
import { StdioServerTransport } from "
|
|
7
|
+
import { StdioServerTransport } from "../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.js";
|
|
8
8
|
import { createBridgeMcpServer } from "./mcp-factory.js";
|
|
9
9
|
export async function startMcpServer(commandQueue) {
|
|
10
10
|
const server = createBridgeMcpServer(commandQueue);
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oEAAoE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAA0B;IAC7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAEpE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP server instructions for Cursor / other agents using SXL Studio Bridge.
|
|
3
|
-
* Keep in sync with Plugin/docs/
|
|
3
|
+
* Keep in sync with Plugin/sxl/docs/16-utils-bridge-mcp.md and Site util-bridge docs.
|
|
4
4
|
*/
|
|
5
5
|
export declare const SXL_BRIDGE_MCP_INSTRUCTIONS: string;
|
|
@@ -1,36 +1,136 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP server instructions for Cursor / other agents using SXL Studio Bridge.
|
|
3
|
-
* Keep in sync with Plugin/docs/
|
|
3
|
+
* Keep in sync with Plugin/sxl/docs/16-utils-bridge-mcp.md and Site util-bridge docs.
|
|
4
4
|
*/
|
|
5
5
|
export const SXL_BRIDGE_MCP_INSTRUCTIONS = `
|
|
6
|
-
You are assisting with Figma
|
|
6
|
+
You are assisting with Figma through the SXL Studio plugin and this Bridge. Follow these rules precisely.
|
|
7
7
|
|
|
8
|
-
## Two MCP servers
|
|
9
|
-
- **Official Figma MCP** (often remote): design context from links,
|
|
10
|
-
- **SXL Studio Bridge (this server)
|
|
8
|
+
## Two MCP servers you may see in Cursor
|
|
9
|
+
- **Official Figma MCP** (often remote): reads design context from selection / links, opens files, native Figma ops (e.g. \`use_figma\`). Parse \`node-id\` from figma.com URLs by replacing "-" with ":".
|
|
10
|
+
- **SXL Studio Bridge** (this server): plugin-only commands — composition / token files, variables, styles, Git in the plugin, Dev Mode codegen parity, orchestration helpers, and canvas helpers.
|
|
11
11
|
|
|
12
|
-
## Prerequisites
|
|
13
|
-
1. Bridge running (HTTP
|
|
14
|
-
2. Figma
|
|
12
|
+
## Prerequisites for every session
|
|
13
|
+
1. Bridge is running locally (HTTP + WebSocket + MCP on BRIDGE_PORT, default 37830).
|
|
14
|
+
2. In Figma the SXL Studio plugin is open with **Remote Connect** session active
|
|
15
|
+
(works in Design mode **and** Dev Mode UI; it does **not** work from the Dev Mode "Inspect → Code" sandbox panel).
|
|
16
|
+
3. Confirm with \`get_plugin_status\` before taking destructive actions. The result contains \`editorType\` ("figma" or "dev"), \`mode\`, \`isDevMode\`, \`isCodegenSandbox\`, and \`writesAllowed\`.
|
|
17
|
+
4. Optional: if the operator configured \`BRIDGE_AUTH_TOKEN\`, MCP/HTTP calls require \`Authorization: Bearer …\`. MCP clients usually handle this automatically once configured.
|
|
15
18
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
## Discovery: prefer authoritative catalogues
|
|
20
|
+
- \`list_tools\` — meta-tool that returns the full Bridge tool catalogue with category and flags (\`requiresDesignMode\`, \`requiresComposition\`). Use it instead of guessing tool names. Filter with \`category\` or \`devModeReadableOnly: true\`.
|
|
21
|
+
- MCP Resources (read-only URIs) — attach as context instead of calling tools when you only need state:
|
|
22
|
+
- \`sxl://figma/status\` — plugin status snapshot.
|
|
23
|
+
- \`sxl://figma/selection\` — current selection.
|
|
24
|
+
- \`sxl://tokens/config\` — raw config.json.
|
|
25
|
+
- \`sxl://tokens/files\` — token file index.
|
|
26
|
+
- \`sxl://tokens/files/{fileId}\` — raw token file body.
|
|
27
|
+
- \`sxl://compositions/index\` — composition JSON index.
|
|
22
28
|
|
|
23
|
-
##
|
|
24
|
-
|
|
25
|
-
- **duplicate_subtree**: \`sourceNodeId\` (template root), \`targetParentId\` (e.g. doc section), optional \`offsetX\` / \`offsetY\`.
|
|
26
|
-
- **create_component_instance**: \`mainComponentId\` (local COMPONENT) or \`componentKey\` (published library), optional \`parentId\`, \`x\`, \`y\`.
|
|
29
|
+
## CRITICAL — never hand-craft composition / token JSON
|
|
30
|
+
If the user asks for "JSON", "composition", "get code", or "same output as Dev Mode → Get Code":
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
1. **Always** call \`export_composition_json\` (or \`get_codegen\`) for the relevant Figma node.
|
|
33
|
+
The returned JSON is the **only** valid source of truth — it is produced by the exact same
|
|
34
|
+
codegen pipeline as "Get Code" in Dev Mode. Do not synthesise it from \`get_node_tree\` /
|
|
35
|
+
\`get_selection\` — those helpers do not emit composition \`structure\` / \`styles\`
|
|
36
|
+
/ \`componentProperties\` the way the plugin parser expects.
|
|
37
|
+
2. If the source node is a FRAME / GROUP rather than a COMPONENT, the JSON will contain
|
|
38
|
+
\`"component": false\`. Pass this JSON through to \`save_token_file\` (or \`create_token_file\`) unchanged, then
|
|
39
|
+
\`generate_composition\` creates plain Frames instead of a Component.
|
|
40
|
+
3. For Dev Mode parity tabs (Variables, Props, Styles, Structure, Transitions, Theme binding,
|
|
41
|
+
Code Connect) call \`get_codegen\` with \`language: "designer-json"\` (default).
|
|
42
|
+
SwiftUI / Kotlin / Vue3 outputs are also available via \`language\` parameter.
|
|
29
43
|
|
|
30
|
-
##
|
|
31
|
-
|
|
44
|
+
## High-level orchestration (preferred when given a Figma URL)
|
|
45
|
+
- \`generate_code_from_url\` — given a \`figma.com/design/…\` URL, Bridge parses \`fileKey\` +
|
|
46
|
+
\`nodeId\` and runs \`get_codegen\` on the target node. Returns all codegen tabs. Use this
|
|
47
|
+
as the first step whenever a developer pastes a Figma link and asks for code.
|
|
48
|
+
- \`compose_from_url\` — URL → \`export_composition_json\` → saves result as a composition
|
|
49
|
+
token file (\`create_token_file\`). Pass \`generate: true\` to immediately run
|
|
50
|
+
\`generate_composition\` and materialize the component in Figma.
|
|
51
|
+
- \`document_component\` — \`get_codegen\` on a component + \`apply_documentation_payload\`
|
|
52
|
+
to fill a documentation template with real context.
|
|
32
53
|
|
|
33
|
-
##
|
|
34
|
-
|
|
54
|
+
## Canonical workflow — component from a Figma layout (manual)
|
|
55
|
+
1. \`export_composition_json\` with \`payload.nodeId\` (or rely on current selection). Receive
|
|
56
|
+
\`{ nodeId, nodeType, compositionJson }\`.
|
|
57
|
+
2. \`list_token_files\` → decide the target \`fileId\` under \`tokens/compositions/...\`
|
|
58
|
+
or create a new file path.
|
|
59
|
+
3. \`save_token_file\` with \`{ fileId, content: compositionJson }\` — or \`create_token_file\`
|
|
60
|
+
if the file doesn't exist yet. Upsert is supported via \`{ name, folder, content }\`.
|
|
61
|
+
4. \`generate_composition\` (or \`apply_composition\` if updating) with the same \`fileId\`.
|
|
62
|
+
Plugin creates / refreshes the Figma Component or ComponentSet on canvas.
|
|
63
|
+
|
|
64
|
+
## Workflow — populate a documentation page
|
|
65
|
+
1. \`duplicate_subtree\` — clone a template subtree under \`targetParentId\` (doc section).
|
|
66
|
+
2. \`create_component_instance\` or \`import_component_by_key\` to place the new component.
|
|
67
|
+
3. \`apply_documentation_payload\` with \`{ targetRootId, entries: [{ layerName, text }] }\`
|
|
68
|
+
to fill text layers by name. Or use \`document_component\` to combine with \`get_codegen\`.
|
|
69
|
+
|
|
70
|
+
## Workflow — Variables / Design Tokens
|
|
71
|
+
- \`get_variables\` — read collections + variables (filter by type, limit paged).
|
|
72
|
+
- \`create_variable_collection\`, \`create_variable\`, \`bind_variable\` — build new tokens.
|
|
73
|
+
- \`rename_variable\`, \`delete_variable\`, \`rename_variable_collection\`,
|
|
74
|
+
\`delete_variable_collection\` — lifecycle.
|
|
75
|
+
- \`add_variable_mode\`, \`remove_variable_mode\`, \`rename_variable_mode\` — manage modes.
|
|
76
|
+
- \`set_variable_mode_value\` — write a per-mode value (accepts \`#hex\` for COLOR).
|
|
77
|
+
- \`set_variable_scopes\`, \`set_variable_code_syntax\` — metadata required for proper
|
|
78
|
+
exports and codegen.
|
|
79
|
+
- \`export_variables\` — push DTCG token files from the plugin workspace into Figma.
|
|
80
|
+
|
|
81
|
+
## Workflow — Tokens & workspace config
|
|
82
|
+
- \`list_token_files\` → \`get_token_file_content\` for reads.
|
|
83
|
+
- \`save_token_file\` — upsert by \`fileId\` or by \`{ name, folder }\`. Content is validated as JSON.
|
|
84
|
+
- \`create_token_file\` — create a new file (supports \`overwrite\`, initial content).
|
|
85
|
+
- \`delete_token_file\` / \`move_token_file\` / \`rename_token_file\` — lifecycle.
|
|
86
|
+
- \`get_tokens_config\` → \`save_tokens_config\` — edit collections, modes, file inclusion.
|
|
87
|
+
- After editing config, follow up with \`export_variables\` to propagate into Figma.
|
|
88
|
+
|
|
89
|
+
## Workflow — Styles
|
|
90
|
+
- \`get_local_styles\` for discovery.
|
|
91
|
+
- \`create_paint_style\` / \`create_text_style\` / \`create_effect_style\` to build new locals.
|
|
92
|
+
- \`set_text_style\`, \`set_effect_style\`, \`set_stroke_style\`, \`set_fill_style\` to
|
|
93
|
+
assign a style to a node.
|
|
94
|
+
- \`import_style_by_key\` to bring in published styles.
|
|
95
|
+
|
|
96
|
+
## Dev Mode rules
|
|
97
|
+
- **Reads always work** — \`get_selection\`, \`get_node_info\`, \`get_node_tree\`,
|
|
98
|
+
\`export_composition_json\`, \`get_codegen\`, \`get_variables\`, \`get_page_structure\`,
|
|
99
|
+
\`list_components\`, \`list_token_files\`, \`get_plugin_status\`.
|
|
100
|
+
- **File operations also work** — token file CRUD, \`save_tokens_config\`, \`git_pull\`,
|
|
101
|
+
\`git_push\` — they operate on the plugin workspace, not on the canvas.
|
|
102
|
+
- **Canvas writes are blocked by Figma in Dev Mode** (\`create_frame\`, \`modify_node\`,
|
|
103
|
+
\`bind_variable\`, style assignment, etc.). The plugin returns a typed error
|
|
104
|
+
\`{ code: "EDITOR_MODE_READONLY", retryable: false, details: { editorType, mode } }\`.
|
|
105
|
+
Surface the message; ask the user to switch to Design mode.
|
|
106
|
+
|
|
107
|
+
## Typed errors
|
|
108
|
+
Every tool may fail with a structured envelope. Parse \`error\` — it is JSON with
|
|
109
|
+
\`{ code, message, retryable, details? }\`. Known codes:
|
|
110
|
+
- \`EDITOR_MODE_READONLY\` — canvas write attempted in Dev Mode (retryable: false).
|
|
111
|
+
- \`BRIDGE_TIMEOUT\` — plugin did not respond in the configured timeout (retryable: true).
|
|
112
|
+
- \`BRIDGE_CANCELLED\` — user or plugin aborted the command.
|
|
113
|
+
- \`BRIDGE_UNAUTHORIZED\` — \`BRIDGE_AUTH_TOKEN\` is set but missing / wrong.
|
|
114
|
+
- \`BRIDGE_ERROR\` — generic plugin error; inspect \`message\`.
|
|
115
|
+
|
|
116
|
+
## Idempotency & retries
|
|
117
|
+
- For HTTP (\`POST /api/command\`) include an \`Idempotency-Key\` header; repeating within
|
|
118
|
+
10 minutes returns the cached response without re-running the command. Use when a
|
|
119
|
+
network hiccup might cause double-send.
|
|
120
|
+
- MCP clients usually don't need this; each tool call is delivered once by MCP itself.
|
|
121
|
+
- If a command times out (default 15s, composition / export up to 120s) — do **not** retry
|
|
122
|
+
immediately; read the result first (\`get_export_report\`, inspect Figma) to avoid
|
|
123
|
+
duplicate side effects.
|
|
124
|
+
|
|
125
|
+
## Stability checklist before calling tools
|
|
126
|
+
- \`get_plugin_status\` returns \`sessionActive: true\`.
|
|
127
|
+
- The node(s) you plan to operate on exist (confirm via \`find_nodes\` or \`get_node_info\`).
|
|
128
|
+
- For composition tools, the user has a Pro Plus license (the gate raises a clear error).
|
|
129
|
+
- For canvas-write tools, \`writesAllowed: true\` (i.e. not in Dev Mode).
|
|
130
|
+
- If unsure what's available, start with \`list_tools\` (or GET /api/tools) and filter by category.
|
|
131
|
+
|
|
132
|
+
## Response shape
|
|
133
|
+
Every tool returns a serialized JSON object as text. Read \`status\` / \`ok\` before trusting
|
|
134
|
+
the payload. Errors carry \`error\` (JSON-encoded typed envelope, see above).
|
|
35
135
|
`.trim();
|
|
36
136
|
//# sourceMappingURL=sxl-mcp-instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sxl-mcp-instructions.js","sourceRoot":"","sources":["../src/sxl-mcp-instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG
|
|
1
|
+
{"version":3,"file":"sxl-mcp-instructions.js","sourceRoot":"","sources":["../src/sxl-mcp-instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkI1C,CAAC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central catalogue bootstrap for all Bridge MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* This is a single authoritative list of (name, category, flags) entries so
|
|
5
|
+
* that `list_tools` and `GET /api/tools` can return the same metadata without
|
|
6
|
+
* each tool registration file having to call `catalogueTool` inline. Adding a
|
|
7
|
+
* new tool? Register it here and in the corresponding tools/*.ts module.
|
|
8
|
+
*/
|
|
9
|
+
export declare function bootstrapBridgeToolCatalogue(): void;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central catalogue bootstrap for all Bridge MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* This is a single authoritative list of (name, category, flags) entries so
|
|
5
|
+
* that `list_tools` and `GET /api/tools` can return the same metadata without
|
|
6
|
+
* each tool registration file having to call `catalogueTool` inline. Adding a
|
|
7
|
+
* new tool? Register it here and in the corresponding tools/*.ts module.
|
|
8
|
+
*/
|
|
9
|
+
import { catalogueTool } from "./registry.js";
|
|
10
|
+
function add(entry) {
|
|
11
|
+
catalogueTool({
|
|
12
|
+
name: entry.name,
|
|
13
|
+
category: entry.category,
|
|
14
|
+
summary: entry.summary,
|
|
15
|
+
requiresDesignMode: entry.requiresDesignMode ?? false,
|
|
16
|
+
requiresComposition: entry.requiresComposition ?? false,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function category(cat, entries) {
|
|
20
|
+
for (const e of entries)
|
|
21
|
+
add({ ...e, category: cat });
|
|
22
|
+
}
|
|
23
|
+
export function bootstrapBridgeToolCatalogue() {
|
|
24
|
+
category("diagnostics", [
|
|
25
|
+
{ name: "get_plugin_status", category: "diagnostics", summary: "Plugin runtime status (editor, mode, selection, session)." },
|
|
26
|
+
{ name: "is_dev_mode", category: "diagnostics", summary: "Shortcut flag: true when figma.editorType === 'dev'." },
|
|
27
|
+
{ name: "get_selection_summary", category: "diagnostics", summary: "Summary of current Figma selection." },
|
|
28
|
+
{ name: "get_drift_status", category: "diagnostics", summary: "Drift status across exported collections." },
|
|
29
|
+
{ name: "get_export_report", category: "diagnostics", summary: "Most recent export report." },
|
|
30
|
+
]);
|
|
31
|
+
category("tokens", [
|
|
32
|
+
{ name: "list_token_files", category: "tokens", summary: "Index of token files (id, name, folder, gitPath)." },
|
|
33
|
+
{ name: "get_token_file_content", category: "tokens", summary: "Raw JSON body of a token file." },
|
|
34
|
+
{ name: "save_token_file", category: "tokens", summary: "Upsert JSON content of a token file." },
|
|
35
|
+
{ name: "create_token_file", category: "tokens", summary: "Create a new token file." },
|
|
36
|
+
{ name: "delete_token_file", category: "tokens", summary: "Delete a token file (queues gitPath removal if tracked)." },
|
|
37
|
+
{ name: "move_token_file", category: "tokens", summary: "Rename/move a token file." },
|
|
38
|
+
{ name: "rename_token_file", category: "tokens", summary: "Rename a token file (alias of move_token_file)." },
|
|
39
|
+
{ name: "get_tokens_config", category: "tokens", summary: "Read the plugin config.json content." },
|
|
40
|
+
{ name: "save_tokens_config", category: "tokens", summary: "Overwrite config.json." },
|
|
41
|
+
{ name: "get_applied_tokens", category: "tokens", summary: "Applied tokens + composition binding on a node." },
|
|
42
|
+
{ name: "export_variables", category: "tokens", summary: "Run variables export (requires Design mode).", requiresDesignMode: true },
|
|
43
|
+
{ name: "reset_diff", category: "tokens", summary: "Reset all Diff-IDs." },
|
|
44
|
+
{ name: "reset_diff_collection", category: "tokens", summary: "Reset Diff-IDs for a collection." },
|
|
45
|
+
{ name: "reset_diff_file", category: "tokens", summary: "Reset Diff-IDs for a file." },
|
|
46
|
+
{ name: "reapply_token_bindings", category: "tokens", summary: "Re-apply token bindings (scope: selection|page|document).", requiresDesignMode: true },
|
|
47
|
+
{ name: "cross_file_sync_fetch", category: "tokens", summary: "Fetch remote variables for cross-file sync." },
|
|
48
|
+
{ name: "cross_file_sync_apply", category: "tokens", summary: "Apply cross-file sync entries.", requiresDesignMode: true },
|
|
49
|
+
]);
|
|
50
|
+
category("compositions", [
|
|
51
|
+
{ name: "export_composition_json", category: "compositions", summary: "Single source of truth: composition JSON for a node.", requiresComposition: true },
|
|
52
|
+
{ name: "get_codegen", category: "compositions", summary: "Mirror Dev Mode Inspect→Code for any node.", requiresComposition: true },
|
|
53
|
+
{ name: "list_compositions", category: "compositions", summary: "Enumerate composition files in workspace.", requiresComposition: true },
|
|
54
|
+
{ name: "generate_composition", category: "compositions", summary: "Generate Figma component/set from composition JSON.", requiresDesignMode: true, requiresComposition: true },
|
|
55
|
+
{ name: "apply_composition", category: "compositions", summary: "Apply composition to an existing anchor.", requiresDesignMode: true, requiresComposition: true },
|
|
56
|
+
{ name: "preview_composition", category: "compositions", summary: "Preview composition structure.", requiresComposition: true },
|
|
57
|
+
{ name: "check_composition_linked", category: "compositions", summary: "Check if a composition is linked.", requiresComposition: true },
|
|
58
|
+
{ name: "reapply_compositions", category: "compositions", summary: "Re-apply compositions (scope-based).", requiresDesignMode: true, requiresComposition: true },
|
|
59
|
+
{ name: "remap_composition_id", category: "compositions", summary: "Remap a composition id to a new anchor.", requiresDesignMode: true, requiresComposition: true },
|
|
60
|
+
{ name: "inspect_selection", category: "compositions", summary: "Inspect current selection." },
|
|
61
|
+
]);
|
|
62
|
+
category("variables", [
|
|
63
|
+
{ name: "get_variables", category: "variables", summary: "List local variable collections and variables." },
|
|
64
|
+
{ name: "create_variable_collection", category: "variables", summary: "Create a new variable collection.", requiresDesignMode: true },
|
|
65
|
+
{ name: "create_variable", category: "variables", summary: "Create a new variable inside a collection.", requiresDesignMode: true },
|
|
66
|
+
{ name: "bind_variable", category: "variables", summary: "Bind a variable to a node property.", requiresDesignMode: true },
|
|
67
|
+
{ name: "rename_variable", category: "variables", summary: "Rename a variable.", requiresDesignMode: true },
|
|
68
|
+
{ name: "delete_variable", category: "variables", summary: "Delete a variable.", requiresDesignMode: true },
|
|
69
|
+
{ name: "rename_variable_collection", category: "variables", summary: "Rename a variable collection.", requiresDesignMode: true },
|
|
70
|
+
{ name: "delete_variable_collection", category: "variables", summary: "Delete a variable collection.", requiresDesignMode: true },
|
|
71
|
+
{ name: "add_variable_mode", category: "variables", summary: "Add a mode to a collection.", requiresDesignMode: true },
|
|
72
|
+
{ name: "remove_variable_mode", category: "variables", summary: "Remove a mode from a collection.", requiresDesignMode: true },
|
|
73
|
+
{ name: "rename_variable_mode", category: "variables", summary: "Rename a mode.", requiresDesignMode: true },
|
|
74
|
+
{ name: "set_variable_mode_value", category: "variables", summary: "Set variable value for a mode.", requiresDesignMode: true },
|
|
75
|
+
{ name: "set_variable_scopes", category: "variables", summary: "Set variable scopes.", requiresDesignMode: true },
|
|
76
|
+
{ name: "set_variable_code_syntax", category: "variables", summary: "Set variable codeSyntax per platform.", requiresDesignMode: true },
|
|
77
|
+
]);
|
|
78
|
+
category("styles", [
|
|
79
|
+
{ name: "get_local_styles", category: "styles", summary: "List local paint/text/effect styles." },
|
|
80
|
+
{ name: "create_paint_style", category: "styles", summary: "Create a local PaintStyle.", requiresDesignMode: true },
|
|
81
|
+
{ name: "create_text_style", category: "styles", summary: "Create a local TextStyle.", requiresDesignMode: true },
|
|
82
|
+
{ name: "create_effect_style", category: "styles", summary: "Create a local EffectStyle.", requiresDesignMode: true },
|
|
83
|
+
{ name: "set_text_style", category: "styles", summary: "Assign a TextStyle to a node.", requiresDesignMode: true },
|
|
84
|
+
{ name: "set_effect_style", category: "styles", summary: "Assign an EffectStyle to a node.", requiresDesignMode: true },
|
|
85
|
+
{ name: "set_stroke_style", category: "styles", summary: "Assign a PaintStyle to a node stroke.", requiresDesignMode: true },
|
|
86
|
+
{ name: "set_fill_style", category: "styles", summary: "Assign a PaintStyle to a node fill.", requiresDesignMode: true },
|
|
87
|
+
{ name: "import_style_by_key", category: "styles", summary: "Import a published style by key.", requiresDesignMode: true },
|
|
88
|
+
]);
|
|
89
|
+
category("canvas", [
|
|
90
|
+
{ name: "get_selection", category: "canvas", summary: "Current selection with node ids." },
|
|
91
|
+
{ name: "set_selection", category: "canvas", summary: "Select nodes.", requiresDesignMode: true },
|
|
92
|
+
{ name: "select_nodes", category: "canvas", summary: "Select nodes (alias).", requiresDesignMode: true },
|
|
93
|
+
{ name: "get_pages", category: "canvas", summary: "List document pages." },
|
|
94
|
+
{ name: "set_current_page", category: "canvas", summary: "Change current page.", requiresDesignMode: true },
|
|
95
|
+
{ name: "get_node_info", category: "canvas", summary: "Basic info about one node." },
|
|
96
|
+
{ name: "get_node_tree", category: "canvas", summary: "Full scene subtree." },
|
|
97
|
+
{ name: "get_page_structure", category: "canvas", summary: "Summary of current page structure." },
|
|
98
|
+
{ name: "read_node_properties", category: "canvas", summary: "Read canonical node properties." },
|
|
99
|
+
{ name: "find_nodes", category: "canvas", summary: "Find nodes by predicate." },
|
|
100
|
+
{ name: "list_components", category: "canvas", summary: "List local components." },
|
|
101
|
+
{ name: "list_available_fonts", category: "canvas", summary: "Available fonts (+ project text styles hint)." },
|
|
102
|
+
{ name: "export_as_svg", category: "canvas", summary: "Export node(s) as SVG." },
|
|
103
|
+
{ name: "notify", category: "canvas", summary: "Figma toast notification." },
|
|
104
|
+
{ name: "create_frame", category: "canvas", summary: "Create a frame.", requiresDesignMode: true },
|
|
105
|
+
{ name: "create_rectangle", category: "canvas", summary: "Create a rectangle.", requiresDesignMode: true },
|
|
106
|
+
{ name: "create_text", category: "canvas", summary: "Create a text node.", requiresDesignMode: true },
|
|
107
|
+
{ name: "create_ellipse", category: "canvas", summary: "Create an ellipse.", requiresDesignMode: true },
|
|
108
|
+
{ name: "create_line", category: "canvas", summary: "Create a line.", requiresDesignMode: true },
|
|
109
|
+
{ name: "create_svg_node", category: "canvas", summary: "Create a node from SVG string.", requiresDesignMode: true },
|
|
110
|
+
{ name: "create_vector", category: "canvas", summary: "Create a vector node.", requiresDesignMode: true },
|
|
111
|
+
{ name: "set_auto_layout", category: "canvas", summary: "Configure auto layout.", requiresDesignMode: true },
|
|
112
|
+
{ name: "modify_node", category: "canvas", summary: "Modify generic node properties.", requiresDesignMode: true },
|
|
113
|
+
{ name: "set_node_text", category: "canvas", summary: "Set text on a text node.", requiresDesignMode: true },
|
|
114
|
+
{ name: "set_node_property", category: "canvas", summary: "Set arbitrary node property.", requiresDesignMode: true },
|
|
115
|
+
{ name: "rename_node", category: "canvas", summary: "Rename a node.", requiresDesignMode: true },
|
|
116
|
+
{ name: "set_node_visibility", category: "canvas", summary: "Show/hide node.", requiresDesignMode: true },
|
|
117
|
+
{ name: "set_node_size", category: "canvas", summary: "Resize a node.", requiresDesignMode: true },
|
|
118
|
+
{ name: "set_node_fill", category: "canvas", summary: "Set solid fill.", requiresDesignMode: true },
|
|
119
|
+
{ name: "set_node_fill_variable", category: "canvas", summary: "Bind a variable as fill.", requiresDesignMode: true },
|
|
120
|
+
{ name: "set_stroke", category: "canvas", summary: "Set stroke.", requiresDesignMode: true },
|
|
121
|
+
{ name: "set_effects", category: "canvas", summary: "Set effects array.", requiresDesignMode: true },
|
|
122
|
+
{ name: "set_fill", category: "canvas", summary: "Set fills array.", requiresDesignMode: true },
|
|
123
|
+
{ name: "set_image_fill", category: "canvas", summary: "Set image fill from bytes.", requiresDesignMode: true },
|
|
124
|
+
{ name: "set_constraints", category: "canvas", summary: "Set layout constraints.", requiresDesignMode: true },
|
|
125
|
+
{ name: "style_text_range", category: "canvas", summary: "Style a text range.", requiresDesignMode: true },
|
|
126
|
+
{ name: "insert_data", category: "canvas", summary: "Insert raw payload onto the page.", requiresDesignMode: true },
|
|
127
|
+
{ name: "delete_node", category: "canvas", summary: "Delete one node.", requiresDesignMode: true },
|
|
128
|
+
{ name: "delete_nodes", category: "canvas", summary: "Delete many nodes.", requiresDesignMode: true },
|
|
129
|
+
{ name: "clone_node", category: "canvas", summary: "Clone a node.", requiresDesignMode: true },
|
|
130
|
+
{ name: "duplicate_subtree", category: "canvas", summary: "Duplicate a subtree.", requiresDesignMode: true },
|
|
131
|
+
{ name: "move_to_parent", category: "canvas", summary: "Reparent a node.", requiresDesignMode: true },
|
|
132
|
+
{ name: "create_component", category: "canvas", summary: "Create a component.", requiresDesignMode: true },
|
|
133
|
+
{ name: "create_component_set", category: "canvas", summary: "Create a component set.", requiresDesignMode: true },
|
|
134
|
+
{ name: "create_component_instance", category: "canvas", summary: "Create an instance of a component.", requiresDesignMode: true },
|
|
135
|
+
{ name: "detach_instance", category: "canvas", summary: "Detach an instance.", requiresDesignMode: true },
|
|
136
|
+
{ name: "import_component_by_key", category: "canvas", summary: "Import a published component by key.", requiresDesignMode: true },
|
|
137
|
+
{ name: "boolean_operation", category: "canvas", summary: "Boolean op on nodes.", requiresDesignMode: true },
|
|
138
|
+
{ name: "flatten_nodes", category: "canvas", summary: "Flatten nodes.", requiresDesignMode: true },
|
|
139
|
+
{ name: "apply_documentation_payload", category: "canvas", summary: "Apply SXL documentation payload.", requiresDesignMode: true },
|
|
140
|
+
]);
|
|
141
|
+
category("data", [
|
|
142
|
+
{ name: "apply_mapping", category: "data", summary: "Apply a mapping to a node.", requiresDesignMode: true },
|
|
143
|
+
{ name: "apply_all_mappings", category: "data", summary: "Apply all mappings.", requiresDesignMode: true },
|
|
144
|
+
{ name: "count_apply_targets", category: "data", summary: "Count mapping targets." },
|
|
145
|
+
{ name: "generate_instances", category: "data", summary: "Generate instances from mapping.", requiresDesignMode: true },
|
|
146
|
+
{ name: "apply_image", category: "data", summary: "Apply an image asset.", requiresDesignMode: true },
|
|
147
|
+
{ name: "rebind_instance", category: "data", summary: "Rebind an instance to a new main.", requiresDesignMode: true },
|
|
148
|
+
{ name: "codeconnect_get_binding", category: "data", summary: "Get Code Connect binding for node." },
|
|
149
|
+
{ name: "codeconnect_save_binding", category: "data", summary: "Save Code Connect binding." },
|
|
150
|
+
{ name: "codeconnect_get_selection_status", category: "data", summary: "Code Connect status for selection." },
|
|
151
|
+
{ name: "codeconnect_get_registry", category: "data", summary: "Code Connect registry snapshot." },
|
|
152
|
+
{ name: "codeconnect_get_global_settings", category: "data", summary: "Global Code Connect settings." },
|
|
153
|
+
{ name: "codeconnect_save_global_settings", category: "data", summary: "Save global Code Connect settings." },
|
|
154
|
+
{ name: "codeconnect_get_node_ui_status", category: "data", summary: "Code Connect node UI status." },
|
|
155
|
+
]);
|
|
156
|
+
category("git", [
|
|
157
|
+
{ name: "git_pull", category: "git", summary: "Pull from active Git connection." },
|
|
158
|
+
{ name: "git_hard_pull", category: "git", summary: "Hard pull (overwrite local)." },
|
|
159
|
+
{ name: "git_push", category: "git", summary: "Push to active Git connection." },
|
|
160
|
+
]);
|
|
161
|
+
category("orchestration", [
|
|
162
|
+
{ name: "generate_code_from_url", category: "orchestration", summary: "Parse Figma URL → run get_codegen on target node.", requiresComposition: true },
|
|
163
|
+
{ name: "compose_from_url", category: "orchestration", summary: "Parse Figma URL → export_composition_json → save as composition file → optional generate.", requiresComposition: true },
|
|
164
|
+
{ name: "document_component", category: "orchestration", summary: "Generate SXL documentation payload for a component and apply it.", requiresDesignMode: true, requiresComposition: true },
|
|
165
|
+
{ name: "list_tools", category: "orchestration", summary: "List all Bridge MCP tools with metadata." },
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=catalogue-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue-bootstrap.js","sourceRoot":"","sources":["../../src/tools/catalogue-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP tools for Composition operations.
|
|
3
3
|
*/
|
|
4
|
-
import type { McpServer } from "
|
|
4
|
+
import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
|
|
5
5
|
import type { CommandQueue } from "../command-queue.js";
|
|
6
6
|
export declare function registerCompositionTools(server: McpServer, queue: CommandQueue): void;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
export function registerCompositionTools(server, queue) {
|
|
6
|
-
server.tool("generate_composition", "Generate a Figma component (or ComponentSet) from a composition JSON file. Creates the component structure, applies styles, binds variables. The fileId can be an internal file ID or a file path like 'compositions/MyButton/MyButton.json'.", {
|
|
6
|
+
server.tool("generate_composition", "Generate a Figma component (or ComponentSet) from a composition JSON file. Creates the component structure, applies styles, binds variables. When the JSON has \"component\": false, creates plain nodes (Frame/Instance) instead of a Component. The fileId can be an internal file ID or a file path like 'compositions/MyButton/MyButton.json'.", {
|
|
7
7
|
fileId: z.string().describe("File path (e.g. 'compositions/MyButton/MyButton.json') or internal file ID"),
|
|
8
8
|
compositionName: z.string().optional().describe("Component name from JSON (e.g. 'MyButton') — used as fallback if fileId doesn't resolve"),
|
|
9
9
|
}, async ({ fileId, compositionName }) => {
|
|
@@ -31,7 +31,7 @@ export function registerCompositionTools(server, queue) {
|
|
|
31
31
|
const result = await queue.execute("inspect_selection");
|
|
32
32
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
33
33
|
});
|
|
34
|
-
server.tool("export_composition_json", "Export the selected node (or a node by ID) as composition JSON string
|
|
34
|
+
server.tool("export_composition_json", "Export the selected node (or a node by ID) as composition JSON string — the SINGLE SOURCE OF TRUTH for composition JSON. Produces the exact same output as Dev Mode → Get Code → Designer JSON tab. For non-component nodes (Frame, Group, etc.) the output includes \"component\": false so the JSON can be used to regenerate plain nodes. NEVER hand-craft this JSON from get_node_tree / get_selection — always use this tool.", {
|
|
35
35
|
nodeId: z
|
|
36
36
|
.string()
|
|
37
37
|
.optional()
|
|
@@ -43,5 +43,33 @@ export function registerCompositionTools(server, queue) {
|
|
|
43
43
|
const result = await queue.execute("export_composition_json", payload);
|
|
44
44
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
45
45
|
});
|
|
46
|
+
server.tool("get_codegen", "Run Figma Dev Mode codegen for the selected node (or by nodeId) and return all generated tabs. This exposes the exact same output the user sees in Dev Mode → Inspect → Code panel, for any language: designer-json (default, includes Props/Structure/Styles/Variables/Transitions/Theme/Code Connect tabs), vue3 (SFC + CSS vars + Code Connect), swiftui (Swift file + Variables), kotlin (Compose file + Variables). Use viewMode to switch between 'styled' (default, tokens preserved), 'decomposed' (composite styles expanded) or 'raw' (all literals).", {
|
|
47
|
+
nodeId: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Figma node id. Omit to use current selection (first selected node)."),
|
|
51
|
+
language: z
|
|
52
|
+
.enum(["designer-json", "vue3", "swiftui", "kotlin"])
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Target language for codegen. Defaults to 'designer-json'."),
|
|
55
|
+
viewMode: z
|
|
56
|
+
.enum(["styled", "decomposed", "raw"])
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Style resolution mode. 'styled' (default) preserves tokens, 'decomposed' expands composite styles, 'raw' resolves everything to literals."),
|
|
59
|
+
}, async ({ nodeId, language, viewMode }) => {
|
|
60
|
+
const payload = {};
|
|
61
|
+
if (nodeId)
|
|
62
|
+
payload.nodeId = nodeId;
|
|
63
|
+
if (language)
|
|
64
|
+
payload.language = language;
|
|
65
|
+
if (viewMode)
|
|
66
|
+
payload.viewMode = viewMode;
|
|
67
|
+
const result = await queue.execute("get_codegen", payload);
|
|
68
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
69
|
+
});
|
|
70
|
+
server.tool("list_compositions", "List every composition JSON file in the plugin workspace (entries with $type:composition). Returns fileId, fileName, folder, gitPath, compositionName, and whether it represents a Component (component:true) or plain Frames (component:false). Use this to discover targets for generate_composition / apply_composition.", {}, async () => {
|
|
71
|
+
const result = await queue.execute("list_compositions", {});
|
|
72
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
73
|
+
});
|
|
46
74
|
}
|
|
47
75
|
//# sourceMappingURL=composition.js.map
|