@sxl-studio/bridge 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +342 -16
  2. package/dist/agent-recipes.d.ts +781 -11
  3. package/dist/agent-recipes.js +886 -13
  4. package/dist/agent-recipes.js.map +1 -1
  5. package/dist/agent-runbook.d.ts +50 -0
  6. package/dist/agent-runbook.js +243 -0
  7. package/dist/agent-runbook.js.map +1 -0
  8. package/dist/asset-upload.d.ts +63 -0
  9. package/dist/asset-upload.js +225 -0
  10. package/dist/asset-upload.js.map +1 -0
  11. package/dist/audit-store.d.ts +15 -0
  12. package/dist/audit-store.js +100 -0
  13. package/dist/audit-store.js.map +1 -0
  14. package/dist/audit.d.ts +4 -3
  15. package/dist/audit.js +37 -4
  16. package/dist/audit.js.map +1 -1
  17. package/dist/auth.d.ts +8 -1
  18. package/dist/auth.js +41 -1
  19. package/dist/auth.js.map +1 -1
  20. package/dist/bridge-agent-workflow-validation-cli.d.ts +2 -0
  21. package/dist/bridge-agent-workflow-validation-cli.js +68 -0
  22. package/dist/bridge-agent-workflow-validation-cli.js.map +1 -0
  23. package/dist/bridge-agent-workflow-validation.d.ts +42 -0
  24. package/dist/bridge-agent-workflow-validation.js +170 -0
  25. package/dist/bridge-agent-workflow-validation.js.map +1 -0
  26. package/dist/bridge-contract-audit.d.ts +45 -0
  27. package/dist/bridge-contract-audit.js +345 -0
  28. package/dist/bridge-contract-audit.js.map +1 -0
  29. package/dist/bridge-health-cli.d.ts +2 -0
  30. package/dist/bridge-health-cli.js +115 -0
  31. package/dist/bridge-health-cli.js.map +1 -0
  32. package/dist/bridge-health.d.ts +33 -0
  33. package/dist/bridge-health.js +594 -0
  34. package/dist/bridge-health.js.map +1 -0
  35. package/dist/bridge-live-validation-cli.d.ts +2 -0
  36. package/dist/bridge-live-validation-cli.js +114 -0
  37. package/dist/bridge-live-validation-cli.js.map +1 -0
  38. package/dist/bridge-live-validation.d.ts +39 -0
  39. package/dist/bridge-live-validation.js +1141 -0
  40. package/dist/bridge-live-validation.js.map +1 -0
  41. package/dist/bridge-performance-profile.d.ts +81 -0
  42. package/dist/bridge-performance-profile.js +227 -0
  43. package/dist/bridge-performance-profile.js.map +1 -0
  44. package/dist/bridge-readiness-cli.d.ts +30 -0
  45. package/dist/bridge-readiness-cli.js +242 -0
  46. package/dist/bridge-readiness-cli.js.map +1 -0
  47. package/dist/bridge-runtime-summary.d.ts +50 -0
  48. package/dist/bridge-runtime-summary.js +112 -0
  49. package/dist/bridge-runtime-summary.js.map +1 -0
  50. package/dist/bridge-workflow-smoke-cli.d.ts +2 -0
  51. package/dist/bridge-workflow-smoke-cli.js +126 -0
  52. package/dist/bridge-workflow-smoke-cli.js.map +1 -0
  53. package/dist/bridge-workflow-smoke.d.ts +39 -0
  54. package/dist/bridge-workflow-smoke.js +431 -0
  55. package/dist/bridge-workflow-smoke.js.map +1 -0
  56. package/dist/codeconnect-suggestions.d.ts +74 -0
  57. package/dist/codeconnect-suggestions.js +398 -0
  58. package/dist/codeconnect-suggestions.js.map +1 -0
  59. package/dist/codeconnect-template.d.ts +98 -0
  60. package/dist/codeconnect-template.js +280 -0
  61. package/dist/codeconnect-template.js.map +1 -0
  62. package/dist/command-queue.d.ts +11 -1
  63. package/dist/command-queue.js +200 -1
  64. package/dist/command-queue.js.map +1 -1
  65. package/dist/command-safety.d.ts +13 -0
  66. package/dist/command-safety.js +59 -0
  67. package/dist/command-safety.js.map +1 -0
  68. package/dist/enabled-library-search.d.ts +49 -0
  69. package/dist/enabled-library-search.js +151 -0
  70. package/dist/enabled-library-search.js.map +1 -0
  71. package/dist/figma-mcp-parity.d.ts +49 -0
  72. package/dist/figma-mcp-parity.js +368 -0
  73. package/dist/figma-mcp-parity.js.map +1 -0
  74. package/dist/figma-mcp-skills-parity.d.ts +61 -0
  75. package/dist/figma-mcp-skills-parity.js +434 -0
  76. package/dist/figma-mcp-skills-parity.js.map +1 -0
  77. package/dist/figma-rest-diagnostics.d.ts +50 -0
  78. package/dist/figma-rest-diagnostics.js +314 -0
  79. package/dist/figma-rest-diagnostics.js.map +1 -0
  80. package/dist/figma-rest.d.ts +27 -0
  81. package/dist/figma-rest.js +116 -0
  82. package/dist/figma-rest.js.map +1 -0
  83. package/dist/http-api.d.ts +16 -2
  84. package/dist/http-api.js +329 -17
  85. package/dist/http-api.js.map +1 -1
  86. package/dist/index.js +25 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/mcp-factory.d.ts +6 -1
  89. package/dist/mcp-factory.js +23 -4
  90. package/dist/mcp-factory.js.map +1 -1
  91. package/dist/mcp-runtime-probe.d.ts +22 -0
  92. package/dist/mcp-runtime-probe.js +777 -0
  93. package/dist/mcp-runtime-probe.js.map +1 -0
  94. package/dist/mcp-server.d.ts +2 -1
  95. package/dist/mcp-server.js +2 -2
  96. package/dist/mcp-server.js.map +1 -1
  97. package/dist/sxl-mcp-instructions.js +99 -26
  98. package/dist/sxl-mcp-instructions.js.map +1 -1
  99. package/dist/tools/audit.d.ts +22 -6
  100. package/dist/tools/audit.js +49 -7
  101. package/dist/tools/audit.js.map +1 -1
  102. package/dist/tools/capability-matrix.d.ts +22 -0
  103. package/dist/tools/capability-matrix.js +38 -0
  104. package/dist/tools/capability-matrix.js.map +1 -0
  105. package/dist/tools/catalogue-bootstrap.d.ts +1 -0
  106. package/dist/tools/catalogue-bootstrap.js +665 -30
  107. package/dist/tools/catalogue-bootstrap.js.map +1 -1
  108. package/dist/tools/code-connect-context.d.ts +3 -0
  109. package/dist/tools/code-connect-context.js +319 -0
  110. package/dist/tools/code-connect-context.js.map +1 -0
  111. package/dist/tools/code-connect-template.d.ts +3 -0
  112. package/dist/tools/code-connect-template.js +111 -0
  113. package/dist/tools/code-connect-template.js.map +1 -0
  114. package/dist/tools/composition.js +15 -30
  115. package/dist/tools/composition.js.map +1 -1
  116. package/dist/tools/compositions-orchestration.d.ts +14 -14
  117. package/dist/tools/compositions-orchestration.js +2 -2
  118. package/dist/tools/compositions-orchestration.js.map +1 -1
  119. package/dist/tools/data.js +839 -27
  120. package/dist/tools/data.js.map +1 -1
  121. package/dist/tools/design-context.d.ts +3 -0
  122. package/dist/tools/design-context.js +197 -0
  123. package/dist/tools/design-context.js.map +1 -0
  124. package/dist/tools/destructive-confirmation.d.ts +10 -0
  125. package/dist/tools/destructive-confirmation.js +25 -0
  126. package/dist/tools/destructive-confirmation.js.map +1 -0
  127. package/dist/tools/diagnostics.js +76 -51
  128. package/dist/tools/diagnostics.js.map +1 -1
  129. package/dist/tools/figma-mcp-design.d.ts +3 -0
  130. package/dist/tools/figma-mcp-design.js +377 -0
  131. package/dist/tools/figma-mcp-design.js.map +1 -0
  132. package/dist/tools/figma-nodes.js +57 -43
  133. package/dist/tools/figma-nodes.js.map +1 -1
  134. package/dist/tools/figma-rc-extended.js +23 -6
  135. package/dist/tools/figma-rc-extended.js.map +1 -1
  136. package/dist/tools/figma-rest.d.ts +39 -0
  137. package/dist/tools/figma-rest.js +279 -0
  138. package/dist/tools/figma-rest.js.map +1 -0
  139. package/dist/tools/git.js +11 -7
  140. package/dist/tools/git.js.map +1 -1
  141. package/dist/tools/large-data.d.ts +14 -0
  142. package/dist/tools/large-data.js +189 -0
  143. package/dist/tools/large-data.js.map +1 -0
  144. package/dist/tools/meta.d.ts +6 -1
  145. package/dist/tools/meta.js +89 -11
  146. package/dist/tools/meta.js.map +1 -1
  147. package/dist/tools/metadata.d.ts +3 -0
  148. package/dist/tools/metadata.js +140 -0
  149. package/dist/tools/metadata.js.map +1 -0
  150. package/dist/tools/mockup.d.ts +15 -156
  151. package/dist/tools/mockup.js +54 -121
  152. package/dist/tools/mockup.js.map +1 -1
  153. package/dist/tools/orchestration.js +75 -47
  154. package/dist/tools/orchestration.js.map +1 -1
  155. package/dist/tools/prompts.d.ts +3 -0
  156. package/dist/tools/prompts.js +219 -0
  157. package/dist/tools/prompts.js.map +1 -0
  158. package/dist/tools/registry.d.ts +19 -1
  159. package/dist/tools/registry.js +4 -4
  160. package/dist/tools/registry.js.map +1 -1
  161. package/dist/tools/resources.d.ts +19 -2
  162. package/dist/tools/resources.js +149 -5
  163. package/dist/tools/resources.js.map +1 -1
  164. package/dist/tools/schema-contracts.d.ts +4763 -0
  165. package/dist/tools/schema-contracts.js +814 -0
  166. package/dist/tools/schema-contracts.js.map +1 -0
  167. package/dist/tools/screenshot.d.ts +3 -0
  168. package/dist/tools/screenshot.js +144 -0
  169. package/dist/tools/screenshot.js.map +1 -0
  170. package/dist/tools/shared.d.ts +11 -1
  171. package/dist/tools/shared.js +55 -2
  172. package/dist/tools/shared.js.map +1 -1
  173. package/dist/tools/styles-orchestration.d.ts +2 -2
  174. package/dist/tools/styles-orchestration.js +13 -5
  175. package/dist/tools/styles-orchestration.js.map +1 -1
  176. package/dist/tools/styles.js +22 -8
  177. package/dist/tools/styles.js.map +1 -1
  178. package/dist/tools/tokens.d.ts +31 -692
  179. package/dist/tools/tokens.js +175 -135
  180. package/dist/tools/tokens.js.map +1 -1
  181. package/dist/tools/variable-defs.d.ts +3 -0
  182. package/dist/tools/variable-defs.js +338 -0
  183. package/dist/tools/variable-defs.js.map +1 -0
  184. package/dist/tools/variables-orchestration.js +13 -5
  185. package/dist/tools/variables-orchestration.js.map +1 -1
  186. package/dist/tools/variables.js +18 -15
  187. package/dist/tools/variables.js.map +1 -1
  188. package/dist/types.d.ts +53 -0
  189. package/dist/ultimate-readiness-audit.d.ts +37 -0
  190. package/dist/ultimate-readiness-audit.js +431 -0
  191. package/dist/ultimate-readiness-audit.js.map +1 -0
  192. package/dist/workflow-planner.d.ts +57 -0
  193. package/dist/workflow-planner.js +464 -0
  194. package/dist/workflow-planner.js.map +1 -0
  195. package/dist/workspace-blob-store.d.ts +6 -0
  196. package/dist/workspace-blob-store.js +9 -0
  197. package/dist/workspace-blob-store.js.map +1 -1
  198. package/dist/workspace-path-http.d.ts +24 -0
  199. package/dist/workspace-path-http.js +146 -0
  200. package/dist/workspace-path-http.js.map +1 -0
  201. package/dist/ws-server.js +16 -3
  202. package/dist/ws-server.js.map +1 -1
  203. package/package.json +21 -2
