@kryptosai/mcp-observatory 1.31.0 → 1.32.1

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 (151) hide show
  1. package/PRIVACY.md +16 -0
  2. package/README.md +5 -11
  3. package/README.zh-CN.md +4 -10
  4. package/dist/src/cli.js +4 -2
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/commands/diff.js +24 -2
  7. package/dist/src/commands/diff.js.map +1 -1
  8. package/dist/src/commands/enforce.d.ts +2 -2
  9. package/dist/src/commands/enforce.js +5 -8
  10. package/dist/src/commands/enforce.js.map +1 -1
  11. package/dist/src/commands/scan.js.map +1 -1
  12. package/dist/src/commands/telemetry.js +41 -1
  13. package/dist/src/commands/telemetry.js.map +1 -1
  14. package/dist/src/commands/test.js +2 -2
  15. package/dist/src/commands/test.js.map +1 -1
  16. package/dist/src/diff.d.ts +5 -2
  17. package/dist/src/diff.js +23 -2
  18. package/dist/src/diff.js.map +1 -1
  19. package/dist/src/index.d.ts +1 -0
  20. package/dist/src/index.js +1 -0
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/permission-delta.d.ts +2 -0
  23. package/dist/src/permission-delta.js +99 -0
  24. package/dist/src/permission-delta.js.map +1 -0
  25. package/dist/src/reporters/common.d.ts +1 -0
  26. package/dist/src/reporters/common.js +3 -1
  27. package/dist/src/reporters/common.js.map +1 -1
  28. package/dist/src/reporters/html.js +30 -1
  29. package/dist/src/reporters/html.js.map +1 -1
  30. package/dist/src/reporters/markdown.js +21 -2
  31. package/dist/src/reporters/markdown.js.map +1 -1
  32. package/dist/src/reporters/pr-comment.js +1 -1
  33. package/dist/src/reporters/pr-comment.js.map +1 -1
  34. package/dist/src/reporters/terminal.js +9 -3
  35. package/dist/src/reporters/terminal.js.map +1 -1
  36. package/dist/src/risk-taxonomy.d.ts +16 -0
  37. package/dist/src/risk-taxonomy.js +95 -0
  38. package/dist/src/risk-taxonomy.js.map +1 -0
  39. package/dist/src/schema-diff.d.ts +2 -1
  40. package/dist/src/schema-diff.js +28 -3
  41. package/dist/src/schema-diff.js.map +1 -1
  42. package/dist/src/telemetry.d.ts +17 -0
  43. package/dist/src/telemetry.js +70 -2
  44. package/dist/src/telemetry.js.map +1 -1
  45. package/dist/src/types.d.ts +15 -0
  46. package/dist/src/validate.js +44 -2
  47. package/dist/src/validate.js.map +1 -1
  48. package/docs/mcp-server-safety-index.md +77 -15
  49. package/docs/safety-index/artifacts/antv-chart-server.json +1452 -19
  50. package/docs/safety-index/artifacts/antv-chart-server.md +156 -10
  51. package/docs/safety-index/artifacts/brave-search-server.json +341 -0
  52. package/docs/safety-index/artifacts/brave-search-server.md +201 -0
  53. package/docs/safety-index/artifacts/browsermcp-server.json +83 -18
  54. package/docs/safety-index/artifacts/browsermcp-server.md +46 -12
  55. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.json +592 -21
  56. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.md +96 -14
  57. package/docs/safety-index/artifacts/clay-server.json +66 -0
  58. package/docs/safety-index/artifacts/clay-server.md +106 -0
  59. package/docs/safety-index/artifacts/cloudflare-server.json +66 -0
  60. package/docs/safety-index/artifacts/cloudflare-server.md +106 -0
  61. package/docs/safety-index/artifacts/context7-server.json +85 -18
  62. package/docs/safety-index/artifacts/context7-server.md +52 -11
  63. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +1565 -34
  64. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +178 -17
  65. package/docs/safety-index/artifacts/docker-server.json +395 -0
  66. package/docs/safety-index/artifacts/docker-server.md +204 -0
  67. package/docs/safety-index/artifacts/everything-server.json +145 -18
  68. package/docs/safety-index/artifacts/everything-server.md +56 -11
  69. package/docs/safety-index/artifacts/exa-server.json +400 -0
  70. package/docs/safety-index/artifacts/exa-server.md +207 -0
  71. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +625 -18
  72. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +95 -11
  73. package/docs/safety-index/artifacts/fetch-server.json +66 -0
  74. package/docs/safety-index/artifacts/fetch-server.md +106 -0
  75. package/docs/safety-index/artifacts/figma-server.json +1766 -0
  76. package/docs/safety-index/artifacts/figma-server.md +256 -0
  77. package/docs/safety-index/artifacts/filesystem-mcp-server.json +428 -24
  78. package/docs/safety-index/artifacts/filesystem-mcp-server.md +75 -14
  79. package/docs/safety-index/artifacts/filesystem-server.json +426 -22
  80. package/docs/safety-index/artifacts/filesystem-server.md +73 -12
  81. package/docs/safety-index/artifacts/firecrawl-server.json +4056 -0
  82. package/docs/safety-index/artifacts/firecrawl-server.md +243 -0
  83. package/docs/safety-index/artifacts/github-mcp-server.json +374 -21
  84. package/docs/safety-index/artifacts/github-mcp-server.md +71 -15
  85. package/docs/safety-index/artifacts/gitlab-server.json +229 -0
  86. package/docs/safety-index/artifacts/gitlab-server.md +753 -0
  87. package/docs/safety-index/artifacts/gmail-server.json +66 -0
  88. package/docs/safety-index/artifacts/gmail-server.md +106 -0
  89. package/docs/safety-index/artifacts/google-calendar-server.json +66 -0
  90. package/docs/safety-index/artifacts/google-calendar-server.md +106 -0
  91. package/docs/safety-index/artifacts/google-drive-server.json +66 -0
  92. package/docs/safety-index/artifacts/google-drive-server.md +106 -0
  93. package/docs/safety-index/artifacts/google-sheets-server.json +66 -0
  94. package/docs/safety-index/artifacts/google-sheets-server.md +106 -0
  95. package/docs/safety-index/artifacts/google-tasks-server.json +66 -0
  96. package/docs/safety-index/artifacts/google-tasks-server.md +106 -0
  97. package/docs/safety-index/artifacts/huggingface-server.json +66 -0
  98. package/docs/safety-index/artifacts/huggingface-server.md +106 -0
  99. package/docs/safety-index/artifacts/jina-server.json +66 -0
  100. package/docs/safety-index/artifacts/jina-server.md +106 -0
  101. package/docs/safety-index/artifacts/kubernetes-server.json +1054 -27
  102. package/docs/safety-index/artifacts/kubernetes-server.md +137 -18
  103. package/docs/safety-index/artifacts/linear-server.json +1494 -0
  104. package/docs/safety-index/artifacts/linear-server.md +237 -0
  105. package/docs/safety-index/artifacts/memory-server.json +191 -18
  106. package/docs/safety-index/artifacts/memory-server.md +51 -9
  107. package/docs/safety-index/artifacts/mongodb-server.json +66 -0
  108. package/docs/safety-index/artifacts/mongodb-server.md +106 -0
  109. package/docs/safety-index/artifacts/neon-server.json +66 -0
  110. package/docs/safety-index/artifacts/neon-server.md +103 -0
  111. package/docs/safety-index/artifacts/notion-server.json +7151 -0
  112. package/docs/safety-index/artifacts/notion-server.md +236 -0
  113. package/docs/safety-index/artifacts/onesignal-server.json +66 -0
  114. package/docs/safety-index/artifacts/onesignal-server.md +106 -0
  115. package/docs/safety-index/artifacts/opentofu-server.json +31 -19
  116. package/docs/safety-index/artifacts/opentofu-server.md +28 -10
  117. package/docs/safety-index/artifacts/playwright-mcp-server.json +415 -24
  118. package/docs/safety-index/artifacts/playwright-mcp-server.md +84 -20
  119. package/docs/safety-index/artifacts/postgres-server.json +330 -0
  120. package/docs/safety-index/artifacts/postgres-server.md +208 -0
  121. package/docs/safety-index/artifacts/promptopia-server.json +96 -19
  122. package/docs/safety-index/artifacts/promptopia-server.md +43 -9
  123. package/docs/safety-index/artifacts/puppeteer-server.json +118 -29
  124. package/docs/safety-index/artifacts/puppeteer-server.md +61 -19
  125. package/docs/safety-index/artifacts/qdrant-server.json +66 -0
  126. package/docs/safety-index/artifacts/qdrant-server.md +106 -0
  127. package/docs/safety-index/artifacts/reddit-server.json +66 -0
  128. package/docs/safety-index/artifacts/reddit-server.md +106 -0
  129. package/docs/safety-index/artifacts/ref-tools-server.json +95 -18
  130. package/docs/safety-index/artifacts/ref-tools-server.md +45 -12
  131. package/docs/safety-index/artifacts/sentry-server.json +66 -0
  132. package/docs/safety-index/artifacts/sentry-server.md +106 -0
  133. package/docs/safety-index/artifacts/sequential-thinking-server.json +59 -18
  134. package/docs/safety-index/artifacts/sequential-thinking-server.md +41 -9
  135. package/docs/safety-index/artifacts/slack-server.json +66 -0
  136. package/docs/safety-index/artifacts/slack-server.md +102 -0
  137. package/docs/safety-index/artifacts/sqlite-server.json +67 -0
  138. package/docs/safety-index/artifacts/sqlite-server.md +106 -0
  139. package/docs/safety-index/artifacts/stripe-server.json +66 -0
  140. package/docs/safety-index/artifacts/stripe-server.md +106 -0
  141. package/docs/safety-index/artifacts/supabase-server.json +66 -0
  142. package/docs/safety-index/artifacts/supabase-server.md +102 -0
  143. package/docs/safety-index/artifacts/tavily-search-server.json +66 -0
  144. package/docs/safety-index/artifacts/tavily-search-server.md +106 -0
  145. package/docs/safety-index/artifacts/ui5-mcp-server.json +842 -0
  146. package/docs/safety-index/artifacts/ui5-mcp-server.md +232 -0
  147. package/docs/safety-index/artifacts/vercel-ai-server.json +66 -0
  148. package/docs/safety-index/artifacts/vercel-ai-server.md +106 -0
  149. package/docs/safety-index/targets.json +552 -0
  150. package/package.json +1 -1
  151. package/schemas/run-artifact.schema.json +56 -1
