@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,2014 @@
1
+ {
2
+ "artifactType": "run",
3
+ "schemaVersion": "1.0.0",
4
+ "gate": "pass",
5
+ "runId": "run_2026-07-06T014658742Z_9d713d02",
6
+ "createdAt": "2026-07-06T01:46:58.742Z",
7
+ "toolVersion": "0.26.1",
8
+ "target": {
9
+ "targetId": "cyanheads-git-mcp-server",
10
+ "adapter": "local-process",
11
+ "command": "npx",
12
+ "args": [
13
+ "-y",
14
+ "@cyanheads/git-mcp-server"
15
+ ],
16
+ "cwd": ".",
17
+ "metadata": {
18
+ "package": "@cyanheads/git-mcp-server",
19
+ "purpose": "mcp-safety-index",
20
+ "riskClass": "Repository mutation",
21
+ "failureClass": "Git tool boundary",
22
+ "whyItMatters": "Coding agents often need Git context and can cause real repository changes if tool boundaries are unclear."
23
+ },
24
+ "serverName": "@cyanheads/git-mcp-server",
25
+ "serverVersion": "2.15.1"
26
+ },
27
+ "environment": {
28
+ "platform": "darwin 24.0.0",
29
+ "nodeVersion": "v25.8.1"
30
+ },
31
+ "summary": {
32
+ "total": 7,
33
+ "pass": 4,
34
+ "fail": 0,
35
+ "partial": 3,
36
+ "unsupported": 0,
37
+ "flaky": 0,
38
+ "skipped": 0,
39
+ "gate": "pass"
40
+ },
41
+ "checks": [
42
+ {
43
+ "id": "tools",
44
+ "capability": "tools",
45
+ "status": "pass",
46
+ "durationMs": 33.99316700000054,
47
+ "message": "Advertised capability responded with the minimal expected shape (28 items).",
48
+ "evidence": [
49
+ {
50
+ "endpoint": "tools/list",
51
+ "advertised": true,
52
+ "responded": true,
53
+ "minimalShapePresent": true,
54
+ "itemCount": 28,
55
+ "identifiers": [
56
+ "git_add",
57
+ "git_blame",
58
+ "git_branch",
59
+ "git_changelog_analyze",
60
+ "git_checkout",
61
+ "git_cherry_pick",
62
+ "git_clean",
63
+ "git_clear_working_dir",
64
+ "git_clone",
65
+ "git_commit",
66
+ "git_diff",
67
+ "git_fetch",
68
+ "git_init",
69
+ "git_log",
70
+ "git_merge",
71
+ "git_pull",
72
+ "git_push",
73
+ "git_rebase",
74
+ "git_reflog",
75
+ "git_remote",
76
+ "git_reset",
77
+ "git_set_working_dir",
78
+ "git_show",
79
+ "git_stash",
80
+ "git_status",
81
+ "git_tag",
82
+ "git_worktree",
83
+ "git_wrapup_instructions"
84
+ ],
85
+ "diagnostics": [],
86
+ "schemas": {
87
+ "git_add": {
88
+ "type": "object",
89
+ "properties": {
90
+ "path": {
91
+ "default": ".",
92
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
93
+ "type": "string"
94
+ },
95
+ "paths": {
96
+ "default": [],
97
+ "description": "Array of file or directory paths to stage (relative to repository root). Use [\".\"] to stage all changes. Can be omitted when all or update is true.",
98
+ "type": "array",
99
+ "items": {
100
+ "type": "string"
101
+ }
102
+ },
103
+ "update": {
104
+ "default": false,
105
+ "description": "Stage only modified and deleted files (skip untracked files).",
106
+ "type": "boolean"
107
+ },
108
+ "all": {
109
+ "default": false,
110
+ "description": "Include all items (varies by operation).",
111
+ "type": "boolean"
112
+ },
113
+ "force": {
114
+ "default": false,
115
+ "description": "Allow adding otherwise ignored files.",
116
+ "type": "boolean"
117
+ }
118
+ },
119
+ "$schema": "http://json-schema.org/draft-07/schema#",
120
+ "additionalProperties": false
121
+ },
122
+ "git_blame": {
123
+ "type": "object",
124
+ "properties": {
125
+ "path": {
126
+ "default": ".",
127
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
128
+ "type": "string"
129
+ },
130
+ "filePath": {
131
+ "type": "string",
132
+ "minLength": 1,
133
+ "description": "Path to the file to blame (relative to repository root)."
134
+ },
135
+ "startLine": {
136
+ "description": "Start line number (1-indexed).",
137
+ "type": "integer",
138
+ "minimum": 1,
139
+ "maximum": 9007199254740991
140
+ },
141
+ "endLine": {
142
+ "description": "End line number (1-indexed).",
143
+ "type": "integer",
144
+ "minimum": 1,
145
+ "maximum": 9007199254740991
146
+ },
147
+ "ignoreWhitespace": {
148
+ "default": false,
149
+ "description": "Ignore whitespace changes.",
150
+ "type": "boolean"
151
+ }
152
+ },
153
+ "required": [
154
+ "filePath"
155
+ ],
156
+ "$schema": "http://json-schema.org/draft-07/schema#",
157
+ "additionalProperties": false
158
+ },
159
+ "git_branch": {
160
+ "type": "object",
161
+ "properties": {
162
+ "path": {
163
+ "default": ".",
164
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
165
+ "type": "string"
166
+ },
167
+ "mode": {
168
+ "default": "list",
169
+ "description": "The branch operation to perform.",
170
+ "type": "string",
171
+ "enum": [
172
+ "list",
173
+ "create",
174
+ "delete",
175
+ "rename",
176
+ "show-current"
177
+ ]
178
+ },
179
+ "branchName": {
180
+ "description": "Branch name for create/delete/rename operations.",
181
+ "type": "string",
182
+ "minLength": 1,
183
+ "maxLength": 255,
184
+ "pattern": "^[^~^:?*\\[\\\\]+$"
185
+ },
186
+ "newBranchName": {
187
+ "description": "New branch name for rename operation.",
188
+ "type": "string",
189
+ "minLength": 1,
190
+ "maxLength": 255,
191
+ "pattern": "^[^~^:?*\\[\\\\]+$"
192
+ },
193
+ "startPoint": {
194
+ "description": "Starting point (commit/branch) for new branch creation.",
195
+ "type": "string",
196
+ "minLength": 1
197
+ },
198
+ "force": {
199
+ "default": false,
200
+ "description": "Force the operation, bypassing safety checks.",
201
+ "type": "boolean"
202
+ },
203
+ "all": {
204
+ "default": false,
205
+ "description": "For list mode: show both local and remote branches.",
206
+ "type": "boolean"
207
+ },
208
+ "remote": {
209
+ "default": false,
210
+ "description": "For list mode: show only remote branches.",
211
+ "type": "boolean"
212
+ },
213
+ "merged": {
214
+ "description": "For list mode: show only branches merged into HEAD (true) or specified commit (string).",
215
+ "anyOf": [
216
+ {
217
+ "type": "boolean"
218
+ },
219
+ {
220
+ "type": "string",
221
+ "minLength": 1,
222
+ "description": "Commit reference: full/short hash, branch name, tag name, or relative ref (HEAD~1)."
223
+ }
224
+ ]
225
+ },
226
+ "noMerged": {
227
+ "description": "For list mode: show only branches not merged into HEAD (true) or specified commit (string).",
228
+ "anyOf": [
229
+ {
230
+ "type": "boolean"
231
+ },
232
+ {
233
+ "type": "string",
234
+ "minLength": 1,
235
+ "description": "Commit reference: full/short hash, branch name, tag name, or relative ref (HEAD~1)."
236
+ }
237
+ ]
238
+ },
239
+ "limit": {
240
+ "description": "For list mode: cap the number of branches returned (applied at the git command). Use on repos with many branches.",
241
+ "type": "integer",
242
+ "minimum": 1,
243
+ "maximum": 1000
244
+ }
245
+ },
246
+ "$schema": "http://json-schema.org/draft-07/schema#",
247
+ "additionalProperties": false
248
+ },
249
+ "git_changelog_analyze": {
250
+ "type": "object",
251
+ "properties": {
252
+ "path": {
253
+ "default": ".",
254
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
255
+ "type": "string"
256
+ },
257
+ "reviewTypes": {
258
+ "minItems": 1,
259
+ "type": "array",
260
+ "items": {
261
+ "type": "string",
262
+ "enum": [
263
+ "security",
264
+ "features",
265
+ "storyline",
266
+ "gaps",
267
+ "breaking_changes",
268
+ "quality"
269
+ ]
270
+ },
271
+ "description": "Types of changelog review to perform. At least one required. Options: security, features, storyline, gaps, breaking_changes, quality."
272
+ },
273
+ "maxCommits": {
274
+ "default": 200,
275
+ "description": "Maximum recent commits to fetch for cross-referencing (1-1000).",
276
+ "type": "integer",
277
+ "minimum": 1,
278
+ "maximum": 1000
279
+ },
280
+ "maxTags": {
281
+ "default": 100,
282
+ "description": "Maximum recent tags to fetch for release context (1-1000). Applied at the git command so large tag catalogs do not bloat the response.",
283
+ "type": "integer",
284
+ "minimum": 1,
285
+ "maximum": 1000
286
+ },
287
+ "sinceTag": {
288
+ "description": "Only include git history since this tag (e.g., \"v1.2.0\"). Narrows the analysis window.",
289
+ "type": "string"
290
+ },
291
+ "branch": {
292
+ "description": "Branch to analyze (defaults to current branch).",
293
+ "type": "string",
294
+ "minLength": 1
295
+ }
296
+ },
297
+ "required": [
298
+ "reviewTypes"
299
+ ],
300
+ "$schema": "http://json-schema.org/draft-07/schema#",
301
+ "additionalProperties": false
302
+ },
303
+ "git_checkout": {
304
+ "type": "object",
305
+ "properties": {
306
+ "path": {
307
+ "default": ".",
308
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
309
+ "type": "string"
310
+ },
311
+ "target": {
312
+ "anyOf": [
313
+ {
314
+ "type": "string",
315
+ "minLength": 1,
316
+ "maxLength": 255,
317
+ "pattern": "^[^~^:?*\\[\\\\]+$",
318
+ "description": "Branch name (must follow git naming conventions)."
319
+ },
320
+ {
321
+ "type": "string",
322
+ "minLength": 1,
323
+ "description": "Commit reference: full/short hash, branch name, tag name, or relative ref (HEAD~1)."
324
+ }
325
+ ],
326
+ "description": "Branch name, commit hash, or tag to checkout."
327
+ },
328
+ "createBranch": {
329
+ "default": false,
330
+ "description": "Create a new branch with the specified name.",
331
+ "type": "boolean"
332
+ },
333
+ "force": {
334
+ "default": false,
335
+ "description": "Force the operation, bypassing safety checks.",
336
+ "type": "boolean"
337
+ },
338
+ "paths": {
339
+ "description": "Specific file paths to checkout/restore (relative to repository root).",
340
+ "type": "array",
341
+ "items": {
342
+ "type": "string"
343
+ }
344
+ },
345
+ "track": {
346
+ "description": "Set up tracking relationship with remote branch when creating new branch.",
347
+ "type": "boolean"
348
+ }
349
+ },
350
+ "required": [
351
+ "target"
352
+ ],
353
+ "$schema": "http://json-schema.org/draft-07/schema#",
354
+ "additionalProperties": false
355
+ },
356
+ "git_cherry_pick": {
357
+ "type": "object",
358
+ "properties": {
359
+ "path": {
360
+ "default": ".",
361
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
362
+ "type": "string"
363
+ },
364
+ "commits": {
365
+ "minItems": 1,
366
+ "type": "array",
367
+ "items": {
368
+ "type": "string",
369
+ "minLength": 1,
370
+ "description": "Commit reference: full/short hash, branch name, tag name, or relative ref (HEAD~1)."
371
+ },
372
+ "description": "Commit hashes to cherry-pick."
373
+ },
374
+ "noCommit": {
375
+ "default": false,
376
+ "description": "Don't create commit (stage changes only).",
377
+ "type": "boolean"
378
+ },
379
+ "continueOperation": {
380
+ "default": false,
381
+ "description": "Continue cherry-pick after resolving conflicts.",
382
+ "type": "boolean"
383
+ },
384
+ "abort": {
385
+ "default": false,
386
+ "description": "Abort cherry-pick operation.",
387
+ "type": "boolean"
388
+ },
389
+ "mainline": {
390
+ "description": "For merge commits, specify which parent to follow (1 for first parent, 2 for second, etc.).",
391
+ "type": "integer",
392
+ "minimum": 1,
393
+ "maximum": 9007199254740991
394
+ },
395
+ "strategy": {
396
+ "description": "Merge strategy to use for cherry-pick.",
397
+ "type": "string",
398
+ "enum": [
399
+ "ort",
400
+ "recursive",
401
+ "octopus",
402
+ "ours",
403
+ "subtree"
404
+ ]
405
+ },
406
+ "signoff": {
407
+ "default": false,
408
+ "description": "Add Signed-off-by line to the commit message.",
409
+ "type": "boolean"
410
+ }
411
+ },
412
+ "required": [
413
+ "commits"
414
+ ],
415
+ "$schema": "http://json-schema.org/draft-07/schema#",
416
+ "additionalProperties": false
417
+ },
418
+ "git_clean": {
419
+ "type": "object",
420
+ "properties": {
421
+ "path": {
422
+ "default": ".",
423
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
424
+ "type": "string"
425
+ },
426
+ "force": {
427
+ "default": false,
428
+ "description": "Force the operation, bypassing safety checks.",
429
+ "type": "boolean"
430
+ },
431
+ "dryRun": {
432
+ "default": false,
433
+ "description": "Preview the operation without executing it.",
434
+ "type": "boolean"
435
+ },
436
+ "directories": {
437
+ "default": false,
438
+ "description": "Remove untracked directories in addition to files.",
439
+ "type": "boolean"
440
+ },
441
+ "ignored": {
442
+ "default": false,
443
+ "description": "Remove ignored files as well.",
444
+ "type": "boolean"
445
+ }
446
+ },
447
+ "$schema": "http://json-schema.org/draft-07/schema#",
448
+ "additionalProperties": false
449
+ },
450
+ "git_clear_working_dir": {
451
+ "type": "object",
452
+ "properties": {
453
+ "confirm": {
454
+ "type": "string",
455
+ "enum": [
456
+ "Y",
457
+ "y",
458
+ "Yes",
459
+ "yes"
460
+ ],
461
+ "description": "Explicit confirmation required to clear working directory. Accepted values: 'Y', 'y', 'Yes', or 'yes'."
462
+ }
463
+ },
464
+ "required": [
465
+ "confirm"
466
+ ],
467
+ "$schema": "http://json-schema.org/draft-07/schema#",
468
+ "additionalProperties": false
469
+ },
470
+ "git_clone": {
471
+ "type": "object",
472
+ "properties": {
473
+ "url": {
474
+ "type": "string",
475
+ "minLength": 1,
476
+ "description": "Source to clone from: HTTP(S) URL, SSH URL (ssh://… or git@host:path), git:// URL, file:// URL, or a bare filesystem path (e.g. /tmp/repo.git)."
477
+ },
478
+ "path": {
479
+ "type": "string",
480
+ "minLength": 1,
481
+ "description": "Destination path where the repository should be cloned."
482
+ },
483
+ "branch": {
484
+ "description": "Specific branch to clone (defaults to remote HEAD).",
485
+ "type": "string"
486
+ },
487
+ "depth": {
488
+ "description": "Create a shallow clone with history truncated to N commits.",
489
+ "type": "integer",
490
+ "minimum": 1,
491
+ "maximum": 9007199254740991
492
+ },
493
+ "bare": {
494
+ "default": false,
495
+ "description": "Create a bare repository (no working directory).",
496
+ "type": "boolean"
497
+ },
498
+ "mirror": {
499
+ "default": false,
500
+ "description": "Create a mirror clone (implies bare).",
501
+ "type": "boolean"
502
+ }
503
+ },
504
+ "required": [
505
+ "url",
506
+ "path"
507
+ ],
508
+ "$schema": "http://json-schema.org/draft-07/schema#",
509
+ "additionalProperties": false
510
+ },
511
+ "git_commit": {
512
+ "type": "object",
513
+ "properties": {
514
+ "path": {
515
+ "default": ".",
516
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
517
+ "type": "string"
518
+ },
519
+ "message": {
520
+ "description": "Commit message.",
521
+ "type": "string",
522
+ "minLength": 1,
523
+ "maxLength": 10000
524
+ },
525
+ "author": {
526
+ "description": "Override commit author (defaults to git config).",
527
+ "type": "object",
528
+ "properties": {
529
+ "name": {
530
+ "type": "string",
531
+ "minLength": 1,
532
+ "description": "Author's name"
533
+ },
534
+ "email": {
535
+ "type": "string",
536
+ "minLength": 1,
537
+ "description": "Author's email address (e.g. [redacted-email])."
538
+ }
539
+ },
540
+ "required": [
541
+ "name",
542
+ "email"
543
+ ]
544
+ },
545
+ "amend": {
546
+ "default": false,
547
+ "description": "Amend the previous commit instead of creating a new one. Use with caution.",
548
+ "type": "boolean"
549
+ },
550
+ "allowEmpty": {
551
+ "default": false,
552
+ "description": "Allow creating a commit with no changes.",
553
+ "type": "boolean"
554
+ },
555
+ "noVerify": {
556
+ "default": false,
557
+ "description": "Bypass pre-commit and commit-msg hooks.",
558
+ "type": "boolean"
559
+ },
560
+ "filesToStage": {
561
+ "description": "File paths to stage before committing (atomic stage+commit operation).",
562
+ "type": "array",
563
+ "items": {
564
+ "type": "string"
565
+ }
566
+ }
567
+ },
568
+ "required": [
569
+ "message"
570
+ ],
571
+ "$schema": "http://json-schema.org/draft-07/schema#",
572
+ "additionalProperties": false
573
+ },
574
+ "git_diff": {
575
+ "type": "object",
576
+ "properties": {
577
+ "path": {
578
+ "default": ".",
579
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
580
+ "type": "string"
581
+ },
582
+ "target": {
583
+ "description": "Target commit/branch to compare against. If not specified, shows unstaged changes in working tree.",
584
+ "type": "string",
585
+ "minLength": 1
586
+ },
587
+ "source": {
588
+ "description": "Source commit/branch to compare from. If target is specified but not source, compares target against working tree.",
589
+ "type": "string",
590
+ "minLength": 1
591
+ },
592
+ "paths": {
593
+ "description": "Limit diff to specific file paths (relative to repository root).",
594
+ "type": "array",
595
+ "items": {
596
+ "type": "string"
597
+ }
598
+ },
599
+ "staged": {
600
+ "default": false,
601
+ "description": "Show diff of staged changes instead of unstaged.",
602
+ "type": "boolean"
603
+ },
604
+ "includeUntracked": {
605
+ "default": false,
606
+ "description": "Include untracked files in the diff. Useful for reviewing all upcoming changes.",
607
+ "type": "boolean"
608
+ },
609
+ "nameOnly": {
610
+ "default": false,
611
+ "description": "Show only names of changed files, not the diff content.",
612
+ "type": "boolean"
613
+ },
614
+ "stat": {
615
+ "default": false,
616
+ "description": "Show diffstat (summary of changes) instead of full diff content.",
617
+ "type": "boolean"
618
+ },
619
+ "contextLines": {
620
+ "default": 3,
621
+ "description": "Number of context lines to show around changes.",
622
+ "type": "integer",
623
+ "minimum": 0,
624
+ "maximum": 100
625
+ },
626
+ "autoExclude": {
627
+ "default": true,
628
+ "description": "Automatically exclude lock files and other generated files (e.g., package-lock.json, yarn.lock, bun.lock, poetry.lock, go.sum) from diff output to reduce context bloat. Set to false if you need to inspect these files.",
629
+ "type": "boolean"
630
+ }
631
+ },
632
+ "$schema": "http://json-schema.org/draft-07/schema#",
633
+ "additionalProperties": false
634
+ },
635
+ "git_fetch": {
636
+ "type": "object",
637
+ "properties": {
638
+ "path": {
639
+ "default": ".",
640
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
641
+ "type": "string"
642
+ },
643
+ "remote": {
644
+ "description": "Remote name (default: origin).",
645
+ "type": "string",
646
+ "minLength": 1,
647
+ "maxLength": 255,
648
+ "pattern": "^[a-zA-Z0-9._-]+$"
649
+ },
650
+ "prune": {
651
+ "default": false,
652
+ "description": "Prune remote-tracking references that no longer exist on remote.",
653
+ "type": "boolean"
654
+ },
655
+ "tags": {
656
+ "default": false,
657
+ "description": "Fetch all tags from the remote.",
658
+ "type": "boolean"
659
+ },
660
+ "depth": {
661
+ "description": "Create a shallow clone with history truncated to N commits.",
662
+ "type": "integer",
663
+ "minimum": 1,
664
+ "maximum": 9007199254740991
665
+ }
666
+ },
667
+ "$schema": "http://json-schema.org/draft-07/schema#",
668
+ "additionalProperties": false
669
+ },
670
+ "git_init": {
671
+ "type": "object",
672
+ "properties": {
673
+ "path": {
674
+ "default": ".",
675
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
676
+ "type": "string"
677
+ },
678
+ "initialBranch": {
679
+ "description": "Name of the initial branch (default: main).",
680
+ "type": "string"
681
+ },
682
+ "bare": {
683
+ "default": false,
684
+ "description": "Create a bare repository (no working directory).",
685
+ "type": "boolean"
686
+ }
687
+ },
688
+ "$schema": "http://json-schema.org/draft-07/schema#",
689
+ "additionalProperties": false
690
+ },
691
+ "git_log": {
692
+ "type": "object",
693
+ "properties": {
694
+ "path": {
695
+ "default": ".",
696
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
697
+ "type": "string"
698
+ },
699
+ "maxCount": {
700
+ "default": 10,
701
+ "description": "Maximum number of items to return (1-1000).",
702
+ "type": "integer",
703
+ "minimum": 1,
704
+ "maximum": 1000
705
+ },
706
+ "skip": {
707
+ "description": "Number of items to skip for pagination.",
708
+ "type": "integer",
709
+ "minimum": 0,
710
+ "maximum": 9007199254740991
711
+ },
712
+ "since": {
713
+ "description": "Show commits more recent than a specific date (ISO 8601 format).",
714
+ "type": "string"
715
+ },
716
+ "until": {
717
+ "description": "Show commits older than a specific date (ISO 8601 format).",
718
+ "type": "string"
719
+ },
720
+ "author": {
721
+ "description": "Filter commits by author name or email pattern.",
722
+ "type": "string"
723
+ },
724
+ "grep": {
725
+ "description": "Filter commits by message pattern (regex supported).",
726
+ "type": "string"
727
+ },
728
+ "branch": {
729
+ "description": "Show commits from a specific branch or ref (defaults to current branch).",
730
+ "type": "string",
731
+ "minLength": 1
732
+ },
733
+ "filePath": {
734
+ "description": "Show commits that affected a specific file path.",
735
+ "type": "string"
736
+ },
737
+ "oneline": {
738
+ "default": false,
739
+ "description": "Abbreviated output: return only hash, shortHash, and subject per commit. Significantly reduces response size.",
740
+ "type": "boolean"
741
+ },
742
+ "stat": {
743
+ "default": false,
744
+ "description": "Include file change statistics for each commit.",
745
+ "type": "boolean"
746
+ },
747
+ "patch": {
748
+ "default": false,
749
+ "description": "Include the full diff patch for each commit.",
750
+ "type": "boolean"
751
+ },
752
+ "showSignature": {
753
+ "default": false,
754
+ "description": "Show GPG signature verification information for each commit.",
755
+ "type": "boolean"
756
+ }
757
+ },
758
+ "$schema": "http://json-schema.org/draft-07/schema#",
759
+ "additionalProperties": false
760
+ },
761
+ "git_merge": {
762
+ "type": "object",
763
+ "properties": {
764
+ "path": {
765
+ "default": ".",
766
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
767
+ "type": "string"
768
+ },
769
+ "branch": {
770
+ "type": "string",
771
+ "minLength": 1,
772
+ "maxLength": 255,
773
+ "pattern": "^[^~^:?*\\[\\\\]+$",
774
+ "description": "Branch to merge into current branch."
775
+ },
776
+ "strategy": {
777
+ "description": "Merge strategy to use (ort, recursive, octopus, ours, subtree).",
778
+ "type": "string",
779
+ "enum": [
780
+ "ort",
781
+ "recursive",
782
+ "octopus",
783
+ "ours",
784
+ "subtree"
785
+ ]
786
+ },
787
+ "noFastForward": {
788
+ "default": false,
789
+ "description": "Prevent fast-forward merge (create merge commit).",
790
+ "type": "boolean"
791
+ },
792
+ "squash": {
793
+ "default": false,
794
+ "description": "Squash all commits from the branch into a single commit.",
795
+ "type": "boolean"
796
+ },
797
+ "message": {
798
+ "description": "Custom merge commit message.",
799
+ "type": "string",
800
+ "minLength": 1,
801
+ "maxLength": 10000
802
+ },
803
+ "abort": {
804
+ "default": false,
805
+ "description": "Abort an in-progress merge that has conflicts.",
806
+ "type": "boolean"
807
+ }
808
+ },
809
+ "required": [
810
+ "branch"
811
+ ],
812
+ "$schema": "http://json-schema.org/draft-07/schema#",
813
+ "additionalProperties": false
814
+ },
815
+ "git_pull": {
816
+ "type": "object",
817
+ "properties": {
818
+ "path": {
819
+ "default": ".",
820
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
821
+ "type": "string"
822
+ },
823
+ "remote": {
824
+ "description": "Remote name (default: origin).",
825
+ "type": "string",
826
+ "minLength": 1,
827
+ "maxLength": 255,
828
+ "pattern": "^[a-zA-Z0-9._-]+$"
829
+ },
830
+ "branch": {
831
+ "description": "Branch name (default: current branch).",
832
+ "type": "string",
833
+ "minLength": 1,
834
+ "maxLength": 255,
835
+ "pattern": "^[^~^:?*\\[\\\\]+$"
836
+ },
837
+ "rebase": {
838
+ "default": false,
839
+ "description": "Use rebase instead of merge when integrating changes.",
840
+ "type": "boolean"
841
+ },
842
+ "fastForwardOnly": {
843
+ "default": false,
844
+ "description": "Fail if can't fast-forward (no merge commit).",
845
+ "type": "boolean"
846
+ }
847
+ },
848
+ "$schema": "http://json-schema.org/draft-07/schema#",
849
+ "additionalProperties": false
850
+ },
851
+ "git_push": {
852
+ "type": "object",
853
+ "properties": {
854
+ "path": {
855
+ "default": ".",
856
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
857
+ "type": "string"
858
+ },
859
+ "remote": {
860
+ "description": "Remote name (default: origin).",
861
+ "type": "string",
862
+ "minLength": 1,
863
+ "maxLength": 255,
864
+ "pattern": "^[a-zA-Z0-9._-]+$"
865
+ },
866
+ "branch": {
867
+ "description": "Branch name (default: current branch).",
868
+ "type": "string",
869
+ "minLength": 1,
870
+ "maxLength": 255,
871
+ "pattern": "^[^~^:?*\\[\\\\]+$"
872
+ },
873
+ "force": {
874
+ "default": false,
875
+ "description": "Force push (overwrites remote history).",
876
+ "type": "boolean"
877
+ },
878
+ "forceWithLease": {
879
+ "default": false,
880
+ "description": "Safer force push - only succeeds if remote branch is at expected state.",
881
+ "type": "boolean"
882
+ },
883
+ "setUpstream": {
884
+ "default": false,
885
+ "description": "Set upstream tracking relationship for the branch.",
886
+ "type": "boolean"
887
+ },
888
+ "tags": {
889
+ "default": false,
890
+ "description": "Push all tags to the remote.",
891
+ "type": "boolean"
892
+ },
893
+ "dryRun": {
894
+ "default": false,
895
+ "description": "Preview the operation without executing it.",
896
+ "type": "boolean"
897
+ },
898
+ "delete": {
899
+ "default": false,
900
+ "description": "Delete the specified remote branch.",
901
+ "type": "boolean"
902
+ },
903
+ "remoteBranch": {
904
+ "description": "Remote branch name to push to (if different from local branch name).",
905
+ "type": "string",
906
+ "minLength": 1,
907
+ "maxLength": 255,
908
+ "pattern": "^[^~^:?*\\[\\\\]+$"
909
+ },
910
+ "confirmed": {
911
+ "default": false,
912
+ "description": "Explicit confirmation required for force push or branch deletion on protected branches (main, master, production, etc.).",
913
+ "type": "boolean"
914
+ }
915
+ },
916
+ "$schema": "http://json-schema.org/draft-07/schema#",
917
+ "additionalProperties": false
918
+ },
919
+ "git_rebase": {
920
+ "type": "object",
921
+ "properties": {
922
+ "path": {
923
+ "default": ".",
924
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
925
+ "type": "string"
926
+ },
927
+ "mode": {
928
+ "default": "start",
929
+ "description": "Rebase operation mode: 'start', 'continue', 'abort', or 'skip'.",
930
+ "type": "string",
931
+ "enum": [
932
+ "start",
933
+ "continue",
934
+ "abort",
935
+ "skip"
936
+ ]
937
+ },
938
+ "upstream": {
939
+ "description": "Upstream branch to rebase onto (required for start mode).",
940
+ "type": "string",
941
+ "minLength": 1
942
+ },
943
+ "branch": {
944
+ "description": "Branch to rebase (default: current branch).",
945
+ "type": "string",
946
+ "minLength": 1
947
+ },
948
+ "interactive": {
949
+ "default": false,
950
+ "description": "Interactive rebase (not supported in all providers).",
951
+ "type": "boolean"
952
+ },
953
+ "onto": {
954
+ "description": "Rebase onto different commit than upstream.",
955
+ "type": "string",
956
+ "minLength": 1
957
+ },
958
+ "preserve": {
959
+ "default": false,
960
+ "description": "Preserve merge commits during rebase.",
961
+ "type": "boolean"
962
+ }
963
+ },
964
+ "$schema": "http://json-schema.org/draft-07/schema#",
965
+ "additionalProperties": false
966
+ },
967
+ "git_reflog": {
968
+ "type": "object",
969
+ "properties": {
970
+ "path": {
971
+ "default": ".",
972
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
973
+ "type": "string"
974
+ },
975
+ "ref": {
976
+ "default": "HEAD",
977
+ "description": "Reference whose reflog to show. Defaults to HEAD.",
978
+ "type": "string"
979
+ },
980
+ "maxCount": {
981
+ "default": 25,
982
+ "description": "Maximum number of items to return (1-1000).",
983
+ "type": "integer",
984
+ "minimum": 1,
985
+ "maximum": 1000
986
+ }
987
+ },
988
+ "$schema": "http://json-schema.org/draft-07/schema#",
989
+ "additionalProperties": false
990
+ },
991
+ "git_remote": {
992
+ "type": "object",
993
+ "properties": {
994
+ "path": {
995
+ "default": ".",
996
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
997
+ "type": "string"
998
+ },
999
+ "mode": {
1000
+ "default": "list",
1001
+ "description": "The remote operation to perform.",
1002
+ "type": "string",
1003
+ "enum": [
1004
+ "list",
1005
+ "add",
1006
+ "remove",
1007
+ "rename",
1008
+ "get-url",
1009
+ "set-url"
1010
+ ]
1011
+ },
1012
+ "name": {
1013
+ "description": "Remote name for add/remove/rename/get-url/set-url operations.",
1014
+ "type": "string",
1015
+ "minLength": 1,
1016
+ "maxLength": 255,
1017
+ "pattern": "^[a-zA-Z0-9._-]+$"
1018
+ },
1019
+ "url": {
1020
+ "description": "Remote URL for add/set-url operations. Accepts HTTP(S), SSH (ssh://… or git@host:path), git://, or file:// URLs.",
1021
+ "type": "string",
1022
+ "minLength": 1
1023
+ },
1024
+ "newName": {
1025
+ "description": "New remote name for rename operation.",
1026
+ "type": "string",
1027
+ "minLength": 1,
1028
+ "maxLength": 255,
1029
+ "pattern": "^[a-zA-Z0-9._-]+$"
1030
+ },
1031
+ "push": {
1032
+ "default": false,
1033
+ "description": "Set push URL separately (for set-url operation).",
1034
+ "type": "boolean"
1035
+ }
1036
+ },
1037
+ "$schema": "http://json-schema.org/draft-07/schema#",
1038
+ "additionalProperties": false
1039
+ },
1040
+ "git_reset": {
1041
+ "type": "object",
1042
+ "properties": {
1043
+ "path": {
1044
+ "default": ".",
1045
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1046
+ "type": "string"
1047
+ },
1048
+ "mode": {
1049
+ "default": "mixed",
1050
+ "description": "Reset mode: soft (keep changes staged), mixed (unstage changes), hard (discard all changes), merge (reset and merge), keep (reset but keep local changes).",
1051
+ "type": "string",
1052
+ "enum": [
1053
+ "soft",
1054
+ "mixed",
1055
+ "hard",
1056
+ "merge",
1057
+ "keep"
1058
+ ]
1059
+ },
1060
+ "target": {
1061
+ "default": "HEAD",
1062
+ "description": "Target commit to reset to. Defaults to HEAD.",
1063
+ "type": "string",
1064
+ "minLength": 1
1065
+ },
1066
+ "paths": {
1067
+ "description": "Specific file paths to reset (leaves HEAD unchanged).",
1068
+ "type": "array",
1069
+ "items": {
1070
+ "type": "string"
1071
+ }
1072
+ },
1073
+ "confirmed": {
1074
+ "default": false,
1075
+ "description": "Explicit confirmation required for hard, merge, and keep reset modes on protected branches (main, master, production, etc.).",
1076
+ "type": "boolean"
1077
+ }
1078
+ },
1079
+ "$schema": "http://json-schema.org/draft-07/schema#",
1080
+ "additionalProperties": false
1081
+ },
1082
+ "git_set_working_dir": {
1083
+ "type": "object",
1084
+ "properties": {
1085
+ "path": {
1086
+ "type": "string",
1087
+ "minLength": 1,
1088
+ "description": "Absolute path to the git repository to use as the working directory."
1089
+ },
1090
+ "validateGitRepo": {
1091
+ "default": true,
1092
+ "description": "Validate that the path is a Git repository.",
1093
+ "type": "boolean"
1094
+ },
1095
+ "initializeIfNotPresent": {
1096
+ "default": false,
1097
+ "description": "If not a Git repository, initialize it with 'git init'.",
1098
+ "type": "boolean"
1099
+ }
1100
+ },
1101
+ "required": [
1102
+ "path"
1103
+ ],
1104
+ "$schema": "http://json-schema.org/draft-07/schema#",
1105
+ "additionalProperties": false
1106
+ },
1107
+ "git_show": {
1108
+ "type": "object",
1109
+ "properties": {
1110
+ "path": {
1111
+ "default": ".",
1112
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1113
+ "type": "string"
1114
+ },
1115
+ "object": {
1116
+ "type": "string",
1117
+ "minLength": 1,
1118
+ "description": "Git object to show (commit hash, branch, tag, tree, or blob)."
1119
+ },
1120
+ "format": {
1121
+ "description": "Output format for the git object. Use \"raw\" for unprocessed git output.",
1122
+ "type": "string",
1123
+ "enum": [
1124
+ "raw"
1125
+ ]
1126
+ },
1127
+ "stat": {
1128
+ "default": false,
1129
+ "description": "Show diffstat instead of full diff.",
1130
+ "type": "boolean"
1131
+ },
1132
+ "filePath": {
1133
+ "description": "View specific file at a given commit reference. When provided, shows the file content from the specified object.",
1134
+ "type": "string"
1135
+ }
1136
+ },
1137
+ "required": [
1138
+ "object"
1139
+ ],
1140
+ "$schema": "http://json-schema.org/draft-07/schema#",
1141
+ "additionalProperties": false
1142
+ },
1143
+ "git_stash": {
1144
+ "type": "object",
1145
+ "properties": {
1146
+ "path": {
1147
+ "default": ".",
1148
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1149
+ "type": "string"
1150
+ },
1151
+ "mode": {
1152
+ "default": "push",
1153
+ "description": "The stash operation to perform. Defaults to push (save current changes).",
1154
+ "type": "string",
1155
+ "enum": [
1156
+ "list",
1157
+ "push",
1158
+ "pop",
1159
+ "apply",
1160
+ "drop",
1161
+ "clear"
1162
+ ]
1163
+ },
1164
+ "message": {
1165
+ "description": "Stash message description (for push operation).",
1166
+ "type": "string"
1167
+ },
1168
+ "stashRef": {
1169
+ "description": "Stash reference like stash@{0} (for pop/apply/drop operations).",
1170
+ "type": "string"
1171
+ },
1172
+ "includeUntracked": {
1173
+ "default": false,
1174
+ "description": "Include untracked files in the stash (for push operation).",
1175
+ "type": "boolean"
1176
+ },
1177
+ "keepIndex": {
1178
+ "default": false,
1179
+ "description": "Don't revert staged changes (for push operation).",
1180
+ "type": "boolean"
1181
+ },
1182
+ "limit": {
1183
+ "description": "For list mode: cap the number of stash entries returned (applied at the git command).",
1184
+ "type": "integer",
1185
+ "minimum": 1,
1186
+ "maximum": 1000
1187
+ }
1188
+ },
1189
+ "$schema": "http://json-schema.org/draft-07/schema#",
1190
+ "additionalProperties": false
1191
+ },
1192
+ "git_status": {
1193
+ "type": "object",
1194
+ "properties": {
1195
+ "path": {
1196
+ "default": ".",
1197
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1198
+ "type": "string"
1199
+ },
1200
+ "includeUntracked": {
1201
+ "default": true,
1202
+ "description": "Include untracked files in the output.",
1203
+ "type": "boolean"
1204
+ }
1205
+ },
1206
+ "$schema": "http://json-schema.org/draft-07/schema#",
1207
+ "additionalProperties": false
1208
+ },
1209
+ "git_tag": {
1210
+ "type": "object",
1211
+ "properties": {
1212
+ "path": {
1213
+ "default": ".",
1214
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1215
+ "type": "string"
1216
+ },
1217
+ "mode": {
1218
+ "default": "list",
1219
+ "description": "The tag operation to perform.",
1220
+ "type": "string",
1221
+ "enum": [
1222
+ "list",
1223
+ "create",
1224
+ "delete",
1225
+ "verify"
1226
+ ]
1227
+ },
1228
+ "tagName": {
1229
+ "description": "Tag name for create/delete/verify operations.",
1230
+ "type": "string",
1231
+ "minLength": 1,
1232
+ "maxLength": 255,
1233
+ "pattern": "^[^~^:?*\\[\\\\]+$"
1234
+ },
1235
+ "commit": {
1236
+ "description": "Commit to tag (default: HEAD for create operation).",
1237
+ "type": "string",
1238
+ "minLength": 1
1239
+ },
1240
+ "message": {
1241
+ "description": "Tag message. Providing a message always produces an annotated tag (git does not support messages on lightweight tags). For release tags, summarize notable changes.",
1242
+ "type": "string"
1243
+ },
1244
+ "annotated": {
1245
+ "default": false,
1246
+ "description": "Create an annotated tag with a default \"Tag <name>\" message. Only effective when no message is provided and signing is disabled — otherwise the tag is always annotated.",
1247
+ "type": "boolean"
1248
+ },
1249
+ "force": {
1250
+ "default": false,
1251
+ "description": "Overwrite an existing tag (create mode only; has no effect on list or delete).",
1252
+ "type": "boolean"
1253
+ },
1254
+ "limit": {
1255
+ "description": "For list mode: cap the number of tags returned (applied at the git command via `--count=N`). Use on repos with many tags.",
1256
+ "type": "integer",
1257
+ "minimum": 1,
1258
+ "maximum": 1000
1259
+ }
1260
+ },
1261
+ "$schema": "http://json-schema.org/draft-07/schema#",
1262
+ "additionalProperties": false
1263
+ },
1264
+ "git_worktree": {
1265
+ "type": "object",
1266
+ "properties": {
1267
+ "path": {
1268
+ "default": ".",
1269
+ "description": "Path to the Git repository. Defaults to session working directory set via git_set_working_dir.",
1270
+ "type": "string"
1271
+ },
1272
+ "mode": {
1273
+ "default": "list",
1274
+ "description": "The worktree operation to perform.",
1275
+ "type": "string",
1276
+ "enum": [
1277
+ "list",
1278
+ "add",
1279
+ "remove",
1280
+ "move",
1281
+ "prune"
1282
+ ]
1283
+ },
1284
+ "worktreePath": {
1285
+ "description": "Path for the new worktree (for add/move operations).",
1286
+ "type": "string"
1287
+ },
1288
+ "branch": {
1289
+ "description": "For add operation: create a NEW branch with this name in the new worktree. Fails if the branch already exists — use `commitish` to check out an existing branch instead.",
1290
+ "type": "string",
1291
+ "minLength": 1,
1292
+ "maxLength": 255,
1293
+ "pattern": "^[^~^:?*\\[\\\\]+$"
1294
+ },
1295
+ "commitish": {
1296
+ "description": "For add operation: check out this existing branch/commit/tag in the new worktree (no new branch is created).",
1297
+ "type": "string",
1298
+ "minLength": 1
1299
+ },
1300
+ "force": {
1301
+ "default": false,
1302
+ "description": "Force operation (for remove operation with uncommitted changes).",
1303
+ "type": "boolean"
1304
+ },
1305
+ "newPath": {
1306
+ "description": "New path for the worktree (for move operation).",
1307
+ "type": "string"
1308
+ },
1309
+ "detach": {
1310
+ "default": false,
1311
+ "description": "Create worktree with detached HEAD (for add operation).",
1312
+ "type": "boolean"
1313
+ },
1314
+ "verbose": {
1315
+ "default": false,
1316
+ "description": "Provide detailed output for worktree operations.",
1317
+ "type": "boolean"
1318
+ },
1319
+ "dryRun": {
1320
+ "default": false,
1321
+ "description": "Preview the operation without executing it (for prune operation).",
1322
+ "type": "boolean"
1323
+ }
1324
+ },
1325
+ "$schema": "http://json-schema.org/draft-07/schema#",
1326
+ "additionalProperties": false
1327
+ },
1328
+ "git_wrapup_instructions": {
1329
+ "type": "object",
1330
+ "properties": {
1331
+ "acknowledgement": {
1332
+ "type": "string",
1333
+ "enum": [
1334
+ "Y",
1335
+ "y",
1336
+ "Yes",
1337
+ "yes"
1338
+ ],
1339
+ "description": "Acknowledgement to initiate the wrap-up workflow."
1340
+ },
1341
+ "createTag": {
1342
+ "description": "Controls whether the tag criterion appears in the emitted protocol. Omit or set `true` to include the tag step. Set `false` to omit it entirely — e.g., when tagging is deferred to a separate release step.",
1343
+ "type": "boolean"
1344
+ }
1345
+ },
1346
+ "required": [
1347
+ "acknowledgement"
1348
+ ],
1349
+ "$schema": "http://json-schema.org/draft-07/schema#",
1350
+ "additionalProperties": false
1351
+ }
1352
+ }
1353
+ }
1354
+ ]
1355
+ },
1356
+ {
1357
+ "id": "prompts",
1358
+ "capability": "prompts",
1359
+ "status": "pass",
1360
+ "durationMs": 0.766749999998865,
1361
+ "message": "Advertised capability responded with the minimal expected shape (1 item).",
1362
+ "evidence": [
1363
+ {
1364
+ "endpoint": "prompts/list",
1365
+ "advertised": true,
1366
+ "responded": true,
1367
+ "minimalShapePresent": true,
1368
+ "itemCount": 1,
1369
+ "identifiers": [
1370
+ "git_wrapup"
1371
+ ],
1372
+ "diagnostics": [
1373
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1374
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1375
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1376
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1377
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"E3M9U-3WL5B\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"ServerStartup\",\"msg\":\"@cyanheads/git-mcp-server is now running and ready.\"}"
1378
+ ]
1379
+ }
1380
+ ]
1381
+ },
1382
+ {
1383
+ "id": "resources",
1384
+ "capability": "resources",
1385
+ "status": "pass",
1386
+ "durationMs": 0.6985839999997552,
1387
+ "message": "Advertised capability responded with the minimal expected shape (2 items).",
1388
+ "evidence": [
1389
+ {
1390
+ "endpoint": "resources/list",
1391
+ "advertised": true,
1392
+ "responded": true,
1393
+ "minimalShapePresent": true,
1394
+ "itemCount": 1,
1395
+ "identifiers": [
1396
+ "git://working-directory"
1397
+ ],
1398
+ "diagnostics": [
1399
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1400
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1401
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1402
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1403
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"E3M9U-3WL5B\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"ServerStartup\",\"msg\":\"@cyanheads/git-mcp-server is now running and ready.\"}"
1404
+ ]
1405
+ },
1406
+ {
1407
+ "endpoint": "resources/templates/list",
1408
+ "advertised": true,
1409
+ "responded": true,
1410
+ "minimalShapePresent": true,
1411
+ "itemCount": 1,
1412
+ "identifiers": [
1413
+ "git://working-directory"
1414
+ ],
1415
+ "diagnostics": [
1416
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1417
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1418
+ "{\"level\":20,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1419
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"transport\":\"stdio\",\"requestId\":\"0MOWN-K5EH1\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1420
+ "{\"level\":30,\"time\":1783302419905,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":87344,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"E3M9U-3WL5B\",\"timestamp\":\"2026-07-06T01:46:59.900Z\",\"operation\":\"ServerStartup\",\"msg\":\"@cyanheads/git-mcp-server is now running and ready.\"}"
1421
+ ]
1422
+ }
1423
+ ]
1424
+ },
1425
+ {
1426
+ "id": "security-lite",
1427
+ "capability": "security-lite",
1428
+ "status": "partial",
1429
+ "durationMs": 0.10316700000112178,
1430
+ "message": "Found 19 security finding(s): 0 high, 19 medium, 0 low.",
1431
+ "evidence": [
1432
+ {
1433
+ "endpoint": "security/scan-lite",
1434
+ "advertised": true,
1435
+ "responded": true,
1436
+ "minimalShapePresent": true,
1437
+ "itemCount": 19,
1438
+ "identifiers": [
1439
+ "git_add",
1440
+ "git_branch",
1441
+ "git_checkout",
1442
+ "git_cherry_pick",
1443
+ "git_clean",
1444
+ "git_clone",
1445
+ "git_commit",
1446
+ "git_fetch",
1447
+ "git_init",
1448
+ "git_merge",
1449
+ "git_pull",
1450
+ "git_push",
1451
+ "git_rebase",
1452
+ "git_remote",
1453
+ "git_reset",
1454
+ "git_set_working_dir",
1455
+ "git_stash",
1456
+ "git_tag",
1457
+ "git_worktree"
1458
+ ],
1459
+ "diagnostics": [
1460
+ "[medium] Tool \"git_add\" accepts filesystem paths and has destructive capabilities.",
1461
+ "[medium] Tool \"git_branch\" accepts filesystem paths and has destructive capabilities.",
1462
+ "[medium] Tool \"git_checkout\" accepts filesystem paths and has destructive capabilities.",
1463
+ "[medium] Tool \"git_cherry_pick\" accepts filesystem paths and has destructive capabilities.",
1464
+ "[medium] Tool \"git_clean\" accepts filesystem paths and has destructive capabilities.",
1465
+ "[medium] Tool \"git_clone\" accepts filesystem paths and has destructive capabilities.",
1466
+ "[medium] Tool \"git_commit\" accepts filesystem paths and has destructive capabilities.",
1467
+ "[medium] Tool \"git_fetch\" accepts filesystem paths and has destructive capabilities.",
1468
+ "[medium] Tool \"git_init\" accepts filesystem paths and has destructive capabilities.",
1469
+ "[medium] Tool \"git_merge\" accepts filesystem paths and has destructive capabilities.",
1470
+ "[medium] Tool \"git_pull\" accepts filesystem paths and has destructive capabilities.",
1471
+ "[medium] Tool \"git_push\" accepts filesystem paths and has destructive capabilities.",
1472
+ "[medium] Tool \"git_rebase\" accepts filesystem paths and has destructive capabilities.",
1473
+ "[medium] Tool \"git_remote\" accepts filesystem paths and has destructive capabilities.",
1474
+ "[medium] Tool \"git_reset\" accepts filesystem paths and has destructive capabilities.",
1475
+ "[medium] Tool \"git_set_working_dir\" accepts filesystem paths and has destructive capabilities.",
1476
+ "[medium] Tool \"git_stash\" accepts filesystem paths and has destructive capabilities.",
1477
+ "[medium] Tool \"git_tag\" accepts filesystem paths and has destructive capabilities.",
1478
+ "[medium] Tool \"git_worktree\" accepts filesystem paths and has destructive capabilities."
1479
+ ],
1480
+ "findings": [
1481
+ {
1482
+ "ruleId": "broad-filesystem",
1483
+ "severity": "medium",
1484
+ "toolName": "git_add",
1485
+ "message": "Tool \"git_add\" accepts filesystem paths and has destructive capabilities."
1486
+ },
1487
+ {
1488
+ "ruleId": "broad-filesystem",
1489
+ "severity": "medium",
1490
+ "toolName": "git_branch",
1491
+ "message": "Tool \"git_branch\" accepts filesystem paths and has destructive capabilities."
1492
+ },
1493
+ {
1494
+ "ruleId": "broad-filesystem",
1495
+ "severity": "medium",
1496
+ "toolName": "git_checkout",
1497
+ "message": "Tool \"git_checkout\" accepts filesystem paths and has destructive capabilities."
1498
+ },
1499
+ {
1500
+ "ruleId": "broad-filesystem",
1501
+ "severity": "medium",
1502
+ "toolName": "git_cherry_pick",
1503
+ "message": "Tool \"git_cherry_pick\" accepts filesystem paths and has destructive capabilities."
1504
+ },
1505
+ {
1506
+ "ruleId": "broad-filesystem",
1507
+ "severity": "medium",
1508
+ "toolName": "git_clean",
1509
+ "message": "Tool \"git_clean\" accepts filesystem paths and has destructive capabilities."
1510
+ },
1511
+ {
1512
+ "ruleId": "broad-filesystem",
1513
+ "severity": "medium",
1514
+ "toolName": "git_clone",
1515
+ "message": "Tool \"git_clone\" accepts filesystem paths and has destructive capabilities."
1516
+ },
1517
+ {
1518
+ "ruleId": "broad-filesystem",
1519
+ "severity": "medium",
1520
+ "toolName": "git_commit",
1521
+ "message": "Tool \"git_commit\" accepts filesystem paths and has destructive capabilities."
1522
+ },
1523
+ {
1524
+ "ruleId": "broad-filesystem",
1525
+ "severity": "medium",
1526
+ "toolName": "git_fetch",
1527
+ "message": "Tool \"git_fetch\" accepts filesystem paths and has destructive capabilities."
1528
+ },
1529
+ {
1530
+ "ruleId": "broad-filesystem",
1531
+ "severity": "medium",
1532
+ "toolName": "git_init",
1533
+ "message": "Tool \"git_init\" accepts filesystem paths and has destructive capabilities."
1534
+ },
1535
+ {
1536
+ "ruleId": "broad-filesystem",
1537
+ "severity": "medium",
1538
+ "toolName": "git_merge",
1539
+ "message": "Tool \"git_merge\" accepts filesystem paths and has destructive capabilities."
1540
+ },
1541
+ {
1542
+ "ruleId": "broad-filesystem",
1543
+ "severity": "medium",
1544
+ "toolName": "git_pull",
1545
+ "message": "Tool \"git_pull\" accepts filesystem paths and has destructive capabilities."
1546
+ },
1547
+ {
1548
+ "ruleId": "broad-filesystem",
1549
+ "severity": "medium",
1550
+ "toolName": "git_push",
1551
+ "message": "Tool \"git_push\" accepts filesystem paths and has destructive capabilities."
1552
+ },
1553
+ {
1554
+ "ruleId": "broad-filesystem",
1555
+ "severity": "medium",
1556
+ "toolName": "git_rebase",
1557
+ "message": "Tool \"git_rebase\" accepts filesystem paths and has destructive capabilities."
1558
+ },
1559
+ {
1560
+ "ruleId": "broad-filesystem",
1561
+ "severity": "medium",
1562
+ "toolName": "git_remote",
1563
+ "message": "Tool \"git_remote\" accepts filesystem paths and has destructive capabilities."
1564
+ },
1565
+ {
1566
+ "ruleId": "broad-filesystem",
1567
+ "severity": "medium",
1568
+ "toolName": "git_reset",
1569
+ "message": "Tool \"git_reset\" accepts filesystem paths and has destructive capabilities."
1570
+ },
1571
+ {
1572
+ "ruleId": "broad-filesystem",
1573
+ "severity": "medium",
1574
+ "toolName": "git_set_working_dir",
1575
+ "message": "Tool \"git_set_working_dir\" accepts filesystem paths and has destructive capabilities."
1576
+ },
1577
+ {
1578
+ "ruleId": "broad-filesystem",
1579
+ "severity": "medium",
1580
+ "toolName": "git_stash",
1581
+ "message": "Tool \"git_stash\" accepts filesystem paths and has destructive capabilities."
1582
+ },
1583
+ {
1584
+ "ruleId": "broad-filesystem",
1585
+ "severity": "medium",
1586
+ "toolName": "git_tag",
1587
+ "message": "Tool \"git_tag\" accepts filesystem paths and has destructive capabilities."
1588
+ },
1589
+ {
1590
+ "ruleId": "broad-filesystem",
1591
+ "severity": "medium",
1592
+ "toolName": "git_worktree",
1593
+ "message": "Tool \"git_worktree\" accepts filesystem paths and has destructive capabilities."
1594
+ }
1595
+ ]
1596
+ }
1597
+ ]
1598
+ },
1599
+ {
1600
+ "id": "conformance",
1601
+ "capability": "conformance",
1602
+ "status": "pass",
1603
+ "durationMs": 43.65862500000003,
1604
+ "message": "All 7 conformance checks passed.",
1605
+ "evidence": [
1606
+ {
1607
+ "endpoint": "conformance/check",
1608
+ "advertised": true,
1609
+ "responded": true,
1610
+ "minimalShapePresent": true,
1611
+ "itemCount": 7,
1612
+ "identifiers": [],
1613
+ "diagnostics": [
1614
+ "[pass] capabilities-present: Server returned capabilities object.",
1615
+ "[pass] server-info: Server provided initialization info.",
1616
+ "[pass] tools-capability-match: tools/list returned 28 tool(s).",
1617
+ "[pass] prompts-capability-match: prompts/list returned 1 prompt(s).",
1618
+ "[pass] resources-capability-match: resources/list returned 1 resource(s).",
1619
+ "[pass] tool-response-content: Tool \"git_add\" response has valid content array.",
1620
+ "[pass] error-handling: Server returned proper error code -32601 for unknown method."
1621
+ ]
1622
+ }
1623
+ ]
1624
+ },
1625
+ {
1626
+ "id": "schema-quality",
1627
+ "capability": "schema-quality",
1628
+ "status": "partial",
1629
+ "durationMs": 21.666000000001077,
1630
+ "message": "Found 17 quality finding(s) across 30 item(s): 0 warnings, 17 info.",
1631
+ "evidence": [
1632
+ {
1633
+ "endpoint": "schema-quality/scan",
1634
+ "advertised": true,
1635
+ "responded": true,
1636
+ "minimalShapePresent": true,
1637
+ "itemCount": 17,
1638
+ "identifiers": [
1639
+ "git_add",
1640
+ "git_branch",
1641
+ "git_clean",
1642
+ "git_diff",
1643
+ "git_fetch",
1644
+ "git_init",
1645
+ "git_log",
1646
+ "git_pull",
1647
+ "git_push",
1648
+ "git_rebase",
1649
+ "git_reflog",
1650
+ "git_remote",
1651
+ "git_reset",
1652
+ "git_stash",
1653
+ "git_status",
1654
+ "git_tag",
1655
+ "git_worktree"
1656
+ ],
1657
+ "diagnostics": [
1658
+ "[info] tool \"git_add\": Has properties but no 'required' array declared",
1659
+ "[info] tool \"git_branch\": Has properties but no 'required' array declared",
1660
+ "[info] tool \"git_clean\": Has properties but no 'required' array declared",
1661
+ "[info] tool \"git_diff\": Has properties but no 'required' array declared",
1662
+ "[info] tool \"git_fetch\": Has properties but no 'required' array declared",
1663
+ "[info] tool \"git_init\": Has properties but no 'required' array declared",
1664
+ "[info] tool \"git_log\": Has properties but no 'required' array declared",
1665
+ "[info] tool \"git_pull\": Has properties but no 'required' array declared",
1666
+ "[info] tool \"git_push\": Has properties but no 'required' array declared",
1667
+ "[info] tool \"git_rebase\": Has properties but no 'required' array declared",
1668
+ "[info] tool \"git_reflog\": Has properties but no 'required' array declared",
1669
+ "[info] tool \"git_remote\": Has properties but no 'required' array declared",
1670
+ "[info] tool \"git_reset\": Has properties but no 'required' array declared",
1671
+ "[info] tool \"git_stash\": Has properties but no 'required' array declared",
1672
+ "[info] tool \"git_status\": Has properties but no 'required' array declared",
1673
+ "[info] tool \"git_tag\": Has properties but no 'required' array declared",
1674
+ "[info] tool \"git_worktree\": Has properties but no 'required' array declared"
1675
+ ],
1676
+ "findings": [
1677
+ {
1678
+ "itemType": "tool",
1679
+ "itemName": "git_add",
1680
+ "issue": "Has properties but no 'required' array declared",
1681
+ "severity": "info"
1682
+ },
1683
+ {
1684
+ "itemType": "tool",
1685
+ "itemName": "git_branch",
1686
+ "issue": "Has properties but no 'required' array declared",
1687
+ "severity": "info"
1688
+ },
1689
+ {
1690
+ "itemType": "tool",
1691
+ "itemName": "git_clean",
1692
+ "issue": "Has properties but no 'required' array declared",
1693
+ "severity": "info"
1694
+ },
1695
+ {
1696
+ "itemType": "tool",
1697
+ "itemName": "git_diff",
1698
+ "issue": "Has properties but no 'required' array declared",
1699
+ "severity": "info"
1700
+ },
1701
+ {
1702
+ "itemType": "tool",
1703
+ "itemName": "git_fetch",
1704
+ "issue": "Has properties but no 'required' array declared",
1705
+ "severity": "info"
1706
+ },
1707
+ {
1708
+ "itemType": "tool",
1709
+ "itemName": "git_init",
1710
+ "issue": "Has properties but no 'required' array declared",
1711
+ "severity": "info"
1712
+ },
1713
+ {
1714
+ "itemType": "tool",
1715
+ "itemName": "git_log",
1716
+ "issue": "Has properties but no 'required' array declared",
1717
+ "severity": "info"
1718
+ },
1719
+ {
1720
+ "itemType": "tool",
1721
+ "itemName": "git_pull",
1722
+ "issue": "Has properties but no 'required' array declared",
1723
+ "severity": "info"
1724
+ },
1725
+ {
1726
+ "itemType": "tool",
1727
+ "itemName": "git_push",
1728
+ "issue": "Has properties but no 'required' array declared",
1729
+ "severity": "info"
1730
+ },
1731
+ {
1732
+ "itemType": "tool",
1733
+ "itemName": "git_rebase",
1734
+ "issue": "Has properties but no 'required' array declared",
1735
+ "severity": "info"
1736
+ },
1737
+ {
1738
+ "itemType": "tool",
1739
+ "itemName": "git_reflog",
1740
+ "issue": "Has properties but no 'required' array declared",
1741
+ "severity": "info"
1742
+ },
1743
+ {
1744
+ "itemType": "tool",
1745
+ "itemName": "git_remote",
1746
+ "issue": "Has properties but no 'required' array declared",
1747
+ "severity": "info"
1748
+ },
1749
+ {
1750
+ "itemType": "tool",
1751
+ "itemName": "git_reset",
1752
+ "issue": "Has properties but no 'required' array declared",
1753
+ "severity": "info"
1754
+ },
1755
+ {
1756
+ "itemType": "tool",
1757
+ "itemName": "git_stash",
1758
+ "issue": "Has properties but no 'required' array declared",
1759
+ "severity": "info"
1760
+ },
1761
+ {
1762
+ "itemType": "tool",
1763
+ "itemName": "git_status",
1764
+ "issue": "Has properties but no 'required' array declared",
1765
+ "severity": "info"
1766
+ },
1767
+ {
1768
+ "itemType": "tool",
1769
+ "itemName": "git_tag",
1770
+ "issue": "Has properties but no 'required' array declared",
1771
+ "severity": "info"
1772
+ },
1773
+ {
1774
+ "itemType": "tool",
1775
+ "itemName": "git_worktree",
1776
+ "issue": "Has properties but no 'required' array declared",
1777
+ "severity": "info"
1778
+ }
1779
+ ]
1780
+ }
1781
+ ]
1782
+ },
1783
+ {
1784
+ "id": "security",
1785
+ "capability": "security",
1786
+ "status": "partial",
1787
+ "durationMs": 27.04162499999984,
1788
+ "message": "Found 19 security finding(s): 0 high, 19 medium, 0 low.",
1789
+ "evidence": [
1790
+ {
1791
+ "endpoint": "security/scan",
1792
+ "advertised": true,
1793
+ "responded": true,
1794
+ "minimalShapePresent": true,
1795
+ "itemCount": 19,
1796
+ "identifiers": [
1797
+ "git_add",
1798
+ "git_branch",
1799
+ "git_checkout",
1800
+ "git_cherry_pick",
1801
+ "git_clean",
1802
+ "git_clone",
1803
+ "git_commit",
1804
+ "git_fetch",
1805
+ "git_init",
1806
+ "git_merge",
1807
+ "git_pull",
1808
+ "git_push",
1809
+ "git_rebase",
1810
+ "git_remote",
1811
+ "git_reset",
1812
+ "git_set_working_dir",
1813
+ "git_stash",
1814
+ "git_tag",
1815
+ "git_worktree"
1816
+ ],
1817
+ "diagnostics": [
1818
+ "[medium] Tool \"git_add\" accepts filesystem paths and has destructive capabilities.",
1819
+ "[medium] Tool \"git_branch\" accepts filesystem paths and has destructive capabilities.",
1820
+ "[medium] Tool \"git_checkout\" accepts filesystem paths and has destructive capabilities.",
1821
+ "[medium] Tool \"git_cherry_pick\" accepts filesystem paths and has destructive capabilities.",
1822
+ "[medium] Tool \"git_clean\" accepts filesystem paths and has destructive capabilities.",
1823
+ "[medium] Tool \"git_clone\" accepts filesystem paths and has destructive capabilities.",
1824
+ "[medium] Tool \"git_commit\" accepts filesystem paths and has destructive capabilities.",
1825
+ "[medium] Tool \"git_fetch\" accepts filesystem paths and has destructive capabilities.",
1826
+ "[medium] Tool \"git_init\" accepts filesystem paths and has destructive capabilities.",
1827
+ "[medium] Tool \"git_merge\" accepts filesystem paths and has destructive capabilities.",
1828
+ "[medium] Tool \"git_pull\" accepts filesystem paths and has destructive capabilities.",
1829
+ "[medium] Tool \"git_push\" accepts filesystem paths and has destructive capabilities.",
1830
+ "[medium] Tool \"git_rebase\" accepts filesystem paths and has destructive capabilities.",
1831
+ "[medium] Tool \"git_remote\" accepts filesystem paths and has destructive capabilities.",
1832
+ "[medium] Tool \"git_reset\" accepts filesystem paths and has destructive capabilities.",
1833
+ "[medium] Tool \"git_set_working_dir\" accepts filesystem paths and has destructive capabilities.",
1834
+ "[medium] Tool \"git_stash\" accepts filesystem paths and has destructive capabilities.",
1835
+ "[medium] Tool \"git_tag\" accepts filesystem paths and has destructive capabilities.",
1836
+ "[medium] Tool \"git_worktree\" accepts filesystem paths and has destructive capabilities."
1837
+ ],
1838
+ "findings": [
1839
+ {
1840
+ "ruleId": "broad-filesystem",
1841
+ "severity": "medium",
1842
+ "toolName": "git_add",
1843
+ "message": "Tool \"git_add\" accepts filesystem paths and has destructive capabilities."
1844
+ },
1845
+ {
1846
+ "ruleId": "broad-filesystem",
1847
+ "severity": "medium",
1848
+ "toolName": "git_branch",
1849
+ "message": "Tool \"git_branch\" accepts filesystem paths and has destructive capabilities."
1850
+ },
1851
+ {
1852
+ "ruleId": "broad-filesystem",
1853
+ "severity": "medium",
1854
+ "toolName": "git_checkout",
1855
+ "message": "Tool \"git_checkout\" accepts filesystem paths and has destructive capabilities."
1856
+ },
1857
+ {
1858
+ "ruleId": "broad-filesystem",
1859
+ "severity": "medium",
1860
+ "toolName": "git_cherry_pick",
1861
+ "message": "Tool \"git_cherry_pick\" accepts filesystem paths and has destructive capabilities."
1862
+ },
1863
+ {
1864
+ "ruleId": "broad-filesystem",
1865
+ "severity": "medium",
1866
+ "toolName": "git_clean",
1867
+ "message": "Tool \"git_clean\" accepts filesystem paths and has destructive capabilities."
1868
+ },
1869
+ {
1870
+ "ruleId": "broad-filesystem",
1871
+ "severity": "medium",
1872
+ "toolName": "git_clone",
1873
+ "message": "Tool \"git_clone\" accepts filesystem paths and has destructive capabilities."
1874
+ },
1875
+ {
1876
+ "ruleId": "broad-filesystem",
1877
+ "severity": "medium",
1878
+ "toolName": "git_commit",
1879
+ "message": "Tool \"git_commit\" accepts filesystem paths and has destructive capabilities."
1880
+ },
1881
+ {
1882
+ "ruleId": "broad-filesystem",
1883
+ "severity": "medium",
1884
+ "toolName": "git_fetch",
1885
+ "message": "Tool \"git_fetch\" accepts filesystem paths and has destructive capabilities."
1886
+ },
1887
+ {
1888
+ "ruleId": "broad-filesystem",
1889
+ "severity": "medium",
1890
+ "toolName": "git_init",
1891
+ "message": "Tool \"git_init\" accepts filesystem paths and has destructive capabilities."
1892
+ },
1893
+ {
1894
+ "ruleId": "broad-filesystem",
1895
+ "severity": "medium",
1896
+ "toolName": "git_merge",
1897
+ "message": "Tool \"git_merge\" accepts filesystem paths and has destructive capabilities."
1898
+ },
1899
+ {
1900
+ "ruleId": "broad-filesystem",
1901
+ "severity": "medium",
1902
+ "toolName": "git_pull",
1903
+ "message": "Tool \"git_pull\" accepts filesystem paths and has destructive capabilities."
1904
+ },
1905
+ {
1906
+ "ruleId": "broad-filesystem",
1907
+ "severity": "medium",
1908
+ "toolName": "git_push",
1909
+ "message": "Tool \"git_push\" accepts filesystem paths and has destructive capabilities."
1910
+ },
1911
+ {
1912
+ "ruleId": "broad-filesystem",
1913
+ "severity": "medium",
1914
+ "toolName": "git_rebase",
1915
+ "message": "Tool \"git_rebase\" accepts filesystem paths and has destructive capabilities."
1916
+ },
1917
+ {
1918
+ "ruleId": "broad-filesystem",
1919
+ "severity": "medium",
1920
+ "toolName": "git_remote",
1921
+ "message": "Tool \"git_remote\" accepts filesystem paths and has destructive capabilities."
1922
+ },
1923
+ {
1924
+ "ruleId": "broad-filesystem",
1925
+ "severity": "medium",
1926
+ "toolName": "git_reset",
1927
+ "message": "Tool \"git_reset\" accepts filesystem paths and has destructive capabilities."
1928
+ },
1929
+ {
1930
+ "ruleId": "broad-filesystem",
1931
+ "severity": "medium",
1932
+ "toolName": "git_set_working_dir",
1933
+ "message": "Tool \"git_set_working_dir\" accepts filesystem paths and has destructive capabilities."
1934
+ },
1935
+ {
1936
+ "ruleId": "broad-filesystem",
1937
+ "severity": "medium",
1938
+ "toolName": "git_stash",
1939
+ "message": "Tool \"git_stash\" accepts filesystem paths and has destructive capabilities."
1940
+ },
1941
+ {
1942
+ "ruleId": "broad-filesystem",
1943
+ "severity": "medium",
1944
+ "toolName": "git_tag",
1945
+ "message": "Tool \"git_tag\" accepts filesystem paths and has destructive capabilities."
1946
+ },
1947
+ {
1948
+ "ruleId": "broad-filesystem",
1949
+ "severity": "medium",
1950
+ "toolName": "git_worktree",
1951
+ "message": "Tool \"git_worktree\" accepts filesystem paths and has destructive capabilities."
1952
+ }
1953
+ ]
1954
+ }
1955
+ ]
1956
+ }
1957
+ ],
1958
+ "healthScore": {
1959
+ "overall": 84,
1960
+ "grade": "B",
1961
+ "dimensions": [
1962
+ {
1963
+ "name": "Protocol Compliance",
1964
+ "weight": 0.3,
1965
+ "score": 100,
1966
+ "details": [
1967
+ "conformance: pass (100/100)"
1968
+ ]
1969
+ },
1970
+ {
1971
+ "name": "Schema Quality",
1972
+ "weight": 0.2,
1973
+ "score": 60,
1974
+ "details": [
1975
+ "schema-quality: partial (60/100)"
1976
+ ]
1977
+ },
1978
+ {
1979
+ "name": "Security",
1980
+ "weight": 0.2,
1981
+ "score": 60,
1982
+ "details": [
1983
+ "security-lite: partial (60/100)",
1984
+ "security: partial (60/100)"
1985
+ ]
1986
+ },
1987
+ {
1988
+ "name": "Reliability",
1989
+ "weight": 0.2,
1990
+ "score": 100,
1991
+ "details": [
1992
+ "tools: pass (100/100)",
1993
+ "prompts: pass (100/100)",
1994
+ "resources: pass (100/100)"
1995
+ ]
1996
+ },
1997
+ {
1998
+ "name": "Performance",
1999
+ "weight": 0.1,
2000
+ "score": 100,
2001
+ "details": [
2002
+ "Connect: 1166ms",
2003
+ "p95 latency: 34ms (3 operations)"
2004
+ ]
2005
+ }
2006
+ ]
2007
+ },
2008
+ "performanceMetrics": {
2009
+ "connectMs": 1166.4691249999996,
2010
+ "toolsListMs": 33.99316700000054,
2011
+ "promptsListMs": 0.766749999998865,
2012
+ "resourcesListMs": 0.6985839999997552
2013
+ }
2014
+ }