@@ -0,0 +1,189 @@
1
+ import { z } from "zod";
2
+ export const LARGE_DATA_RESPONSE_MODE_FIELD = "bridgeResponseMode";
3
+ export const LARGE_DATA_MAX_BYTES_FIELD = "bridgeMaxResponseBytes";
4
+ const DEFAULT_MAX_RESPONSE_BYTES = 96 * 1024;
5
+ const MIN_MAX_RESPONSE_BYTES = 8 * 1024;
6
+ const MAX_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
7
+ const PREVIEW_ITEMS = 5;
8
+ const MAX_STRING_PREVIEW = 240;
9
+ const MAX_OBJECT_KEYS = 24;
10
+ export const largeDataResponseArgs = {
11
+ [LARGE_DATA_RESPONSE_MODE_FIELD]: z
12
+ .enum(["auto", "summary", "full"])
13
+ .optional()
14
+ .describe("Bridge MCP response mode for large results. auto (default) summarizes only oversized responses; summary always returns counts/preview; full returns the full result and should be used sparingly."),
15
+ [LARGE_DATA_MAX_BYTES_FIELD]: z
16
+ .number()
17
+ .int()
18
+ .positive()
19
+ .max(MAX_MAX_RESPONSE_BYTES)
20
+ .optional()
21
+ .describe("Optional auto-summary threshold in bytes for this MCP response. Default: 98304."),
22
+ };
23
+ export function stripLargeDataControlFields(payload = {}) {
24
+ const out = {};
25
+ for (const [key, value] of Object.entries(payload)) {
26
+ if (key !== LARGE_DATA_RESPONSE_MODE_FIELD && key !== LARGE_DATA_MAX_BYTES_FIELD) {
27
+ out[key] = value;
28
+ }
29
+ }
30
+ return out;
31
+ }
32
+ function readMode(payload) {
33
+ const raw = payload[LARGE_DATA_RESPONSE_MODE_FIELD];
34
+ return raw === "summary" || raw === "full" || raw === "auto" ? raw : "auto";
35
+ }
36
+ function readMaxBytes(payload) {
37
+ const raw = payload[LARGE_DATA_MAX_BYTES_FIELD];
38
+ if (typeof raw !== "number" || !Number.isFinite(raw))
39
+ return DEFAULT_MAX_RESPONSE_BYTES;
40
+ return Math.max(MIN_MAX_RESPONSE_BYTES, Math.min(MAX_MAX_RESPONSE_BYTES, Math.floor(raw)));
41
+ }
42
+ function isRecord(value) {
43
+ return typeof value === "object" && value !== null && !Array.isArray(value);
44
+ }
45
+ function isPlainObject(value) {
46
+ return Object.prototype.toString.call(value) === "[object Object]";
47
+ }
48
+ function estimateBytes(value) {
49
+ try {
50
+ return Buffer.byteLength(JSON.stringify(value), "utf8");
51
+ }
52
+ catch {
53
+ return Number.POSITIVE_INFINITY;
54
+ }
55
+ }
56
+ function scalarPreview(value) {
57
+ if (typeof value !== "string")
58
+ return value;
59
+ if (value.length <= MAX_STRING_PREVIEW)
60
+ return value;
61
+ return {
62
+ type: "string",
63
+ length: value.length,
64
+ preview: value.slice(0, MAX_STRING_PREVIEW),
65
+ };
66
+ }
67
+ function summarizePreview(value, depth = 0) {
68
+ if (value === null || typeof value !== "object")
69
+ return scalarPreview(value);
70
+ if (Array.isArray(value)) {
71
+ return {
72
+ type: "array",
73
+ count: value.length,
74
+ truncated: value.length > PREVIEW_ITEMS,
75
+ items: value.slice(0, PREVIEW_ITEMS).map((item) => summarizePreview(item, depth + 1)),
76
+ };
77
+ }
78
+ if (!isPlainObject(value)) {
79
+ return { type: typeof value };
80
+ }
81
+ const entries = Object.entries(value);
82
+ const out = {
83
+ type: "object",
84
+ keyCount: entries.length,
85
+ };
86
+ const preferredKeys = [
87
+ "id",
88
+ "key",
89
+ "name",
90
+ "type",
91
+ "nodeId",
92
+ "nodeName",
93
+ "nodeType",
94
+ "pageId",
95
+ "pageName",
96
+ "commandType",
97
+ "status",
98
+ "cursor",
99
+ "ok",
100
+ ];
101
+ const keys = [
102
+ ...preferredKeys.filter((key) => key in value),
103
+ ...entries.map(([key]) => key).filter((key) => !preferredKeys.includes(key)),
104
+ ].slice(0, MAX_OBJECT_KEYS);
105
+ for (const key of keys) {
106
+ const child = value[key];
107
+ if (depth >= 2 && typeof child === "object" && child !== null) {
108
+ out[key] = Array.isArray(child)
109
+ ? { type: "array", count: child.length }
110
+ : { type: "object", keyCount: Object.keys(child).length };
111
+ }
112
+ else {
113
+ out[key] = summarizePreview(child, depth + 1);
114
+ }
115
+ }
116
+ if (entries.length > keys.length) {
117
+ out.truncatedKeys = entries.length - keys.length;
118
+ }
119
+ return out;
120
+ }
121
+ function countCollections(value) {
122
+ if (!isRecord(value))
123
+ return {};
124
+ const counts = {};
125
+ for (const [key, child] of Object.entries(value)) {
126
+ if (Array.isArray(child)) {
127
+ counts[key] = child.length;
128
+ }
129
+ }
130
+ return counts;
131
+ }
132
+ function extractPagination(value) {
133
+ if (!isRecord(value))
134
+ return null;
135
+ const pagination = {};
136
+ if (typeof value.cursor === "string" || value.cursor === null)
137
+ pagination.cursor = value.cursor;
138
+ if (isRecord(value.summary)) {
139
+ if (typeof value.summary.hasMore === "boolean")
140
+ pagination.hasMore = value.summary.hasMore;
141
+ if (typeof value.summary.nextCursor === "string")
142
+ pagination.nextCursor = value.summary.nextCursor;
143
+ if (typeof value.summary.returned === "number")
144
+ pagination.returned = value.summary.returned;
145
+ }
146
+ return Object.keys(pagination).length > 0 ? pagination : null;
147
+ }
148
+ function extractTopLevelScalars(value) {
149
+ if (!isRecord(value))
150
+ return {};
151
+ const scalars = {};
152
+ for (const [key, child] of Object.entries(value)) {
153
+ if (child === null || typeof child === "string" || typeof child === "number" || typeof child === "boolean") {
154
+ scalars[key] = scalarPreview(child);
155
+ }
156
+ }
157
+ return scalars;
158
+ }
159
+ export function normalizeLargeDataResult(commandType, payload, result) {
160
+ const mode = readMode(payload);
161
+ if (mode === "full")
162
+ return result;
163
+ const maxBytes = readMaxBytes(payload);
164
+ const originalBytes = estimateBytes(result);
165
+ const shouldNormalize = mode === "summary" || originalBytes > maxBytes;
166
+ if (!shouldNormalize)
167
+ return result;
168
+ const pagination = extractPagination(result);
169
+ return {
170
+ ok: isRecord(result) && typeof result.ok === "boolean" ? result.ok : true,
171
+ bridgeLargeData: {
172
+ normalized: true,
173
+ commandType,
174
+ responseMode: mode,
175
+ reason: mode === "summary" ? "requested-summary" : "response-too-large",
176
+ originalBytes,
177
+ maxBytes,
178
+ fullResultHint: `Pass ${LARGE_DATA_RESPONSE_MODE_FIELD}: "full" only when the user explicitly needs the full payload.`,
179
+ },
180
+ summary: {
181
+ topLevelKeys: isRecord(result) ? Object.keys(result) : [],
182
+ scalars: extractTopLevelScalars(result),
183
+ counts: countCollections(result),
184
+ ...(pagination ? { pagination } : {}),
185
+ },
186
+ preview: summarizePreview(result),
187
+ };
188
+ }
189
+ //# sourceMappingURL=large-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"large-data.js","sourceRoot":"","sources":["../../src/tools/large-data.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,9 @@
7
7
  */
