@kryptosai/mcp-observatory 0.27.0 → 1.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/COMMERCIAL.md +28 -2
  2. package/CONTRIBUTORS.md +39 -0
  3. package/README.md +114 -22
  4. package/dist/src/action-receipt.d.ts +20 -0
  5. package/dist/src/action-receipt.js +85 -0
  6. package/dist/src/action-receipt.js.map +1 -0
  7. package/dist/src/adapters/http.js +1 -5
  8. package/dist/src/adapters/http.js.map +1 -1
  9. package/dist/src/audit.d.ts +64 -0
  10. package/dist/src/audit.js +359 -0
  11. package/dist/src/audit.js.map +1 -0
  12. package/dist/src/cassette.js +3 -2
  13. package/dist/src/cassette.js.map +1 -1
  14. package/dist/src/checks/attack-sim.d.ts +20 -0
  15. package/dist/src/checks/attack-sim.js +316 -0
  16. package/dist/src/checks/attack-sim.js.map +1 -0
  17. package/dist/src/ci-issue.js +4 -3
  18. package/dist/src/ci-issue.js.map +1 -1
  19. package/dist/src/cli.js +25 -4
  20. package/dist/src/cli.js.map +1 -1
  21. package/dist/src/commands/attack-sim.d.ts +2 -0
  22. package/dist/src/commands/attack-sim.js +220 -0
  23. package/dist/src/commands/attack-sim.js.map +1 -0
  24. package/dist/src/commands/audit.d.ts +2 -0
  25. package/dist/src/commands/audit.js +132 -0
  26. package/dist/src/commands/audit.js.map +1 -0
  27. package/dist/src/commands/init-ci.d.ts +3 -0
  28. package/dist/src/commands/init-ci.js +78 -13
  29. package/dist/src/commands/init-ci.js.map +1 -1
  30. package/dist/src/commands/legacy.js +8 -1
  31. package/dist/src/commands/legacy.js.map +1 -1
  32. package/dist/src/commands/receipt.d.ts +2 -0
  33. package/dist/src/commands/receipt.js +113 -0
  34. package/dist/src/commands/receipt.js.map +1 -0
  35. package/dist/src/commands/scan.js +30 -6
  36. package/dist/src/commands/scan.js.map +1 -1
  37. package/dist/src/commands/score.js +63 -0
  38. package/dist/src/commands/score.js.map +1 -1
  39. package/dist/src/commands/serve.js +9 -1
  40. package/dist/src/commands/serve.js.map +1 -1
  41. package/dist/src/commands/setup-ci-conversion.d.ts +3 -1
  42. package/dist/src/commands/setup-ci-conversion.js +23 -8
  43. package/dist/src/commands/setup-ci-conversion.js.map +1 -1
  44. package/dist/src/commands/telemetry.js +20 -14
  45. package/dist/src/commands/telemetry.js.map +1 -1
  46. package/dist/src/commands/test.js +31 -2
  47. package/dist/src/commands/test.js.map +1 -1
  48. package/dist/src/findings.d.ts +1 -0
  49. package/dist/src/findings.js +42 -1
  50. package/dist/src/findings.js.map +1 -1
  51. package/dist/src/history.js +3 -2
  52. package/dist/src/history.js.map +1 -1
  53. package/dist/src/index.d.ts +4 -0
  54. package/dist/src/index.js +4 -0
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/integrations/smithery.js +5 -1
  57. package/dist/src/integrations/smithery.js.map +1 -1
  58. package/dist/src/receipt.d.ts +100 -0
  59. package/dist/src/receipt.js +375 -0
  60. package/dist/src/receipt.js.map +1 -0
  61. package/dist/src/reporters/attack-sim.d.ts +2 -0
  62. package/dist/src/reporters/attack-sim.js +89 -0
  63. package/dist/src/reporters/attack-sim.js.map +1 -0
  64. package/dist/src/reporters/pr-comment.js +20 -6
  65. package/dist/src/reporters/pr-comment.js.map +1 -1
  66. package/dist/src/reporters/sarif.js +11 -1
  67. package/dist/src/reporters/sarif.js.map +1 -1
  68. package/dist/src/runner.d.ts +3 -0
  69. package/dist/src/runner.js +5 -0
  70. package/dist/src/runner.js.map +1 -1
  71. package/dist/src/score.js +1 -1
  72. package/dist/src/score.js.map +1 -1
  73. package/dist/src/security-profiles.d.ts +13 -0
  74. package/dist/src/security-profiles.js +59 -0
  75. package/dist/src/security-profiles.js.map +1 -0
  76. package/dist/src/storage.js +3 -2
  77. package/dist/src/storage.js.map +1 -1
  78. package/dist/src/telemetry.d.ts +10 -0
  79. package/dist/src/telemetry.js +17 -1
  80. package/dist/src/telemetry.js.map +1 -1
  81. package/dist/src/types.d.ts +1 -1
  82. package/dist/src/utils/files.d.ts +1 -0
  83. package/dist/src/utils/files.js +21 -0
  84. package/dist/src/utils/files.js.map +1 -0
  85. package/dist/src/utils/ids.js +18 -5
  86. package/dist/src/utils/ids.js.map +1 -1
  87. package/dist/src/utils/url.d.ts +2 -0
  88. package/dist/src/utils/url.js +15 -0
  89. package/dist/src/utils/url.js.map +1 -0
  90. package/dist/src/validate.js +1 -1
  91. package/dist/src/validate.js.map +1 -1
  92. package/docs/10x-agentic-growth-sprint.md +47 -0
  93. package/docs/agent-ecosystem-promotion-plan.md +244 -0
  94. package/docs/agent-tasks.md +95 -0
  95. package/docs/agentic-contributor-outreach.md +52 -0
  96. package/docs/automatic-ci-integration.md +33 -0
  97. package/docs/campaign-attribution.md +58 -0
  98. package/docs/code-scanning-demo.md +57 -0
  99. package/docs/commercial-boundary.md +83 -0
  100. package/docs/contributor-proof-cards/README.md +33 -0
  101. package/docs/contributor-recognition.md +92 -0
  102. package/docs/examples/nsa-mcp-audit-report.md +372 -0
  103. package/docs/examples/nsa-mcp-results.sarif +930 -0
  104. package/docs/examples/nsa-mcp-score.json +13 -0
  105. package/docs/feishu-lark-mcp.md +1 -1
  106. package/docs/github-code-scanning-for-mcp.md +1 -1
  107. package/docs/government-enterprise-pilot.md +93 -0
  108. package/docs/launch.md +64 -0
  109. package/docs/mcp-attack-simulator.md +57 -0
  110. package/docs/mcp-receipts.md +109 -0
  111. package/docs/mcp-server-safety-index.md +29 -22
  112. package/docs/nsa-mcp-audit-ci.md +88 -0
  113. package/docs/procurement-one-pager.md +74 -0
  114. package/docs/proof.md +5 -2
  115. package/docs/public-guidance-crosswalk.md +48 -0
  116. package/docs/receipt-graph.md +54 -0
  117. package/docs/safety-index/artifacts/antv-chart-server.json +40 -22
  118. package/docs/safety-index/artifacts/antv-chart-server.md +22 -9
  119. package/docs/safety-index/artifacts/browsermcp-server.json +36 -18
  120. package/docs/safety-index/artifacts/browsermcp-server.md +22 -9
  121. package/docs/safety-index/artifacts/context7-server.json +83 -26
  122. package/docs/safety-index/artifacts/context7-server.md +33 -20
  123. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2438 -0
  124. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +176 -0
  125. package/docs/safety-index/artifacts/everything-server.json +150 -57
  126. package/docs/safety-index/artifacts/everything-server.md +36 -23
  127. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +162 -19
  128. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +25 -12
  129. package/docs/safety-index/artifacts/filesystem-server.json +221 -19
  130. package/docs/safety-index/artifacts/filesystem-server.md +24 -11
  131. package/docs/safety-index/artifacts/kubernetes-server.attack.json +1559 -0
  132. package/docs/safety-index/artifacts/kubernetes-server.attack.md +43 -0
  133. package/docs/safety-index/artifacts/kubernetes-server.attack.sarif +2857 -0
  134. package/docs/safety-index/artifacts/kubernetes-server.json +1573 -0
  135. package/docs/safety-index/artifacts/kubernetes-server.md +176 -0
  136. package/docs/safety-index/artifacts/memory-server.json +93 -32
  137. package/docs/safety-index/artifacts/memory-server.md +45 -25
  138. package/docs/safety-index/artifacts/opentofu-server.json +44 -18
  139. package/docs/safety-index/artifacts/opentofu-server.md +23 -10
  140. package/docs/safety-index/artifacts/playwright-mcp-server.json +177 -21
  141. package/docs/safety-index/artifacts/playwright-mcp-server.md +27 -14
  142. package/docs/safety-index/artifacts/promptopia-server.json +45 -19
  143. package/docs/safety-index/artifacts/promptopia-server.md +21 -8
  144. package/docs/safety-index/artifacts/puppeteer-server.json +77 -22
  145. package/docs/safety-index/artifacts/puppeteer-server.md +28 -15
  146. package/docs/safety-index/artifacts/ref-tools-server.json +36 -18
  147. package/docs/safety-index/artifacts/ref-tools-server.md +21 -8
  148. package/docs/safety-index/artifacts/sequential-thinking-server.json +38 -21
  149. package/docs/safety-index/artifacts/sequential-thinking-server.md +22 -9
  150. package/docs/safety-index/targets.json +90 -14
  151. package/docs/security-due-diligence.md +87 -0
  152. package/docs/setup-ci-doctor.md +13 -1
  153. package/docs/target-gallery.md +49 -0
  154. package/docs/target-registry.md +5 -1
  155. package/docs/tool-call-receipts.md +115 -0
  156. package/examples/insecure-mcp-server/mcp-observatory.target.json +13 -0
  157. package/examples/insecure-mcp-server/server.mjs +62 -0
  158. package/package.json +31 -2
  159. package/schemas/run-artifact.schema.json +1 -0
  160. package/scripts/postinstall.mjs +138 -0
