@kryptosai/mcp-observatory 0.26.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/COMMERCIAL.md +13 -9
  2. package/CONTRIBUTORS.md +39 -0
  3. package/PRIVACY.md +5 -5
  4. package/README.md +83 -30
  5. package/TERMS.md +1 -1
  6. package/dist/src/adapters/http.js +1 -5
  7. package/dist/src/adapters/http.js.map +1 -1
  8. package/dist/src/cassette.js +3 -2
  9. package/dist/src/cassette.js.map +1 -1
  10. package/dist/src/checks/attack-sim.d.ts +18 -0
  11. package/dist/src/checks/attack-sim.js +304 -0
  12. package/dist/src/checks/attack-sim.js.map +1 -0
  13. package/dist/src/checks/schema-quality.js +1 -0
  14. package/dist/src/checks/schema-quality.js.map +1 -1
  15. package/dist/src/ci-issue.js +4 -3
  16. package/dist/src/ci-issue.js.map +1 -1
  17. package/dist/src/cli.js +17 -3
  18. package/dist/src/cli.js.map +1 -1
  19. package/dist/src/commands/attack-sim.d.ts +2 -0
  20. package/dist/src/commands/attack-sim.js +168 -0
  21. package/dist/src/commands/attack-sim.js.map +1 -0
  22. package/dist/src/commands/helpers.d.ts +3 -1
  23. package/dist/src/commands/helpers.js +2 -2
  24. package/dist/src/commands/helpers.js.map +1 -1
  25. package/dist/src/commands/init-ci.d.ts +3 -0
  26. package/dist/src/commands/init-ci.js +57 -11
  27. package/dist/src/commands/init-ci.js.map +1 -1
  28. package/dist/src/commands/legacy.js +24 -3
  29. package/dist/src/commands/legacy.js.map +1 -1
  30. package/dist/src/commands/scan.js +37 -10
  31. package/dist/src/commands/scan.js.map +1 -1
  32. package/dist/src/commands/serve.js +9 -1
  33. package/dist/src/commands/serve.js.map +1 -1
  34. package/dist/src/commands/setup-ci-conversion.d.ts +26 -0
  35. package/dist/src/commands/setup-ci-conversion.js +120 -0
  36. package/dist/src/commands/setup-ci-conversion.js.map +1 -0
  37. package/dist/src/commands/telemetry.js +20 -14
  38. package/dist/src/commands/telemetry.js.map +1 -1
  39. package/dist/src/commands/test.js +63 -4
  40. package/dist/src/commands/test.js.map +1 -1
  41. package/dist/src/findings.d.ts +20 -0
  42. package/dist/src/findings.js +272 -0
  43. package/dist/src/findings.js.map +1 -0
  44. package/dist/src/history.js +3 -2
  45. package/dist/src/history.js.map +1 -1
  46. package/dist/src/index.d.ts +3 -0
  47. package/dist/src/index.js +3 -0
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/integrations/smithery.js +5 -1
  50. package/dist/src/integrations/smithery.js.map +1 -1
  51. package/dist/src/reporters/attack-sim.d.ts +2 -0
  52. package/dist/src/reporters/attack-sim.js +84 -0
  53. package/dist/src/reporters/attack-sim.js.map +1 -0
  54. package/dist/src/reporters/pr-comment.js +20 -6
  55. package/dist/src/reporters/pr-comment.js.map +1 -1
  56. package/dist/src/reporters/sarif.d.ts +4 -1
  57. package/dist/src/reporters/sarif.js +58 -37
  58. package/dist/src/reporters/sarif.js.map +1 -1
  59. package/dist/src/runner.d.ts +3 -0
  60. package/dist/src/runner.js +5 -0
  61. package/dist/src/runner.js.map +1 -1
  62. package/dist/src/score.js +1 -1
  63. package/dist/src/score.js.map +1 -1
  64. package/dist/src/storage.d.ts +1 -0
  65. package/dist/src/storage.js +28 -2
  66. package/dist/src/storage.js.map +1 -1
  67. package/dist/src/telemetry.d.ts +6 -0
  68. package/dist/src/telemetry.js +17 -1
  69. package/dist/src/telemetry.js.map +1 -1
  70. package/dist/src/types.d.ts +1 -1
  71. package/dist/src/utils/files.d.ts +1 -0
  72. package/dist/src/utils/files.js +21 -0
  73. package/dist/src/utils/files.js.map +1 -0
  74. package/dist/src/utils/ids.js +18 -5
  75. package/dist/src/utils/ids.js.map +1 -1
  76. package/dist/src/utils/url.d.ts +2 -0
  77. package/dist/src/utils/url.js +15 -0
  78. package/dist/src/utils/url.js.map +1 -0
  79. package/dist/src/validate.js +1 -1
  80. package/dist/src/validate.js.map +1 -1
  81. package/docs/agent-ecosystem-promotion-plan.md +244 -0
  82. package/docs/agent-runtime-quickstart.md +98 -0
  83. package/docs/agent-tasks.md +95 -0
  84. package/docs/automatic-ci-integration.md +33 -0
  85. package/docs/campaign-attribution.md +58 -0
  86. package/docs/code-scanning-demo.md +57 -0
  87. package/docs/code-scanning-launch-outreach.md +55 -0
  88. package/docs/contributor-proof-cards/README.md +33 -0
  89. package/docs/contributor-recognition.md +92 -0
  90. package/docs/feishu-lark-mcp.md +3 -3
  91. package/docs/github-code-scanning-for-mcp.md +94 -0
  92. package/docs/launch.md +64 -0
  93. package/docs/mcp-attack-simulator.md +57 -0
  94. package/docs/mcp-server-safety-index.md +18 -12
  95. package/docs/metrics-dashboard.md +2 -2
  96. package/docs/openclaw-agent-template/SOUL.md +156 -0
  97. package/docs/proof.md +7 -4
  98. package/docs/receipt-graph.md +54 -0
  99. package/docs/safety-index/artifacts/antv-chart-server.json +21 -21
  100. package/docs/safety-index/artifacts/antv-chart-server.md +10 -10
  101. package/docs/safety-index/artifacts/browsermcp-server.json +17 -17
  102. package/docs/safety-index/artifacts/browsermcp-server.md +10 -10
  103. package/docs/safety-index/artifacts/context7-server.json +17 -17
  104. package/docs/safety-index/artifacts/context7-server.md +10 -10
  105. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2014 -0
  106. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +163 -0
  107. package/docs/safety-index/artifacts/everything-server.json +131 -56
  108. package/docs/safety-index/artifacts/everything-server.md +24 -24
  109. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +26 -18
  110. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +10 -10
  111. package/docs/safety-index/artifacts/filesystem-server.json +128 -20
  112. package/docs/safety-index/artifacts/filesystem-server.md +10 -10
  113. package/docs/safety-index/artifacts/kubernetes-server.attack.json +1559 -0
  114. package/docs/safety-index/artifacts/kubernetes-server.attack.md +43 -0
  115. package/docs/safety-index/artifacts/kubernetes-server.attack.sarif +2857 -0
  116. package/docs/safety-index/artifacts/kubernetes-server.json +1348 -0
  117. package/docs/safety-index/artifacts/kubernetes-server.md +150 -0
  118. package/docs/safety-index/artifacts/memory-server.json +75 -32
  119. package/docs/safety-index/artifacts/memory-server.md +35 -28
  120. package/docs/safety-index/artifacts/opentofu-server.json +25 -17
  121. package/docs/safety-index/artifacts/opentofu-server.md +11 -11
  122. package/docs/safety-index/artifacts/playwright-mcp-server.json +56 -20
  123. package/docs/safety-index/artifacts/playwright-mcp-server.md +12 -12
  124. package/docs/safety-index/artifacts/promptopia-server.json +28 -20
  125. package/docs/safety-index/artifacts/promptopia-server.md +11 -11
  126. package/docs/safety-index/artifacts/puppeteer-server.json +42 -30
  127. package/docs/safety-index/artifacts/puppeteer-server.md +28 -28
  128. package/docs/safety-index/artifacts/ref-tools-server.json +17 -17
  129. package/docs/safety-index/artifacts/ref-tools-server.md +9 -9
  130. package/docs/safety-index/artifacts/sequential-thinking-server.json +20 -21
  131. package/docs/safety-index/artifacts/sequential-thinking-server.md +10 -10
  132. package/docs/safety-index/targets.json +90 -14
  133. package/docs/setup-ci-doctor.md +2 -0
  134. package/docs/target-contribution-guide.md +139 -0
  135. package/docs/target-gallery.md +49 -0
  136. package/docs/target-registry.md +120 -0
  137. package/docs/tool-call-receipts.md +116 -0
  138. package/package.json +52 -9
  139. package/schemas/run-artifact.schema.json +1 -0
  140. package/scripts/postinstall.mjs +123 -0
  141. package/docs/certification-campaign-template.md +0 -181
  142. package/docs/certification-distribution.md +0 -145
  143. package/docs/certification-pr-campaign.md +0 -68
  144. package/docs/clone-to-ci-campaign.md +0 -62
  145. package/docs/directory-listing-copy.md +0 -85
  146. package/docs/distribution-launch.md +0 -76
  147. package/docs/ecosystem-distribution-kit.md +0 -79
  148. package/docs/enterprise-outreach-playbook.md +0 -83
  149. package/docs/paid-pilot-offer.md +0 -74
  150. package/docs/project-case-study.md +0 -140
  151. package/docs/public-post-drafts.md +0 -98
  152. package/docs/publish-readiness.md +0 -79