8
8
  import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
9
9
  import type { CommandQueue } from "../command-queue.js";
10
- export declare function registerMetaTools(server: McpServer, _queue: CommandQueue): void;
10
+ import type { SessionInfo } from "../types.js";
11
+ export type BridgeMetaRuntimeContext = {
12
+ bridgePort?: number;
13
+ getSessionInfo?: () => SessionInfo;
14
+ };
15
+ export declare function registerMetaTools(server: McpServer, queue: CommandQueue, runtimeContext?: BridgeMetaRuntimeContext): void;
@@ -6,31 +6,109 @@
6
6
  * which tools require Design mode vs read-only Dev Mode.
7
7
  */
8
8
  import { z } from "zod";
9
- import { getBridgeToolCatalogue } from "./registry.js";
9
+ import { routeAgentIntent } from "../agent-recipes.js";
10
+ import { getAuditSnapshot } from "../audit.js";
11
+ import { readPersistedAuditSnapshot } from "../audit-store.js";
12
+ import { buildBridgeContractAudit } from "../bridge-contract-audit.js";
13
+ import { buildBridgePerformanceProfile } from "../bridge-performance-profile.js";
14
+ import { buildBridgeRuntimeSummary } from "../bridge-runtime-summary.js";
15
+ import { buildFigmaMcpParityMatrix } from "../figma-mcp-parity.js";
16
+ import { buildFigmaMcpSkillsParityMatrix } from "../figma-mcp-skills-parity.js";
17
+ import { buildUltimateReadinessAudit } from "../ultimate-readiness-audit.js";
18
+ import { SXL_OPERATOR_RUNBOOK } from "../agent-runbook.js";
19
+ import { planWorkflow, previewWorkflow } from "../workflow-planner.js";
20
+ import { buildCapabilityMatrix, listCatalogueTools } from "./capability-matrix.js";
21
+ import { largeDataResponseArgs, normalizeLargeDataResult, } from "./large-data.js";
10
22
  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.", {