@@ -0,0 +1,1766 @@
1
+ {
2
+ "artifactType": "run",
3
+ "schemaVersion": "1.0.0",
4
+ "gate": "pass",
5
+ "runId": "run_2026-07-12T234424039Z_199e1d13",
6
+ "createdAt": "2026-07-12T23:44:24.039Z",
7
+ "toolVersion": "1.31.0",
8
+ "target": {
9
+ "targetId": "figma-server",
10
+ "adapter": "local-process",
11
+ "command": "npx",
12
+ "args": [
13
+ "-y",
14
+ "figma-mcp-express"
15
+ ],
16
+ "cwd": ".",
17
+ "metadata": {
18
+ "package": "figma-mcp-express",
19
+ "purpose": "mcp-safety-index",
20
+ "riskClass": "Design system access",
21
+ "failureClass": "Design/file boundary",
22
+ "whyItMatters": "Figma MCP servers can expose design files, components, and styles to agents for design-to-code workflows."
23
+ },
24
+ "serverName": "figma-mcp-express",
25
+ "serverVersion": "2.8.0"
26
+ },
27
+ "environment": {
28
+ "platform": "darwin 25.5.0",
29
+ "nodeVersion": "v22.22.1"
30
+ },
31
+ "summary": {
32
+ "total": 9,
33
+ "pass": 6,
34
+ "fail": 0,
35
+ "partial": 2,
36
+ "unsupported": 1,
37
+ "flaky": 0,
38
+ "skipped": 0,
39
+ "gate": "pass"
40
+ },
41
+ "checks": [
42
+ {
43
+ "id": "tools",
44
+ "capability": "tools",
45
+ "status": "pass",
46
+ "durationMs": 1.6067500000026484,
47
+ "message": "Advertised capability responded with the minimal expected shape (22 items).",
48
+ "evidence": [
49
+ {
50
+ "endpoint": "tools/list",
51
+ "advertised": true,
52
+ "responded": true,
53
+ "minimalShapePresent": true,
54
+ "itemCount": 22,
55
+ "identifiers": [
56
+ "batch",
57
+ "export_frames_to_pdf",
58
+ "export_tokens",
59
+ "fetch_library_catalog",
60
+ "get_batch_op_spec",
61
+ "get_design_context",
62
+ "get_local_components",
63
+ "get_metadata",
64
+ "get_node",
65
+ "get_nodes_info",
66
+ "get_pages",
67
+ "get_selection",
68
+ "get_styles",
69
+ "get_variable_defs",
70
+ "list_channels",
71
+ "list_library_variable_collections",
72
+ "save_screenshots",
73
+ "scan_nodes_by_types",
74
+ "scan_text_nodes",
75
+ "search_batch_ops",
76
+ "search_nodes",
77
+ "set_presence"
78
+ ],
79
+ "diagnostics": [
80
+ "[leader] listening on 127.0.0.1:1994",
81
+ "[node] became LEADER",
82
+ "Starting figma-mcp-express 2.8.0 (role: LEADER)"
83
+ ],
84
+ "schemas": {
85
+ "batch": {
86
+ "type": "object",
87
+ "properties": {
88
+ "channel": {
89
+ "description": "Optional. Target a specific connected file by its channel id...",
90
+ "type": "string"
91
+ },
92
+ "continueOnError": {
93
+ "description": "Override the default stop policy: true = run all ops and report...",
94
+ "type": "boolean"
95
+ },
96
+ "ops": {
97
+ "description": "Ordered ops. Each: {type: BatchOpCatalog op name, nodeIds?:...",
98
+ "items": {
99
+ "properties": {
100
+ "nodeIds": {
101
+ "items": {
102
+ "type": "string"
103
+ },
104
+ "type": "array"
105
+ },
106
+ "params": {
107
+ "type": "object"
108
+ },
109
+ "type": {
110
+ "description": "BatchOpCatalog op name, e.g. create_frame, set_fills, get_node",
111
+ "type": "string"
112
+ }
113
+ },
114
+ "required": [
115
+ "type"
116
+ ],
117
+ "type": "object"
118
+ },
119
+ "type": "array"
120
+ },
121
+ "origin": {
122
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
123
+ "enum": [
124
+ "wolfgang",
125
+ "grace",
126
+ "theo",
127
+ "sunho",
128
+ "zoe",
129
+ "taewon",
130
+ "emma",
131
+ "alex",
132
+ "rick"
133
+ ],
134
+ "type": "string"
135
+ },
136
+ "validateOnly": {
137
+ "description": "Validate the declarative batch/FigmaPlan payload and return a...",
138
+ "type": "boolean"
139
+ }
140
+ },
141
+ "required": [
142
+ "ops",
143
+ "origin"
144
+ ]
145
+ },
146
+ "export_frames_to_pdf": {
147
+ "type": "object",
148
+ "properties": {
149
+ "channel": {
150
+ "description": "Optional. Target a specific connected file by its channel id...",
151
+ "type": "string"
152
+ },
153
+ "nodeIds": {
154
+ "description": "Ordered list of frame node IDs to export as PDF pages, colon...",
155
+ "items": {
156
+ "type": "string"
157
+ },
158
+ "type": "array"
159
+ },
160
+ "origin": {
161
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
162
+ "enum": [
163
+ "wolfgang",
164
+ "grace",
165
+ "theo",
166
+ "sunho",
167
+ "zoe",
168
+ "taewon",
169
+ "emma",
170
+ "alex",
171
+ "rick"
172
+ ],
173
+ "type": "string"
174
+ },
175
+ "outputPath": {
176
+ "description": "File path to write the PDF to, must end in .pdf (relative to...",
177
+ "type": "string"
178
+ }
179
+ },
180
+ "required": [
181
+ "nodeIds",
182
+ "outputPath",
183
+ "origin"
184
+ ]
185
+ },
186
+ "export_tokens": {
187
+ "type": "object",
188
+ "properties": {
189
+ "channel": {
190
+ "description": "Optional. Target a specific connected file by its channel id...",
191
+ "type": "string"
192
+ },
193
+ "format": {
194
+ "description": "Output format: json (default) or css",
195
+ "type": "string"
196
+ },
197
+ "origin": {
198
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
199
+ "enum": [
200
+ "wolfgang",
201
+ "grace",
202
+ "theo",
203
+ "sunho",
204
+ "zoe",
205
+ "taewon",
206
+ "emma",
207
+ "alex",
208
+ "rick"
209
+ ],
210
+ "type": "string"
211
+ }
212
+ },
213
+ "required": [
214
+ "origin"
215
+ ]
216
+ },
217
+ "fetch_library_catalog": {
218
+ "type": "object",
219
+ "properties": {
220
+ "fileKey": {
221
+ "description": "Figma file key — the path segment after /design/ in the file...",
222
+ "type": "string"
223
+ },
224
+ "outPath": {
225
+ "description": "File path to write the full catalog JSON to (relative to...",
226
+ "type": "string"
227
+ },
228
+ "scope": {
229
+ "description": "Which endpoints to fetch: all (default), components,...",
230
+ "type": "string"
231
+ }
232
+ },
233
+ "required": [
234
+ "fileKey",
235
+ "outPath"
236
+ ]
237
+ },
238
+ "get_batch_op_spec": {
239
+ "type": "object",
240
+ "properties": {
241
+ "includeExamples": {
242
+ "description": "Include example op payloads when available. Default false.",
243
+ "type": "boolean"
244
+ },
245
+ "op": {
246
+ "description": "Batch op name, e.g. create_frame, set_fills, rename_node, map.",
247
+ "type": "string"
248
+ }
249
+ },
250
+ "required": [
251
+ "op"
252
+ ]
253
+ },
254
+ "get_design_context": {
255
+ "type": "object",
256
+ "properties": {
257
+ "channel": {
258
+ "description": "Optional. Target a specific connected file by its channel id...",
259
+ "type": "string"
260
+ },
261
+ "codeConnectMap": {
262
+ "description": "Optional Code-Connect map keyed by published component key →...",
263
+ "properties": {},
264
+ "type": "object"
265
+ },
266
+ "dedupe_components": {
267
+ "description": "When true, INSTANCE nodes are serialized compactly...",
268
+ "type": "boolean"
269
+ },
270
+ "depth": {
271
+ "description": "How many levels deep to traverse (default 2)",
272
+ "type": "number"
273
+ },
274
+ "detail": {
275
+ "description": "Property verbosity: minimal (id/name/type/bounds only), compact...",
276
+ "type": "string"
277
+ },
278
+ "nodeId": {
279
+ "description": "Optional. Scope to this node's subtree (e.g. 4029:12345). Omit...",
280
+ "type": "string"
281
+ },
282
+ "origin": {
283
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
284
+ "enum": [
285
+ "wolfgang",
286
+ "grace",
287
+ "theo",
288
+ "sunho",
289
+ "zoe",
290
+ "taewon",
291
+ "emma",
292
+ "alex",
293
+ "rick"
294
+ ],
295
+ "type": "string"
296
+ },
297
+ "skipInvisibleInstanceChildren": {
298
+ "description": "Optional. true = skip hidden instances' children during...",
299
+ "type": "boolean"
300
+ }
301
+ },
302
+ "required": [
303
+ "origin"
304
+ ]
305
+ },
306
+ "get_local_components": {
307
+ "type": "object",
308
+ "properties": {
309
+ "channel": {
310
+ "description": "Optional. Target a specific connected file by its channel id...",
311
+ "type": "string"
312
+ },
313
+ "origin": {
314
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
315
+ "enum": [
316
+ "wolfgang",
317
+ "grace",
318
+ "theo",
319
+ "sunho",
320
+ "zoe",
321
+ "taewon",
322
+ "emma",
323
+ "alex",
324
+ "rick"
325
+ ],
326
+ "type": "string"
327
+ },
328
+ "pageId": {
329
+ "description": "Optional — scope scan to a single page by its node ID (colon...",
330
+ "type": "string"
331
+ }
332
+ },
333
+ "required": [
334
+ "origin"
335
+ ]
336
+ },
337
+ "get_metadata": {
338
+ "type": "object",
339
+ "properties": {
340
+ "channel": {
341
+ "description": "Optional. Target a specific connected file by its channel id...",
342
+ "type": "string"
343
+ },
344
+ "origin": {
345
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
346
+ "enum": [
347
+ "wolfgang",
348
+ "grace",
349
+ "theo",
350
+ "sunho",
351
+ "zoe",
352
+ "taewon",
353
+ "emma",
354
+ "alex",
355
+ "rick"
356
+ ],
357
+ "type": "string"
358
+ }
359
+ },
360
+ "required": [
361
+ "origin"
362
+ ]
363
+ },
364
+ "get_node": {
365
+ "type": "object",
366
+ "properties": {
367
+ "channel": {
368
+ "description": "Optional. Target a specific connected file by its channel id...",
369
+ "type": "string"
370
+ },
371
+ "depth": {
372
+ "description": "How many levels deep to traverse (default: full depth). depth:0...",
373
+ "type": "number"
374
+ },
375
+ "nodeId": {
376
+ "description": "Node ID in colon format e.g. '4029:12345'",
377
+ "type": "string"
378
+ },
379
+ "origin": {
380
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
381
+ "enum": [
382
+ "wolfgang",
383
+ "grace",
384
+ "theo",
385
+ "sunho",
386
+ "zoe",
387
+ "taewon",
388
+ "emma",
389
+ "alex",
390
+ "rick"
391
+ ],
392
+ "type": "string"
393
+ },
394
+ "skipInvisibleInstanceChildren": {
395
+ "description": "Optional. true = skip hidden instances' children during...",
396
+ "type": "boolean"
397
+ }
398
+ },
399
+ "required": [
400
+ "nodeId",
401
+ "origin"
402
+ ]
403
+ },
404
+ "get_nodes_info": {
405
+ "type": "object",
406
+ "properties": {
407
+ "channel": {
408
+ "description": "Optional. Target a specific connected file by its channel id...",
409
+ "type": "string"
410
+ },
411
+ "depth": {
412
+ "description": "How many levels deep to traverse per node (default 50,...",
413
+ "type": "number"
414
+ },
415
+ "nodeIds": {
416
+ "description": "List of node IDs in colon format e.g. ['4029:12345',...",
417
+ "items": {
418
+ "type": "string"
419
+ },
420
+ "type": "array"
421
+ },
422
+ "origin": {
423
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
424
+ "enum": [
425
+ "wolfgang",
426
+ "grace",
427
+ "theo",
428
+ "sunho",
429
+ "zoe",
430
+ "taewon",
431
+ "emma",
432
+ "alex",
433
+ "rick"
434
+ ],
435
+ "type": "string"
436
+ },
437
+ "skipInvisibleInstanceChildren": {
438
+ "description": "Optional. true = skip hidden instances' children during...",
439
+ "type": "boolean"
440
+ }
441
+ },
442
+ "required": [
443
+ "nodeIds",
444
+ "origin"
445
+ ]
446
+ },
447
+ "get_pages": {
448
+ "type": "object",
449
+ "properties": {
450
+ "channel": {
451
+ "description": "Optional. Target a specific connected file by its channel id...",
452
+ "type": "string"
453
+ },
454
+ "origin": {
455
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
456
+ "enum": [
457
+ "wolfgang",
458
+ "grace",
459
+ "theo",
460
+ "sunho",
461
+ "zoe",
462
+ "taewon",
463
+ "emma",
464
+ "alex",
465
+ "rick"
466
+ ],
467
+ "type": "string"
468
+ }
469
+ },
470
+ "required": [
471
+ "origin"
472
+ ]
473
+ },
474
+ "get_selection": {
475
+ "type": "object",
476
+ "properties": {
477
+ "channel": {
478
+ "description": "Optional. Target a specific connected file by its channel id...",
479
+ "type": "string"
480
+ },
481
+ "origin": {
482
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
483
+ "enum": [
484
+ "wolfgang",
485
+ "grace",
486
+ "theo",
487
+ "sunho",
488
+ "zoe",
489
+ "taewon",
490
+ "emma",
491
+ "alex",
492
+ "rick"
493
+ ],
494
+ "type": "string"
495
+ }
496
+ },
497
+ "required": [
498
+ "origin"
499
+ ]
500
+ },
501
+ "get_styles": {
502
+ "type": "object",
503
+ "properties": {
504
+ "channel": {
505
+ "description": "Optional. Target a specific connected file by its channel id...",
506
+ "type": "string"
507
+ },
508
+ "origin": {
509
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
510
+ "enum": [
511
+ "wolfgang",
512
+ "grace",
513
+ "theo",
514
+ "sunho",
515
+ "zoe",
516
+ "taewon",
517
+ "emma",
518
+ "alex",
519
+ "rick"
520
+ ],
521
+ "type": "string"
522
+ },
523
+ "skipInvisibleInstanceChildren": {
524
+ "description": "Optional. true = skip hidden instances' children during...",
525
+ "type": "boolean"
526
+ }
527
+ },
528
+ "required": [
529
+ "origin"
530
+ ]
531
+ },
532
+ "get_variable_defs": {
533
+ "type": "object",
534
+ "properties": {
535
+ "channel": {
536
+ "description": "Optional. Target a specific connected file by its channel id...",
537
+ "type": "string"
538
+ },
539
+ "origin": {
540
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
541
+ "enum": [
542
+ "wolfgang",
543
+ "grace",
544
+ "theo",
545
+ "sunho",
546
+ "zoe",
547
+ "taewon",
548
+ "emma",
549
+ "alex",
550
+ "rick"
551
+ ],
552
+ "type": "string"
553
+ }
554
+ },
555
+ "required": [
556
+ "origin"
557
+ ]
558
+ },
559
+ "list_channels": {
560
+ "type": "object",
561
+ "properties": {},
562
+ "required": []
563
+ },
564
+ "list_library_variable_collections": {
565
+ "type": "object",
566
+ "properties": {
567
+ "channel": {
568
+ "description": "Optional. Target a specific connected file by its channel id...",
569
+ "type": "string"
570
+ },
571
+ "origin": {
572
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
573
+ "enum": [
574
+ "wolfgang",
575
+ "grace",
576
+ "theo",
577
+ "sunho",
578
+ "zoe",
579
+ "taewon",
580
+ "emma",
581
+ "alex",
582
+ "rick"
583
+ ],
584
+ "type": "string"
585
+ }
586
+ },
587
+ "required": [
588
+ "origin"
589
+ ]
590
+ },
591
+ "save_screenshots": {
592
+ "type": "object",
593
+ "properties": {
594
+ "channel": {
595
+ "description": "Optional. Target a specific connected file by its channel id...",
596
+ "type": "string"
597
+ },
598
+ "format": {
599
+ "description": "Default export format: PNG (default), SVG, JPG, or PDF",
600
+ "type": "string"
601
+ },
602
+ "items": {
603
+ "description": "List of {nodeId, outputPath, format?, scale?} objects",
604
+ "items": {
605
+ "properties": {
606
+ "format": {
607
+ "description": "Export format: PNG, SVG, JPG, or PDF",
608
+ "type": "string"
609
+ },
610
+ "nodeId": {
611
+ "description": "Node ID in colon format e.g. '4029:12345'",
612
+ "type": "string"
613
+ },
614
+ "outputPath": {
615
+ "description": "File path to write the image to",
616
+ "type": "string"
617
+ },
618
+ "scale": {
619
+ "description": "Export scale for raster formats",
620
+ "type": "number"
621
+ }
622
+ },
623
+ "required": [
624
+ "nodeId",
625
+ "outputPath"
626
+ ],
627
+ "type": "object"
628
+ },
629
+ "type": "array"
630
+ },
631
+ "origin": {
632
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
633
+ "enum": [
634
+ "wolfgang",
635
+ "grace",
636
+ "theo",
637
+ "sunho",
638
+ "zoe",
639
+ "taewon",
640
+ "emma",
641
+ "alex",
642
+ "rick"
643
+ ],
644
+ "type": "string"
645
+ },
646
+ "scale": {
647
+ "description": "Default export scale for raster formats (default 2)",
648
+ "type": "number"
649
+ }
650
+ },
651
+ "required": [
652
+ "items",
653
+ "origin"
654
+ ]
655
+ },
656
+ "scan_nodes_by_types": {
657
+ "type": "object",
658
+ "properties": {
659
+ "channel": {
660
+ "description": "Optional. Target a specific connected file by its channel id...",
661
+ "type": "string"
662
+ },
663
+ "nodeId": {
664
+ "description": "Root node ID to scan from, colon format e.g. '4029:12345'",
665
+ "type": "string"
666
+ },
667
+ "origin": {
668
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
669
+ "enum": [
670
+ "wolfgang",
671
+ "grace",
672
+ "theo",
673
+ "sunho",
674
+ "zoe",
675
+ "taewon",
676
+ "emma",
677
+ "alex",
678
+ "rick"
679
+ ],
680
+ "type": "string"
681
+ },
682
+ "skipInvisibleInstanceChildren": {
683
+ "description": "Optional. true = skip hidden instances' children during...",
684
+ "type": "boolean"
685
+ },
686
+ "types": {
687
+ "description": "Node types to find e.g. ['FRAME', 'COMPONENT', 'INSTANCE']",
688
+ "items": {
689
+ "type": "string"
690
+ },
691
+ "type": "array"
692
+ }
693
+ },
694
+ "required": [
695
+ "nodeId",
696
+ "types",
697
+ "origin"
698
+ ]
699
+ },
700
+ "scan_text_nodes": {
701
+ "type": "object",
702
+ "properties": {
703
+ "channel": {
704
+ "description": "Optional. Target a specific connected file by its channel id...",
705
+ "type": "string"
706
+ },
707
+ "nodeId": {
708
+ "description": "Root node ID to scan from, colon format e.g. '4029:12345'",
709
+ "type": "string"
710
+ },
711
+ "origin": {
712
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
713
+ "enum": [
714
+ "wolfgang",
715
+ "grace",
716
+ "theo",
717
+ "sunho",
718
+ "zoe",
719
+ "taewon",
720
+ "emma",
721
+ "alex",
722
+ "rick"
723
+ ],
724
+ "type": "string"
725
+ },
726
+ "skipInvisibleInstanceChildren": {
727
+ "description": "Optional. true = skip hidden instances' children during...",
728
+ "type": "boolean"
729
+ }
730
+ },
731
+ "required": [
732
+ "nodeId",
733
+ "origin"
734
+ ]
735
+ },
736
+ "search_batch_ops": {
737
+ "type": "object",
738
+ "properties": {
739
+ "category": {
740
+ "description": "Optional intent category filter. Featured (advanced): effects,...",
741
+ "type": "string"
742
+ },
743
+ "limit": {
744
+ "description": "Maximum matches to return. Default 20, max 100.",
745
+ "type": "number"
746
+ },
747
+ "mutates": {
748
+ "description": "Optional. true returns mutating ops; false returns non-mutating...",
749
+ "type": "boolean"
750
+ },
751
+ "query": {
752
+ "description": "Optional capability/op/param words to search. Tolerates...",
753
+ "type": "string"
754
+ },
755
+ "readOnly": {
756
+ "description": "Optional. true returns read-only ops; false returns...",
757
+ "type": "boolean"
758
+ }
759
+ },
760
+ "required": []
761
+ },
762
+ "search_nodes": {
763
+ "type": "object",
764
+ "properties": {
765
+ "channel": {
766
+ "description": "Optional. Target a specific connected file by its channel id...",
767
+ "type": "string"
768
+ },
769
+ "limit": {
770
+ "description": "Maximum results to return (default: 50)",
771
+ "type": "number"
772
+ },
773
+ "nodeId": {
774
+ "description": "Scope search to this subtree (default: current page), colon...",
775
+ "type": "string"
776
+ },
777
+ "origin": {
778
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
779
+ "enum": [
780
+ "wolfgang",
781
+ "grace",
782
+ "theo",
783
+ "sunho",
784
+ "zoe",
785
+ "taewon",
786
+ "emma",
787
+ "alex",
788
+ "rick"
789
+ ],
790
+ "type": "string"
791
+ },
792
+ "query": {
793
+ "description": "Name substring to match (case-insensitive)",
794
+ "type": "string"
795
+ },
796
+ "skipInvisibleInstanceChildren": {
797
+ "description": "Optional. true = skip hidden instances' children during...",
798
+ "type": "boolean"
799
+ },
800
+ "types": {
801
+ "description": "Filter by Figma node type e.g. ['TEXT', 'FRAME', 'COMPONENT']",
802
+ "items": {
803
+ "type": "string"
804
+ },
805
+ "type": "array"
806
+ }
807
+ },
808
+ "required": [
809
+ "query",
810
+ "origin"
811
+ ]
812
+ },
813
+ "set_presence": {
814
+ "type": "object",
815
+ "properties": {
816
+ "channel": {
817
+ "description": "Optional. Target a specific connected file by its channel id...",
818
+ "type": "string"
819
+ },
820
+ "origin": {
821
+ "description": "Origin: orchestrator/self=wolfgang; workers use assigned name....",
822
+ "enum": [
823
+ "wolfgang",
824
+ "grace",
825
+ "theo",
826
+ "sunho",
827
+ "zoe",
828
+ "taewon",
829
+ "emma",
830
+ "alex",
831
+ "rick"
832
+ ],
833
+ "type": "string"
834
+ },
835
+ "status": {
836
+ "description": "Optional presence status — the acting agent's current...",
837
+ "enum": [
838
+ "thinking",
839
+ "waiting_review",
840
+ "reviewing",
841
+ "approved",
842
+ "escalated",
843
+ "done"
844
+ ],
845
+ "type": "string"
846
+ },
847
+ "task": {
848
+ "description": "Optional one-sentence description of what you are working on...",
849
+ "maxLength": 80,
850
+ "type": "string"
851
+ }
852
+ },
853
+ "required": [
854
+ "origin"
855
+ ]
856
+ }
857
+ }
858
+ }
859
+ ]
860
+ },
861
+ {
862
+ "id": "prompts",
863
+ "capability": "prompts",
864
+ "status": "pass",
865
+ "durationMs": 0.11812499999723514,
866
+ "message": "Advertised capability responded with the minimal expected shape (4 items).",
867
+ "evidence": [
868
+ {
869
+ "endpoint": "prompts/list",
870
+ "advertised": true,
871
+ "responded": true,
872
+ "minimalShapePresent": true,
873
+ "itemCount": 4,
874
+ "identifiers": [
875
+ "design_token_generation_strategy",
876
+ "generate_color_palette",
877
+ "generate_component_variants",
878
+ "generate_type_scale"
879
+ ],
880
+ "diagnostics": [
881
+ "[leader] listening on 127.0.0.1:1994",
882
+ "[node] became LEADER",
883
+ "Starting figma-mcp-express 2.8.0 (role: LEADER)"
884
+ ]
885
+ }
886
+ ]
887
+ },
888
+ {
889
+ "id": "resources",
890
+ "capability": "resources",
891
+ "status": "unsupported",
892
+ "durationMs": 0.001082999999198364,
893
+ "message": "Resources are not advertised by the target.",
894
+ "evidence": [
895
+ {
896
+ "endpoint": "resources/list | resources/templates/list",
897
+ "advertised": false,
898
+ "responded": false,
899
+ "minimalShapePresent": false,
900
+ "diagnostics": []
901
+ }
902
+ ]
903
+ },
904
+ {
905
+ "id": "security-lite",
906
+ "capability": "security-lite",
907
+ "status": "pass",
908
+ "durationMs": 0.057124999999359716,
909
+ "message": "Found 1 security finding(s): 0 high, 0 medium, 1 low.",
910
+ "evidence": [
911
+ {
912
+ "endpoint": "security/scan-lite",
913
+ "advertised": true,
914
+ "responded": true,
915
+ "minimalShapePresent": true,
916
+ "itemCount": 1,
917
+ "identifiers": [
918
+ "list_channels"
919
+ ],
920
+ "diagnostics": [
921
+ "[low] Tool \"list_channels\" has an empty schema but is marked as destructive."
922
+ ],
923
+ "findings": [
924
+ {
925
+ "ruleId": "permissive-schema",
926
+ "severity": "low",
927
+ "toolName": "list_channels",
928
+ "message": "Tool \"list_channels\" has an empty schema but is marked as destructive."
929
+ }
930
+ ]
931
+ }
932
+ ]
933
+ },
934
+ {
935
+ "id": "runtime-profile",
936
+ "capability": "runtime-profile",
937
+ "status": "partial",
938
+ "durationMs": 0.2050840000010794,
939
+ "message": "Detected 18 potential egress target(s) and 32 potential state mutation(s) with high confidence.",
940
+ "evidence": [
941
+ {
942
+ "endpoint": "runtime-profile/analyze",
943
+ "advertised": true,
944
+ "responded": true,
945
+ "minimalShapePresent": true,
946
+ "itemCount": 50,
947
+ "diagnostics": [
948
+ "Egress entries: 18",
949
+ "State mutations: 32",
950
+ "Confidence: high"
951
+ ],
952
+ "findings": [
953
+ {
954
+ "target": "origin",
955
+ "protocol": "unknown",
956
+ "source": "tool_schema",
957
+ "confidence": "high"
958
+ },
959
+ {
960
+ "target": "origin",
961
+ "protocol": "unknown",
962
+ "source": "tool_schema",
963
+ "confidence": "high"
964
+ },
965
+ {
966
+ "target": "origin",
967
+ "protocol": "unknown",
968
+ "source": "tool_schema",
969
+ "confidence": "high"
970
+ },
971
+ {
972
+ "target": "origin",
973
+ "protocol": "unknown",
974
+ "source": "tool_schema",
975
+ "confidence": "high"
976
+ },
977
+ {
978
+ "target": "origin",
979
+ "protocol": "unknown",
980
+ "source": "tool_schema",
981
+ "confidence": "high"
982
+ },
983
+ {
984
+ "target": "origin",
985
+ "protocol": "unknown",
986
+ "source": "tool_schema",
987
+ "confidence": "high"
988
+ },
989
+ {
990
+ "target": "origin",
991
+ "protocol": "unknown",
992
+ "source": "tool_schema",
993
+ "confidence": "high"
994
+ },
995
+ {
996
+ "target": "origin",
997
+ "protocol": "unknown",
998
+ "source": "tool_schema",
999
+ "confidence": "high"
1000
+ },
1001
+ {
1002
+ "target": "origin",
1003
+ "protocol": "unknown",
1004
+ "source": "tool_schema",
1005
+ "confidence": "high"
1006
+ },
1007
+ {
1008
+ "target": "origin",
1009
+ "protocol": "unknown",
1010
+ "source": "tool_schema",
1011
+ "confidence": "high"
1012
+ },
1013
+ {
1014
+ "target": "origin",
1015
+ "protocol": "unknown",
1016
+ "source": "tool_schema",
1017
+ "confidence": "high"
1018
+ },
1019
+ {
1020
+ "target": "origin",
1021
+ "protocol": "unknown",
1022
+ "source": "tool_schema",
1023
+ "confidence": "high"
1024
+ },
1025
+ {
1026
+ "target": "origin",
1027
+ "protocol": "unknown",
1028
+ "source": "tool_schema",
1029
+ "confidence": "high"
1030
+ },
1031
+ {
1032
+ "target": "origin",
1033
+ "protocol": "unknown",
1034
+ "source": "tool_schema",
1035
+ "confidence": "high"
1036
+ },
1037
+ {
1038
+ "target": "origin",
1039
+ "protocol": "unknown",
1040
+ "source": "tool_schema",
1041
+ "confidence": "high"
1042
+ },
1043
+ {
1044
+ "target": "origin",
1045
+ "protocol": "unknown",
1046
+ "source": "tool_schema",
1047
+ "confidence": "high"
1048
+ },
1049
+ {
1050
+ "target": "origin",
1051
+ "protocol": "unknown",
1052
+ "source": "tool_schema",
1053
+ "confidence": "high"
1054
+ },
1055
+ {
1056
+ "target": "origin",
1057
+ "protocol": "unknown",
1058
+ "source": "tool_schema",
1059
+ "confidence": "high"
1060
+ },
1061
+ {
1062
+ "resource": "filesystem",
1063
+ "operation": "write",
1064
+ "scope": "working_directory",
1065
+ "source": "description_analysis"
1066
+ },
1067
+ {
1068
+ "resource": "filesystem",
1069
+ "operation": "write",
1070
+ "scope": "working_directory",
1071
+ "source": "description_analysis"
1072
+ },
1073
+ {
1074
+ "resource": "filesystem",
1075
+ "operation": "write",
1076
+ "scope": "working_directory",
1077
+ "source": "description_analysis"
1078
+ },
1079
+ {
1080
+ "resource": "filesystem",
1081
+ "operation": "write",
1082
+ "scope": "working_directory",
1083
+ "source": "description_analysis"
1084
+ },
1085
+ {
1086
+ "resource": "filesystem",
1087
+ "operation": "write",
1088
+ "scope": "working_directory",
1089
+ "source": "description_analysis"
1090
+ },
1091
+ {
1092
+ "resource": "filesystem",
1093
+ "operation": "write",
1094
+ "scope": "working_directory",
1095
+ "source": "description_analysis"
1096
+ },
1097
+ {
1098
+ "resource": "filesystem",
1099
+ "operation": "write",
1100
+ "scope": "working_directory",
1101
+ "source": "description_analysis"
1102
+ },
1103
+ {
1104
+ "resource": "filesystem",
1105
+ "operation": "write",
1106
+ "scope": "working_directory",
1107
+ "source": "description_analysis"
1108
+ },
1109
+ {
1110
+ "resource": "filesystem",
1111
+ "operation": "write",
1112
+ "scope": "working_directory",
1113
+ "source": "description_analysis"
1114
+ },
1115
+ {
1116
+ "resource": "filesystem",
1117
+ "operation": "write",
1118
+ "scope": "working_directory",
1119
+ "source": "description_analysis"
1120
+ },
1121
+ {
1122
+ "resource": "filesystem",
1123
+ "operation": "write",
1124
+ "scope": "working_directory",
1125
+ "source": "description_analysis"
1126
+ },
1127
+ {
1128
+ "resource": "filesystem",
1129
+ "operation": "write",
1130
+ "scope": "working_directory",
1131
+ "source": "description_analysis"
1132
+ },
1133
+ {
1134
+ "resource": "filesystem",
1135
+ "operation": "write",
1136
+ "scope": "working_directory",
1137
+ "source": "description_analysis"
1138
+ },
1139
+ {
1140
+ "resource": "filesystem",
1141
+ "operation": "write",
1142
+ "scope": "working_directory",
1143
+ "source": "description_analysis"
1144
+ },
1145
+ {
1146
+ "resource": "filesystem",
1147
+ "operation": "write",
1148
+ "scope": "working_directory",
1149
+ "source": "description_analysis"
1150
+ },
1151
+ {
1152
+ "resource": "filesystem",
1153
+ "operation": "write",
1154
+ "scope": "working_directory",
1155
+ "source": "description_analysis"
1156
+ },
1157
+ {
1158
+ "resource": "filesystem",
1159
+ "operation": "write",
1160
+ "scope": "working_directory",
1161
+ "source": "description_analysis"
1162
+ },
1163
+ {
1164
+ "resource": "filesystem",
1165
+ "operation": "write",
1166
+ "scope": "working_directory",
1167
+ "source": "description_analysis"
1168
+ },
1169
+ {
1170
+ "resource": "filesystem",
1171
+ "operation": "write",
1172
+ "scope": "working_directory",
1173
+ "source": "description_analysis"
1174
+ },
1175
+ {
1176
+ "resource": "filesystem",
1177
+ "operation": "write",
1178
+ "scope": "working_directory",
1179
+ "source": "description_analysis"
1180
+ },
1181
+ {
1182
+ "resource": "filesystem",
1183
+ "operation": "write",
1184
+ "scope": "working_directory",
1185
+ "source": "description_analysis"
1186
+ },
1187
+ {
1188
+ "resource": "filesystem",
1189
+ "operation": "write",
1190
+ "scope": "working_directory",
1191
+ "source": "description_analysis"
1192
+ },
1193
+ {
1194
+ "resource": "filesystem",
1195
+ "operation": "write",
1196
+ "scope": "working_directory",
1197
+ "source": "description_analysis"
1198
+ },
1199
+ {
1200
+ "resource": "filesystem",
1201
+ "operation": "write",
1202
+ "scope": "working_directory",
1203
+ "source": "description_analysis"
1204
+ },
1205
+ {
1206
+ "resource": "filesystem",
1207
+ "operation": "write",
1208
+ "scope": "working_directory",
1209
+ "source": "description_analysis"
1210
+ },
1211
+ {
1212
+ "resource": "filesystem",
1213
+ "operation": "write",
1214
+ "scope": "working_directory",
1215
+ "source": "description_analysis"
1216
+ },
1217
+ {
1218
+ "resource": "filesystem",
1219
+ "operation": "write",
1220
+ "scope": "working_directory",
1221
+ "source": "description_analysis"
1222
+ },
1223
+ {
1224
+ "resource": "filesystem",
1225
+ "operation": "write",
1226
+ "scope": "working_directory",
1227
+ "source": "description_analysis"
1228
+ },
1229
+ {
1230
+ "resource": "filesystem",
1231
+ "operation": "write",
1232
+ "scope": "working_directory",
1233
+ "source": "description_analysis"
1234
+ },
1235
+ {
1236
+ "resource": "filesystem",
1237
+ "operation": "write",
1238
+ "scope": "working_directory",
1239
+ "source": "description_analysis"
1240
+ },
1241
+ {
1242
+ "resource": "filesystem",
1243
+ "operation": "write",
1244
+ "scope": "working_directory",
1245
+ "source": "description_analysis"
1246
+ },
1247
+ {
1248
+ "resource": "filesystem",
1249
+ "operation": "write",
1250
+ "scope": "working_directory",
1251
+ "source": "description_analysis"
1252
+ }
1253
+ ]
1254
+ }
1255
+ ]
1256
+ },
1257
+ {
1258
+ "id": "conformance",
1259
+ "capability": "conformance",
1260
+ "status": "pass",
1261
+ "durationMs": 2.2190410000002885,
1262
+ "message": "All 7 conformance checks passed.",
1263
+ "evidence": [
1264
+ {
1265
+ "endpoint": "conformance/check",
1266
+ "advertised": true,
1267
+ "responded": true,
1268
+ "minimalShapePresent": true,
1269
+ "itemCount": 7,
1270
+ "identifiers": [],
1271
+ "diagnostics": [
1272
+ "[pass] capabilities-present: Server returned capabilities object.",
1273
+ "[pass] server-info: Server provided initialization info.",
1274
+ "[pass] tools-capability-match: tools/list returned 22 tool(s).",
1275
+ "[pass] prompts-capability-match: prompts/list returned 4 prompt(s).",
1276
+ "[pass] resources-capability-match: Resources not advertised — endpoint check skipped.",
1277
+ "[pass] tool-response-content: Tool \"list_channels\" response has valid content array.",
1278
+ "[pass] error-handling: Server returned proper error code -32601 for unknown method."
1279
+ ]
1280
+ }
1281
+ ]
1282
+ },
1283
+ {
1284
+ "id": "schema-quality",
1285
+ "capability": "schema-quality",
1286
+ "status": "pass",
1287
+ "durationMs": 1.7518750000017462,
1288
+ "message": "All 26 item(s) have good schema quality.",
1289
+ "evidence": [
1290
+ {
1291
+ "endpoint": "schema-quality/scan",
1292
+ "advertised": true,
1293
+ "responded": true,
1294
+ "minimalShapePresent": true,
1295
+ "itemCount": 0,
1296
+ "identifiers": []
1297
+ }
1298
+ ]
1299
+ },
1300
+ {
1301
+ "id": "security",
1302
+ "capability": "security",
1303
+ "status": "pass",
1304
+ "durationMs": 1.2406249999985448,
1305
+ "message": "Found 1 security finding(s): 0 high, 0 medium, 1 low.",
1306
+ "evidence": [
1307
+ {
1308
+ "endpoint": "security/scan",
1309
+ "advertised": true,
1310
+ "responded": true,
1311
+ "minimalShapePresent": true,
1312
+ "itemCount": 1,
1313
+ "identifiers": [
1314
+ "list_channels"
1315
+ ],
1316
+ "diagnostics": [
1317
+ "[low] Tool \"list_channels\" has an empty schema but is marked as destructive."
1318
+ ],
1319
+ "findings": [
1320
+ {
1321
+ "ruleId": "permissive-schema",
1322
+ "severity": "low",
1323
+ "toolName": "list_channels",
1324
+ "message": "Tool \"list_channels\" has an empty schema but is marked as destructive."
1325
+ }
1326
+ ]
1327
+ }
1328
+ ]
1329
+ },
1330
+ {
1331
+ "id": "attack-sim",
1332
+ "capability": "attack-sim",
1333
+ "status": "partial",
1334
+ "durationMs": 2.757000000001426,
1335
+ "message": "Safe attack simulation found 2 finding(s): 0 high, 2 medium, 0 low.",
1336
+ "evidence": [
1337
+ {
1338
+ "endpoint": "attack-sim/safe",
1339
+ "advertised": true,
1340
+ "responded": true,
1341
+ "minimalShapePresent": true,
1342
+ "itemCount": 2,
1343
+ "identifiers": [
1344
+ "search_batch_ops",
1345
+ "search_nodes"
1346
+ ],
1347
+ "diagnostics": [
1348
+ "[medium] Tool \"search_batch_ops\" combines broad parameters (query) with destructive or non-read-only behavior.",
1349
+ "[medium] Tool \"search_nodes\" combines broad parameters (query) with destructive or non-read-only behavior."
1350
+ ],
1351
+ "findings": [
1352
+ {
1353
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
1354
+ "attackClass": "permission-boundary",
1355
+ "severity": "medium",
1356
+ "itemType": "tool",
1357
+ "itemName": "search_batch_ops",
1358
+ "message": "Tool \"search_batch_ops\" combines broad parameters (query) with destructive or non-read-only behavior.",
1359
+ "evidence": {
1360
+ "broadParams": [
1361
+ "query"
1362
+ ],
1363
+ "annotations": {
1364
+ "readOnlyHint": false,
1365
+ "destructiveHint": true,
1366
+ "idempotentHint": false,
1367
+ "openWorldHint": true
1368
+ },
1369
+ "description": "Search BatchOpCatalog by intent, op name, category, read/write flag, or param key before get_batch_op_spec."
1370
+ },
1371
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
1372
+ "recommendedAction": "gate"
1373
+ },
1374
+ {
1375
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
1376
+ "attackClass": "permission-boundary",
1377
+ "severity": "medium",
1378
+ "itemType": "tool",
1379
+ "itemName": "search_nodes",
1380
+ "message": "Tool \"search_nodes\" combines broad parameters (query) with destructive or non-read-only behavior.",
1381
+ "evidence": {
1382
+ "broadParams": [
1383
+ "query"
1384
+ ],
1385
+ "annotations": {
1386
+ "readOnlyHint": false,
1387
+ "destructiveHint": true,
1388
+ "idempotentHint": false,
1389
+ "openWorldHint": true
1390
+ },
1391
+ "description": "Find nodes by name substring and optional type filter. Scope with nodeId and limit."
1392
+ },
1393
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
1394
+ "recommendedAction": "gate"
1395
+ }
1396
+ ]
1397
+ }
1398
+ ]
1399
+ }
1400
+ ],
1401
+ "healthScore": {
1402
+ "overall": 94,
1403
+ "grade": "A",
1404
+ "dimensions": [
1405
+ {
1406
+ "name": "Protocol Compliance",
1407
+ "weight": 0.3,
1408
+ "score": 100,
1409
+ "details": [
1410
+ "conformance: pass (100/100)"
1411
+ ]
1412
+ },
1413
+ {
1414
+ "name": "Schema Quality",
1415
+ "weight": 0.2,
1416
+ "score": 100,
1417
+ "details": [
1418
+ "schema-quality: pass (100/100)"
1419
+ ]
1420
+ },
1421
+ {
1422
+ "name": "Security",
1423
+ "weight": 0.2,
1424
+ "score": 87,
1425
+ "details": [
1426
+ "security-lite: pass (100/100)",
1427
+ "security: pass (100/100)",
1428
+ "attack-sim: partial (60/100)"
1429
+ ]
1430
+ },
1431
+ {
1432
+ "name": "Reliability",
1433
+ "weight": 0.2,
1434
+ "score": 83,
1435
+ "details": [
1436
+ "tools: pass (100/100)",
1437
+ "prompts: pass (100/100)",
1438
+ "resources: unsupported (50/100)"
1439
+ ]
1440
+ },
1441
+ {
1442
+ "name": "Performance",
1443
+ "weight": 0.1,
1444
+ "score": 100,
1445
+ "details": [
1446
+ "Connect: 872ms",
1447
+ "p95 latency: 2ms (3 operations)"
1448
+ ]
1449
+ }
1450
+ ]
1451
+ },
1452
+ "performanceMetrics": {
1453
+ "connectMs": 872.3659589999988,
1454
+ "toolsListMs": 1.6067500000026484,
1455
+ "promptsListMs": 0.11812499999723514,
1456
+ "resourcesListMs": 0.001082999999198364
1457
+ },
1458
+ "runtimeProfile": {
1459
+ "egress": [
1460
+ {
1461
+ "target": "origin",
1462
+ "protocol": "unknown",
1463
+ "source": "tool_schema",
1464
+ "confidence": "high"
1465
+ },
1466
+ {
1467
+ "target": "origin",
1468
+ "protocol": "unknown",
1469
+ "source": "tool_schema",
1470
+ "confidence": "high"
1471
+ },
1472
+ {
1473
+ "target": "origin",
1474
+ "protocol": "unknown",
1475
+ "source": "tool_schema",
1476
+ "confidence": "high"
1477
+ },
1478
+ {
1479
+ "target": "origin",
1480
+ "protocol": "unknown",
1481
+ "source": "tool_schema",
1482
+ "confidence": "high"
1483
+ },
1484
+ {
1485
+ "target": "origin",
1486
+ "protocol": "unknown",
1487
+ "source": "tool_schema",
1488
+ "confidence": "high"
1489
+ },
1490
+ {
1491
+ "target": "origin",
1492
+ "protocol": "unknown",
1493
+ "source": "tool_schema",
1494
+ "confidence": "high"
1495
+ },
1496
+ {
1497
+ "target": "origin",
1498
+ "protocol": "unknown",
1499
+ "source": "tool_schema",
1500
+ "confidence": "high"
1501
+ },
1502
+ {
1503
+ "target": "origin",
1504
+ "protocol": "unknown",
1505
+ "source": "tool_schema",
1506
+ "confidence": "high"
1507
+ },
1508
+ {
1509
+ "target": "origin",
1510
+ "protocol": "unknown",
1511
+ "source": "tool_schema",
1512
+ "confidence": "high"
1513
+ },
1514
+ {
1515
+ "target": "origin",
1516
+ "protocol": "unknown",
1517
+ "source": "tool_schema",
1518
+ "confidence": "high"
1519
+ },
1520
+ {
1521
+ "target": "origin",
1522
+ "protocol": "unknown",
1523
+ "source": "tool_schema",
1524
+ "confidence": "high"
1525
+ },
1526
+ {
1527
+ "target": "origin",
1528
+ "protocol": "unknown",
1529
+ "source": "tool_schema",
1530
+ "confidence": "high"
1531
+ },
1532
+ {
1533
+ "target": "origin",
1534
+ "protocol": "unknown",
1535
+ "source": "tool_schema",
1536
+ "confidence": "high"
1537
+ },
1538
+ {
1539
+ "target": "origin",
1540
+ "protocol": "unknown",
1541
+ "source": "tool_schema",
1542
+ "confidence": "high"
1543
+ },
1544
+ {
1545
+ "target": "origin",
1546
+ "protocol": "unknown",
1547
+ "source": "tool_schema",
1548
+ "confidence": "high"
1549
+ },
1550
+ {
1551
+ "target": "origin",
1552
+ "protocol": "unknown",
1553
+ "source": "tool_schema",
1554
+ "confidence": "high"
1555
+ },
1556
+ {
1557
+ "target": "origin",
1558
+ "protocol": "unknown",
1559
+ "source": "tool_schema",
1560
+ "confidence": "high"
1561
+ },
1562
+ {
1563
+ "target": "origin",
1564
+ "protocol": "unknown",
1565
+ "source": "tool_schema",
1566
+ "confidence": "high"
1567
+ }
1568
+ ],
1569
+ "stateMutations": [
1570
+ {
1571
+ "resource": "filesystem",
1572
+ "operation": "write",
1573
+ "scope": "working_directory",
1574
+ "source": "description_analysis"
1575
+ },
1576
+ {
1577
+ "resource": "filesystem",
1578
+ "operation": "write",
1579
+ "scope": "working_directory",
1580
+ "source": "description_analysis"
1581
+ },
1582
+ {
1583
+ "resource": "filesystem",
1584
+ "operation": "write",
1585
+ "scope": "working_directory",
1586
+ "source": "description_analysis"
1587
+ },
1588
+ {
1589
+ "resource": "filesystem",
1590
+ "operation": "write",
1591
+ "scope": "working_directory",
1592
+ "source": "description_analysis"
1593
+ },
1594
+ {
1595
+ "resource": "filesystem",
1596
+ "operation": "write",
1597
+ "scope": "working_directory",
1598
+ "source": "description_analysis"
1599
+ },
1600
+ {
1601
+ "resource": "filesystem",
1602
+ "operation": "write",
1603
+ "scope": "working_directory",
1604
+ "source": "description_analysis"
1605
+ },
1606
+ {
1607
+ "resource": "filesystem",
1608
+ "operation": "write",
1609
+ "scope": "working_directory",
1610
+ "source": "description_analysis"
1611
+ },
1612
+ {
1613
+ "resource": "filesystem",
1614
+ "operation": "write",
1615
+ "scope": "working_directory",
1616
+ "source": "description_analysis"
1617
+ },
1618
+ {
1619
+ "resource": "filesystem",
1620
+ "operation": "write",
1621
+ "scope": "working_directory",
1622
+ "source": "description_analysis"
1623
+ },
1624
+ {
1625
+ "resource": "filesystem",
1626
+ "operation": "write",
1627
+ "scope": "working_directory",
1628
+ "source": "description_analysis"
1629
+ },
1630
+ {
1631
+ "resource": "filesystem",
1632
+ "operation": "write",
1633
+ "scope": "working_directory",
1634
+ "source": "description_analysis"
1635
+ },
1636
+ {
1637
+ "resource": "filesystem",
1638
+ "operation": "write",
1639
+ "scope": "working_directory",
1640
+ "source": "description_analysis"
1641
+ },
1642
+ {
1643
+ "resource": "filesystem",
1644
+ "operation": "write",
1645
+ "scope": "working_directory",
1646
+ "source": "description_analysis"
1647
+ },
1648
+ {
1649
+ "resource": "filesystem",
1650
+ "operation": "write",
1651
+ "scope": "working_directory",
1652
+ "source": "description_analysis"
1653
+ },
1654
+ {
1655
+ "resource": "filesystem",
1656
+ "operation": "write",
1657
+ "scope": "working_directory",
1658
+ "source": "description_analysis"
1659
+ },
1660
+ {
1661
+ "resource": "filesystem",
1662
+ "operation": "write",
1663
+ "scope": "working_directory",
1664
+ "source": "description_analysis"
1665
+ },
1666
+ {
1667
+ "resource": "filesystem",
1668
+ "operation": "write",
1669
+ "scope": "working_directory",
1670
+ "source": "description_analysis"
1671
+ },
1672
+ {
1673
+ "resource": "filesystem",
1674
+ "operation": "write",
1675
+ "scope": "working_directory",
1676
+ "source": "description_analysis"
1677
+ },
1678
+ {
1679
+ "resource": "filesystem",
1680
+ "operation": "write",
1681
+ "scope": "working_directory",
1682
+ "source": "description_analysis"
1683
+ },
1684
+ {
1685
+ "resource": "filesystem",
1686
+ "operation": "write",
1687
+ "scope": "working_directory",
1688
+ "source": "description_analysis"
1689
+ },
1690
+ {
1691
+ "resource": "filesystem",
1692
+ "operation": "write",
1693
+ "scope": "working_directory",
1694
+ "source": "description_analysis"
1695
+ },
1696
+ {
1697
+ "resource": "filesystem",
1698
+ "operation": "write",
1699
+ "scope": "working_directory",
1700
+ "source": "description_analysis"
1701
+ },
1702
+ {
1703
+ "resource": "filesystem",
1704
+ "operation": "write",
1705
+ "scope": "working_directory",
1706
+ "source": "description_analysis"
1707
+ },
1708
+ {
1709
+ "resource": "filesystem",
1710
+ "operation": "write",
1711
+ "scope": "working_directory",
1712
+ "source": "description_analysis"
1713
+ },
1714
+ {
1715
+ "resource": "filesystem",
1716
+ "operation": "write",
1717
+ "scope": "working_directory",
1718
+ "source": "description_analysis"
1719
+ },
1720
+ {
1721
+ "resource": "filesystem",
1722
+ "operation": "write",
1723
+ "scope": "working_directory",
1724
+ "source": "description_analysis"
1725
+ },
1726
+ {
1727
+ "resource": "filesystem",
1728
+ "operation": "write",
1729
+ "scope": "working_directory",
1730
+ "source": "description_analysis"
1731
+ },
1732
+ {
1733
+ "resource": "filesystem",
1734
+ "operation": "write",
1735
+ "scope": "working_directory",
1736
+ "source": "description_analysis"
1737
+ },
1738
+ {
1739
+ "resource": "filesystem",
1740
+ "operation": "write",
1741
+ "scope": "working_directory",
1742
+ "source": "description_analysis"
1743
+ },
1744
+ {
1745
+ "resource": "filesystem",
1746
+ "operation": "write",
1747
+ "scope": "working_directory",
1748
+ "source": "description_analysis"
1749
+ },
1750
+ {
1751
+ "resource": "filesystem",
1752
+ "operation": "write",
1753
+ "scope": "working_directory",
1754
+ "source": "description_analysis"
1755
+ },
1756
+ {
1757
+ "resource": "filesystem",
1758
+ "operation": "write",
1759
+ "scope": "working_directory",
1760
+ "source": "description_analysis"
1761
+ }
1762
+ ],
1763
+ "analyzedAt": "2026-07-12T23:44:24.914Z",
1764
+ "confidence": "high"
1765
+ }
1766
+ }