@@ -0,0 +1,1348 @@
1
+ {
2
+ "artifactType": "run",
3
+ "schemaVersion": "1.0.0",
4
+ "gate": "fail",
5
+ "runId": "run_2026-07-06T053258917Z_2e4f693a",
6
+ "createdAt": "2026-07-06T05:32:58.918Z",
7
+ "toolVersion": "0.28.0",
8
+ "target": {
9
+ "targetId": "mcp-server-kubernetes",
10
+ "adapter": "local-process",
11
+ "command": "npx",
12
+ "args": [
13
+ "-y",
14
+ "mcp-server-kubernetes"
15
+ ],
16
+ "serverName": "kubernetes",
17
+ "serverVersion": "3.9.2"
18
+ },
19
+ "environment": {
20
+ "platform": "darwin 25.5.0",
21
+ "nodeVersion": "v22.22.1"
22
+ },
23
+ "summary": {
24
+ "total": 6,
25
+ "pass": 4,
26
+ "fail": 1,
27
+ "partial": 1,
28
+ "unsupported": 0,
29
+ "flaky": 0,
30
+ "skipped": 0,
31
+ "gate": "fail"
32
+ },
33
+ "checks": [
34
+ {
35
+ "id": "tools",
36
+ "capability": "tools",
37
+ "status": "pass",
38
+ "durationMs": 2.264750000000049,
39
+ "message": "Advertised capability responded with the minimal expected shape (23 items).",
40
+ "evidence": [
41
+ {
42
+ "endpoint": "tools/list",
43
+ "advertised": true,
44
+ "responded": true,
45
+ "minimalShapePresent": true,
46
+ "itemCount": 23,
47
+ "identifiers": [
48
+ "cleanup",
49
+ "kubectl_get",
50
+ "kubectl_describe",
51
+ "kubectl_apply",
52
+ "kubectl_delete",
53
+ "kubectl_create",
54
+ "kubectl_logs",
55
+ "kubectl_scale",
56
+ "kubectl_patch",
57
+ "kubectl_rollout",
58
+ "kubectl_context",
59
+ "kubectl_reconnect",
60
+ "explain_resource",
61
+ "install_helm_chart",
62
+ "upgrade_helm_chart",
63
+ "uninstall_helm_chart",
64
+ "node_management",
65
+ "port_forward",
66
+ "stop_port_forward",
67
+ "exec_in_pod",
68
+ "list_api_resources",
69
+ "kubectl_generic",
70
+ "ping"
71
+ ],
72
+ "diagnostics": [
73
+ "Starting Kubernetes MCP server v3.9.2, handling commands...",
74
+ "Telemetry: Disabled",
75
+ "(node:54973) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.",
76
+ "(Use `node --trace-deprecation ...` to show where the warning was created)"
77
+ ],
78
+ "schemas": {
79
+ "cleanup": {
80
+ "type": "object",
81
+ "properties": {}
82
+ },
83
+ "kubectl_get": {
84
+ "type": "object",
85
+ "properties": {
86
+ "resourceType": {
87
+ "type": "string",
88
+ "description": "Type of resource to get (e.g., pods, deployments, services, configmaps, events, etc.)"
89
+ },
90
+ "name": {
91
+ "type": "string",
92
+ "description": "Name of the resource (optional - if not provided, lists all resources of the specified type)"
93
+ },
94
+ "namespace": {
95
+ "type": "string",
96
+ "description": "Kubernetes namespace",
97
+ "default": "default"
98
+ },
99
+ "output": {
100
+ "type": "string",
101
+ "enum": [
102
+ "json",
103
+ "yaml",
104
+ "wide",
105
+ "name",
106
+ "custom"
107
+ ],
108
+ "description": "Output format",
109
+ "default": "json"
110
+ },
111
+ "allNamespaces": {
112
+ "type": "boolean",
113
+ "description": "If true, list resources across all namespaces",
114
+ "default": false
115
+ },
116
+ "labelSelector": {
117
+ "type": "string",
118
+ "description": "Filter resources by label selector (e.g. 'app=nginx')"
119
+ },
120
+ "fieldSelector": {
121
+ "type": "string",
122
+ "description": "Filter resources by field selector (e.g. 'metadata.name=my-pod')"
123
+ },
124
+ "sortBy": {
125
+ "type": "string",
126
+ "description": "Sort events by a field (default: lastTimestamp). Only applicable for events."
127
+ },
128
+ "context": {
129
+ "type": "string",
130
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
131
+ "default": ""
132
+ }
133
+ },
134
+ "required": [
135
+ "resourceType"
136
+ ]
137
+ },
138
+ "kubectl_describe": {
139
+ "type": "object",
140
+ "properties": {
141
+ "resourceType": {
142
+ "type": "string",
143
+ "description": "Type of resource to describe (e.g., pods, deployments, services, etc.)"
144
+ },
145
+ "name": {
146
+ "type": "string",
147
+ "description": "Name of the resource to describe"
148
+ },
149
+ "namespace": {
150
+ "type": "string",
151
+ "description": "Kubernetes namespace",
152
+ "default": "default"
153
+ },
154
+ "context": {
155
+ "type": "string",
156
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
157
+ "default": ""
158
+ },
159
+ "allNamespaces": {
160
+ "type": "boolean",
161
+ "description": "If true, describe resources across all namespaces",
162
+ "default": false
163
+ }
164
+ },
165
+ "required": [
166
+ "resourceType",
167
+ "name"
168
+ ]
169
+ },
170
+ "kubectl_apply": {
171
+ "type": "object",
172
+ "properties": {
173
+ "manifest": {
174
+ "type": "string",
175
+ "description": "YAML manifest to apply"
176
+ },
177
+ "filename": {
178
+ "type": "string",
179
+ "description": "Path to a YAML file to apply (optional - use either manifest or filename)"
180
+ },
181
+ "namespace": {
182
+ "type": "string",
183
+ "description": "Kubernetes namespace",
184
+ "default": "default"
185
+ },
186
+ "dryRun": {
187
+ "type": "boolean",
188
+ "description": "If true, only validate the resource, don't actually execute the operation",
189
+ "default": false
190
+ },
191
+ "force": {
192
+ "type": "boolean",
193
+ "description": "If true, immediately remove resources from API and bypass graceful deletion",
194
+ "default": false
195
+ },
196
+ "context": {
197
+ "type": "string",
198
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
199
+ "default": ""
200
+ }
201
+ },
202
+ "required": []
203
+ },
204
+ "kubectl_delete": {
205
+ "type": "object",
206
+ "properties": {
207
+ "resourceType": {
208
+ "type": "string",
209
+ "description": "Type of resource to delete (e.g., pods, deployments, services, etc.)"
210
+ },
211
+ "name": {
212
+ "type": "string",
213
+ "description": "Name of the resource to delete"
214
+ },
215
+ "namespace": {
216
+ "type": "string",
217
+ "description": "Kubernetes namespace",
218
+ "default": "default"
219
+ },
220
+ "labelSelector": {
221
+ "type": "string",
222
+ "description": "Delete resources matching this label selector (e.g. 'app=nginx')"
223
+ },
224
+ "manifest": {
225
+ "type": "string",
226
+ "description": "YAML manifest defining resources to delete (optional)"
227
+ },
228
+ "filename": {
229
+ "type": "string",
230
+ "description": "Path to a YAML file to delete resources from (optional)"
231
+ },
232
+ "allNamespaces": {
233
+ "type": "boolean",
234
+ "description": "If true, delete resources across all namespaces",
235
+ "default": false
236
+ },
237
+ "force": {
238
+ "type": "boolean",
239
+ "description": "If true, immediately remove resources from API and bypass graceful deletion",
240
+ "default": false
241
+ },
242
+ "gracePeriodSeconds": {
243
+ "type": "number",
244
+ "description": "Period of time in seconds given to the resource to terminate gracefully"
245
+ },
246
+ "context": {
247
+ "type": "string",
248
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
249
+ "default": ""
250
+ }
251
+ },
252
+ "required": []
253
+ },
254
+ "kubectl_create": {
255
+ "type": "object",
256
+ "properties": {
257
+ "dryRun": {
258
+ "type": "boolean",
259
+ "description": "If true, only validate the resource, don't actually execute the operation",
260
+ "default": false
261
+ },
262
+ "output": {
263
+ "type": "string",
264
+ "enum": [
265
+ "json",
266
+ "yaml",
267
+ "name",
268
+ "go-template",
269
+ "go-template-file",
270
+ "template",
271
+ "templatefile",
272
+ "jsonpath",
273
+ "jsonpath-as-json",
274
+ "jsonpath-file"
275
+ ],
276
+ "description": "Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file",
277
+ "default": "yaml"
278
+ },
279
+ "validate": {
280
+ "type": "boolean",
281
+ "description": "If true, validate resource schema against server schema",
282
+ "default": true
283
+ },
284
+ "manifest": {
285
+ "type": "string",
286
+ "description": "YAML manifest to create resources from"
287
+ },
288
+ "filename": {
289
+ "type": "string",
290
+ "description": "Path to a YAML file to create resources from"
291
+ },
292
+ "resourceType": {
293
+ "type": "string",
294
+ "description": "Type of resource to create (namespace, configmap, deployment, service, etc.)"
295
+ },
296
+ "name": {
297
+ "type": "string",
298
+ "description": "Name of the resource to create"
299
+ },
300
+ "namespace": {
301
+ "type": "string",
302
+ "description": "Kubernetes namespace",
303
+ "default": "default"
304
+ },
305
+ "fromLiteral": {
306
+ "type": "array",
307
+ "items": {
308
+ "type": "string"
309
+ },
310
+ "description": "Key-value pair for creating configmap (e.g. [\"key1=value1\", \"key2=value2\"])"
311
+ },
312
+ "fromFile": {
313
+ "type": "array",
314
+ "items": {
315
+ "type": "string"
316
+ },
317
+ "description": "Path to file for creating configmap (e.g. [\"key1=/path/to/file1\", \"key2=/path/to/file2\"])"
318
+ },
319
+ "secretType": {
320
+ "type": "string",
321
+ "enum": [
322
+ "generic",
323
+ "docker-registry",
324
+ "tls"
325
+ ],
326
+ "description": "Type of secret to create (generic, docker-registry, tls)"
327
+ },
328
+ "serviceType": {
329
+ "type": "string",
330
+ "enum": [
331
+ "clusterip",
332
+ "nodeport",
333
+ "loadbalancer",
334
+ "externalname"
335
+ ],
336
+ "description": "Type of service to create (clusterip, nodeport, loadbalancer, externalname)"
337
+ },
338
+ "tcpPort": {
339
+ "type": "array",
340
+ "items": {
341
+ "type": "string"
342
+ },
343
+ "description": "Port pairs for tcp service (e.g. [\"80:8080\", \"443:8443\"])"
344
+ },
345
+ "image": {
346
+ "type": "string",
347
+ "description": "Image to use for the containers in the deployment"
348
+ },
349
+ "replicas": {
350
+ "type": "number",
351
+ "description": "Number of replicas to create for the deployment",
352
+ "default": 1
353
+ },
354
+ "port": {
355
+ "type": "number",
356
+ "description": "Port that the container exposes"
357
+ },
358
+ "schedule": {
359
+ "type": "string",
360
+ "description": "Cron schedule expression for the CronJob (e.g. \"*/5 * * * *\")"
361
+ },
362
+ "suspend": {
363
+ "type": "boolean",
364
+ "description": "Whether to suspend the CronJob",
365
+ "default": false
366
+ },
367
+ "command": {
368
+ "type": "array",
369
+ "items": {
370
+ "type": "string"
371
+ },
372
+ "description": "Command to run in the container"
373
+ },
374
+ "labels": {
375
+ "type": "array",
376
+ "items": {
377
+ "type": "string"
378
+ },
379
+ "description": "Labels to apply to the resource (e.g. [\"key1=value1\", \"key2=value2\"])"
380
+ },
381
+ "annotations": {
382
+ "type": "array",
383
+ "items": {
384
+ "type": "string"
385
+ },
386
+ "description": "Annotations to apply to the resource (e.g. [\"key1=value1\", \"key2=value2\"])"
387
+ },
388
+ "context": {
389
+ "type": "string",
390
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
391
+ "default": ""
392
+ }
393
+ },
394
+ "required": []
395
+ },
396
+ "kubectl_logs": {
397
+ "type": "object",
398
+ "properties": {
399
+ "resourceType": {
400
+ "type": "string",
401
+ "enum": [
402
+ "pod",
403
+ "deployment",
404
+ "job",
405
+ "cronjob"
406
+ ],
407
+ "description": "Type of resource to get logs from"
408
+ },
409
+ "name": {
410
+ "type": "string",
411
+ "description": "Name of the resource"
412
+ },
413
+ "namespace": {
414
+ "type": "string",
415
+ "description": "Kubernetes namespace",
416
+ "default": "default"
417
+ },
418
+ "container": {
419
+ "type": "string",
420
+ "description": "Container name (required when pod has multiple containers)"
421
+ },
422
+ "tail": {
423
+ "type": "number",
424
+ "description": "Number of lines to show from end of logs"
425
+ },
426
+ "since": {
427
+ "type": "string",
428
+ "description": "Show logs since relative time (e.g. '5s', '2m', '3h')"
429
+ },
430
+ "sinceTime": {
431
+ "type": "string",
432
+ "description": "Show logs since absolute time (RFC3339)"
433
+ },
434
+ "timestamps": {
435
+ "type": "boolean",
436
+ "description": "Include timestamps in logs",
437
+ "default": false
438
+ },
439
+ "previous": {
440
+ "type": "boolean",
441
+ "description": "Include logs from previously terminated containers",
442
+ "default": false
443
+ },
444
+ "follow": {
445
+ "type": "boolean",
446
+ "description": "Follow logs output (not recommended, may cause timeouts)",
447
+ "default": false
448
+ },
449
+ "labelSelector": {
450
+ "type": "string",
451
+ "description": "Filter resources by label selector"
452
+ },
453
+ "context": {
454
+ "type": "string",
455
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
456
+ "default": ""
457
+ }
458
+ },
459
+ "required": [
460
+ "resourceType",
461
+ "name",
462
+ "namespace"
463
+ ]
464
+ },
465
+ "kubectl_scale": {
466
+ "type": "object",
467
+ "properties": {
468
+ "name": {
469
+ "type": "string",
470
+ "description": "Name of the deployment to scale"
471
+ },
472
+ "namespace": {
473
+ "type": "string",
474
+ "description": "Kubernetes namespace",
475
+ "default": "default"
476
+ },
477
+ "replicas": {
478
+ "type": "number",
479
+ "description": "Number of replicas to scale to"
480
+ },
481
+ "resourceType": {
482
+ "type": "string",
483
+ "description": "Resource type to scale (deployment, replicaset, statefulset)",
484
+ "default": "deployment"
485
+ },
486
+ "context": {
487
+ "type": "string",
488
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
489
+ "default": ""
490
+ }
491
+ },
492
+ "required": [
493
+ "name",
494
+ "replicas"
495
+ ]
496
+ },
497
+ "kubectl_patch": {
498
+ "type": "object",
499
+ "properties": {
500
+ "resourceType": {
501
+ "type": "string",
502
+ "description": "Type of resource to patch (e.g., pods, deployments, services)"
503
+ },
504
+ "name": {
505
+ "type": "string",
506
+ "description": "Name of the resource to patch"
507
+ },
508
+ "namespace": {
509
+ "type": "string",
510
+ "description": "Kubernetes namespace",
511
+ "default": "default"
512
+ },
513
+ "patchType": {
514
+ "type": "string",
515
+ "description": "Type of patch to apply",
516
+ "enum": [
517
+ "strategic",
518
+ "merge",
519
+ "json"
520
+ ],
521
+ "default": "strategic"
522
+ },
523
+ "patchData": {
524
+ "type": "object",
525
+ "description": "Patch data as a JSON object"
526
+ },
527
+ "patchFile": {
528
+ "type": "string",
529
+ "description": "Path to a file containing the patch data (alternative to patchData)"
530
+ },
531
+ "dryRun": {
532
+ "type": "boolean",
533
+ "description": "If true, only validate the resource, don't actually execute the operation",
534
+ "default": false
535
+ },
536
+ "context": {
537
+ "type": "string",
538
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
539
+ "default": ""
540
+ }
541
+ },
542
+ "required": [
543
+ "resourceType",
544
+ "name"
545
+ ]
546
+ },
547
+ "kubectl_rollout": {
548
+ "type": "object",
549
+ "properties": {
550
+ "subCommand": {
551
+ "type": "string",
552
+ "description": "Rollout subcommand to execute",
553
+ "enum": [
554
+ "history",
555
+ "pause",
556
+ "restart",
557
+ "resume",
558
+ "status",
559
+ "undo"
560
+ ],
561
+ "default": "status"
562
+ },
563
+ "resourceType": {
564
+ "type": "string",
565
+ "description": "Type of resource to manage rollout for",
566
+ "enum": [
567
+ "deployment",
568
+ "daemonset",
569
+ "statefulset"
570
+ ],
571
+ "default": "deployment"
572
+ },
573
+ "name": {
574
+ "type": "string",
575
+ "description": "Name of the resource"
576
+ },
577
+ "namespace": {
578
+ "type": "string",
579
+ "description": "Kubernetes namespace",
580
+ "default": "default"
581
+ },
582
+ "revision": {
583
+ "type": "number",
584
+ "description": "Revision to rollback to (for undo subcommand)"
585
+ },
586
+ "toRevision": {
587
+ "type": "number",
588
+ "description": "Revision to roll back to (for history subcommand)"
589
+ },
590
+ "timeout": {
591
+ "type": "string",
592
+ "description": "The length of time to wait before giving up (e.g., '30s', '1m', '2m30s')"
593
+ },
594
+ "watch": {
595
+ "type": "boolean",
596
+ "description": "Watch the rollout status in real-time until completion",
597
+ "default": false
598
+ },
599
+ "context": {
600
+ "type": "string",
601
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
602
+ "default": ""
603
+ }
604
+ },
605
+ "required": [
606
+ "subCommand",
607
+ "resourceType",
608
+ "name",
609
+ "namespace"
610
+ ]
611
+ },
612
+ "kubectl_context": {
613
+ "type": "object",
614
+ "properties": {
615
+ "operation": {
616
+ "type": "string",
617
+ "enum": [
618
+ "list",
619
+ "get",
620
+ "set"
621
+ ],
622
+ "description": "Operation to perform: list contexts, get current context, or set current context",
623
+ "default": "list"
624
+ },
625
+ "name": {
626
+ "type": "string",
627
+ "description": "Name of the context to set as current (required for set operation)"
628
+ },
629
+ "showCurrent": {
630
+ "type": "boolean",
631
+ "description": "When listing contexts, highlight which one is currently active",
632
+ "default": true
633
+ },
634
+ "detailed": {
635
+ "type": "boolean",
636
+ "description": "Include detailed information about the context",
637
+ "default": false
638
+ },
639
+ "output": {
640
+ "type": "string",
641
+ "enum": [
642
+ "json",
643
+ "yaml",
644
+ "name",
645
+ "custom"
646
+ ],
647
+ "description": "Output format",
648
+ "default": "json"
649
+ }
650
+ },
651
+ "required": [
652
+ "operation"
653
+ ]
654
+ },
655
+ "kubectl_reconnect": {
656
+ "type": "object",
657
+ "properties": {},
658
+ "required": []
659
+ },
660
+ "explain_resource": {
661
+ "type": "object",
662
+ "properties": {
663
+ "resource": {
664
+ "type": "string",
665
+ "description": "Resource name or field path (e.g. 'pods' or 'pods.spec.containers')"
666
+ },
667
+ "apiVersion": {
668
+ "type": "string",
669
+ "description": "API version to use (e.g. 'apps/v1')"
670
+ },
671
+ "recursive": {
672
+ "type": "boolean",
673
+ "description": "Print the fields of fields recursively",
674
+ "default": false
675
+ },
676
+ "context": {
677
+ "type": "string",
678
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
679
+ "default": ""
680
+ },
681
+ "output": {
682
+ "type": "string",
683
+ "description": "Output format (plaintext or plaintext-openapiv2)",
684
+ "enum": [
685
+ "plaintext",
686
+ "plaintext-openapiv2"
687
+ ],
688
+ "default": "plaintext"
689
+ }
690
+ },
691
+ "required": [
692
+ "resource"
693
+ ]
694
+ },
695
+ "install_helm_chart": {
696
+ "type": "object",
697
+ "properties": {
698
+ "name": {
699
+ "type": "string",
700
+ "description": "Name of the Helm release"
701
+ },
702
+ "chart": {
703
+ "type": "string",
704
+ "description": "Chart name (e.g., 'nginx') or path to chart directory"
705
+ },
706
+ "namespace": {
707
+ "type": "string",
708
+ "description": "Kubernetes namespace",
709
+ "default": "default"
710
+ },
711
+ "context": {
712
+ "type": "string",
713
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
714
+ "default": ""
715
+ },
716
+ "repo": {
717
+ "type": "string",
718
+ "description": "Helm repository URL (optional if using local chart path)"
719
+ },
720
+ "values": {
721
+ "type": "object",
722
+ "description": "Custom values to override chart defaults"
723
+ },
724
+ "valuesFile": {
725
+ "type": "string",
726
+ "description": "Path to values file (alternative to values object)"
727
+ },
728
+ "useTemplate": {
729
+ "type": "boolean",
730
+ "description": "Use helm template + kubectl apply instead of helm install (bypasses auth issues)",
731
+ "default": false
732
+ },
733
+ "createNamespace": {
734
+ "type": "boolean",
735
+ "description": "Create namespace if it doesn't exist",
736
+ "default": true
737
+ }
738
+ },
739
+ "required": [
740
+ "name",
741
+ "chart",
742
+ "namespace"
743
+ ]
744
+ },
745
+ "upgrade_helm_chart": {
746
+ "type": "object",
747
+ "properties": {
748
+ "name": {
749
+ "type": "string",
750
+ "description": "Name of the Helm release to upgrade"
751
+ },
752
+ "chart": {
753
+ "type": "string",
754
+ "description": "Chart name or path to chart directory"
755
+ },
756
+ "namespace": {
757
+ "type": "string",
758
+ "description": "Kubernetes namespace",
759
+ "default": "default"
760
+ },
761
+ "context": {
762
+ "type": "string",
763
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
764
+ "default": ""
765
+ },
766
+ "repo": {
767
+ "type": "string",
768
+ "description": "Helm repository URL (optional if using local chart path)"
769
+ },
770
+ "values": {
771
+ "type": "object",
772
+ "description": "Custom values to override chart defaults"
773
+ },
774
+ "valuesFile": {
775
+ "type": "string",
776
+ "description": "Path to values file (alternative to values object)"
777
+ }
778
+ },
779
+ "required": [
780
+ "name",
781
+ "chart",
782
+ "namespace"
783
+ ]
784
+ },
785
+ "uninstall_helm_chart": {
786
+ "type": "object",
787
+ "properties": {
788
+ "name": {
789
+ "type": "string",
790
+ "description": "Name of the Helm release to uninstall"
791
+ },
792
+ "namespace": {
793
+ "type": "string",
794
+ "description": "Kubernetes namespace",
795
+ "default": "default"
796
+ },
797
+ "context": {
798
+ "type": "string",
799
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
800
+ "default": ""
801
+ }
802
+ },
803
+ "required": [
804
+ "name",
805
+ "namespace"
806
+ ]
807
+ },
808
+ "node_management": {
809
+ "type": "object",
810
+ "properties": {
811
+ "operation": {
812
+ "type": "string",
813
+ "description": "Node operation to perform",
814
+ "enum": [
815
+ "cordon",
816
+ "drain",
817
+ "uncordon"
818
+ ]
819
+ },
820
+ "nodeName": {
821
+ "type": "string",
822
+ "description": "Name of the node to operate on (required for cordon, drain, uncordon)"
823
+ },
824
+ "force": {
825
+ "type": "boolean",
826
+ "description": "Force the operation even if there are pods not managed by a ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet (for drain operation)",
827
+ "default": false
828
+ },
829
+ "gracePeriod": {
830
+ "type": "number",
831
+ "description": "Period of time in seconds given to each pod to terminate gracefully (for drain operation). If set to -1, uses the kubectl default grace period.",
832
+ "default": -1
833
+ },
834
+ "deleteLocalData": {
835
+ "type": "boolean",
836
+ "description": "Delete local data even if emptyDir volumes are used (for drain operation)",
837
+ "default": false
838
+ },
839
+ "ignoreDaemonsets": {
840
+ "type": "boolean",
841
+ "description": "Ignore DaemonSet-managed pods (for drain operation)",
842
+ "default": true
843
+ },
844
+ "timeout": {
845
+ "type": "string",
846
+ "description": "The length of time to wait before giving up (for drain operation, e.g., '5m', '1h')",
847
+ "default": "0"
848
+ },
849
+ "dryRun": {
850
+ "type": "boolean",
851
+ "description": "Show what would be done without actually doing it (for drain operation)",
852
+ "default": false
853
+ },
854
+ "confirmDrain": {
855
+ "type": "boolean",
856
+ "description": "Explicit confirmation to drain the node (required for drain operation)",
857
+ "default": false
858
+ }
859
+ },
860
+ "required": [
861
+ "operation"
862
+ ]
863
+ },
864
+ "port_forward": {
865
+ "type": "object",
866
+ "properties": {
867
+ "resourceType": {
868
+ "type": "string"
869
+ },
870
+ "resourceName": {
871
+ "type": "string"
872
+ },
873
+ "localPort": {
874
+ "type": "number"
875
+ },
876
+ "targetPort": {
877
+ "type": "number"
878
+ },
879
+ "namespace": {
880
+ "type": "string"
881
+ }
882
+ },
883
+ "required": [
884
+ "resourceType",
885
+ "resourceName",
886
+ "localPort",
887
+ "targetPort"
888
+ ]
889
+ },
890
+ "stop_port_forward": {
891
+ "type": "object",
892
+ "properties": {
893
+ "id": {
894
+ "type": "string"
895
+ }
896
+ },
897
+ "required": [
898
+ "id"
899
+ ]
900
+ },
901
+ "exec_in_pod": {
902
+ "type": "object",
903
+ "properties": {
904
+ "name": {
905
+ "type": "string",
906
+ "description": "Name of the pod to execute the command in"
907
+ },
908
+ "namespace": {
909
+ "type": "string",
910
+ "description": "Kubernetes namespace",
911
+ "default": "default"
912
+ },
913
+ "command": {
914
+ "type": "array",
915
+ "items": {
916
+ "type": "string"
917
+ },
918
+ "description": "Command to execute as an array of strings (e.g. [\"ls\", \"-la\", \"/app\"]). First element is the executable, remaining are arguments. Shell operators like pipes, redirects, or command chaining are not supported - use explicit array format for security."
919
+ },
920
+ "container": {
921
+ "type": "string",
922
+ "description": "Container name (required when pod has multiple containers)"
923
+ },
924
+ "timeout": {
925
+ "type": "number",
926
+ "description": "Timeout for command - 60000 milliseconds if not specified"
927
+ },
928
+ "context": {
929
+ "type": "string",
930
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
931
+ "default": ""
932
+ }
933
+ },
934
+ "required": [
935
+ "name",
936
+ "command"
937
+ ]
938
+ },
939
+ "list_api_resources": {
940
+ "type": "object",
941
+ "properties": {
942
+ "apiGroup": {
943
+ "type": "string",
944
+ "description": "API group to filter by"
945
+ },
946
+ "namespaced": {
947
+ "type": "boolean",
948
+ "description": "If true, only show namespaced resources"
949
+ },
950
+ "context": {
951
+ "type": "string",
952
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
953
+ "default": ""
954
+ },
955
+ "verbs": {
956
+ "type": "array",
957
+ "items": {
958
+ "type": "string"
959
+ },
960
+ "description": "List of verbs to filter by"
961
+ },
962
+ "output": {
963
+ "type": "string",
964
+ "description": "Output format (wide, name, or no-headers)",
965
+ "enum": [
966
+ "wide",
967
+ "name",
968
+ "no-headers"
969
+ ],
970
+ "default": "wide"
971
+ }
972
+ }
973
+ },
974
+ "kubectl_generic": {
975
+ "type": "object",
976
+ "properties": {
977
+ "command": {
978
+ "type": "string",
979
+ "description": "The kubectl command to execute (e.g. patch, rollout, top)"
980
+ },
981
+ "subCommand": {
982
+ "type": "string",
983
+ "description": "Subcommand if applicable (e.g. 'history' for rollout)"
984
+ },
985
+ "resourceType": {
986
+ "type": "string",
987
+ "description": "Resource type (e.g. pod, deployment)"
988
+ },
989
+ "name": {
990
+ "type": "string",
991
+ "description": "Resource name"
992
+ },
993
+ "namespace": {
994
+ "type": "string",
995
+ "description": "Kubernetes namespace",
996
+ "default": "default"
997
+ },
998
+ "outputFormat": {
999
+ "type": "string",
1000
+ "description": "Output format (e.g. json, yaml, wide)",
1001
+ "enum": [
1002
+ "json",
1003
+ "yaml",
1004
+ "wide",
1005
+ "name",
1006
+ "custom"
1007
+ ]
1008
+ },
1009
+ "flags": {
1010
+ "type": "object",
1011
+ "description": "Command flags as key-value pairs",
1012
+ "additionalProperties": true
1013
+ },
1014
+ "args": {
1015
+ "type": "array",
1016
+ "items": {
1017
+ "type": "string"
1018
+ },
1019
+ "description": "Additional command arguments"
1020
+ },
1021
+ "context": {
1022
+ "type": "string",
1023
+ "description": "Kubeconfig Context to use for the command (optional - defaults to null)",
1024
+ "default": ""
1025
+ }
1026
+ },
1027
+ "required": [
1028
+ "command"
1029
+ ]
1030
+ },
1031
+ "ping": {
1032
+ "type": "object",
1033
+ "properties": {},
1034
+ "required": []
1035
+ }
1036
+ }
1037
+ }
1038
+ ]
1039
+ },
1040
+ {
1041
+ "id": "prompts",
1042
+ "capability": "prompts",
1043
+ "status": "pass",
1044
+ "durationMs": 0.6192499999999654,
1045
+ "message": "Advertised capability responded with the minimal expected shape (1 item).",
1046
+ "evidence": [
1047
+ {
1048
+ "endpoint": "prompts/list",
1049
+ "advertised": true,
1050
+ "responded": true,
1051
+ "minimalShapePresent": true,
1052
+ "itemCount": 1,
1053
+ "identifiers": [
1054
+ "k8s-diagnose"
1055
+ ],
1056
+ "diagnostics": [
1057
+ "Starting Kubernetes MCP server v3.9.2, handling commands...",
1058
+ "Telemetry: Disabled",
1059
+ "(node:54973) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.",
1060
+ "(Use `node --trace-deprecation ...` to show where the warning was created)"
1061
+ ]
1062
+ }
1063
+ ]
1064
+ },
1065
+ {
1066
+ "id": "resources",
1067
+ "capability": "resources",
1068
+ "status": "pass",
1069
+ "durationMs": 1.0306660000001102,
1070
+ "message": "Advertised capability responded with the minimal expected shape, but one optional resource endpoint appears unsupported.",
1071
+ "evidence": [
1072
+ {
1073
+ "endpoint": "resources/list",
1074
+ "advertised": true,
1075
+ "responded": true,
1076
+ "minimalShapePresent": true,
1077
+ "itemCount": 5,
1078
+ "identifiers": [
1079
+ "k8s://default/pods",
1080
+ "k8s://default/deployments",
1081
+ "k8s://default/services",
1082
+ "k8s://namespaces",
1083
+ "k8s://nodes"
1084
+ ],
1085
+ "diagnostics": [
1086
+ "Starting Kubernetes MCP server v3.9.2, handling commands...",
1087
+ "Telemetry: Disabled",
1088
+ "(node:54973) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.",
1089
+ "(Use `node --trace-deprecation ...` to show where the warning was created)"
1090
+ ]
1091
+ },
1092
+ {
1093
+ "endpoint": "resources/templates/list",
1094
+ "advertised": true,
1095
+ "responded": false,
1096
+ "minimalShapePresent": false,
1097
+ "diagnostics": [
1098
+ "MCP error -32601: Method not found",
1099
+ "Starting Kubernetes MCP server v3.9.2, handling commands...",
1100
+ "Telemetry: Disabled",
1101
+ "(node:54973) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.",
1102
+ "(Use `node --trace-deprecation ...` to show where the warning was created)"
1103
+ ]
1104
+ }
1105
+ ]
1106
+ },
1107
+ {
1108
+ "id": "security-lite",
1109
+ "capability": "security-lite",
1110
+ "status": "fail",
1111
+ "durationMs": 0.597582999999986,
1112
+ "message": "Found 8 security finding(s): 3 high, 3 medium, 2 low.",
1113
+ "evidence": [
1114
+ {
1115
+ "endpoint": "security/scan-lite",
1116
+ "advertised": true,
1117
+ "responded": true,
1118
+ "minimalShapePresent": true,
1119
+ "itemCount": 8,
1120
+ "identifiers": [
1121
+ "cleanup",
1122
+ "kubectl_apply",
1123
+ "kubectl_delete",
1124
+ "kubectl_create",
1125
+ "kubectl_reconnect",
1126
+ "exec_in_pod",
1127
+ "kubectl_generic"
1128
+ ],
1129
+ "diagnostics": [
1130
+ "[low] Tool \"cleanup\" has an empty schema but is marked as destructive.",
1131
+ "[medium] Tool \"kubectl_apply\" accepts filesystem paths and has destructive capabilities.",
1132
+ "[medium] Tool \"kubectl_delete\" accepts filesystem paths and has destructive capabilities.",
1133
+ "[high] Tool \"kubectl_create\" has parameter \"command\" which may allow arbitrary command execution.",
1134
+ "[medium] Tool \"kubectl_create\" accepts filesystem paths and has destructive capabilities.",
1135
+ "[low] Tool \"kubectl_reconnect\" has an empty schema but is marked as destructive.",
1136
+ "[high] Tool \"exec_in_pod\" has parameter \"command\" which may allow arbitrary command execution.",
1137
+ "[high] Tool \"kubectl_generic\" has parameter \"command\" which may allow arbitrary command execution."
1138
+ ],
1139
+ "findings": [
1140
+ {
1141
+ "ruleId": "permissive-schema",
1142
+ "severity": "low",
1143
+ "toolName": "cleanup",
1144
+ "message": "Tool \"cleanup\" has an empty schema but is marked as destructive."
1145
+ },
1146
+ {
1147
+ "ruleId": "broad-filesystem",
1148
+ "severity": "medium",
1149
+ "toolName": "kubectl_apply",
1150
+ "message": "Tool \"kubectl_apply\" accepts filesystem paths and has destructive capabilities."
1151
+ },
1152
+ {
1153
+ "ruleId": "broad-filesystem",
1154
+ "severity": "medium",
1155
+ "toolName": "kubectl_delete",
1156
+ "message": "Tool \"kubectl_delete\" accepts filesystem paths and has destructive capabilities."
1157
+ },
1158
+ {
1159
+ "ruleId": "shell-injection",
1160
+ "severity": "high",
1161
+ "toolName": "kubectl_create",
1162
+ "message": "Tool \"kubectl_create\" has parameter \"command\" which may allow arbitrary command execution."
1163
+ },
1164
+ {
1165
+ "ruleId": "broad-filesystem",
1166
+ "severity": "medium",
1167
+ "toolName": "kubectl_create",
1168
+ "message": "Tool \"kubectl_create\" accepts filesystem paths and has destructive capabilities."
1169
+ },
1170
+ {
1171
+ "ruleId": "permissive-schema",
1172
+ "severity": "low",
1173
+ "toolName": "kubectl_reconnect",
1174
+ "message": "Tool \"kubectl_reconnect\" has an empty schema but is marked as destructive."
1175
+ },
1176
+ {
1177
+ "ruleId": "shell-injection",
1178
+ "severity": "high",
1179
+ "toolName": "exec_in_pod",
1180
+ "message": "Tool \"exec_in_pod\" has parameter \"command\" which may allow arbitrary command execution."
1181
+ },
1182
+ {
1183
+ "ruleId": "shell-injection",
1184
+ "severity": "high",
1185
+ "toolName": "kubectl_generic",
1186
+ "message": "Tool \"kubectl_generic\" has parameter \"command\" which may allow arbitrary command execution."
1187
+ }
1188
+ ]
1189
+ }
1190
+ ]
1191
+ },
1192
+ {
1193
+ "id": "conformance",
1194
+ "capability": "conformance",
1195
+ "status": "pass",
1196
+ "durationMs": 7.210374999999885,
1197
+ "message": "All 7 conformance checks passed.",
1198
+ "evidence": [
1199
+ {
1200
+ "endpoint": "conformance/check",
1201
+ "advertised": true,
1202
+ "responded": true,
1203
+ "minimalShapePresent": true,
1204
+ "itemCount": 7,
1205
+ "identifiers": [],
1206
+ "diagnostics": [
1207
+ "[pass] capabilities-present: Server returned capabilities object.",
1208
+ "[pass] server-info: Server provided initialization info.",
1209
+ "[pass] tools-capability-match: tools/list returned 23 tool(s).",
1210
+ "[pass] prompts-capability-match: prompts/list returned 1 prompt(s).",
1211
+ "[pass] resources-capability-match: resources/list returned 5 resource(s).",
1212
+ "[pass] tool-response-content: Tool \"cleanup\" response has valid content array.",
1213
+ "[pass] error-handling: Server returned proper error code -32601 for unknown method."
1214
+ ]
1215
+ }
1216
+ ]
1217
+ },
1218
+ {
1219
+ "id": "schema-quality",
1220
+ "capability": "schema-quality",
1221
+ "status": "partial",
1222
+ "durationMs": 0.9046250000001237,
1223
+ "message": "Found 7 quality finding(s) across 29 item(s): 0 warnings, 7 info.",
1224
+ "evidence": [
1225
+ {
1226
+ "endpoint": "schema-quality/scan",
1227
+ "advertised": true,
1228
+ "responded": true,
1229
+ "minimalShapePresent": true,
1230
+ "itemCount": 7,
1231
+ "identifiers": [
1232
+ "port_forward",
1233
+ "stop_port_forward",
1234
+ "list_api_resources"
1235
+ ],
1236
+ "diagnostics": [
1237
+ "[info] tool \"port_forward\": Property 'resourceType' missing description",
1238
+ "[info] tool \"port_forward\": Property 'resourceName' missing description",
1239
+ "[info] tool \"port_forward\": Property 'localPort' missing description",
1240
+ "[info] tool \"port_forward\": Property 'targetPort' missing description",
1241
+ "[info] tool \"port_forward\": Property 'namespace' missing description",
1242
+ "[info] tool \"stop_port_forward\": Property 'id' missing description",
1243
+ "[info] tool \"list_api_resources\": Has properties but no 'required' array declared"
1244
+ ],
1245
+ "findings": [
1246
+ {
1247
+ "itemType": "tool",
1248
+ "itemName": "port_forward",
1249
+ "issue": "Property 'resourceType' missing description",
1250
+ "severity": "info"
1251
+ },
1252
+ {
1253
+ "itemType": "tool",
1254
+ "itemName": "port_forward",
1255
+ "issue": "Property 'resourceName' missing description",
1256
+ "severity": "info"
1257
+ },
1258
+ {
1259
+ "itemType": "tool",
1260
+ "itemName": "port_forward",
1261
+ "issue": "Property 'localPort' missing description",
1262
+ "severity": "info"
1263
+ },
1264
+ {
1265
+ "itemType": "tool",
1266
+ "itemName": "port_forward",
1267
+ "issue": "Property 'targetPort' missing description",
1268
+ "severity": "info"
1269
+ },
1270
+ {
1271
+ "itemType": "tool",
1272
+ "itemName": "port_forward",
1273
+ "issue": "Property 'namespace' missing description",
1274
+ "severity": "info"
1275
+ },
1276
+ {
1277
+ "itemType": "tool",
1278
+ "itemName": "stop_port_forward",
1279
+ "issue": "Property 'id' missing description",
1280
+ "severity": "info"
1281
+ },
1282
+ {
1283
+ "itemType": "tool",
1284
+ "itemName": "list_api_resources",
1285
+ "issue": "Has properties but no 'required' array declared",
1286
+ "severity": "info"
1287
+ }
1288
+ ]
1289
+ }
1290
+ ]
1291
+ }
1292
+ ],
1293
+ "healthScore": {
1294
+ "overall": 72,
1295
+ "grade": "C",
1296
+ "dimensions": [
1297
+ {
1298
+ "name": "Protocol Compliance",
1299
+ "weight": 0.3,
1300
+ "score": 100,
1301
+ "details": [
1302
+ "conformance: pass (100/100)"
1303
+ ]
1304
+ },
1305
+ {
1306
+ "name": "Schema Quality",
1307
+ "weight": 0.2,
1308
+ "score": 60,
1309
+ "details": [
1310
+ "schema-quality: partial (60/100)"
1311
+ ]
1312
+ },
1313
+ {
1314
+ "name": "Security",
1315
+ "weight": 0.2,
1316
+ "score": 0,
1317
+ "details": [
1318
+ "security-lite: fail (0/100)"
1319
+ ]
1320
+ },
1321
+ {
1322
+ "name": "Reliability",
1323
+ "weight": 0.2,
1324
+ "score": 100,
1325
+ "details": [
1326
+ "tools: pass (100/100)",
1327
+ "prompts: pass (100/100)",
1328
+ "resources: pass (100/100)"
1329
+ ]
1330
+ },
1331
+ {
1332
+ "name": "Performance",
1333
+ "weight": 0.1,
1334
+ "score": 100,
1335
+ "details": [
1336
+ "Connect: 975ms",
1337
+ "p95 latency: 2ms (3 operations)"
1338
+ ]
1339
+ }
1340
+ ]
1341
+ },
1342
+ "performanceMetrics": {
1343
+ "connectMs": 975.0412919999999,
1344
+ "toolsListMs": 2.264750000000049,
1345
+ "promptsListMs": 0.6192499999999654,
1346
+ "resourcesListMs": 1.0306660000001102
1347
+ }
1348
+ }