23
+ export function registerMetaTools(server, queue, runtimeContext = {}) {
24
+ server.tool("get_contract_audit", "Return a Bridge-local release contract audit: catalogue execution mapping, required meta tools, recipe references, schema entrypoints, workflow gates, and findings. Does not execute plugin commands.", {}, async () => ok(buildBridgeContractAudit()));
25
+ server.tool("get_figma_mcp_parity", "Return the machine-readable parity map between official Figma MCP tools and SXL Bridge/SXL Studio capabilities. Use it to decide when Bridge is primary, when official Figma MCP should be used as companion, and what remains future/unsupported.", {}, async () => ok(buildFigmaMcpParityMatrix()));
26
+ server.tool("get_figma_mcp_skills_parity", "Return the machine-readable parity map between current official Figma MCP skills and SXL Bridge/SXL Studio recipes/resources, including legacy/client compatibility aliases. Use it to route skill-level requests such as figma-use, figma-swiftui, figma-code-connect, or figma-create-new-file.", {}, async () => ok(buildFigmaMcpSkillsParityMatrix()));
27
+ server.tool("get_performance_profile", "Return the machine-readable Bridge performance profile: tool budgets, large-data and dry-run policies, destructive-write warnings, and recent audit timing. Use it before large workflows or when tuning agent behavior for speed/stability.", {
28
+ auditLimit: z
29
+ .number()
30
+ .int()
31
+ .positive()
32
+ .max(200)
33
+ .optional()
34
+ .describe("Number of recent audit entries to include. Default: 50, max: 200."),
35
+ }, async ({ auditLimit }) => ok(buildBridgePerformanceProfile({ auditLimit })));
36
+ server.tool("get_bridge_audit_log", "Return recent Bridge command audit entries from memory or persisted disk JSONL. Entries are sanitized: payload values are never returned, only payload key names.", {
37
+ source: z.enum(["memory", "disk"]).optional().describe("Audit source. Default: memory ring buffer."),
38
+ limit: z.number().int().positive().max(1000).optional().describe("Max entries. Default: 50."),
39
+ ...largeDataResponseArgs,
40
+ }, async ({ source, limit, ...controls }) => {
41
+ const resolvedSource = source ?? "memory";
42
+ const entries = resolvedSource === "disk"
43
+ ? await readPersistedAuditSnapshot({ limit })
44
+ : getAuditSnapshot(limit);
45
+ const result = {
46
+ source: resolvedSource,
47
+ entries,
48
+ };
49
+ return ok(normalizeLargeDataResult("get_bridge_audit_log", controls, result));
50
+ });
51
+ server.tool("get_bridge_runtime_summary", "Return a compact Bridge runtime summary: plugin connection state, queue pressure, recent events/audit failures, MCP URL, auth flag, and recommendations. Use before heavy workflows.", {
52
+ auditLimit: z
53
+ .number()
54
+ .int()
55
+ .positive()
56
+ .max(200)
57
+ .optional()
58
+ .describe("Number of recent audit entries to summarize. Default: 50, max: 200."),
59
+ }, async ({ auditLimit }) => ok(buildBridgeRuntimeSummary({
60
+ queue,
61
+ sessionInfo: runtimeContext.getSessionInfo?.(),
62
+ bridgePort: runtimeContext.bridgePort,
63
+ auditLimit,
64
+ })));
65
+ server.tool("get_operator_runbook", "Return the machine-readable SXL Bridge operator runbook: start-here resources, safety rules, common workflows, preferred tools, dry-run gates, done criteria, release gates, and official Figma MCP companion handoff.", {}, async () => ok(SXL_OPERATOR_RUNBOOK));
66
+ server.tool("get_ultimate_readiness", "Return a requirement-by-requirement readiness audit for the Ultimate Bridge Toolkit plan: contract surface, SXL skills, Design DSL, analytics, database, variables/styles, compositions, documentation, Code Connect, production safety, and official Figma MCP parity. Does not execute plugin commands.", {}, async () => ok(buildUltimateReadinessAudit()));
67
+ server.tool("route_intent", "Route a natural-language SXL/Figma request to Bridge agent recipes, preferred tools, dry-run policy, and schema resources. Use this when the user's wording is broad or ambiguous.", {
68
+ request: z.string().min(1).describe("Natural-language user request in RU or EN."),
69
+ limit: z.number().int().positive().max(10).optional().describe("Max ranked routes to return. Default: 5."),
70
+ }, async ({ request, limit }) => ok(routeAgentIntent(request, { limit })));
71
+ server.tool("plan_workflow", "Build a Bridge-local workflow plan from a natural-language request: selected SXL recipe, resources, expected tools, dry-run gates, approval gates, and done criteria. Does not execute plugin commands.", {
72
+ request: z.string().min(1).describe("Natural-language user request in RU or EN."),
73
+ recipeId: z.string().optional().describe("Optional explicit SXL recipe id from route_intent."),
74
+ }, async ({ request, recipeId }) => ok(planWorkflow({ request, recipeId })));
75
+ server.tool("preview_workflow", "Validate a proposed Bridge tool sequence against the planned SXL workflow. Checks unknown tools, missing status/discovery/dry-run gates, and preferred-tool coverage. Does not execute plugin commands.", {
76
+ request: z.string().min(1).describe("Natural-language user request in RU or EN."),
77
+ recipeId: z.string().optional().describe("Optional explicit SXL recipe id from route_intent."),
78
+ proposedTools: z.array(z.string()).optional().describe("Simple proposed tool name sequence."),
79
+ proposedSteps: z
80
+ .array(z.object({ toolName: z.string(), dryRun: z.boolean().optional() }))
81
+ .optional()
82
+ .describe("Detailed proposed tool sequence with dryRun hints where known."),
83
+ }, async ({ request, recipeId, proposedTools, proposedSteps }) => ok(previewWorkflow({ request, recipeId, proposedTools, proposedSteps })));
84
+ server.tool("list_tools", "List all Bridge MCP tools with category, mode, execution, plugin command mapping, and routing metadata. Useful as a first call to discover the tool surface.", {
13
85
  category: z
14
86
  .string()
15
87
  .optional()
16
- .describe("Filter by category: diagnostics | tokens | compositions | variables | styles | canvas | data | git | orchestration"),
88
+ .describe("Filter by category: diagnostics | tokens | compositions | variables | styles | canvas | figma-rest | data | git | orchestration"),
17
89
  devModeReadableOnly: z
18
90
  .boolean()
19
91
  .optional()
20
92
  .describe("If true, return only tools usable in Figma Dev Mode (requiresDesignMode: false)."),
21
93
  }, 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
- }
94
+ const entries = listCatalogueTools({ category, devModeReadableOnly });
29
95
  return ok({
30
96
  count: entries.length,
31
97
  categories: Array.from(new Set(entries.map((e) => e.category))),
32
98
  tools: entries,
33
99
  });
34
100
  });
