@kryptosai/mcp-observatory 0.27.0 → 1.28.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 (160) hide show
  1. package/COMMERCIAL.md +28 -2
  2. package/CONTRIBUTORS.md +39 -0
  3. package/README.md +114 -22
  4. package/dist/src/action-receipt.d.ts +20 -0
  5. package/dist/src/action-receipt.js +85 -0
  6. package/dist/src/action-receipt.js.map +1 -0
  7. package/dist/src/adapters/http.js +1 -5
  8. package/dist/src/adapters/http.js.map +1 -1
  9. package/dist/src/audit.d.ts +64 -0
  10. package/dist/src/audit.js +359 -0
  11. package/dist/src/audit.js.map +1 -0
  12. package/dist/src/cassette.js +3 -2
  13. package/dist/src/cassette.js.map +1 -1
  14. package/dist/src/checks/attack-sim.d.ts +20 -0
  15. package/dist/src/checks/attack-sim.js +316 -0
  16. package/dist/src/checks/attack-sim.js.map +1 -0
  17. package/dist/src/ci-issue.js +4 -3
  18. package/dist/src/ci-issue.js.map +1 -1
  19. package/dist/src/cli.js +25 -4
  20. package/dist/src/cli.js.map +1 -1
  21. package/dist/src/commands/attack-sim.d.ts +2 -0
  22. package/dist/src/commands/attack-sim.js +220 -0
  23. package/dist/src/commands/attack-sim.js.map +1 -0
  24. package/dist/src/commands/audit.d.ts +2 -0
  25. package/dist/src/commands/audit.js +132 -0
  26. package/dist/src/commands/audit.js.map +1 -0
  27. package/dist/src/commands/init-ci.d.ts +3 -0
  28. package/dist/src/commands/init-ci.js +78 -13
  29. package/dist/src/commands/init-ci.js.map +1 -1
  30. package/dist/src/commands/legacy.js +8 -1
  31. package/dist/src/commands/legacy.js.map +1 -1
  32. package/dist/src/commands/receipt.d.ts +2 -0
  33. package/dist/src/commands/receipt.js +113 -0
  34. package/dist/src/commands/receipt.js.map +1 -0
  35. package/dist/src/commands/scan.js +30 -6
  36. package/dist/src/commands/scan.js.map +1 -1
  37. package/dist/src/commands/score.js +63 -0
  38. package/dist/src/commands/score.js.map +1 -1
  39. package/dist/src/commands/serve.js +9 -1
  40. package/dist/src/commands/serve.js.map +1 -1
  41. package/dist/src/commands/setup-ci-conversion.d.ts +3 -1
  42. package/dist/src/commands/setup-ci-conversion.js +23 -8
  43. package/dist/src/commands/setup-ci-conversion.js.map +1 -1
  44. package/dist/src/commands/telemetry.js +20 -14
  45. package/dist/src/commands/telemetry.js.map +1 -1
  46. package/dist/src/commands/test.js +31 -2
  47. package/dist/src/commands/test.js.map +1 -1
  48. package/dist/src/findings.d.ts +1 -0
  49. package/dist/src/findings.js +42 -1
  50. package/dist/src/findings.js.map +1 -1
  51. package/dist/src/history.js +3 -2
  52. package/dist/src/history.js.map +1 -1
  53. package/dist/src/index.d.ts +4 -0
  54. package/dist/src/index.js +4 -0
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/integrations/smithery.js +5 -1
  57. package/dist/src/integrations/smithery.js.map +1 -1
  58. package/dist/src/receipt.d.ts +100 -0
  59. package/dist/src/receipt.js +375 -0
  60. package/dist/src/receipt.js.map +1 -0
  61. package/dist/src/reporters/attack-sim.d.ts +2 -0
  62. package/dist/src/reporters/attack-sim.js +89 -0
  63. package/dist/src/reporters/attack-sim.js.map +1 -0
  64. package/dist/src/reporters/pr-comment.js +20 -6
  65. package/dist/src/reporters/pr-comment.js.map +1 -1
  66. package/dist/src/reporters/sarif.js +11 -1
  67. package/dist/src/reporters/sarif.js.map +1 -1
  68. package/dist/src/runner.d.ts +3 -0
  69. package/dist/src/runner.js +5 -0
  70. package/dist/src/runner.js.map +1 -1
  71. package/dist/src/score.js +1 -1
  72. package/dist/src/score.js.map +1 -1
  73. package/dist/src/security-profiles.d.ts +13 -0
  74. package/dist/src/security-profiles.js +59 -0
  75. package/dist/src/security-profiles.js.map +1 -0
  76. package/dist/src/storage.js +3 -2
  77. package/dist/src/storage.js.map +1 -1
  78. package/dist/src/telemetry.d.ts +10 -0
  79. package/dist/src/telemetry.js +17 -1
  80. package/dist/src/telemetry.js.map +1 -1
  81. package/dist/src/types.d.ts +1 -1
  82. package/dist/src/utils/files.d.ts +1 -0
  83. package/dist/src/utils/files.js +21 -0
  84. package/dist/src/utils/files.js.map +1 -0
  85. package/dist/src/utils/ids.js +18 -5
  86. package/dist/src/utils/ids.js.map +1 -1
  87. package/dist/src/utils/url.d.ts +2 -0
  88. package/dist/src/utils/url.js +15 -0
  89. package/dist/src/utils/url.js.map +1 -0
  90. package/dist/src/validate.js +1 -1
  91. package/dist/src/validate.js.map +1 -1
  92. package/docs/10x-agentic-growth-sprint.md +47 -0
  93. package/docs/agent-ecosystem-promotion-plan.md +244 -0
  94. package/docs/agent-tasks.md +95 -0
  95. package/docs/agentic-contributor-outreach.md +52 -0
  96. package/docs/automatic-ci-integration.md +33 -0
  97. package/docs/campaign-attribution.md +58 -0
  98. package/docs/code-scanning-demo.md +57 -0
  99. package/docs/commercial-boundary.md +83 -0
  100. package/docs/contributor-proof-cards/README.md +33 -0
  101. package/docs/contributor-recognition.md +92 -0
  102. package/docs/examples/nsa-mcp-audit-report.md +372 -0
  103. package/docs/examples/nsa-mcp-results.sarif +930 -0
  104. package/docs/examples/nsa-mcp-score.json +13 -0
  105. package/docs/feishu-lark-mcp.md +1 -1
  106. package/docs/github-code-scanning-for-mcp.md +1 -1
  107. package/docs/government-enterprise-pilot.md +93 -0
  108. package/docs/launch.md +64 -0
  109. package/docs/mcp-attack-simulator.md +57 -0
  110. package/docs/mcp-receipts.md +109 -0
  111. package/docs/mcp-server-safety-index.md +29 -22
  112. package/docs/nsa-mcp-audit-ci.md +88 -0
  113. package/docs/procurement-one-pager.md +74 -0
  114. package/docs/proof.md +5 -2
  115. package/docs/public-guidance-crosswalk.md +48 -0
  116. package/docs/receipt-graph.md +54 -0
  117. package/docs/safety-index/artifacts/antv-chart-server.json +40 -22
  118. package/docs/safety-index/artifacts/antv-chart-server.md +22 -9
  119. package/docs/safety-index/artifacts/browsermcp-server.json +36 -18
  120. package/docs/safety-index/artifacts/browsermcp-server.md +22 -9
  121. package/docs/safety-index/artifacts/context7-server.json +83 -26
  122. package/docs/safety-index/artifacts/context7-server.md +33 -20
  123. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2438 -0
  124. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +176 -0
  125. package/docs/safety-index/artifacts/everything-server.json +150 -57
  126. package/docs/safety-index/artifacts/everything-server.md +36 -23
  127. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +162 -19
  128. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +25 -12
  129. package/docs/safety-index/artifacts/filesystem-server.json +221 -19
  130. package/docs/safety-index/artifacts/filesystem-server.md +24 -11
  131. package/docs/safety-index/artifacts/kubernetes-server.attack.json +1559 -0
  132. package/docs/safety-index/artifacts/kubernetes-server.attack.md +43 -0
  133. package/docs/safety-index/artifacts/kubernetes-server.attack.sarif +2857 -0
  134. package/docs/safety-index/artifacts/kubernetes-server.json +1573 -0
  135. package/docs/safety-index/artifacts/kubernetes-server.md +176 -0
  136. package/docs/safety-index/artifacts/memory-server.json +93 -32
  137. package/docs/safety-index/artifacts/memory-server.md +45 -25
  138. package/docs/safety-index/artifacts/opentofu-server.json +44 -18
  139. package/docs/safety-index/artifacts/opentofu-server.md +23 -10
  140. package/docs/safety-index/artifacts/playwright-mcp-server.json +177 -21
  141. package/docs/safety-index/artifacts/playwright-mcp-server.md +27 -14
  142. package/docs/safety-index/artifacts/promptopia-server.json +45 -19
  143. package/docs/safety-index/artifacts/promptopia-server.md +21 -8
  144. package/docs/safety-index/artifacts/puppeteer-server.json +77 -22
  145. package/docs/safety-index/artifacts/puppeteer-server.md +28 -15
  146. package/docs/safety-index/artifacts/ref-tools-server.json +36 -18
  147. package/docs/safety-index/artifacts/ref-tools-server.md +21 -8
  148. package/docs/safety-index/artifacts/sequential-thinking-server.json +38 -21
  149. package/docs/safety-index/artifacts/sequential-thinking-server.md +22 -9
  150. package/docs/safety-index/targets.json +90 -14
  151. package/docs/security-due-diligence.md +87 -0
  152. package/docs/setup-ci-doctor.md +13 -1
  153. package/docs/target-gallery.md +49 -0
  154. package/docs/target-registry.md +5 -1
  155. package/docs/tool-call-receipts.md +115 -0
  156. package/examples/insecure-mcp-server/mcp-observatory.target.json +13 -0
  157. package/examples/insecure-mcp-server/server.mjs +62 -0
  158. package/package.json +31 -2
  159. package/schemas/run-artifact.schema.json +1 -0
  160. package/scripts/postinstall.mjs +138 -0
