@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.
Files changed (63) hide show
  1. package/README.md +122 -48
  2. package/dist/audit.d.ts +21 -0
  3. package/dist/audit.js +24 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/auth.d.ts +18 -0
  6. package/dist/auth.js +39 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/http-api.d.ts +13 -0
  9. package/dist/http-api.js +101 -5
  10. package/dist/http-api.js.map +1 -1
  11. package/dist/idempotency.d.ts +13 -0
  12. package/dist/idempotency.js +47 -0
  13. package/dist/idempotency.js.map +1 -0
  14. package/dist/mcp-factory.d.ts +1 -1
  15. package/dist/mcp-factory.js +19 -3
  16. package/dist/mcp-factory.js.map +1 -1
  17. package/dist/mcp-server.d.ts +1 -1
  18. package/dist/mcp-server.js +1 -1
  19. package/dist/mcp-server.js.map +1 -1
  20. package/dist/sxl-mcp-instructions.d.ts +1 -1
  21. package/dist/sxl-mcp-instructions.js +123 -23
  22. package/dist/sxl-mcp-instructions.js.map +1 -1
  23. package/dist/tools/catalogue-bootstrap.d.ts +9 -0
  24. package/dist/tools/catalogue-bootstrap.js +168 -0
  25. package/dist/tools/catalogue-bootstrap.js.map +1 -0
  26. package/dist/tools/composition.d.ts +1 -1
  27. package/dist/tools/composition.js +30 -2
  28. package/dist/tools/composition.js.map +1 -1
  29. package/dist/tools/data.d.ts +1 -1
  30. package/dist/tools/diagnostics.d.ts +1 -1
  31. package/dist/tools/diagnostics.js +7 -5
  32. package/dist/tools/diagnostics.js.map +1 -1
  33. package/dist/tools/figma-nodes.d.ts +1 -1
  34. package/dist/tools/figma-rc-extended.d.ts +1 -1
  35. package/dist/tools/figma-url.d.ts +20 -0
  36. package/dist/tools/figma-url.js +52 -0
  37. package/dist/tools/figma-url.js.map +1 -0
  38. package/dist/tools/git.d.ts +1 -1
  39. package/dist/tools/meta.d.ts +10 -0
  40. package/dist/tools/meta.js +36 -0
  41. package/dist/tools/meta.js.map +1 -0
  42. package/dist/tools/orchestration.d.ts +11 -0
  43. package/dist/tools/orchestration.js +112 -0
  44. package/dist/tools/orchestration.js.map +1 -0
  45. package/dist/tools/registry.d.ts +22 -0
  46. package/dist/tools/registry.js +26 -0
  47. package/dist/tools/registry.js.map +1 -0
  48. package/dist/tools/resources.d.ts +17 -0
  49. package/dist/tools/resources.js +92 -0
  50. package/dist/tools/resources.js.map +1 -0
  51. package/dist/tools/shared.d.ts +20 -0
  52. package/dist/tools/shared.js +61 -0
  53. package/dist/tools/shared.js.map +1 -0
  54. package/dist/tools/styles.d.ts +8 -0
  55. package/dist/tools/styles.js +55 -0
  56. package/dist/tools/styles.js.map +1 -0
  57. package/dist/tools/tokens.d.ts +2 -2
  58. package/dist/tools/tokens.js +65 -34
  59. package/dist/tools/tokens.js.map +1 -1
  60. package/dist/tools/variables.d.ts +11 -0
  61. package/dist/tools/variables.js +55 -0
  62. package/dist/tools/variables.js.map +1 -0
  63. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/tools/composition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/tools/composition.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * MCP tools for Data / Mapping operations.
3
3
  */
4
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
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 registerDataTools(server: McpServer, queue: CommandQueue): void;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * MCP tools for Diagnostics, Recovery, and Code Connect operations.
3
3
  */
4
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
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 registerDiagnosticTools(server: McpServer, queue: CommandQueue): void;
@@ -4,10 +4,14 @@
4
4
  import { z } from "zod";
