@kryptosai/mcp-observatory 1.28.1 → 1.28.3

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 (134) hide show
  1. package/CONTRIBUTORS.md +4 -1
  2. package/README.md +109 -14
  3. package/README.zh-CN.md +654 -0
  4. package/dist/src/adapters/http.js +13 -4
  5. package/dist/src/adapters/http.js.map +1 -1
  6. package/dist/src/checks/runtime-profile.d.ts +5 -0
  7. package/dist/src/checks/runtime-profile.js +214 -0
  8. package/dist/src/checks/runtime-profile.js.map +1 -0
  9. package/dist/src/checks/security-rules.js +18 -0
  10. package/dist/src/checks/security-rules.js.map +1 -1
  11. package/dist/src/checks/security.js +33 -65
  12. package/dist/src/checks/security.js.map +1 -1
  13. package/dist/src/checks/skill-scan.d.ts +46 -0
  14. package/dist/src/checks/skill-scan.js +665 -0
  15. package/dist/src/checks/skill-scan.js.map +1 -0
  16. package/dist/src/cli.js +15 -2
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/commands/enforce.d.ts +12 -0
  19. package/dist/src/commands/enforce.js +187 -0
  20. package/dist/src/commands/enforce.js.map +1 -0
  21. package/dist/src/commands/helpers.d.ts +2 -1
  22. package/dist/src/commands/helpers.js +9 -1
  23. package/dist/src/commands/helpers.js.map +1 -1
  24. package/dist/src/commands/legacy.js +3 -0
  25. package/dist/src/commands/legacy.js.map +1 -1
  26. package/dist/src/commands/risk-graph.d.ts +2 -0
  27. package/dist/src/commands/risk-graph.js +64 -0
  28. package/dist/src/commands/risk-graph.js.map +1 -0
  29. package/dist/src/commands/scan.js +36 -9
  30. package/dist/src/commands/scan.js.map +1 -1
  31. package/dist/src/commands/score.js.map +1 -1
  32. package/dist/src/commands/skill-scan.d.ts +6 -0
  33. package/dist/src/commands/skill-scan.js +62 -0
  34. package/dist/src/commands/skill-scan.js.map +1 -0
  35. package/dist/src/commands/test.js +13 -0
  36. package/dist/src/commands/test.js.map +1 -1
  37. package/dist/src/commands/watch.js +13 -8
  38. package/dist/src/commands/watch.js.map +1 -1
  39. package/dist/src/discovery.d.ts +15 -1
  40. package/dist/src/discovery.js +251 -35
  41. package/dist/src/discovery.js.map +1 -1
  42. package/dist/src/index.d.ts +3 -1
  43. package/dist/src/index.js +3 -1
  44. package/dist/src/index.js.map +1 -1
  45. package/dist/src/receipt.d.ts +4 -1
  46. package/dist/src/receipt.js +85 -0
  47. package/dist/src/receipt.js.map +1 -1
  48. package/dist/src/reporters/markdown.js +39 -0
  49. package/dist/src/reporters/markdown.js.map +1 -1
  50. package/dist/src/reporters/terminal.d.ts +2 -0
  51. package/dist/src/reporters/terminal.js +55 -2
  52. package/dist/src/reporters/terminal.js.map +1 -1
  53. package/dist/src/risk-graph.d.ts +64 -0
  54. package/dist/src/risk-graph.js +452 -0
  55. package/dist/src/risk-graph.js.map +1 -0
  56. package/dist/src/runner.js +6 -0
  57. package/dist/src/runner.js.map +1 -1
  58. package/dist/src/server.d.ts +1 -3
  59. package/dist/src/server.js +29 -645
  60. package/dist/src/server.js.map +1 -1
  61. package/dist/src/storage.js +13 -9
  62. package/dist/src/storage.js.map +1 -1
  63. package/dist/src/telemetry.d.ts +7 -0
  64. package/dist/src/telemetry.js.map +1 -1
  65. package/dist/src/tools/check-server.d.ts +27 -0
  66. package/dist/src/tools/check-server.js +46 -0
  67. package/dist/src/tools/check-server.js.map +1 -0
  68. package/dist/src/tools/ci-report.d.ts +21 -0
  69. package/dist/src/tools/ci-report.js +38 -0
  70. package/dist/src/tools/ci-report.js.map +1 -0
  71. package/dist/src/tools/diff-runs.d.ts +28 -0
  72. package/dist/src/tools/diff-runs.js +39 -0
  73. package/dist/src/tools/diff-runs.js.map +1 -0
  74. package/dist/src/tools/get-history.d.ts +21 -0
  75. package/dist/src/tools/get-history.js +37 -0
  76. package/dist/src/tools/get-history.js.map +1 -0
  77. package/dist/src/tools/get-last-run.d.ts +21 -0
  78. package/dist/src/tools/get-last-run.js +47 -0
  79. package/dist/src/tools/get-last-run.js.map +1 -0
  80. package/dist/src/tools/helpers.d.ts +8 -0
  81. package/dist/src/tools/helpers.js +32 -0
  82. package/dist/src/tools/helpers.js.map +1 -0
  83. package/dist/src/tools/lock-verify.d.ts +21 -0
  84. package/dist/src/tools/lock-verify.js +47 -0
  85. package/dist/src/tools/lock-verify.js.map +1 -0
  86. package/dist/src/tools/record.d.ts +23 -0
  87. package/dist/src/tools/record.js +48 -0
  88. package/dist/src/tools/record.js.map +1 -0
  89. package/dist/src/tools/replay.d.ts +21 -0
  90. package/dist/src/tools/replay.js +54 -0
  91. package/dist/src/tools/replay.js.map +1 -0
  92. package/dist/src/tools/scan.d.ts +18 -0
  93. package/dist/src/tools/scan.js +43 -0
  94. package/dist/src/tools/scan.js.map +1 -0
  95. package/dist/src/tools/score-server.d.ts +23 -0
  96. package/dist/src/tools/score-server.js +53 -0
  97. package/dist/src/tools/score-server.js.map +1 -0
  98. package/dist/src/tools/suggest-servers.d.ts +21 -0
  99. package/dist/src/tools/suggest-servers.js +114 -0
  100. package/dist/src/tools/suggest-servers.js.map +1 -0
  101. package/dist/src/tools/verify-tool.d.ts +25 -0
  102. package/dist/src/tools/verify-tool.js +48 -0
  103. package/dist/src/tools/verify-tool.js.map +1 -0
  104. package/dist/src/tools/watch.d.ts +23 -0
  105. package/dist/src/tools/watch.js +67 -0
  106. package/dist/src/tools/watch.js.map +1 -0
  107. package/dist/src/types.d.ts +26 -1
  108. package/dist/src/utils/security.d.ts +3 -0
  109. package/dist/src/utils/security.js +37 -0
  110. package/dist/src/utils/security.js.map +1 -0
  111. package/dist/src/validate.d.ts +1 -0
  112. package/dist/src/validate.js +119 -35
  113. package/dist/src/validate.js.map +1 -1
  114. package/docs/agent-tasks.md +1 -1
  115. package/docs/commercial-boundary.md +9 -1
  116. package/docs/contributor-recognition.md +2 -0
  117. package/docs/demo.svg +1 -59
  118. package/docs/mcp-receipts.md +9 -0
  119. package/docs/mcp-server-safety-index.md +21 -16
  120. package/docs/metrics-dashboard.md +17 -1
  121. package/docs/private-mcp-fleet-risk-graph.md +69 -0
  122. package/docs/receipt-graph.md +118 -31
  123. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.json +1745 -0
  124. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.md +169 -0
  125. package/docs/safety-index/artifacts/filesystem-mcp-server.json +786 -0
  126. package/docs/safety-index/artifacts/filesystem-mcp-server.md +169 -0
  127. package/docs/safety-index/artifacts/github-mcp-server.json +1707 -0
  128. package/docs/safety-index/artifacts/github-mcp-server.md +169 -0
  129. package/docs/safety-index/mcp-risk-graph.html +167 -0
  130. package/docs/safety-index/mcp-risk-graph.json +669 -0
  131. package/docs/safety-index/mcp-risk-graph.md +47 -0
  132. package/docs/safety-index/targets.json +57 -0
  133. package/docs/sample-private-fleet-risk-graph.md +90 -0
  134. package/package.json +21 -11