@@ -2,9 +2,9 @@
2
2
  "artifactType": "run",
3
3
  "schemaVersion": "1.0.0",
4
4
  "gate": "pass",
5
- "runId": "run_2026-06-24T020729328Z_2a54782d",
6
- "createdAt": "2026-06-24T02:07:29.328Z",
7
- "toolVersion": "0.24.0",
5
+ "runId": "run_2026-07-06T194953212Z_e649da15",
6
+ "createdAt": "2026-07-06T19:49:53.212Z",
7
+ "toolVersion": "0.28.0",
8
8
  "target": {
9
9
  "targetId": "opentofu-server",
10
10
  "adapter": "local-process",
@@ -29,8 +29,8 @@
29
29
  "nodeVersion": "v22.22.1"
30
30
  },
31
31
  "summary": {
32
- "total": 7,
33
- "pass": 5,
32
+ "total": 8,
33
+ "pass": 6,
34
34
  "fail": 0,
35
35
  "partial": 1,
36
36
  "unsupported": 1,
@@ -43,7 +43,7 @@
43
43
  "id": "tools",
44
44
  "capability": "tools",
45
45
  "status": "pass",
46
- "durationMs": 2.47979099999975,
46
+ "durationMs": 1.897333000000799,
47
47
  "message": "Advertised capability responded with the minimal expected shape (5 items).",
48
48
  "evidence": [
49
49
  {
@@ -206,7 +206,7 @@
206
206
  "id": "prompts",
207
207
  "capability": "prompts",
208
208
  "status": "unsupported",
209
- "durationMs": 0.0038340000010066433,
209
+ "durationMs": 0.005124999999679858,
210
210
  "message": "Prompts are not advertised by the target.",
211
211
  "evidence": [
212
212
  {
@@ -222,7 +222,7 @@
222
222
  "id": "resources",
223
223
  "capability": "resources",
224
224
  "status": "pass",
225
- "durationMs": 1.4208330000001297,
225
+ "durationMs": 0.5354160000006232,
226
226
  "message": "Advertised capability responded with the minimal expected shape (1 items).",
227
227
  "evidence": [
228
228
  {
@@ -251,7 +251,7 @@
251
251
  "id": "security-lite",
252
252
  "capability": "security-lite",
253
253
  "status": "pass",
254
- "durationMs": 0.03974999999991269,
254
+ "durationMs": 0.022249999999985448,
255
255
  "message": "No security issues detected (lightweight scan).",
256
256
  "evidence": [
257
257
  {
@@ -267,7 +267,7 @@
267
267
  "id": "conformance",
268
268
  "capability": "conformance",
269
269
  "status": "pass",
270
- "durationMs": 2.5802920000005543,
270
+ "durationMs": 0.7052499999990687,
271
271
  "message": "All 7 conformance checks passed.",
272
272
  "evidence": [
273
273
  {
@@ -293,7 +293,7 @@
293
293
  "id": "schema-quality",
294
294
  "capability": "schema-quality",
295
295
  "status": "partial",
296
- "durationMs": 0.7996249999996508,
296
+ "durationMs": 0.49095800000031886,
297
297
  "message": "Found 1 quality finding(s) across 6 item(s): 1 warnings, 0 info.",
298
298
  "evidence": [
299
299
  {
@@ -307,6 +307,14 @@
307
307
  ],
308
308
  "diagnostics": [
309
309
  "[warning] resource \"opentofu-registry-info\": Missing description"
310
+ ],
311
+ "findings": [
312
+ {
313
+ "itemType": "resource",
314
+ "itemName": "opentofu-registry-info",
315
+ "issue": "Missing description",
316
+ "severity": "warning"
317
+ }
310
318
  ]
311
319
  }
312
320
  ]
@@ -315,7 +323,7 @@
315
323
  "id": "security",
316
324
  "capability": "security",
317
325
  "status": "pass",
318
- "durationMs": 0.36629200000061246,
326
+ "durationMs": 0.15554200000042329,
319
327
  "message": "No security issues detected.",
320
328
  "evidence": [
321
329
  {
@@ -326,6 +334,23 @@
326
334
  "itemCount": 0
327
335
  }
328
336
  ]
337
+ },
338
+ {
339
+ "id": "attack-sim",
340
+ "capability": "attack-sim",
341
+ "status": "pass",
342
+ "durationMs": 0.4453749999993306,
343
+ "message": "Safe attack simulation found no high-risk MCP attack-readiness findings.",
344
+ "evidence": [
345
+ {
346
+ "endpoint": "attack-sim/safe",
347
+ "advertised": true,
348
+ "responded": true,
349
+ "minimalShapePresent": true,
350
+ "itemCount": 0,
351
+ "identifiers": []
352
+ }
353
+ ]
329
354
  }
330
355
  ],
331
356
  "healthScore": {
@@ -354,7 +379,8 @@
354
379
  "score": 100,
355
380
  "details": [
356
381
  "security-lite: pass (100/100)",
357
- "security: pass (100/100)"
382
+ "security: pass (100/100)",
383
+ "attack-sim: pass (100/100)"
358
384
  ]
359
385
  },
360
386
  {
@@ -372,16 +398,16 @@
372
398
  "weight": 0.1,
373
399
  "score": 100,
374
400
  "details": [
375
- "Connect: 940ms",
401
+ "Connect: 773ms",
376
402
  "p95 latency: 2ms (3 operations)"
377
403
  ]
378
404
  }
379
405
  ]
380
406
  },
381
407
  "performanceMetrics": {
382
- "connectMs": 940.4044579999991,
383
- "toolsListMs": 2.47979099999975,
384
- "promptsListMs": 0.0038340000010066433,
385
- "resourcesListMs": 1.4208330000001297
408
+ "connectMs": 772.5637079999997,
409
+ "toolsListMs": 1.897333000000799,
410
+ "promptsListMs": 0.005124999999679858,
411
+ "resourcesListMs": 0.5354160000006232
386
412
  }
387
413
  }
@@ -1,6 +1,6 @@
1
1
  # MCP Observatory Run Report
2
2
 
3
- Generated at 2026-06-24T02:07:29.328Z
3
+ Generated at 2026-07-06T19:49:53.212Z
4
4
 
5
5
  ## Target and Environment Metadata
6
6
 
@@ -25,7 +25,7 @@ Generated at 2026-06-24T02:07:29.328Z
25
25
 
26
26
  | Gate | Total | Pass | Fail | Partial | Unsupported | Flaky | Skipped |
27
27
  | --- | --- | --- | --- | --- | --- | --- | --- |
28
- | pass | 7 | 5 | 0 | 1 | 1 | 0 | 0 |
28
+ | pass | 8 | 6 | 0 | 1 | 1 | 0 | 0 |
29
29
 
30
30
  ## At a Glance
31
31
 
@@ -47,16 +47,29 @@ _Use the `diff` command against another run artifact to classify regressions and
47
47
 
48
48
  | Focus | Check | Status | Duration (ms) | Message |
49
49
  | --- | --- | --- | --- | --- |
50
- | healthy | conformance | pass | 2.58 | All 7 conformance checks passed. |
51
- | healthy | resources | pass | 1.42 | Advertised capability responded with the minimal expected shape (1 items). |
52
- | healthy | security | pass | 0.37 | No security issues detected. |
53
- | healthy | security-lite | pass | 0.04 | No security issues detected (lightweight scan). |
54
- | healthy | tools | pass | 2.48 | Advertised capability responded with the minimal expected shape (5 items). |
55
- | review | schema-quality | partial | 0.80 | Found 1 quality finding(s) across 6 item(s): 1 warnings, 0 info. |
56
- | confirm intent | prompts | unsupported | 0.00 | Prompts are not advertised by the target. |
50
+ | healthy | attack-sim | pass | 0.45 | Safe attack simulation found no high-risk MCP attack-readiness findings. |
51
+ | healthy | conformance | pass | 0.71 | All 7 conformance checks passed. |
52
+ | healthy | resources | pass | 0.54 | Advertised capability responded with the minimal expected shape (1 items). |
53
+ | healthy | security | pass | 0.16 | No security issues detected. |
54
+ | healthy | security-lite | pass | 0.02 | No security issues detected (lightweight scan). |
55
+ | healthy | tools | pass | 1.90 | Advertised capability responded with the minimal expected shape (5 items). |
56
+ | review | schema-quality | partial | 0.49 | Found 1 quality finding(s) across 6 item(s): 1 warnings, 0 info. |
57
+ | confirm intent | prompts | unsupported | 0.01 | Prompts are not advertised by the target. |
57
58
 
58
59
  ## Evidence Snippets
59
60
 
61
+ ### attack-sim — pass
62
+
63
+ Summary: Safe attack simulation found no high-risk MCP attack-readiness findings.
64
+
65
+ - Endpoint: `attack-sim/safe`
66
+ - Advertised: `true`
67
+ - Responded: `true`
68
+ - Minimal shape present: `true`
69
+ - Item count: `0`
70
+ - Identifiers: none
71
+ - Diagnostics: none
72
+
60
73
  ### conformance — pass
61
74
 
62
75
  Summary: All 7 conformance checks passed.
@@ -159,5 +172,5 @@ npm run cli -- report --run <path-to-run-artifact.json> --format markdown
159
172
 
160
173
  - Artifact type: `run`
161
174
  - Schema version: `1.0.0`
162
- - Run ID: `run_2026-06-24T020729328Z_2a54782d`
175
+ - Run ID: `run_2026-07-06T194953212Z_e649da15`
163
176
  - Gate: `pass`
@@ -2,9 +2,9 @@
2
2
  "artifactType": "run",
3
3
  "schemaVersion": "1.0.0",
4
4
  "gate": "fail",
5
- "runId": "run_2026-06-24T020732035Z_b86ac3a9",
6
- "createdAt": "2026-06-24T02:07:32.035Z",
7
- "toolVersion": "0.24.0",
5
+ "runId": "run_2026-07-06T194955359Z_d769bb31",
6
+ "createdAt": "2026-07-06T19:49:55.359Z",
7
+ "toolVersion": "0.28.0",
8
8
  "target": {
9
9
  "targetId": "playwright-mcp-server",
10
10
  "adapter": "local-process",
@@ -22,16 +22,16 @@
22
22
  "whyItMatters": "Popular browser automation servers need explicit review around navigation, screenshots, and code evaluation."
23
23
  },
24
24
  "serverName": "Playwright",
25
- "serverVersion": "1.61.0-alpha-1781023400000"
25
+ "serverVersion": "1.62.0-alpha-2026-06-29"
26
26
  },
27
27
  "environment": {
28
28
  "platform": "darwin 25.5.0",
29
29
  "nodeVersion": "v22.22.1"
30
30
  },
31
31
  "summary": {
32
- "total": 7,
32
+ "total": 8,
33
33
  "pass": 2,
34
- "fail": 2,
34
+ "fail": 3,
35
35
  "partial": 1,
36
36
  "unsupported": 2,
37
37
  "flaky": 0,
@@ -43,7 +43,7 @@
43
43
  "id": "tools",
44
44
  "capability": "tools",
45
45
  "status": "pass",
46
- "durationMs": 59.043541999999434,
46
+ "durationMs": 2.8597500000014406,
47
47
  "message": "Advertised capability responded with the minimal expected shape (23 items).",
48
48
  "evidence": [
49
49
  {
@@ -439,10 +439,20 @@
439
439
  "fullPage": {
440
440
  "description": "When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.",
441
441
  "type": "boolean"
442
+ },
443
+ "scale": {
444
+ "default": "css",
445
+ "description": "Image resolution scale. \"css\" produces a screenshot sized in CSS pixels (smaller, consistent across devices). \"device\" produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css.",
446
+ "type": "string",
447
+ "enum": [
448
+ "css",
449
+ "device"
450
+ ]
442
451
  }
443
452
  },
444
453
  "required": [
445
- "type"
454
+ "type",
455
+ "scale"
446
456
  ],
447
457
  "$schema": "https://json-schema.org/draft/2020-12/schema",
448
458
  "additionalProperties": false
@@ -641,7 +651,7 @@
641
651
  "id": "prompts",
642
652
  "capability": "prompts",
643
653
  "status": "unsupported",
644
- "durationMs": 0.006790999999793712,
654
+ "durationMs": 0.0011660000000119908,
645
655
  "message": "Prompts are not advertised by the target.",
646
656
  "evidence": [
647
657
  {
@@ -657,7 +667,7 @@
657
667
  "id": "resources",
658
668
  "capability": "resources",
659
669
  "status": "unsupported",
660
- "durationMs": 0.007708000001002802,
670
+ "durationMs": 0.0022920000010344665,
661
671
  "message": "Resources are not advertised by the target.",
662
672
  "evidence": [
663
673
  {
@@ -673,7 +683,7 @@
673
683
  "id": "security-lite",
674
684
  "capability": "security-lite",
675
685
  "status": "fail",
676
- "durationMs": 0.24841600000218023,
686
+ "durationMs": 0.05433400000038091,
677
687
  "message": "Found 6 security finding(s): 2 high, 2 medium, 2 low.",
678
688
  "evidence": [
679
689
  {
@@ -741,7 +751,7 @@
741
751
  "id": "conformance",
742
752
  "capability": "conformance",
743
753
  "status": "pass",
744
- "durationMs": 3062.4197910000003,
754
+ "durationMs": 987.085916,
745
755
  "message": "All 7 conformance checks passed.",
746
756
  "evidence": [
747
757
  {
@@ -767,7 +777,7 @@
767
777
  "id": "schema-quality",
768
778
  "capability": "schema-quality",
769
779
  "status": "partial",
770
- "durationMs": 7.270583000001352,
780
+ "durationMs": 1.854709000001094,
771
781
  "message": "Found 4 quality finding(s) across 23 item(s): 0 warnings, 4 info.",
772
782
  "evidence": [
773
783
  {
@@ -787,6 +797,32 @@
787
797
  "[info] tool \"browser_run_code_unsafe\": Has properties but no 'required' array declared",
788
798
  "[info] tool \"browser_snapshot\": Has properties but no 'required' array declared",
789
799
  "[info] tool \"browser_wait_for\": Has properties but no 'required' array declared"
800
+ ],
801
+ "findings": [
802
+ {
803
+ "itemType": "tool",
804
+ "itemName": "browser_file_upload",
805
+ "issue": "Has properties but no 'required' array declared",
806
+ "severity": "info"
807
+ },
808
+ {
809
+ "itemType": "tool",
810
+ "itemName": "browser_run_code_unsafe",
811
+ "issue": "Has properties but no 'required' array declared",
812
+ "severity": "info"
813
+ },
814
+ {
815
+ "itemType": "tool",
816
+ "itemName": "browser_snapshot",
817
+ "issue": "Has properties but no 'required' array declared",
818
+ "severity": "info"
819
+ },
820
+ {
821
+ "itemType": "tool",
822
+ "itemName": "browser_wait_for",
823
+ "issue": "Has properties but no 'required' array declared",
824
+ "severity": "info"
825
+ }
790
826
  ]
791
827
  }
792
828
  ]
@@ -795,7 +831,7 @@
795
831
  "id": "security",
796
832
  "capability": "security",
797
833
  "status": "fail",
798
- "durationMs": 25.690708999998606,
834
+ "durationMs": 2.534332999999606,
799
835
  "message": "Found 6 security finding(s): 2 high, 2 medium, 2 low.",
800
836
  "evidence": [
801
837
  {
@@ -858,6 +894,125 @@
858
894
  ]
859
895
  }
860
896
  ]
897
+ },
898
+ {
899
+ "id": "attack-sim",
900
+ "capability": "attack-sim",
901
+ "status": "fail",
902
+ "durationMs": 1.0038750000003347,
903
+ "message": "Safe attack simulation found 4 finding(s): 1 high, 3 medium, 0 low.",
904
+ "evidence": [
905
+ {
906
+ "endpoint": "attack-sim/safe",
907
+ "advertised": true,
908
+ "responded": true,
909
+ "minimalShapePresent": true,
910
+ "itemCount": 4,
911
+ "identifiers": [
912
+ "browser_evaluate",
913
+ "browser_navigate",
914
+ "browser_run_code_unsafe",
915
+ "browser_tabs"
916
+ ],
917
+ "diagnostics": [
918
+ "[medium] Tool \"browser_evaluate\" combines broad parameters (filename) with destructive or non-read-only behavior.",
919
+ "[medium] Tool \"browser_navigate\" combines broad parameters (url) with destructive or non-read-only behavior.",
920
+ "[high] Tool \"browser_run_code_unsafe\" combines broad parameters (code, filename) with destructive or non-read-only behavior.",
921
+ "[medium] Tool \"browser_tabs\" combines broad parameters (url) with destructive or non-read-only behavior."
922
+ ],
923
+ "findings": [
924
+ {
925
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
926
+ "attackClass": "permission-boundary",
927
+ "severity": "medium",
928
+ "itemType": "tool",
929
+ "itemName": "browser_evaluate",
930
+ "message": "Tool \"browser_evaluate\" combines broad parameters (filename) with destructive or non-read-only behavior.",
931
+ "evidence": {
932
+ "broadParams": [
933
+ "filename"
934
+ ],
935
+ "annotations": {
936
+ "title": "Evaluate JavaScript",
937
+ "readOnlyHint": false,
938
+ "destructiveHint": true,
939
+ "openWorldHint": true
940
+ },
941
+ "description": "Evaluate JavaScript expression on page or element"
942
+ },
943
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
944
+ "recommendedAction": "gate"
945
+ },
946
+ {
947
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
948
+ "attackClass": "permission-boundary",
949
+ "severity": "medium",
950
+ "itemType": "tool",
951
+ "itemName": "browser_navigate",
952
+ "message": "Tool \"browser_navigate\" combines broad parameters (url) with destructive or non-read-only behavior.",
953
+ "evidence": {
954
+ "broadParams": [
955
+ "url"
956
+ ],
957
+ "annotations": {
958
+ "title": "Navigate to a URL",
959
+ "readOnlyHint": false,
960
+ "destructiveHint": true,
961
+ "openWorldHint": true
962
+ },
963
+ "description": "Navigate to a URL"
964
+ },
965
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
966
+ "recommendedAction": "gate"
967
+ },
968
+ {
969
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
970
+ "attackClass": "permission-boundary",
971
+ "severity": "high",
972
+ "itemType": "tool",
973
+ "itemName": "browser_run_code_unsafe",
974
+ "message": "Tool \"browser_run_code_unsafe\" combines broad parameters (code, filename) with destructive or non-read-only behavior.",
975
+ "evidence": {
976
+ "broadParams": [
977
+ "code",
978
+ "filename"
979
+ ],
980
+ "annotations": {
981
+ "title": "Run Playwright code (unsafe)",
982
+ "readOnlyHint": false,
983
+ "destructiveHint": true,
984
+ "openWorldHint": true
985
+ },
986
+ "description": "Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent."
987
+ },
988
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
989
+ "recommendedAction": "quarantine"
990
+ },
991
+ {
992
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
993
+ "attackClass": "permission-boundary",
994
+ "severity": "medium",
995
+ "itemType": "tool",
996
+ "itemName": "browser_tabs",
997
+ "message": "Tool \"browser_tabs\" combines broad parameters (url) with destructive or non-read-only behavior.",
998
+ "evidence": {
999
+ "broadParams": [
1000
+ "url"
1001
+ ],
1002
+ "annotations": {
1003
+ "title": "Manage tabs",
1004
+ "readOnlyHint": false,
1005
+ "destructiveHint": true,
1006
+ "openWorldHint": true
1007
+ },
1008
+ "description": "List, create, close, or select a browser tab."
1009
+ },
1010
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
1011
+ "recommendedAction": "gate"
1012
+ }
1013
+ ]
1014
+ }
1015
+ ]
861
1016
  }
862
1017
  ],
863
1018
  "healthScore": {
@@ -886,7 +1041,8 @@
886
1041
  "score": 0,
887
1042
  "details": [
888
1043
  "security-lite: fail (0/100)",
889
- "security: fail (0/100)"
1044
+ "security: fail (0/100)",
1045
+ "attack-sim: fail (0/100)"
890
1046
  ]
891
1047
  },
892
1048
  {
@@ -904,16 +1060,16 @@
904
1060
  "weight": 0.1,
905
1061
  "score": 100,
906
1062
  "details": [
907
- "Connect: 5774ms",
908
- "p95 latency: 59ms (3 operations)"
1063
+ "Connect: 683ms",
1064
+ "p95 latency: 3ms (3 operations)"
909
1065
  ]
910
1066
  }
911
1067
  ]
912
1068
  },
913
1069
  "performanceMetrics": {
914
- "connectMs": 5773.640125,
915
- "toolsListMs": 59.043541999999434,
916
- "promptsListMs": 0.006790999999793712,
917
- "resourcesListMs": 0.007708000001002802
1070
+ "connectMs": 683.3468749999993,
1071
+ "toolsListMs": 2.8597500000014406,
1072
+ "promptsListMs": 0.0011660000000119908,
1073
+ "resourcesListMs": 0.0022920000010344665
918
1074
  }
919
1075
  }
@@ -1,13 +1,13 @@
1
1
  # MCP Observatory Run Report
2
2
 
3
- Generated at 2026-06-24T02:07:32.035Z
3
+ Generated at 2026-07-06T19:49:55.359Z
4
4
 
5
5
  ## Target and Environment Metadata
6
6
 
7
7
  - Target: `playwright-mcp-server`
8
8
  - Adapter: `local-process`
9
9
  - Command: `npx -y @playwright/mcp`
10
- - Server: `Playwright 1.61.0-alpha-1781023400000`
10
+ - Server: `Playwright 1.62.0-alpha-2026-06-29`
11
11
  - Platform: `darwin 25.5.0`
12
12
  - Node: `v22.22.1`
13
13
 
@@ -25,18 +25,18 @@ Generated at 2026-06-24T02:07:32.035Z
25
25
 
26
26
  | Gate | Total | Pass | Fail | Partial | Unsupported | Flaky | Skipped |
27
27
  | --- | --- | --- | --- | --- | --- | --- | --- |
28
- | fail | 7 | 2 | 2 | 1 | 2 | 0 | 0 |
28
+ | fail | 8 | 2 | 3 | 1 | 2 | 0 | 0 |
29
29
 
30
30
  ## At a Glance
31
31
 
32
32
  - Safety verdict: **Blocked** — One or more checks can break agent dependence and should be fixed before production use.
33
- - Top risks: schema-quality: Found 4 quality finding(s) across 23 item(s): 0 warnings, 4 info.; security: Found 6 security finding(s): 2 high, 2 medium, 2 low.; security-lite: Found 6 security finding(s): 2 high, 2 medium, 2 low.
33
+ - Top risks: schema-quality: Found 4 quality finding(s) across 23 item(s): 0 warnings, 4 info.; attack-sim: Safe attack simulation found 4 finding(s): 1 high, 3 medium, 0 low.; security: Found 6 security finding(s): 2 high, 2 medium, 2 low.
34
34
  - Regression/schema drift: Run `mcp-observatory diff <previous-run.json> <current-run.json>` to classify regressions and schema drift.
35
- - Failing checks: security-lite, security
35
+ - Failing checks: security-lite, security, attack-sim
36
36
  - Partial or flaky checks: schema-quality
37
37
  - Skipped checks: none
38
38
  - Unsupported checks: prompts, resources
39
- - Suggested next step: Start with the failing checks: security-lite, security.
39
+ - Suggested next step: Start with the failing checks: security-lite, security, attack-sim.
40
40
  - CI next step: `Add CI: npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y <server-package>"`
41
41
 
42
42
  ## Regressions and Recoveries
@@ -47,13 +47,14 @@ _Use the `diff` command against another run artifact to classify regressions and
47
47
 
48
48
  | Focus | Check | Status | Duration (ms) | Message |
49
49
  | --- | --- | --- | --- | --- |
50
- | healthy | conformance | pass | 3062.42 | All 7 conformance checks passed. |
51
- | healthy | tools | pass | 59.04 | Advertised capability responded with the minimal expected shape (23 items). |
52
- | review | schema-quality | partial | 7.27 | Found 4 quality finding(s) across 23 item(s): 0 warnings, 4 info. |
53
- | confirm intent | prompts | unsupported | 0.01 | Prompts are not advertised by the target. |
54
- | confirm intent | resources | unsupported | 0.01 | Resources are not advertised by the target. |
55
- | act now | security | fail | 25.69 | Found 6 security finding(s): 2 high, 2 medium, 2 low. |
56
- | act now | security-lite | fail | 0.25 | Found 6 security finding(s): 2 high, 2 medium, 2 low. |
50
+ | healthy | conformance | pass | 987.09 | All 7 conformance checks passed. |
51
+ | healthy | tools | pass | 2.86 | Advertised capability responded with the minimal expected shape (23 items). |
52
+ | review | schema-quality | partial | 1.85 | Found 4 quality finding(s) across 23 item(s): 0 warnings, 4 info. |
53
+ | confirm intent | prompts | unsupported | 0.00 | Prompts are not advertised by the target. |
54
+ | confirm intent | resources | unsupported | 0.00 | Resources are not advertised by the target. |
55
+ | act now | attack-sim | fail | 1.00 | Safe attack simulation found 4 finding(s): 1 high, 3 medium, 0 low. |
56
+ | act now | security | fail | 2.53 | Found 6 security finding(s): 2 high, 2 medium, 2 low. |
57
+ | act now | security-lite | fail | 0.05 | Found 6 security finding(s): 2 high, 2 medium, 2 low. |
57
58
 
58
59
  ## Evidence Snippets
59
60
 
@@ -117,6 +118,18 @@ Summary: Resources are not advertised by the target.
117
118
  - Identifiers: none
118
119
  - Diagnostics: none
119
120
 
121
+ ### attack-sim — fail
122
+
123
+ Summary: Safe attack simulation found 4 finding(s): 1 high, 3 medium, 0 low.
124
+
125
+ - Endpoint: `attack-sim/safe`
126
+ - Advertised: `true`
127
+ - Responded: `true`
128
+ - Minimal shape present: `true`
129
+ - Item count: `4`
130
+ - Identifiers: browser_evaluate, browser_navigate, browser_run_code_unsafe, browser_tabs
131
+ - Diagnostics: [medium] Tool "browser_evaluate" combines broad parameters (filename) with destructive or non-read-only behavior., [medium] Tool "browser_navigate" combines broad parameters (url) with destructive or non-read-only behavior., [high] Tool "browser_run_code_unsafe" combines broad parameters (code, filename) with destructive or non-read-only behavior. (+1 more)
132
+
120
133
  ### security — fail
121
134
 
122
135
  Summary: Found 6 security finding(s): 2 high, 2 medium, 2 low.
@@ -152,5 +165,5 @@ npm run cli -- report --run <path-to-run-artifact.json> --format markdown
152
165
 
153
166
  - Artifact type: `run`
154
167
  - Schema version: `1.0.0`
155
- - Run ID: `run_2026-06-24T020732035Z_b86ac3a9`
168
+ - Run ID: `run_2026-07-06T194955359Z_d769bb31`
156
169
  - Gate: `fail`