101
+ server.tool("get_capability_matrix", "Return the machine-readable Bridge capability matrix: tool metadata, execution mode (plugin / bridge-orchestration / bridge-local), plugin command types, mode requirements, dryRun support, and Bridge timeout. Use this for contract audits and agent routing.", {
102
+ category: z
103
+ .string()
104
+ .optional()
105
+ .describe("Optional category filter. Same semantics as list_tools and GET /api/capabilities?category=..."),
106
+ devModeReadableOnly: z
107
+ .boolean()
108
+ .optional()
109
+ .describe("If true, return only tools usable in Figma Dev Mode (requiresDesignMode: false)."),
110
+ }, async ({ category, devModeReadableOnly }) => {
111
+ return ok(buildCapabilityMatrix({ category, devModeReadableOnly }));
112
+ });
35
113
  }
36
114
  //# sourceMappingURL=meta.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/tools/meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "../../node_modules/@modelcontextprotocol/sdk/dist/cjs/server/mcp.js";
2
+ import type { CommandQueue } from "../command-queue.js";
3
+ export declare function registerMetadataTools(server: McpServer, queue: CommandQueue): void;
@@ -0,0 +1,140 @@
1
+ import { z } from "zod";
2
+ import { figmaRestGet, fileKeyFromArgs, FigmaRestError, } from "../figma-rest.js";
3
+ import { largeDataResponseArgs, normalizeLargeDataResult } from "./large-data.js";
4
+ import { err, executePluginCommand, ok } from "./shared.js";
5
+ const metadataModeZod = z.enum(["auto", "plugin", "rest"]);
6
+ const authModeZod = z.enum(["bearer", "x-figma-token"]);
7
+ const tokenEnvZod = z
8
+ .string()
9
+ .regex(/^[A-Z0-9_]+$/)
10
+ .optional()
11
+ .describe("Environment variable containing the Figma REST token. Default: FIGMA_TOKEN, FIGMA_ACCESS_TOKEN, or FIGMA_REST_TOKEN.");
12
+ function normalizeNodeIds(args) {
13
+ const ids = new Set();
14
+ if (args.nodeId?.trim())
15
+ ids.add(args.nodeId.trim());
16
+ for (const id of args.nodeIds ?? []) {
17
+ if (typeof id === "string" && id.trim())
18
+ ids.add(id.trim());
19
+ }
20
+ return Array.from(ids);
21
+ }
22
+ function restErrorResponse(error) {
23
+ if (error instanceof FigmaRestError) {
24
+ return err(error.message, {
25
+ code: "FIGMA_REST_ERROR",
26
+ status: error.status,
27
+ endpoint: error.endpoint,
28
+ body: error.body,
29
+ retryable: error.status === 429 || error.status >= 500,
30
+ });
31
+ }
32
+ return err(error instanceof Error ? error.message : String(error), {
33
+ code: "GET_METADATA_ERROR",
34
+ retryable: false,
35
+ });
36
+ }
37
+ async function getPluginMetadata(queue, args) {
38
+ const nodeIds = normalizeNodeIds(args);
39
+ const includeSelection = args.includeSelection !== false;
40
+ const includePageStructure = args.includePageStructure !== false;
41
+ const includePages = args.includePages === true;
42
+ if (nodeIds.length > 0) {
43
+ const nodes = [];
44
+ for (const nodeId of nodeIds) {
45
+ nodes.push(await executePluginCommand(queue, "get_node_tree", {
46
+ nodeId,
47
+ depth: args.depth ?? 3,
48
+ }));
49
+ }
50
+ return {
51
+ ok: true,
52
+ source: "plugin-node-tree",
53
+ nodeIds,
54
+ count: nodes.length,
55
+ nodes,
56
+ };
57
+ }
58
+ const result = {
59
+ ok: true,
60
+ source: "plugin-active-file",
61
+ };
62
+ if (includeSelection) {
63
+ result.selection = await executePluginCommand(queue, "get_selection_summary");
64
+ }
65
+ if (includePageStructure) {
66
+ result.pageStructure = await executePluginCommand(queue, "get_page_structure", {
67
+ maxDepth: args.depth ?? 3,
68
+ });
69
+ }
70
+ if (includePages) {
71
+ result.pages = await executePluginCommand(queue, "get_pages");
72
+ }
73
+ return result;
74
+ }
75
+ export function registerMetadataTools(server, queue) {
76
+ server.tool("get_metadata", "Bridge metadata tool. Use plugin mode for active-file selection/page/node tree metadata through Remote Connect; use REST mode with fileKey/url and optional nodeIds for hosted file metadata or node metadata. Auto mode picks REST when fileKey/url is provided, otherwise plugin.", {
77
+ mode: metadataModeZod.optional(),
78
+ nodeId: z.string().optional(),
79
+ nodeIds: z.array(z.string()).optional(),
80
+ depth: z.number().int().positive().max(20).optional(),
81
+ includeSelection: z.boolean().optional(),
82
+ includePageStructure: z.boolean().optional(),
83
+ includePages: z.boolean().optional(),
84
+ fileKey: z.string().optional().describe("Figma file key for REST metadata. Provide this or url for rest mode."),
85
+ url: z.string().url().optional().describe("Figma file/node URL. Used to extract fileKey when fileKey is omitted."),
86
+ geometry: z.enum(["paths"]).optional(),
87
+ pluginData: z.string().optional().describe("REST mode: comma-separated plugin ids or 'shared'."),
88
+ tokenEnv: tokenEnvZod,
89
+ authMode: authModeZod.optional().describe("Figma REST auth header mode. Default: FIGMA_AUTH_MODE or x-figma-token."),
90
+ apiBaseUrl: z.string().url().optional().describe("Figma REST API base URL. Default: https://api.figma.com."),
91
+ ...largeDataResponseArgs,
92
+ }, async (args) => {
93
+ const mode = args.mode ?? "auto";
94
+ const useRest = mode === "rest" || (mode === "auto" && Boolean(args.fileKey || args.url));
95
+ if (!useRest) {
96
+ try {
97
+ const result = await getPluginMetadata(queue, args);
98
+ return ok(normalizeLargeDataResult("get_metadata", args, result));
99
+ }
100
+ catch (error) {
101
+ return err(error instanceof Error ? error.message : String(error), {
102
+ code: "GET_METADATA_PLUGIN_ERROR",
103
+ retryable: /No plugin connected|Session disconnected/i.test(error instanceof Error ? error.message : String(error)),
104
+ });
105
+ }
106
+ }
107
+ try {
108
+ const fileKey = fileKeyFromArgs(args);
109
+ const nodeIds = normalizeNodeIds(args);
110
+ const endpoint = nodeIds.length > 0
111
+ ? `/v1/files/${fileKey}/nodes`
112
+ : `/v1/files/${fileKey}/meta`;
113
+ const body = await figmaRestGet(endpoint, {
114
+ tokenEnv: args.tokenEnv,
115
+ authMode: args.authMode,
116
+ apiBaseUrl: args.apiBaseUrl,
117
+ query: nodeIds.length > 0
118
+ ? {
119
+ ids: nodeIds.join(","),
120
+ depth: args.depth,
121
+ geometry: args.geometry,
122
+ plugin_data: args.pluginData,
123
+ }
124
+ : undefined,
125
+ });
126
+ return ok(normalizeLargeDataResult("get_metadata", args, {
127
+ ok: true,
128
+ source: "figma-rest",
129
+ fileKey,
130
+ endpoint: nodeIds.length > 0 ? "nodes" : "meta",
131
+ nodeIds,
132
+ metadata: body,
133
+ }));
134
+ }
135
+ catch (error) {
136
+ return restErrorResponse(error);
137
+ }
138
+ });
139
+ }
140
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"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"}