@@ -0,0 +1,786 @@
1
+ {
2
+ "artifactType": "run",
3
+ "schemaVersion": "1.0.0",
4
+ "gate": "pass",
5
+ "runId": "run_2026-07-07T211635668Z_9369cd63",
6
+ "createdAt": "2026-07-07T21:16:35.668Z",
7
+ "toolVersion": "1.28.2",
8
+ "target": {
9
+ "targetId": "filesystem-mcp-server",
10
+ "adapter": "local-process",
11
+ "command": "npx",
12
+ "args": [
13
+ "-y",
14
+ "@modelcontextprotocol/server-filesystem",
15
+ "<safe-empty-temp-dir>"
16
+ ],
17
+ "cwd": ".",
18
+ "metadata": {
19
+ "package": "@modelcontextprotocol/server-filesystem",
20
+ "purpose": "mcp-safety-index",
21
+ "riskClass": "Filesystem boundary",
22
+ "failureClass": "Temporary directory filesystem access",
23
+ "whyItMatters": "Filesystem MCP is a core agent trust boundary because it exposes read, write, edit, delete, and directory traversal tools."
24
+ },
25
+ "serverName": "secure-filesystem-server",
26
+ "serverVersion": "0.2.0"
27
+ },
28
+ "environment": {
29
+ "platform": "darwin 24.0.0",
30
+ "nodeVersion": "v25.8.1"
31
+ },
32
+ "summary": {
33
+ "total": 8,
34
+ "pass": 2,
35
+ "fail": 0,
36
+ "partial": 4,
37
+ "unsupported": 2,
38
+ "flaky": 0,
39
+ "skipped": 0,
40
+ "gate": "pass"
41
+ },
42
+ "checks": [
43
+ {
44
+ "id": "tools",
45
+ "capability": "tools",
46
+ "status": "pass",
47
+ "durationMs": 4.94458399999985,
48
+ "message": "Advertised capability responded with the minimal expected shape (14 items).",
49
+ "evidence": [
50
+ {
51
+ "endpoint": "tools/list",
52
+ "advertised": true,
53
+ "responded": true,
54
+ "minimalShapePresent": true,
55
+ "itemCount": 14,
56
+ "identifiers": [
57
+ "read_file",
58
+ "read_text_file",
59
+ "read_media_file",
60
+ "read_multiple_files",
61
+ "write_file",
62
+ "edit_file",
63
+ "create_directory",
64
+ "list_directory",
65
+ "list_directory_with_sizes",
66
+ "directory_tree",
67
+ "move_file",
68
+ "search_files",
69
+ "get_file_info",
70
+ "list_allowed_directories"
71
+ ],
72
+ "diagnostics": [
73
+ "Secure MCP Filesystem Server running on stdio",
74
+ "Client does not support MCP Roots, using allowed directories set from server args: [",
75
+ "'<safe-empty-temp-dir>',",
76
+ "'<safe-empty-temp-dir>'",
77
+ "]"
78
+ ],
79
+ "schemas": {
80
+ "read_file": {
81
+ "type": "object",
82
+ "properties": {
83
+ "path": {
84
+ "type": "string"
85
+ },
86
+ "tail": {
87
+ "description": "If provided, returns only the last N lines of the file",
88
+ "type": "number"
89
+ },
90
+ "head": {
91
+ "description": "If provided, returns only the first N lines of the file",
92
+ "type": "number"
93
+ }
94
+ },
95
+ "required": [
96
+ "path"
97
+ ],
98
+ "$schema": "http://json-schema.org/draft-07/schema#"
99
+ },
100
+ "read_text_file": {
101
+ "type": "object",
102
+ "properties": {
103
+ "path": {
104
+ "type": "string"
105
+ },
106
+ "tail": {
107
+ "description": "If provided, returns only the last N lines of the file",
108
+ "type": "number"
109
+ },
110
+ "head": {
111
+ "description": "If provided, returns only the first N lines of the file",
112
+ "type": "number"
113
+ }
114
+ },
115
+ "required": [
116
+ "path"
117
+ ],
118
+ "$schema": "http://json-schema.org/draft-07/schema#"
119
+ },
120
+ "read_media_file": {
121
+ "type": "object",
122
+ "properties": {
123
+ "path": {
124
+ "type": "string"
125
+ }
126
+ },
127
+ "required": [
128
+ "path"
129
+ ],
130
+ "$schema": "http://json-schema.org/draft-07/schema#"
131
+ },
132
+ "read_multiple_files": {
133
+ "type": "object",
134
+ "properties": {
135
+ "paths": {
136
+ "minItems": 1,
137
+ "type": "array",
138
+ "items": {
139
+ "type": "string"
140
+ },
141
+ "description": "Array of file paths to read. Each path must be a string pointing to a valid file within allowed directories."
142
+ }
143
+ },
144
+ "required": [
145
+ "paths"
146
+ ],
147
+ "$schema": "http://json-schema.org/draft-07/schema#"
148
+ },
149
+ "write_file": {
150
+ "type": "object",
151
+ "properties": {
152
+ "path": {
153
+ "type": "string"
154
+ },
155
+ "content": {
156
+ "type": "string"
157
+ }
158
+ },
159
+ "required": [
160
+ "path",
161
+ "content"
162
+ ],
163
+ "$schema": "http://json-schema.org/draft-07/schema#"
164
+ },
165
+ "edit_file": {
166
+ "type": "object",
167
+ "properties": {
168
+ "path": {
169
+ "type": "string"
170
+ },
171
+ "edits": {
172
+ "type": "array",
173
+ "items": {
174
+ "type": "object",
175
+ "properties": {
176
+ "oldText": {
177
+ "type": "string",
178
+ "description": "Text to search for - must match exactly"
179
+ },
180
+ "newText": {
181
+ "type": "string",
182
+ "description": "Text to replace with"
183
+ }
184
+ },
185
+ "required": [
186
+ "oldText",
187
+ "newText"
188
+ ]
189
+ }
190
+ },
191
+ "dryRun": {
192
+ "default": false,
193
+ "description": "Preview changes using git-style diff format",
194
+ "type": "boolean"
195
+ }
196
+ },
197
+ "required": [
198
+ "path",
199
+ "edits"
200
+ ],
201
+ "$schema": "http://json-schema.org/draft-07/schema#"
202
+ },
203
+ "create_directory": {
204
+ "type": "object",
205
+ "properties": {
206
+ "path": {
207
+ "type": "string"
208
+ }
209
+ },
210
+ "required": [
211
+ "path"
212
+ ],
213
+ "$schema": "http://json-schema.org/draft-07/schema#"
214
+ },
215
+ "list_directory": {
216
+ "type": "object",
217
+ "properties": {
218
+ "path": {
219
+ "type": "string"
220
+ }
221
+ },
222
+ "required": [
223
+ "path"
224
+ ],
225
+ "$schema": "http://json-schema.org/draft-07/schema#"
226
+ },
227
+ "list_directory_with_sizes": {
228
+ "type": "object",
229
+ "properties": {
230
+ "path": {
231
+ "type": "string"
232
+ },
233
+ "sortBy": {
234
+ "default": "name",
235
+ "description": "Sort entries by name or size",
236
+ "type": "string",
237
+ "enum": [
238
+ "name",
239
+ "size"
240
+ ]
241
+ }
242
+ },
243
+ "required": [
244
+ "path"
245
+ ],
246
+ "$schema": "http://json-schema.org/draft-07/schema#"
247
+ },
248
+ "directory_tree": {
249
+ "type": "object",
250
+ "properties": {
251
+ "path": {
252
+ "type": "string"
253
+ },
254
+ "excludePatterns": {
255
+ "default": [],
256
+ "type": "array",
257
+ "items": {
258
+ "type": "string"
259
+ }
260
+ }
261
+ },
262
+ "required": [
263
+ "path"
264
+ ],
265
+ "$schema": "http://json-schema.org/draft-07/schema#"
266
+ },
267
+ "move_file": {
268
+ "type": "object",
269
+ "properties": {
270
+ "source": {
271
+ "type": "string"
272
+ },
273
+ "destination": {
274
+ "type": "string"
275
+ }
276
+ },
277
+ "required": [
278
+ "source",
279
+ "destination"
280
+ ],
281
+ "$schema": "http://json-schema.org/draft-07/schema#"
282
+ },
283
+ "search_files": {
284
+ "type": "object",
285
+ "properties": {
286
+ "path": {
287
+ "type": "string"
288
+ },
289
+ "pattern": {
290
+ "type": "string"
291
+ },
292
+ "excludePatterns": {
293
+ "default": [],
294
+ "type": "array",
295
+ "items": {
296
+ "type": "string"
297
+ }
298
+ }
299
+ },
300
+ "required": [
301
+ "path",
302
+ "pattern"
303
+ ],
304
+ "$schema": "http://json-schema.org/draft-07/schema#"
305
+ },
306
+ "get_file_info": {
307
+ "type": "object",
308
+ "properties": {
309
+ "path": {
310
+ "type": "string"
311
+ }
312
+ },
313
+ "required": [
314
+ "path"
315
+ ],
316
+ "$schema": "http://json-schema.org/draft-07/schema#"
317
+ },
318
+ "list_allowed_directories": {
319
+ "type": "object",
320
+ "properties": {},
321
+ "$schema": "http://json-schema.org/draft-07/schema#"
322
+ }
323
+ }
324
+ }
325
+ ]
326
+ },
327
+ {
328
+ "id": "prompts",
329
+ "capability": "prompts",
330
+ "status": "unsupported",
331
+ "durationMs": 0.0038749999998799467,
332
+ "message": "Prompts are not advertised by the target.",
333
+ "evidence": [
334
+ {
335
+ "endpoint": "prompts/list",
336
+ "advertised": false,
337
+ "responded": false,
338
+ "minimalShapePresent": false,
339
+ "diagnostics": []
340
+ }
341
+ ]
342
+ },
343
+ {
344
+ "id": "resources",
345
+ "capability": "resources",
346
+ "status": "unsupported",
347
+ "durationMs": 0.001750000000356522,
348
+ "message": "Resources are not advertised by the target.",
349
+ "evidence": [
350
+ {
351
+ "endpoint": "resources/list | resources/templates/list",
352
+ "advertised": false,
353
+ "responded": false,
354
+ "minimalShapePresent": false,
355
+ "diagnostics": []
356
+ }
357
+ ]
358
+ },
359
+ {
360
+ "id": "security-lite",
361
+ "capability": "security-lite",
362
+ "status": "partial",
363
+ "durationMs": 0.06254200000012133,
364
+ "message": "Found 3 security finding(s): 0 high, 3 medium, 0 low.",
365
+ "evidence": [
366
+ {
367
+ "endpoint": "security/scan-lite",
368
+ "advertised": true,
369
+ "responded": true,
370
+ "minimalShapePresent": true,
371
+ "itemCount": 3,
372
+ "identifiers": [
373
+ "write_file",
374
+ "edit_file",
375
+ "create_directory"
376
+ ],
377
+ "diagnostics": [
378
+ "[medium] Tool \"write_file\" accepts filesystem paths and has destructive capabilities.",
379
+ "[medium] Tool \"edit_file\" accepts filesystem paths and has destructive capabilities.",
380
+ "[medium] Tool \"create_directory\" accepts filesystem paths and has destructive capabilities."
381
+ ],
382
+ "findings": [
383
+ {
384
+ "ruleId": "broad-filesystem",
385
+ "severity": "medium",
386
+ "toolName": "write_file",
387
+ "message": "Tool \"write_file\" accepts filesystem paths and has destructive capabilities."
388
+ },
389
+ {
390
+ "ruleId": "broad-filesystem",
391
+ "severity": "medium",
392
+ "toolName": "edit_file",
393
+ "message": "Tool \"edit_file\" accepts filesystem paths and has destructive capabilities."
394
+ },
395
+ {
396
+ "ruleId": "broad-filesystem",
397
+ "severity": "medium",
398
+ "toolName": "create_directory",
399
+ "message": "Tool \"create_directory\" accepts filesystem paths and has destructive capabilities."
400
+ }
401
+ ]
402
+ }
403
+ ]
404
+ },
405
+ {
406
+ "id": "conformance",
407
+ "capability": "conformance",
408
+ "status": "pass",
409
+ "durationMs": 4.9719169999998485,
410
+ "message": "All 7 conformance checks passed.",
411
+ "evidence": [
412
+ {
413
+ "endpoint": "conformance/check",
414
+ "advertised": true,
415
+ "responded": true,
416
+ "minimalShapePresent": true,
417
+ "itemCount": 7,
418
+ "identifiers": [],
419
+ "diagnostics": [
420
+ "[pass] capabilities-present: Server returned capabilities object.",
421
+ "[pass] server-info: Server provided initialization info.",
422
+ "[pass] tools-capability-match: tools/list returned 14 tool(s).",
423
+ "[pass] prompts-capability-match: Prompts not advertised — endpoint check skipped.",
424
+ "[pass] resources-capability-match: Resources not advertised — endpoint check skipped.",
425
+ "[pass] tool-response-content: Tool \"list_allowed_directories\" response has valid content array.",
426
+ "[pass] error-handling: Server returned proper error code -32601 for unknown method."
427
+ ]
428
+ }
429
+ ]
430
+ },
431
+ {
432
+ "id": "schema-quality",
433
+ "capability": "schema-quality",
434
+ "status": "partial",
435
+ "durationMs": 2.0610830000000533,
436
+ "message": "Found 18 quality finding(s) across 14 item(s): 0 warnings, 18 info.",
437
+ "evidence": [
438
+ {
439
+ "endpoint": "schema-quality/scan",
440
+ "advertised": true,
441
+ "responded": true,
442
+ "minimalShapePresent": true,
443
+ "itemCount": 18,
444
+ "identifiers": [
445
+ "read_file",
446
+ "read_text_file",
447
+ "read_media_file",
448
+ "write_file",
449
+ "edit_file",
450
+ "create_directory",
451
+ "list_directory",
452
+ "list_directory_with_sizes",
453
+ "directory_tree",
454
+ "move_file",
455
+ "search_files",
456
+ "get_file_info"
457
+ ],
458
+ "diagnostics": [
459
+ "[info] tool \"read_file\": Property 'path' missing description",
460
+ "[info] tool \"read_text_file\": Property 'path' missing description",
461
+ "[info] tool \"read_media_file\": Property 'path' missing description",
462
+ "[info] tool \"write_file\": Property 'path' missing description",
463
+ "[info] tool \"write_file\": Property 'content' missing description",
464
+ "[info] tool \"edit_file\": Property 'path' missing description",
465
+ "[info] tool \"edit_file\": Property 'edits' missing description",
466
+ "[info] tool \"create_directory\": Property 'path' missing description",
467
+ "[info] tool \"list_directory\": Property 'path' missing description",
468
+ "[info] tool \"list_directory_with_sizes\": Property 'path' missing description",
469
+ "[info] tool \"directory_tree\": Property 'path' missing description",
470
+ "[info] tool \"directory_tree\": Property 'excludePatterns' missing description",
471
+ "[info] tool \"move_file\": Property 'source' missing description",
472
+ "[info] tool \"move_file\": Property 'destination' missing description",
473
+ "[info] tool \"search_files\": Property 'path' missing description",
474
+ "[info] tool \"search_files\": Property 'pattern' missing description",
475
+ "[info] tool \"search_files\": Property 'excludePatterns' missing description",
476
+ "[info] tool \"get_file_info\": Property 'path' missing description"
477
+ ],
478
+ "findings": [
479
+ {
480
+ "itemType": "tool",
481
+ "itemName": "read_file",
482
+ "issue": "Property 'path' missing description",
483
+ "severity": "info"
484
+ },
485
+ {
486
+ "itemType": "tool",
487
+ "itemName": "read_text_file",
488
+ "issue": "Property 'path' missing description",
489
+ "severity": "info"
490
+ },
491
+ {
492
+ "itemType": "tool",
493
+ "itemName": "read_media_file",
494
+ "issue": "Property 'path' missing description",
495
+ "severity": "info"
496
+ },
497
+ {
498
+ "itemType": "tool",
499
+ "itemName": "write_file",
500
+ "issue": "Property 'path' missing description",
501
+ "severity": "info"
502
+ },
503
+ {
504
+ "itemType": "tool",
505
+ "itemName": "write_file",
506
+ "issue": "Property 'content' missing description",
507
+ "severity": "info"
508
+ },
509
+ {
510
+ "itemType": "tool",
511
+ "itemName": "edit_file",
512
+ "issue": "Property 'path' missing description",
513
+ "severity": "info"
514
+ },
515
+ {
516
+ "itemType": "tool",
517
+ "itemName": "edit_file",
518
+ "issue": "Property 'edits' missing description",
519
+ "severity": "info"
520
+ },
521
+ {
522
+ "itemType": "tool",
523
+ "itemName": "create_directory",
524
+ "issue": "Property 'path' missing description",
525
+ "severity": "info"
526
+ },
527
+ {
528
+ "itemType": "tool",
529
+ "itemName": "list_directory",
530
+ "issue": "Property 'path' missing description",
531
+ "severity": "info"
532
+ },
533
+ {
534
+ "itemType": "tool",
535
+ "itemName": "list_directory_with_sizes",
536
+ "issue": "Property 'path' missing description",
537
+ "severity": "info"
538
+ },
539
+ {
540
+ "itemType": "tool",
541
+ "itemName": "directory_tree",
542
+ "issue": "Property 'path' missing description",
543
+ "severity": "info"
544
+ },
545
+ {
546
+ "itemType": "tool",
547
+ "itemName": "directory_tree",
548
+ "issue": "Property 'excludePatterns' missing description",
549
+ "severity": "info"
550
+ },
551
+ {
552
+ "itemType": "tool",
553
+ "itemName": "move_file",
554
+ "issue": "Property 'source' missing description",
555
+ "severity": "info"
556
+ },
557
+ {
558
+ "itemType": "tool",
559
+ "itemName": "move_file",
560
+ "issue": "Property 'destination' missing description",
561
+ "severity": "info"
562
+ },
563
+ {
564
+ "itemType": "tool",
565
+ "itemName": "search_files",
566
+ "issue": "Property 'path' missing description",
567
+ "severity": "info"
568
+ },
569
+ {
570
+ "itemType": "tool",
571
+ "itemName": "search_files",
572
+ "issue": "Property 'pattern' missing description",
573
+ "severity": "info"
574
+ },
575
+ {
576
+ "itemType": "tool",
577
+ "itemName": "search_files",
578
+ "issue": "Property 'excludePatterns' missing description",
579
+ "severity": "info"
580
+ },
581
+ {
582
+ "itemType": "tool",
583
+ "itemName": "get_file_info",
584
+ "issue": "Property 'path' missing description",
585
+ "severity": "info"
586
+ }
587
+ ]
588
+ }
589
+ ]
590
+ },
591
+ {
592
+ "id": "security",
593
+ "capability": "security",
594
+ "status": "partial",
595
+ "durationMs": 2.289042000000336,
596
+ "message": "Found 3 security finding(s): 0 high, 3 medium, 0 low.",
597
+ "evidence": [
598
+ {
599
+ "endpoint": "security/scan",
600
+ "advertised": true,
601
+ "responded": true,
602
+ "minimalShapePresent": true,
603
+ "itemCount": 3,
604
+ "identifiers": [
605
+ "write_file",
606
+ "edit_file",
607
+ "create_directory"
608
+ ],
609
+ "diagnostics": [
610
+ "[medium] Tool \"write_file\" accepts filesystem paths and has destructive capabilities.",
611
+ "[medium] Tool \"edit_file\" accepts filesystem paths and has destructive capabilities.",
612
+ "[medium] Tool \"create_directory\" accepts filesystem paths and has destructive capabilities."
613
+ ],
614
+ "findings": [
615
+ {
616
+ "ruleId": "broad-filesystem",
617
+ "severity": "medium",
618
+ "toolName": "write_file",
619
+ "message": "Tool \"write_file\" accepts filesystem paths and has destructive capabilities."
620
+ },
621
+ {
622
+ "ruleId": "broad-filesystem",
623
+ "severity": "medium",
624
+ "toolName": "edit_file",
625
+ "message": "Tool \"edit_file\" accepts filesystem paths and has destructive capabilities."
626
+ },
627
+ {
628
+ "ruleId": "broad-filesystem",
629
+ "severity": "medium",
630
+ "toolName": "create_directory",
631
+ "message": "Tool \"create_directory\" accepts filesystem paths and has destructive capabilities."
632
+ }
633
+ ]
634
+ }
635
+ ]
636
+ },
637
+ {
638
+ "id": "attack-sim",
639
+ "capability": "attack-sim",
640
+ "status": "partial",
641
+ "durationMs": 2.580167000000074,
642
+ "message": "Safe attack simulation found 3 finding(s): 0 high, 3 medium, 0 low.",
643
+ "evidence": [
644
+ {
645
+ "endpoint": "attack-sim/safe",
646
+ "advertised": true,
647
+ "responded": true,
648
+ "minimalShapePresent": true,
649
+ "itemCount": 3,
650
+ "identifiers": [
651
+ "write_file",
652
+ "edit_file",
653
+ "create_directory"
654
+ ],
655
+ "diagnostics": [
656
+ "[medium] Tool \"write_file\" combines broad parameters (path) with destructive or non-read-only behavior.",
657
+ "[medium] Tool \"edit_file\" combines broad parameters (path) with destructive or non-read-only behavior.",
658
+ "[medium] Tool \"create_directory\" combines broad parameters (path) with destructive or non-read-only behavior."
659
+ ],
660
+ "findings": [
661
+ {
662
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
663
+ "attackClass": "permission-boundary",
664
+ "severity": "medium",
665
+ "itemType": "tool",
666
+ "itemName": "write_file",
667
+ "message": "Tool \"write_file\" combines broad parameters (path) with destructive or non-read-only behavior.",
668
+ "evidence": {
669
+ "broadParams": [
670
+ "path"
671
+ ],
672
+ "annotations": {
673
+ "readOnlyHint": false,
674
+ "destructiveHint": true,
675
+ "idempotentHint": true
676
+ },
677
+ "description": "Create a new file or completely overwrite an existing file with new content. Use with caution as it will overwrite existing files without warning. Handles text content with proper encoding. Only works within allowed directories."
678
+ },
679
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
680
+ "recommendedAction": "gate"
681
+ },
682
+ {
683
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
684
+ "attackClass": "permission-boundary",
685
+ "severity": "medium",
686
+ "itemType": "tool",
687
+ "itemName": "edit_file",
688
+ "message": "Tool \"edit_file\" combines broad parameters (path) with destructive or non-read-only behavior.",
689
+ "evidence": {
690
+ "broadParams": [
691
+ "path"
692
+ ],
693
+ "annotations": {
694
+ "readOnlyHint": false,
695
+ "destructiveHint": true,
696
+ "idempotentHint": false
697
+ },
698
+ "description": "Make line-based edits to a text file. Each edit replaces exact line sequences with new content. Returns a git-style diff showing the changes made. Only works within allowed directories."
699
+ },
700
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
701
+ "recommendedAction": "gate"
702
+ },
703
+ {
704
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
705
+ "attackClass": "permission-boundary",
706
+ "severity": "medium",
707
+ "itemType": "tool",
708
+ "itemName": "create_directory",
709
+ "message": "Tool \"create_directory\" combines broad parameters (path) with destructive or non-read-only behavior.",
710
+ "evidence": {
711
+ "broadParams": [
712
+ "path"
713
+ ],
714
+ "annotations": {
715
+ "readOnlyHint": false,
716
+ "destructiveHint": false,
717
+ "idempotentHint": true
718
+ },
719
+ "description": "Create a new directory or ensure a directory exists. Can create multiple nested directories in one operation. If the directory already exists, this operation will succeed silently. Perfect for setting up directory structures for projects or ensuring required paths exist. Only works within allowed directories."
720
+ },
721
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
722
+ "recommendedAction": "gate"
723
+ }
724
+ ]
725
+ }
726
+ ]
727
+ }
728
+ ],
729
+ "healthScore": {
730
+ "overall": 77,
731
+ "grade": "C",
732
+ "dimensions": [
733
+ {
734
+ "name": "Protocol Compliance",
735
+ "weight": 0.3,
736
+ "score": 100,
737
+ "details": [
738
+ "conformance: pass (100/100)"
739
+ ]
740
+ },
741
+ {
742
+ "name": "Schema Quality",
743
+ "weight": 0.2,
744
+ "score": 60,
745
+ "details": [
746
+ "schema-quality: partial (60/100)"
747
+ ]
748
+ },
749
+ {
750
+ "name": "Security",
751
+ "weight": 0.2,
752
+ "score": 60,
753
+ "details": [
754
+ "security-lite: partial (60/100)",
755
+ "security: partial (60/100)",
756
+ "attack-sim: partial (60/100)"
757
+ ]
758
+ },
759
+ {
760
+ "name": "Reliability",
761
+ "weight": 0.2,
762
+ "score": 67,
763
+ "details": [
764
+ "tools: pass (100/100)",
765
+ "prompts: unsupported (50/100)",
766
+ "resources: unsupported (50/100)"
767
+ ]
768
+ },
769
+ {
770
+ "name": "Performance",
771
+ "weight": 0.1,
772
+ "score": 100,
773
+ "details": [
774
+ "Connect: 618ms",
775
+ "p95 latency: 5ms (3 operations)"
776
+ ]
777
+ }
778
+ ]
779
+ },
780
+ "performanceMetrics": {
781
+ "connectMs": 618.2616669999998,
782
+ "toolsListMs": 4.94458399999985,
783
+ "promptsListMs": 0.0038749999998799467,
784
+ "resourcesListMs": 0.001750000000356522
785
+ }
786
+ }