@@ -0,0 +1,2438 @@
1
+ {
2
+ "artifactType": "run",
3
+ "schemaVersion": "1.0.0",
4
+ "gate": "pass",
5
+ "runId": "run_2026-07-06T194952194Z_80b1e6dd",
6
+ "createdAt": "2026-07-06T19:49:52.194Z",
7
+ "toolVersion": "0.28.0",
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 25.5.0",
29
+ "nodeVersion": "v22.22.1"
30
+ },
31
+ "summary": {
32
+ "total": 8,
33
+ "pass": 4,
34
+ "fail": 0,
35
+ "partial": 4,
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": 27.61420899999939,
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.6529589999991003,
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\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1374
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1375
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1376
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1377
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"TCM3J-5YAYY\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"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.6025000000008731,
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\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1400
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1401
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1402
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1403
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"TCM3J-5YAYY\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"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\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Attempting to connect stdio transport...\"}",
1417
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Creating StdioServerTransport instance...\"}",
1418
+ "{\"level\":20,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"Connecting McpServer instance to StdioServerTransport...\"}",
1419
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"transport\":\"stdio\",\"requestId\":\"A40P7-B7WJU\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"operation\":\"connectStdioTransport\",\"transportType\":\"Stdio\",\"msg\":\"MCP Server connected and listening via stdio transport.\"}",
1420
+ "{\"level\":30,\"time\":1783367393061,\"env\":\"development\",\"version\":\"2.15.1\",\"pid\":13590,\"applicationName\":\"@cyanheads/git-mcp-server\",\"applicationVersion\":\"2.15.1\",\"nodeEnvironment\":\"development\",\"requestId\":\"TCM3J-5YAYY\",\"timestamp\":\"2026-07-06T19:49:53.057Z\",\"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.08429100000103062,
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": 35.621124999999665,
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": 17.433541000000332,
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": 16.142957999998544,
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
+ "id": "attack-sim",
1959
+ "capability": "attack-sim",
1960
+ "status": "partial",
1961
+ "durationMs": 18.084541000000172,
1962
+ "message": "Safe attack simulation found 19 finding(s): 0 high, 19 medium, 0 low.",
1963
+ "evidence": [
1964
+ {
1965
+ "endpoint": "attack-sim/safe",
1966
+ "advertised": true,
1967
+ "responded": true,
1968
+ "minimalShapePresent": true,
1969
+ "itemCount": 19,
1970
+ "identifiers": [
1971
+ "git_add",
1972
+ "git_branch",
1973
+ "git_checkout",
1974
+ "git_cherry_pick",
1975
+ "git_clean",
1976
+ "git_clone",
1977
+ "git_commit",
1978
+ "git_fetch",
1979
+ "git_init",
1980
+ "git_merge",
1981
+ "git_pull",
1982
+ "git_push",
1983
+ "git_rebase",
1984
+ "git_remote",
1985
+ "git_reset",
1986
+ "git_set_working_dir",
1987
+ "git_stash",
1988
+ "git_tag",
1989
+ "git_worktree"
1990
+ ],
1991
+ "diagnostics": [
1992
+ "[medium] Tool \"git_add\" combines broad parameters (path) with destructive or non-read-only behavior.",
1993
+ "[medium] Tool \"git_branch\" combines broad parameters (path) with destructive or non-read-only behavior.",
1994
+ "[medium] Tool \"git_checkout\" combines broad parameters (path) with destructive or non-read-only behavior.",
1995
+ "[medium] Tool \"git_cherry_pick\" combines broad parameters (path) with destructive or non-read-only behavior.",
1996
+ "[medium] Tool \"git_clean\" combines broad parameters (path) with destructive or non-read-only behavior.",
1997
+ "[medium] Tool \"git_clone\" combines broad parameters (url, path) with destructive or non-read-only behavior.",
1998
+ "[medium] Tool \"git_commit\" combines broad parameters (path) with destructive or non-read-only behavior.",
1999
+ "[medium] Tool \"git_fetch\" combines broad parameters (path) with destructive or non-read-only behavior.",
2000
+ "[medium] Tool \"git_init\" combines broad parameters (path) with destructive or non-read-only behavior.",
2001
+ "[medium] Tool \"git_merge\" combines broad parameters (path) with destructive or non-read-only behavior.",
2002
+ "[medium] Tool \"git_pull\" combines broad parameters (path) with destructive or non-read-only behavior.",
2003
+ "[medium] Tool \"git_push\" combines broad parameters (path) with destructive or non-read-only behavior.",
2004
+ "[medium] Tool \"git_rebase\" combines broad parameters (path) with destructive or non-read-only behavior.",
2005
+ "[medium] Tool \"git_remote\" combines broad parameters (path, url) with destructive or non-read-only behavior.",
2006
+ "[medium] Tool \"git_reset\" combines broad parameters (path) with destructive or non-read-only behavior.",
2007
+ "[medium] Tool \"git_set_working_dir\" combines broad parameters (path) with destructive or non-read-only behavior.",
2008
+ "[medium] Tool \"git_stash\" combines broad parameters (path) with destructive or non-read-only behavior.",
2009
+ "[medium] Tool \"git_tag\" combines broad parameters (path) with destructive or non-read-only behavior.",
2010
+ "[medium] Tool \"git_worktree\" combines broad parameters (path) with destructive or non-read-only behavior."
2011
+ ],
2012
+ "findings": [
2013
+ {
2014
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2015
+ "attackClass": "permission-boundary",
2016
+ "severity": "medium",
2017
+ "itemType": "tool",
2018
+ "itemName": "git_add",
2019
+ "message": "Tool \"git_add\" combines broad parameters (path) with destructive or non-read-only behavior.",
2020
+ "evidence": {
2021
+ "broadParams": [
2022
+ "path"
2023
+ ],
2024
+ "annotations": {
2025
+ "readOnlyHint": false
2026
+ },
2027
+ "description": "Stage files for commit. Add file contents to the staging area (index) to prepare for the next commit."
2028
+ },
2029
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2030
+ "recommendedAction": "gate"
2031
+ },
2032
+ {
2033
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2034
+ "attackClass": "permission-boundary",
2035
+ "severity": "medium",
2036
+ "itemType": "tool",
2037
+ "itemName": "git_branch",
2038
+ "message": "Tool \"git_branch\" combines broad parameters (path) with destructive or non-read-only behavior.",
2039
+ "evidence": {
2040
+ "broadParams": [
2041
+ "path"
2042
+ ],
2043
+ "annotations": {
2044
+ "readOnlyHint": false
2045
+ },
2046
+ "description": "Manage branches: list all branches, show current branch, create a new branch, delete a branch, or rename a branch."
2047
+ },
2048
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2049
+ "recommendedAction": "gate"
2050
+ },
2051
+ {
2052
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2053
+ "attackClass": "permission-boundary",
2054
+ "severity": "medium",
2055
+ "itemType": "tool",
2056
+ "itemName": "git_checkout",
2057
+ "message": "Tool \"git_checkout\" combines broad parameters (path) with destructive or non-read-only behavior.",
2058
+ "evidence": {
2059
+ "broadParams": [
2060
+ "path"
2061
+ ],
2062
+ "annotations": {
2063
+ "readOnlyHint": false
2064
+ },
2065
+ "description": "Switch branches or restore working tree files. Can checkout an existing branch, create a new branch, or restore specific files."
2066
+ },
2067
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2068
+ "recommendedAction": "gate"
2069
+ },
2070
+ {
2071
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2072
+ "attackClass": "permission-boundary",
2073
+ "severity": "medium",
2074
+ "itemType": "tool",
2075
+ "itemName": "git_cherry_pick",
2076
+ "message": "Tool \"git_cherry_pick\" combines broad parameters (path) with destructive or non-read-only behavior.",
2077
+ "evidence": {
2078
+ "broadParams": [
2079
+ "path"
2080
+ ],
2081
+ "annotations": {
2082
+ "readOnlyHint": false
2083
+ },
2084
+ "description": "Cherry-pick commits from other branches. Apply specific commits to the current branch without merging entire branches."
2085
+ },
2086
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2087
+ "recommendedAction": "gate"
2088
+ },
2089
+ {
2090
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2091
+ "attackClass": "permission-boundary",
2092
+ "severity": "medium",
2093
+ "itemType": "tool",
2094
+ "itemName": "git_clean",
2095
+ "message": "Tool \"git_clean\" combines broad parameters (path) with destructive or non-read-only behavior.",
2096
+ "evidence": {
2097
+ "broadParams": [
2098
+ "path"
2099
+ ],
2100
+ "annotations": {
2101
+ "readOnlyHint": false
2102
+ },
2103
+ "description": "Remove untracked files from the working directory. Requires force flag for safety. Use dry-run to preview files that would be removed."
2104
+ },
2105
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2106
+ "recommendedAction": "gate"
2107
+ },
2108
+ {
2109
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2110
+ "attackClass": "permission-boundary",
2111
+ "severity": "medium",
2112
+ "itemType": "tool",
2113
+ "itemName": "git_clone",
2114
+ "message": "Tool \"git_clone\" combines broad parameters (url, path) with destructive or non-read-only behavior.",
2115
+ "evidence": {
2116
+ "broadParams": [
2117
+ "url",
2118
+ "path"
2119
+ ],
2120
+ "annotations": {
2121
+ "readOnlyHint": false
2122
+ },
2123
+ "description": "Clone a repository from a remote URL or local path. Accepts HTTP(S), SSH, git://, file://, and bare filesystem paths, with optional shallow cloning."
2124
+ },
2125
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2126
+ "recommendedAction": "gate"
2127
+ },
2128
+ {
2129
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2130
+ "attackClass": "permission-boundary",
2131
+ "severity": "medium",
2132
+ "itemType": "tool",
2133
+ "itemName": "git_commit",
2134
+ "message": "Tool \"git_commit\" combines broad parameters (path) with destructive or non-read-only behavior.",
2135
+ "evidence": {
2136
+ "broadParams": [
2137
+ "path"
2138
+ ],
2139
+ "annotations": {
2140
+ "readOnlyHint": false
2141
+ },
2142
+ "description": "Create a new commit with staged changes in the repository. Records a snapshot of the staging area with a commit message.\n\n**Commit Message Format:**\nPass commit messages as JSON string parameters. Multi-line messages are supported using standard JSON string escaping.\n\n**Examples:**\n- Single line: { \"message\": \"feat: add user authentication\" }\n- Multi-line: { \"message\": \"feat: add user authentication\\n\\nImplemented OAuth2 flow with JWT tokens.\\nAdded tests for login and logout.\" }\n\nNote: Do not use bash heredoc syntax. Literal escape sequences (\\n, \\t) in the message string are automatically normalized to their actual characters."
2143
+ },
2144
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2145
+ "recommendedAction": "gate"
2146
+ },
2147
+ {
2148
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2149
+ "attackClass": "permission-boundary",
2150
+ "severity": "medium",
2151
+ "itemType": "tool",
2152
+ "itemName": "git_fetch",
2153
+ "message": "Tool \"git_fetch\" combines broad parameters (path) with destructive or non-read-only behavior.",
2154
+ "evidence": {
2155
+ "broadParams": [
2156
+ "path"
2157
+ ],
2158
+ "annotations": {
2159
+ "readOnlyHint": false
2160
+ },
2161
+ "description": "Fetch updates from a remote repository. Downloads objects and refs without merging them."
2162
+ },
2163
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2164
+ "recommendedAction": "gate"
2165
+ },
2166
+ {
2167
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2168
+ "attackClass": "permission-boundary",
2169
+ "severity": "medium",
2170
+ "itemType": "tool",
2171
+ "itemName": "git_init",
2172
+ "message": "Tool \"git_init\" combines broad parameters (path) with destructive or non-read-only behavior.",
2173
+ "evidence": {
2174
+ "broadParams": [
2175
+ "path"
2176
+ ],
2177
+ "annotations": {
2178
+ "readOnlyHint": false
2179
+ },
2180
+ "description": "Initialize a new Git repository at the specified path. Creates a .git directory and sets up the initial branch."
2181
+ },
2182
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2183
+ "recommendedAction": "gate"
2184
+ },
2185
+ {
2186
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2187
+ "attackClass": "permission-boundary",
2188
+ "severity": "medium",
2189
+ "itemType": "tool",
2190
+ "itemName": "git_merge",
2191
+ "message": "Tool \"git_merge\" combines broad parameters (path) with destructive or non-read-only behavior.",
2192
+ "evidence": {
2193
+ "broadParams": [
2194
+ "path"
2195
+ ],
2196
+ "annotations": {
2197
+ "readOnlyHint": false
2198
+ },
2199
+ "description": "Merge branches together. Integrates changes from another branch into the current branch with optional merge strategies."
2200
+ },
2201
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2202
+ "recommendedAction": "gate"
2203
+ },
2204
+ {
2205
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2206
+ "attackClass": "permission-boundary",
2207
+ "severity": "medium",
2208
+ "itemType": "tool",
2209
+ "itemName": "git_pull",
2210
+ "message": "Tool \"git_pull\" combines broad parameters (path) with destructive or non-read-only behavior.",
2211
+ "evidence": {
2212
+ "broadParams": [
2213
+ "path"
2214
+ ],
2215
+ "annotations": {
2216
+ "readOnlyHint": false
2217
+ },
2218
+ "description": "Pull changes from a remote repository. Fetches and integrates changes into the current branch."
2219
+ },
2220
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2221
+ "recommendedAction": "gate"
2222
+ },
2223
+ {
2224
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2225
+ "attackClass": "permission-boundary",
2226
+ "severity": "medium",
2227
+ "itemType": "tool",
2228
+ "itemName": "git_push",
2229
+ "message": "Tool \"git_push\" combines broad parameters (path) with destructive or non-read-only behavior.",
2230
+ "evidence": {
2231
+ "broadParams": [
2232
+ "path"
2233
+ ],
2234
+ "annotations": {
2235
+ "readOnlyHint": false
2236
+ },
2237
+ "description": "Push changes to a remote repository. Uploads local commits to the remote branch."
2238
+ },
2239
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2240
+ "recommendedAction": "gate"
2241
+ },
2242
+ {
2243
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2244
+ "attackClass": "permission-boundary",
2245
+ "severity": "medium",
2246
+ "itemType": "tool",
2247
+ "itemName": "git_rebase",
2248
+ "message": "Tool \"git_rebase\" combines broad parameters (path) with destructive or non-read-only behavior.",
2249
+ "evidence": {
2250
+ "broadParams": [
2251
+ "path"
2252
+ ],
2253
+ "annotations": {
2254
+ "readOnlyHint": false
2255
+ },
2256
+ "description": "Rebase commits onto another branch. Reapplies commits on top of another base tip for a cleaner history."
2257
+ },
2258
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2259
+ "recommendedAction": "gate"
2260
+ },
2261
+ {
2262
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2263
+ "attackClass": "permission-boundary",
2264
+ "severity": "medium",
2265
+ "itemType": "tool",
2266
+ "itemName": "git_remote",
2267
+ "message": "Tool \"git_remote\" combines broad parameters (path, url) with destructive or non-read-only behavior.",
2268
+ "evidence": {
2269
+ "broadParams": [
2270
+ "path",
2271
+ "url"
2272
+ ],
2273
+ "annotations": {
2274
+ "readOnlyHint": false
2275
+ },
2276
+ "description": "Manage remote repositories: list remotes, add new remotes, remove remotes, rename remotes, or get/set remote URLs."
2277
+ },
2278
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2279
+ "recommendedAction": "gate"
2280
+ },
2281
+ {
2282
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2283
+ "attackClass": "permission-boundary",
2284
+ "severity": "medium",
2285
+ "itemType": "tool",
2286
+ "itemName": "git_reset",
2287
+ "message": "Tool \"git_reset\" combines broad parameters (path) with destructive or non-read-only behavior.",
2288
+ "evidence": {
2289
+ "broadParams": [
2290
+ "path"
2291
+ ],
2292
+ "annotations": {
2293
+ "readOnlyHint": false
2294
+ },
2295
+ "description": "Reset current HEAD to specified state. Can be used to unstage files (soft), discard commits (mixed), or discard all changes (hard)."
2296
+ },
2297
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2298
+ "recommendedAction": "gate"
2299
+ },
2300
+ {
2301
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2302
+ "attackClass": "permission-boundary",
2303
+ "severity": "medium",
2304
+ "itemType": "tool",
2305
+ "itemName": "git_set_working_dir",
2306
+ "message": "Tool \"git_set_working_dir\" combines broad parameters (path) with destructive or non-read-only behavior.",
2307
+ "evidence": {
2308
+ "broadParams": [
2309
+ "path"
2310
+ ],
2311
+ "annotations": {
2312
+ "readOnlyHint": false
2313
+ },
2314
+ "description": "Set the session working directory for all git operations so subsequent calls can omit the path parameter. Always returns a repository snapshot (status, recent commits, recent tags, remotes) to orient the caller."
2315
+ },
2316
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2317
+ "recommendedAction": "gate"
2318
+ },
2319
+ {
2320
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2321
+ "attackClass": "permission-boundary",
2322
+ "severity": "medium",
2323
+ "itemType": "tool",
2324
+ "itemName": "git_stash",
2325
+ "message": "Tool \"git_stash\" combines broad parameters (path) with destructive or non-read-only behavior.",
2326
+ "evidence": {
2327
+ "broadParams": [
2328
+ "path"
2329
+ ],
2330
+ "annotations": {
2331
+ "readOnlyHint": false
2332
+ },
2333
+ "description": "Manage stashes: list stashes, save current changes (push), restore changes (pop/apply), or remove stashes (drop/clear)."
2334
+ },
2335
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2336
+ "recommendedAction": "gate"
2337
+ },
2338
+ {
2339
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2340
+ "attackClass": "permission-boundary",
2341
+ "severity": "medium",
2342
+ "itemType": "tool",
2343
+ "itemName": "git_tag",
2344
+ "message": "Tool \"git_tag\" combines broad parameters (path) with destructive or non-read-only behavior.",
2345
+ "evidence": {
2346
+ "broadParams": [
2347
+ "path"
2348
+ ],
2349
+ "annotations": {
2350
+ "readOnlyHint": false
2351
+ },
2352
+ "description": "Manage tags: list all tags, create a new tag, delete a tag, or verify a signed tag. Tags are used to mark specific points in history (releases, milestones). Verify runs `git tag -v` and returns a structured result distinguishing unsigned tags, missing trust configuration, bad signatures, and valid signatures."
2353
+ },
2354
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2355
+ "recommendedAction": "gate"
2356
+ },
2357
+ {
2358
+ "ruleId": "attack-sim/permission-boundary/broad-destructive-tool",
2359
+ "attackClass": "permission-boundary",
2360
+ "severity": "medium",
2361
+ "itemType": "tool",
2362
+ "itemName": "git_worktree",
2363
+ "message": "Tool \"git_worktree\" combines broad parameters (path) with destructive or non-read-only behavior.",
2364
+ "evidence": {
2365
+ "broadParams": [
2366
+ "path"
2367
+ ],
2368
+ "annotations": {
2369
+ "readOnlyHint": false
2370
+ },
2371
+ "description": "Manage multiple working trees: list worktrees, add new worktrees for parallel work, remove worktrees, or move worktrees to new locations."
2372
+ },
2373
+ "recommendation": "Constrain this tool with typed inputs, allowlists, explicit read-only/destructive annotations, and a harmless CI fixture.",
2374
+ "recommendedAction": "gate"
2375
+ }
2376
+ ]
2377
+ }
2378
+ ]
2379
+ }
2380
+ ],
2381
+ "healthScore": {
2382
+ "overall": 84,
2383
+ "grade": "B",
2384
+ "dimensions": [
2385
+ {
2386
+ "name": "Protocol Compliance",
2387
+ "weight": 0.3,
2388
+ "score": 100,
2389
+ "details": [
2390
+ "conformance: pass (100/100)"
2391
+ ]
2392
+ },
2393
+ {
2394
+ "name": "Schema Quality",
2395
+ "weight": 0.2,
2396
+ "score": 60,
2397
+ "details": [
2398
+ "schema-quality: partial (60/100)"
2399
+ ]
2400
+ },
2401
+ {
2402
+ "name": "Security",
2403
+ "weight": 0.2,
2404
+ "score": 60,
2405
+ "details": [
2406
+ "security-lite: partial (60/100)",
2407
+ "security: partial (60/100)",
2408
+ "attack-sim: partial (60/100)"
2409
+ ]
2410
+ },
2411
+ {
2412
+ "name": "Reliability",
2413
+ "weight": 0.2,
2414
+ "score": 100,
2415
+ "details": [
2416
+ "tools: pass (100/100)",
2417
+ "prompts: pass (100/100)",
2418
+ "resources: pass (100/100)"
2419
+ ]
2420
+ },
2421
+ {
2422
+ "name": "Performance",
2423
+ "weight": 0.1,
2424
+ "score": 100,
2425
+ "details": [
2426
+ "Connect: 870ms",
2427
+ "p95 latency: 28ms (3 operations)"
2428
+ ]
2429
+ }
2430
+ ]
2431
+ },
2432
+ "performanceMetrics": {
2433
+ "connectMs": 869.9702500000003,
2434
+ "toolsListMs": 27.61420899999939,
2435
+ "promptsListMs": 0.6529589999991003,
2436
+ "resourcesListMs": 0.6025000000008731
2437
+ }
2438
+ }