5
5
  export function registerDiagnosticTools(server, queue) {
6
6
  // ─── Diagnostics ───
7
- server.tool("get_plugin_status", "Get current plugin status: editor type, current page, selection, session state.", {}, async () => {
7
+ server.tool("get_plugin_status", "Get current plugin status: editorType ('figma' | 'dev'), mode ('default' | 'codegen' | 'inspect'), isDevMode, writesAllowed, currentPage, selection, sessionActive. Always call this BEFORE executing destructive actions — to confirm the plugin is in a writable editor mode.", {}, async () => {
8
8
  const result = await queue.execute("get_plugin_status");
9
9
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
10
10
  });
11
+ server.tool("is_dev_mode", "Quick check whether the plugin is running in Figma Dev Mode (read-only for canvas writes). Returns { editorType, mode, isDevMode, writesAllowed }. Use this before write commands (create_frame, modify_node, bind_variable, etc.) — those will fail if writesAllowed=false.", {}, async () => {
12
+ const result = await queue.execute("is_dev_mode");
13
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
14
+ });
11
15
  server.tool("get_selection_summary", "Get detailed information about currently selected nodes in Figma: types, names, bound compositions/templates.", {}, async () => {
12
16
  const result = await queue.execute("get_selection_summary");
13
17
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
@@ -20,10 +24,8 @@ export function registerDiagnosticTools(server, queue) {
20
24
  const result = await queue.execute("get_export_report");
21
25
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
22
26
  });
23
- server.tool("list_token_files", "List all token/composition files loaded in the plugin. Returns file IDs, names, and folder paths. Use this to discover correct file IDs before generating compositions.", {}, async () => {
24
- const result = await queue.execute("list_token_files");
25
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
26
- });
27
+ // `list_token_files` только в `tokens.ts` (registerTokenTools). Дубликат здесь
28
+ // ломал старт Bridge: MCP SDK бросает «Tool list_token_files is already registered».
27
29
  // ─── Recovery ───
28
30
  server.tool("rebind_instance", "Rebind one or more instances to a different component.", {
29
31
  instanceNodeIds: z.array(z.string()).describe("Node IDs of instances to rebind"),
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,KAAmB;IAC5E,sBAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iRAAiR,EACjR,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,8QAA8Q,EAC9Q,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,+GAA+G,EAC/G,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,sGAAsG,EACtG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,0DAA0D,EAC1D,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,iFAAiF;IACjF,qFAAqF;IAErF,mBAAmB;IAEnB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wDAAwD,EACxD;QACE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACjF,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,kFAAkF,EAClF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC/C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACxF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,gFAAgF,EAChF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,uBAAuB;IAEvB,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,kFAAkF,EAClF,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,EAC7D,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,uFAAuF,EACvF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC9C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;YACtF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACzE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACzC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kCAAkC,EAClC,yDAAyD,EACzD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -4,6 +4,6 @@
4
4
  * These tools give the agent full control over the Figma file:
5
5
  * reading nodes, modifying properties, navigation, creation, deletion.
6
6
  */
7
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
8
8
  import type { CommandQueue } from "../command-queue.js";
9
9
  export declare function registerFigmaNodeTools(server: McpServer, queue: CommandQueue): void;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * MCP tools for extended SXL Remote Connect canvas commands (parity with common remote canvas APIs).
3
3
  */
4
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
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 registerRcExtendedCanvasTools(server: McpServer, queue: CommandQueue): void;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Parse Figma share URLs into { fileKey, nodeId }.
3
+ *
4
+ * Handles current Figma URL shapes:
5
+ * - https://figma.com/design/:fileKey/:name?node-id=123-456
6
+ * - https://figma.com/file/:fileKey/:name?node-id=123-456 (legacy)
7
+ * - https://figma.com/design/:fileKey/branch/:branchKey/:name?node-id=123-456
8
+ * - https://figma.com/board/:fileKey/:name (FigJam)
9
+ * - https://figma.com/make/:fileKey/:name (Figma Make)
10
+ *
11
+ * The node-id query parameter uses `-` as a separator; Figma node ids use `:`.
12
+ * This converts `-` → `:` to produce a canonical node id.
13
+ */
14
+ export type FigmaUrlInfo = {
15
+ fileKey: string;
16
+ nodeId: string | null;
17
+ branchKey: string | null;
18
+ surface: "design" | "file" | "board" | "make" | "unknown";
19
+ };
20
+ export declare function parseFigmaUrl(raw: string): FigmaUrlInfo;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Parse Figma share URLs into { fileKey, nodeId }.
3
+ *
4
+ * Handles current Figma URL shapes:
5
+ * - https://figma.com/design/:fileKey/:name?node-id=123-456
6
+ * - https://figma.com/file/:fileKey/:name?node-id=123-456 (legacy)
7
+ * - https://figma.com/design/:fileKey/branch/:branchKey/:name?node-id=123-456
8
+ * - https://figma.com/board/:fileKey/:name (FigJam)
9
+ * - https://figma.com/make/:fileKey/:name (Figma Make)
10
+ *
11
+ * The node-id query parameter uses `-` as a separator; Figma node ids use `:`.
12
+ * This converts `-` → `:` to produce a canonical node id.
13
+ */
14
+ export function parseFigmaUrl(raw) {
15
+ let url;
16
+ try {
17
+ url = new URL(raw);
18
+ }
19
+ catch {
20
+ throw new Error(`Invalid Figma URL: ${raw}`);
21
+ }
22
+ const host = url.hostname.toLowerCase();
23
+ if (!host.endsWith("figma.com") && !host.endsWith("figma.dev")) {
24
+ throw new Error(`Not a Figma URL: ${raw}`);
25
+ }
26
+ const parts = url.pathname.split("/").filter(Boolean);
27
+ if (parts.length < 2) {
28
+ throw new Error(`Figma URL missing fileKey: ${raw}`);
29
+ }
30
+ const surfaceRaw = parts[0];
31
+ let surface;
32
+ if (surfaceRaw === "design")
33
+ surface = "design";
34
+ else if (surfaceRaw === "file")
35
+ surface = "file";
36
+ else if (surfaceRaw === "board")
37
+ surface = "board";
38
+ else if (surfaceRaw === "make")
39
+ surface = "make";
40
+ else
41
+ surface = "unknown";
42
+ let fileKey = parts[1];
43
+ let branchKey = null;
44
+ if (parts[2] === "branch" && parts[3]) {
45
+ branchKey = parts[3];
46
+ fileKey = branchKey;
47
+ }
48
+ const rawNode = url.searchParams.get("node-id");
49
+ const nodeId = rawNode ? rawNode.replace(/-/g, ":") : null;
50
+ return { fileKey, nodeId, branchKey, surface };
51
+ }
52
+ //# sourceMappingURL=figma-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-url.js","sourceRoot":"","sources":["../../src/tools/figma-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAgC,CAAC;IACrC,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,QAAQ,CAAC;SAC3C,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC;SAC5C,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,GAAG,OAAO,CAAC;SAC9C,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC;;QAC5C,OAAO,GAAG,SAAS,CAAC;IAEzB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * MCP tools — Git pull from the active Sync connection (same as plugin footer Pull).
3
3
  */
4
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
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 registerGitTools(server: McpServer, queue: CommandQueue): void;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Meta tools — introspection over the Bridge tool surface.
3
+ *
4
+ * `list_tools` lets an agent discover available tools and filter by category,
5
+ * without needing to scan the MCP "tools/list" call output. It also flags
6
+ * which tools require Design mode vs read-only Dev Mode.
7
+ */
8
+ import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
9
+ import type { CommandQueue } from "../command-queue.js";
10
+ export declare function registerMetaTools(server: McpServer, _queue: CommandQueue): void;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Meta tools — introspection over the Bridge tool surface.
3
+ *
4
+ * `list_tools` lets an agent discover available tools and filter by category,
5
+ * without needing to scan the MCP "tools/list" call output. It also flags
6
+ * which tools require Design mode vs read-only Dev Mode.
7
+ */
8
+ import { z } from "zod";
9
+ import { getBridgeToolCatalogue } from "./registry.js";
10
+ import { ok } from "./shared.js";
11
+ export function registerMetaTools(server, _queue) {
12
+ server.tool("list_tools", "List all Bridge MCP tools with their category and mode requirements. Useful as a first call to discover the tool surface.", {
13
+ category: z
14
+ .string()
15
+ .optional()
16
+ .describe("Filter by category: diagnostics | tokens | compositions | variables | styles | canvas | data | git | orchestration"),
17
+ devModeReadableOnly: z
18
+ .boolean()
19
+ .optional()
20
+ .describe("If true, return only tools usable in Figma Dev Mode (requiresDesignMode: false)."),
21
+ }, async ({ category, devModeReadableOnly }) => {
22
+ let entries = [...getBridgeToolCatalogue()];
23
+ if (category) {
24
+ entries = entries.filter((e) => e.category === category);
25
+ }
26
+ if (devModeReadableOnly) {
27
+ entries = entries.filter((e) => !e.requiresDesignMode);
28
+ }
29
+ return ok({
30
+ count: entries.length,
31
+ categories: Array.from(new Set(entries.map((e) => e.category))),
32
+ tools: entries,
33
+ });
34
+ });
35
+ }
36
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/tools/meta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAA2B,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAoB;IACvE,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,2HAA2H,EAC3H;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,oHAAoH,CACrH;QACH,mBAAmB,EAAE,CAAC;aACnB,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,kFAAkF,CAAC;KAChG,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,EAAE;QAC1C,IAAI,OAAO,GAAG,CAAC,GAAG,sBAAsB,EAAE,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAM,QAA+B,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,CAAC;YACR,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/D,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * High-level orchestration tools — compose multiple plugin commands into a
3
+ * single agent-friendly "Jarvis" call. Each tool is pure glue: it calls plugin
4
+ * commands sequentially and returns a structured report.
5
+ *
6
+ * These tools do NOT fabricate JSON. They always delegate to the plugin's
7
+ * single-source-of-truth generators (export_composition_json / get_codegen).
8
+ */
9
+ import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
10
+ import type { CommandQueue } from "../command-queue.js";
11
+ export declare function registerOrchestrationTools(server: McpServer, queue: CommandQueue): void;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * High-level orchestration tools — compose multiple plugin commands into a
3
+ * single agent-friendly "Jarvis" call. Each tool is pure glue: it calls plugin
4
+ * commands sequentially and returns a structured report.
5
+ *
6
+ * These tools do NOT fabricate JSON. They always delegate to the plugin's
7
+ * single-source-of-truth generators (export_composition_json / get_codegen).
8
+ */
9
+ import { z } from "zod";
10
+ import { parseFigmaUrl } from "./figma-url.js";
11
+ import { callPluginCommand, ok } from "./shared.js";
12
+ async function executeOrThrow(queue, commandType, payload = {}) {
13
+ const r = await queue.execute(commandType, payload);
14
+ if (r.status !== "completed") {
15
+ throw new Error(r.error ?? `Command "${commandType}" failed (${r.status})`);
16
+ }
17
+ return r.result;
18
+ }
19
+ export function registerOrchestrationTools(server, queue) {
20
+ server.tool("generate_code_from_url", "High-level: parse a Figma URL → resolve node → run Dev Mode codegen (Inspect → Code) on it. Returns all generated tabs (JSON, Vue3, SwiftUI, Kotlin, Variables). NEVER hand-craft code — use this result as the source of truth. If the URL has no node-id, falls back to the plugin's current selection.", {
21
+ url: z.string().describe("Figma share URL (figma.com/design/... ?node-id=...)"),
22
+ language: z
23
+ .enum(["designer-json", "vue3", "swiftui", "kotlin"])
24
+ .optional()
25
+ .describe("Target language tab (default: designer-json)"),
26
+ viewMode: z
27
+ .enum(["styled", "decomposed", "raw"])
28
+ .optional()
29
+ .describe("Codegen viewMode (default: styled)"),
30
+ }, async ({ url, language, viewMode }) => {
31
+ const parsed = parseFigmaUrl(url);
32
+ const payload = {};
33
+ if (parsed.nodeId)
34
+ payload.nodeId = parsed.nodeId;
35
+ if (language)
36
+ payload.language = language;
37
+ if (viewMode)
38
+ payload.viewMode = viewMode;
39
+ return callPluginCommand(queue, "get_codegen", payload);
40
+ });
41
+ server.tool("compose_from_url", "High-level: parse a Figma URL → run export_composition_json on the referenced node → write the JSON into a composition token file in the plugin workspace. Optional: generate the composition component immediately. Returns the saved fileId and generation report.", {
42
+ url: z.string().describe("Figma share URL pointing to a node (component, frame, or component set)"),
43
+ fileName: z
44
+ .string()
45
+ .optional()
46
+ .describe("Token file name. Must end with .json. Defaults to '<nodeName>.comp.json'."),
47
+ folder: z
48
+ .string()
49
+ .nullable()
50
+ .optional()
51
+ .describe("Folder path inside the workspace (default: 'compositions')"),
52
+ overwrite: z.boolean().optional().describe("Replace an existing file with the same name (default: false)"),
53
+ generate: z
54
+ .boolean()
55
+ .optional()
56
+ .describe("If true, call generate_composition after saving (produces the Figma component/variant set)."),
57
+ }, async ({ url, fileName, folder, overwrite, generate }) => {
58
+ const parsed = parseFigmaUrl(url);
59
+ if (!parsed.nodeId) {
60
+ throw new Error("compose_from_url: the URL must include ?node-id=... so the plugin knows which node to export");
61
+ }
62
+ const exportResult = await executeOrThrow(queue, "export_composition_json", { nodeId: parsed.nodeId });
63
+ const safeName = (exportResult.nodeName || "component")
64
+ .replace(/\s+/g, "-")
65
+ .replace(/[^a-zA-Z0-9_.-]/g, "");
66
+ const resolvedFileName = fileName ?? `${safeName}.comp.json`;
67
+ const resolvedFolder = folder === undefined ? "compositions" : folder;
68
+ const jsonBody = JSON.stringify(exportResult.compositionJson, null, 2);
69
+ const createResult = await executeOrThrow(queue, "create_token_file", {
70
+ name: resolvedFileName,
71
+ folder: resolvedFolder,
72
+ content: jsonBody,
73
+ overwrite: overwrite === true,
74
+ });
75
+ let generateReport = null;
76
+ if (generate === true) {
77
+ generateReport = await executeOrThrow(queue, "generate_composition", {
78
+ fileId: createResult.fileId,
79
+ });
80
+ }
81
+ return ok({
82
+ ok: true,
83
+ fileKey: parsed.fileKey,
84
+ nodeId: parsed.nodeId,
85
+ nodeName: exportResult.nodeName,
86
+ nodeType: exportResult.nodeType,
87
+ fileId: createResult.fileId,
88
+ fileName: createResult.name,
89
+ folder: resolvedFolder,
90
+ created: createResult.created,
91
+ bytes: jsonBody.length,
92
+ generate: generate === true,
93
+ generateReport,
94
+ });
95
+ });
96
+ server.tool("document_component", "Generate an SXL documentation payload for the currently selected component (or a node passed by id) and apply it to the Figma page using apply_documentation_payload. Returns the resulting documentation frame id.", {
97
+ nodeId: z.string().optional().describe("Component/ComponentSet node id. Omit to use current selection."),
98
+ title: z.string().optional().describe("Optional title override for the documentation frame"),
99
+ }, async ({ nodeId, title }) => {
100
+ const codegen = await executeOrThrow(queue, "get_codegen", {
101
+ ...(nodeId ? { nodeId } : {}),
102
+ language: "designer-json",
103
+ });
104
+ const payload = {
105
+ title: title ?? codegen.nodeName,
106
+ nodeIds: nodeId ? [nodeId] : undefined,
107
+ source: codegen,
108
+ };
109
+ return callPluginCommand(queue, "apply_documentation_payload", { payload });
110
+ });
111
+ }
112
+ //# sourceMappingURL=orchestration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../../src/tools/orchestration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Authoritative catalogue of Bridge MCP tools.
3
+ *
4
+ * Keeping the catalogue in a single module lets us:
5
+ * - expose it via `GET /api/tools` for HTTP clients without MCP
6
+ * - expose it via the `list_tools` meta MCP tool for agents
7
+ * - generate documentation
8
+ *
9
+ * Each registered category calls `catalogueTool` as it registers its tool, so
10
+ * there's one source of truth and no drift between docs/registration.
11
+ */
12
+ export type BridgeToolCategory = "diagnostics" | "tokens" | "compositions" | "variables" | "styles" | "canvas" | "data" | "git" | "orchestration";
13
+ export type BridgeToolEntry = {
14
+ name: string;
15
+ category: BridgeToolCategory;
16
+ summary: string;
17
+ requiresDesignMode: boolean;
18
+ requiresComposition: boolean;
19
+ };
20
+ export declare function catalogueTool(entry: BridgeToolEntry): void;
21
+ export declare function getBridgeToolCatalogue(): ReadonlyArray<BridgeToolEntry>;
22
+ export declare function findCategory(name: string): BridgeToolEntry | undefined;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Authoritative catalogue of Bridge MCP tools.
3
+ *
4
+ * Keeping the catalogue in a single module lets us:
5
+ * - expose it via `GET /api/tools` for HTTP clients without MCP
6
+ * - expose it via the `list_tools` meta MCP tool for agents
7
+ * - generate documentation
8
+ *
9
+ * Each registered category calls `catalogueTool` as it registers its tool, so
10
+ * there's one source of truth and no drift between docs/registration.
11
+ */
12
+ const catalogue = [];
13
+ export function catalogueTool(entry) {
14
+ catalogue.push(entry);
15
+ }
16
+ export function getBridgeToolCatalogue() {
17
+ return catalogue.slice().sort((a, b) => {
18
+ if (a.category !== b.category)
19
+ return a.category.localeCompare(b.category);
20
+ return a.name.localeCompare(b.name);
21
+ });
22
+ }
23
+ export function findCategory(name) {
24
+ return catalogue.find((t) => t.name === name);
25
+ }
26
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,MAAM,SAAS,GAAsB,EAAE,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Resources — read-only addressable views into the plugin workspace.
3
+ *
4
+ * URI scheme:
5
+ * - sxl://tokens/config → current config.json
6
+ * - sxl://tokens/files → listing of token files (JSON)
7
+ * - sxl://tokens/files/{fileId} → full content of one token file
8
+ * - sxl://compositions/index → composition index (list_compositions)
9
+ * - sxl://figma/selection → current Figma selection summary
10
+ * - sxl://figma/status → plugin status (editor type, mode, ...)
11
+ *
12
+ * MCP resources live alongside MCP tools. Clients (Cursor, Claude Desktop) can
13
+ * attach them as context without requiring agents to explicitly call tools.
14
+ */
15
+ import { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
16
+ import type { CommandQueue } from "../command-queue.js";
17
+ export declare function registerBridgeResources(server: McpServer, queue: CommandQueue): void;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * MCP Resources — read-only addressable views into the plugin workspace.
3
+ *
4
+ * URI scheme:
5
+ * - sxl://tokens/config → current config.json
6
+ * - sxl://tokens/files → listing of token files (JSON)
7
+ * - sxl://tokens/files/{fileId} → full content of one token file
8
+ * - sxl://compositions/index → composition index (list_compositions)
9
+ * - sxl://figma/selection → current Figma selection summary
10
+ * - sxl://figma/status → plugin status (editor type, mode, ...)
11
+ *
12
+ * MCP resources live alongside MCP tools. Clients (Cursor, Claude Desktop) can
13
+ * attach them as context without requiring agents to explicitly call tools.
14
+ */
15
+ import { ResourceTemplate, } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
16
+ async function execRaw(queue, commandType, payload = {}) {
17
+ const r = await queue.execute(commandType, payload);
18
+ if (r.status !== "completed") {
19
+ throw new Error(r.error ?? `Command "${commandType}" failed (${r.status})`);
20
+ }
21
+ return r.result ?? null;
22
+ }
23
+ function asJson(uri, body) {
24
+ return {
25
+ contents: [
26
+ {
27
+ uri,
28
+ mimeType: "application/json",
29
+ text: JSON.stringify(body, null, 2),
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ export function registerBridgeResources(server, queue) {
35
+ server.registerResource("sxl-tokens-config", "sxl://tokens/config", {
36
+ title: "SXL — tokens/config.json",
37
+ description: "Current content of the plugin workspace config.json (collections, modes, file enablement).",
38
+ mimeType: "application/json",
39
+ }, async (uri) => {
40
+ const data = await execRaw(queue, "get_tokens_config");
41
+ return asJson(uri.href, data);
42
+ });
43
+ server.registerResource("sxl-tokens-files", "sxl://tokens/files", {
44
+ title: "SXL — token file index",
45
+ description: "Listing of all token files in the plugin workspace (id, name, folder, gitPath, tokenCount, types).",
46
+ mimeType: "application/json",
47
+ }, async (uri) => {
48
+ const data = await execRaw(queue, "list_token_files");
49
+ return asJson(uri.href, data);
50
+ });
51
+ server.registerResource("sxl-tokens-file", new ResourceTemplate("sxl://tokens/files/{fileId}", {
52
+ list: undefined,
53
+ }), {
54
+ title: "SXL — token file content",
55
+ description: "Raw JSON content of a specific token file (addressed by fileId from sxl://tokens/files).",
56
+ mimeType: "application/json",
57
+ }, async (uri, variables) => {
58
+ const fileId = Array.isArray(variables.fileId)
59
+ ? variables.fileId[0]
60
+ : variables.fileId;
61
+ if (!fileId) {
62
+ throw new Error("sxl-tokens-file: fileId is required in the URI");
63
+ }
64
+ const data = await execRaw(queue, "get_token_file_content", { fileId });
65
+ return asJson(uri.href, data);
66
+ });
67
+ server.registerResource("sxl-compositions-index", "sxl://compositions/index", {
68
+ title: "SXL — composition index",
69
+ description: "List of all composition token files (files with $type:composition) and their metadata.",
70
+ mimeType: "application/json",
71
+ }, async (uri) => {
72
+ const data = await execRaw(queue, "list_compositions");
73
+ return asJson(uri.href, data);
74
+ });
75
+ server.registerResource("sxl-figma-selection", "sxl://figma/selection", {
76
+ title: "SXL — Figma selection summary",
77
+ description: "Currently selected node(s) in Figma: ids, names, types, and key properties. Useful as agent context before calling canvas tools.",
78
+ mimeType: "application/json",
79
+ }, async (uri) => {
80
+ const data = await execRaw(queue, "get_selection_summary");
81
+ return asJson(uri.href, data);
82
+ });
83
+ server.registerResource("sxl-plugin-status", "sxl://figma/status", {
84
+ title: "SXL — plugin status",
85
+ description: "Plugin status snapshot: editorType, mode, isDevMode, writesAllowed, currentPage, selection, session state.",
86
+ mimeType: "application/json",
87
+ }, async (uri) => {
88
+ const data = await execRaw(queue, "get_plugin_status");
89
+ return asJson(uri.href, data);
90
+ });
91
+ }
92
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Helpers shared between MCP tool registrations.
3
+ *
4
+ * - `callPluginCommand` — executes a plugin command via the shared CommandQueue,
5
+ * normalizes typed errors (see Plugin `EditorModeReadonlyError.toJSON()`),
6
+ * and returns a ready-to-return MCP tool response.
7
+ * - `ok` / `err` — consistent text envelopes for MCP output.
8
+ */
9
+ import type { CommandQueue } from "../command-queue.js";
10
+ type McpToolResponse = {
11
+ content: Array<{
12
+ type: "text";
13
+ text: string;
14
+ }>;
15
+ isError?: boolean;
16
+ };
17
+ export declare function ok(payload: unknown): McpToolResponse;
18
+ export declare function err(message: string, details?: Record<string, unknown>): McpToolResponse;
19
+ export declare function callPluginCommand(queue: CommandQueue, commandType: string, payload?: Record<string, unknown>): Promise<McpToolResponse>;
20
+ export {};