@rethunk/mcp-multi-root-git 2.3.4 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +30 -4
- package/CHANGELOG.md +74 -0
- package/HUMANS.md +54 -5
- package/README.md +15 -1
- package/dist/server/batch-commit-tool.js +266 -19
- package/dist/server/git-cherry-pick-tool.js +32 -8
- package/dist/server/git-diff-summary-tool.js +39 -21
- package/dist/server/git-diff-tool.js +132 -0
- package/dist/server/git-fetch-tool.js +131 -0
- package/dist/server/git-log-tool.js +37 -0
- package/dist/server/git-push-tool.js +8 -1
- package/dist/server/git-refs.js +72 -0
- package/dist/server/git-show-tool.js +148 -0
- package/dist/server/git-stash-tool.js +131 -0
- package/dist/server/git-tag-tool.js +162 -0
- package/dist/server/git.js +35 -4
- package/dist/server/roots.js +8 -4
- package/dist/server/test-harness.js +68 -5
- package/dist/server/tool-parameter-schemas.js +21 -1
- package/dist/server/tools.js +11 -0
- package/docs/install.md +19 -2
- package/docs/mcp-tools.md +443 -10
- package/package.json +18 -6
- package/schemas/batch_commit.json +125 -0
- package/schemas/git_cherry_pick.json +69 -0
- package/schemas/git_diff.json +62 -0
- package/schemas/git_diff_summary.json +75 -0
- package/schemas/git_fetch.json +52 -0
- package/schemas/git_inventory.json +74 -0
- package/schemas/git_log.json +77 -0
- package/schemas/git_merge.json +79 -0
- package/schemas/git_parity.json +74 -0
- package/schemas/git_push.json +50 -0
- package/schemas/git_reset_soft.json +42 -0
- package/schemas/git_show.json +39 -0
- package/schemas/git_stash_apply.json +44 -0
- package/schemas/git_stash_list.json +30 -0
- package/schemas/git_status.json +49 -0
- package/schemas/git_tag.json +50 -0
- package/schemas/git_worktree_add.json +52 -0
- package/schemas/git_worktree_list.json +30 -0
- package/schemas/git_worktree_remove.json +48 -0
- package/schemas/index.json +108 -0
- package/schemas/list_presets.json +44 -0
- package/tool-parameters.schema.json +327 -6
package/docs/mcp-tools.md
CHANGED
|
@@ -15,24 +15,253 @@ MCP clients expose tools as `{serverName}_{toolName}`. With the server registere
|
|
|
15
15
|
| `git_inventory` | `rethunk-git_git_inventory` | Status + ahead/behind per path; default upstream each repo’s `@{u}`; pass **both** `remote` and `branch` for fixed tracking. `nestedRoots`, `preset`, `presetMerge`, `maxRoots`, `format`, plus workspace pick args (`absoluteGitRoots` cannot combine with `preset`/`nestedRoots`). **Read-only.** |
|
|
16
16
|
| `git_parity` | `rethunk-git_git_parity` | Compare `git rev-parse HEAD` for path pairs. `pairs`, `preset`, `presetMerge`, `format`, plus workspace pick args (`absoluteGitRoots` for sibling clone batches). **Read-only.** |
|
|
17
17
|
| `list_presets` | `rethunk-git_list_presets` | List preset names/counts from `.rethunk/git-mcp-presets.json`; invalid JSON/schema surface as errors. Workspace pick + `format` only (includes `absoluteGitRoots`). **Read-only.** |
|
|
18
|
-
| `git_log` | `rethunk-git_git_log` | Path-filtered, time-windowed `git log` across one or more workspace roots. Returns commit history with author, date, subject, and shortstat. Args: `since`, `paths`, `grep`, `author`, `maxCommits`, `branch`, plus workspace pick args (`absoluteGitRoots` for sibling clones) + `format
|
|
18
|
+
| `git_log` | `rethunk-git_git_log` | Path-filtered, time-windowed `git log` across one or more workspace roots. Returns commit history with author, date, subject, and shortstat. Args: `since`, `paths`, `grep`, `author`, `maxCommits`, `branch`, plus workspace pick args (`absoluteGitRoots` for sibling clones) + `format` (`markdown`/`json`/`oneline`). **Read-only.** |
|
|
19
19
|
| `git_diff_summary` | `rethunk-git_git_diff_summary` | Structured, token-efficient diff viewer. Returns per-file diffs with additions/deletions counts, truncated to configurable line limits, with lock files/dist/vendor excluded by default. Args: `range`, `fileFilter`, `maxLinesPerFile`, `maxFiles`, `excludePatterns`, plus workspace pick args (optional single-entry `absoluteGitRoots`) + `format`. **Read-only.** |
|
|
20
|
+
| `git_diff` | `rethunk-git_git_diff` | Raw diff text for a single repo. Supports unstaged, staged, or `base..head` ranges, optionally scoped to one path. Args: `base?`, `head?`, `path?`, `staged?`, plus single-repo workspace pick + `format`. **Read-only.** |
|
|
21
|
+
| `git_show` | `rethunk-git_git_show` | Inspect one commit or ref. Returns commit message plus diff, or file content at `path` for that ref. Args: `ref`, `path?`, plus single-repo workspace pick + `format`. **Read-only.** |
|
|
20
22
|
| `git_worktree_list` | `rethunk-git_git_worktree_list` | List all worktrees (`git worktree list --porcelain`). Workspace pick + `format`. **Read-only.** |
|
|
23
|
+
| `git_stash_list` | `rethunk-git_git_stash_list` | List `git stash` entries for one repo. Args: single-repo workspace pick + `format`. **Read-only.** |
|
|
24
|
+
| `git_fetch` | `rethunk-git_git_fetch` | Fetch from a remote without modifying the working tree. Updates refs only and reports updated/new refs. Args: `remote?`, `branch?`, `prune?`, `tags?`, plus single-repo workspace pick + `format`. **Mutating — refs only.** |
|
|
21
25
|
| `git_push` | `rethunk-git_git_push` | Push the current branch to its upstream. Optional `remote`, `branch`, `setUpstream` (passes `-u`). Refuses on detached HEAD; never force-pushes. Workspace pick + `format`. **Mutating.** |
|
|
26
|
+
| `git_tag` | `rethunk-git_git_tag` | Create/delete annotated or lightweight tags for one repo. Args: `tag`, `message?`, `ref?`, `delete?`, plus single-repo workspace pick + `format`. **Mutating.** |
|
|
22
27
|
| `git_worktree_add` | `rethunk-git_git_worktree_add` | Create a new linked worktree, creating the branch from `baseRef` if it does not yet exist. Refuses on protected branch names. Args: `path`, `branch`, `baseRef?`, plus workspace pick + `format`. **Mutating.** |
|
|
23
28
|
| `git_worktree_remove` | `rethunk-git_git_worktree_remove` | Remove a registered worktree; refuses to remove the main worktree. Optional `force: true` for dirty trees. Args: `path`, `force?`, plus workspace pick + `format`. **Mutating.** |
|
|
24
29
|
| `git_reset_soft` | `rethunk-git_git_reset_soft` | Soft-reset the current branch to a ref (`HEAD~N`, SHA, branch). Rewound changes land in the staging index; requires a clean working tree. Args: `ref`, plus workspace pick + `format`. **Mutating — not idempotent.** |
|
|
25
|
-
| `batch_commit` | `rethunk-git_batch_commit` | Create multiple sequential git commits in a single call. Each entry stages the listed files then commits with the given message. Stops on first failure. Optional `push: "after"` pushes
|
|
30
|
+
| `batch_commit` | `rethunk-git_batch_commit` | Create multiple sequential git commits in a single call. Each entry stages the listed files or line-ranged file hunks, then commits with the given message. Stops on first failure. Optional `push: "after"` pushes once every commit lands; optional `dryRun: true` previews staged content without writing commits. Args: `commits` (array of `{message, files}`), `push?`, `dryRun?`, plus workspace pick args + `format`. **Mutating — not idempotent.** |
|
|
26
31
|
| `git_merge` | `rethunk-git_git_merge` | Merge one or more source branches into a destination. Default strategy `auto` cascades fast-forward → rebase → merge-commit per source, preferring linear history. Refuses on dirty tree; stops on first conflict with structured path report. Optional `deleteMergedBranches` / `deleteMergedWorktrees` cascade cleanup, always skipping protected names (main/master/dev/develop/stable/trunk/prod/production/release\*/hotfix\*). Args: `sources`, `into?`, `strategy?`, `message?`, cleanup flags + workspace pick + `format`. **Mutating.** |
|
|
27
|
-
| `git_cherry_pick` | `rethunk-git_git_cherry_pick` | Play commits from one or more sources onto a destination. Sources may be SHAs, `A..B` ranges, or branch names (expanded to `onto..<branch>`, oldest-first). Uses `--empty=drop` so patch-equivalent re-applies add nothing. Refuses on dirty tree; stops on first conflict, aborting cleanly. Same cleanup flags as `git_merge` (branch-kind sources only, protected names skipped). Args: `sources`, `onto?`, cleanup flags + workspace pick + `format`. **Mutating.** |
|
|
32
|
+
| `git_cherry_pick` | `rethunk-git_git_cherry_pick` | Play commits from one or more sources onto a destination. Sources may be SHAs, `A..B` ranges, or branch names (expanded to `onto..<branch>`, oldest-first). Uses `--empty=drop` so patch-equivalent re-applies add nothing. Refuses on dirty tree; stops on first conflict, aborting cleanly. Same cleanup flags as `git_merge` (branch-kind sources only, protected names skipped); branch deletion uses patch-id equivalence by default so cherry-pick workflows (where SHA differs but diff is identical) clean up correctly. Pass `strictMergedRefEquality: true` for strict `git branch -d` ancestry semantics. Args: `sources`, `onto?`, cleanup flags, `strictMergedRefEquality?` + workspace pick + `format`. **Mutating.** |
|
|
33
|
+
| `git_stash_apply` | `rethunk-git_git_stash_apply` | Apply or pop a stash entry for one repo. Args: `index?`, `pop?`, plus single-repo workspace pick + `format`. **Mutating.** |
|
|
28
34
|
|
|
29
35
|
Pass **`format: "json"`** on any tool for structured JSON instead of markdown (default).
|
|
30
36
|
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### `git_status` — parameters
|
|
40
|
+
|
|
41
|
+
| Parameter | Type | Default | Notes |
|
|
42
|
+
|-----------|------|---------|-------|
|
|
43
|
+
| `includeSubmodules` | boolean | `true` | When `true`, reads `.gitmodules` at each git toplevel and runs `git status --short -b` for each checked-out submodule in parallel. Set `false` to skip submodule discovery entirely. |
|
|
44
|
+
| `workspaceRoot` | string | — | Explicit root; highest priority. |
|
|
45
|
+
| `rootIndex` | int | — | Pick one of several MCP roots (0-based). |
|
|
46
|
+
| `allWorkspaceRoots` | boolean | `false` | Fan out across all MCP roots. |
|
|
47
|
+
| `absoluteGitRoots` | string[] | — | Explicit list of absolute paths; replaces normal workspace pick. Max 256. Read-only tools only. |
|
|
48
|
+
| `format` | `"markdown"` \| `"json"` | `"markdown"` | Output format. |
|
|
49
|
+
|
|
50
|
+
### `git_status` — JSON shape (`format: "json"`)
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"groups": [{
|
|
55
|
+
"mcpRoot": "/abs/workspace",
|
|
56
|
+
"repos": [
|
|
57
|
+
{ "label": ".", "path": "/abs/workspace", "statusText": "## main...origin/main\nM src/foo.ts", "ok": true },
|
|
58
|
+
{ "label": "sub", "path": "/abs/workspace/sub", "statusText": "## main...origin/main", "ok": true }
|
|
59
|
+
]
|
|
60
|
+
}]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
One `groups` entry per resolved root. Each `repos` entry has `label` (relative path, `"."` for the root), `path` (absolute), `statusText` (full `git status --short -b` output), and `ok` (`false` when git failed or the submodule is not checked out).
|
|
65
|
+
|
|
66
|
+
### `git_status` — error codes
|
|
67
|
+
|
|
68
|
+
Error payloads appear as top-level JSON or inline in individual repo rows (`ok: false`):
|
|
69
|
+
|
|
70
|
+
| Code / statusText | Context | Meaning |
|
|
71
|
+
|-------------------|---------|---------|
|
|
72
|
+
| `git_not_found` | top-level | `git` binary not on `PATH`. |
|
|
73
|
+
| `not_a_git_repository` | repo row `statusText` | Root is not inside a git repository. |
|
|
74
|
+
| `(submodule path escapes repository — rejected)` | repo row `statusText` | `.gitmodules` path resolves outside the git toplevel (security guard). |
|
|
75
|
+
| `(no .git — submodule not checked out?)` | repo row `statusText` | Submodule directory exists but has no `.git` — not initialized. |
|
|
76
|
+
| `root_index_out_of_range` | top-level | `rootIndex` exceeds the number of MCP file roots. |
|
|
77
|
+
| `absolute_git_roots_exclusive` | top-level | `absoluteGitRoots` combined with `workspaceRoot`, `rootIndex`, or `allWorkspaceRoots: true`. |
|
|
78
|
+
| `invalid_absolute_git_root` | top-level | An `absoluteGitRoots` entry is not a git-recognized directory. |
|
|
79
|
+
| `absolute_git_roots_too_many` | top-level | More than 256 entries in `absoluteGitRoots`. |
|
|
80
|
+
| `absolute_git_roots_empty` | top-level | `absoluteGitRoots` resolved to zero toplevels. |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### `git_inventory` — parameters
|
|
85
|
+
|
|
86
|
+
| Parameter | Type | Default | Notes |
|
|
87
|
+
|-----------|------|---------|-------|
|
|
88
|
+
| `nestedRoots` | string[] | — | Relative paths (from the workspace git toplevel) to treat as independent git repos to inventory. Each must be a valid git work tree; invalid paths produce skip entries rather than errors. Cannot combine with `absoluteGitRoots` or `preset`. |
|
|
89
|
+
| `preset` | string | — | Preset name from `.rethunk/git-mcp-presets.json`. Loads `nestedRoots` from the preset's entry. Cannot combine with `absoluteGitRoots`. |
|
|
90
|
+
| `presetMerge` | boolean | `false` | When `true`, merge inline `nestedRoots` with preset roots instead of replacing. |
|
|
91
|
+
| `remote` | string | — | Fixed remote for ahead/behind tracking. Must be paired with `branch`. |
|
|
92
|
+
| `branch` | string | — | Fixed branch for ahead/behind tracking. Must be paired with `remote`. When both are absent the tool uses each repo's `@{u}` upstream. |
|
|
93
|
+
| `maxRoots` | int | `64` | Max nested roots to process (1–256). Roots beyond the limit are omitted; `nestedRootsTruncated: true` and `nestedRootsOmittedCount` are set on the group. |
|
|
94
|
+
| `workspaceRoot` | string | — | Explicit root; highest priority. |
|
|
95
|
+
| `rootIndex` | int | — | Pick one of several MCP roots (0-based). |
|
|
96
|
+
| `allWorkspaceRoots` | boolean | `false` | Fan out across all MCP roots. |
|
|
97
|
+
| `absoluteGitRoots` | string[] | — | Explicit list; replaces normal workspace pick. Cannot combine with `nestedRoots` or `preset`. |
|
|
98
|
+
| `format` | `"markdown"` \| `"json"` | `"markdown"` | Output format. |
|
|
99
|
+
|
|
100
|
+
### `git_inventory` — JSON shape (`format: "json"`)
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"inventories": [{
|
|
105
|
+
"workspace_root": "/abs/path",
|
|
106
|
+
"entries": [{
|
|
107
|
+
"label": ".",
|
|
108
|
+
"path": "/abs/path",
|
|
109
|
+
"upstreamMode": "auto",
|
|
110
|
+
"branchStatus": "## main...origin/main",
|
|
111
|
+
"headAbbrev": "a1b2c3d",
|
|
112
|
+
"upstreamRef": "origin/main",
|
|
113
|
+
"ahead": "2",
|
|
114
|
+
"behind": "0"
|
|
115
|
+
}],
|
|
116
|
+
"nestedRootsTruncated": true,
|
|
117
|
+
"nestedRootsOmittedCount": 3,
|
|
118
|
+
"upstream": { "mode": "fixed", "remote": "origin", "branch": "main" }
|
|
119
|
+
}]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`nestedRootsTruncated` / `nestedRootsOmittedCount` present only when `maxRoots` cut the list. `upstream` object present only when `remote`+`branch` were supplied (fixed mode). `presetSchemaVersion` present only when a preset was loaded. See *v2/v3 field omission* for `entries[*]` optional fields.
|
|
124
|
+
|
|
125
|
+
### `git_inventory` — error codes
|
|
126
|
+
|
|
127
|
+
| Code | Meaning |
|
|
128
|
+
|------|---------|
|
|
129
|
+
| `git_not_found` | `git` binary not on `PATH`. |
|
|
130
|
+
| `remote_branch_mismatch` | Only one of `remote` / `branch` was provided; supply both or neither. |
|
|
131
|
+
| `invalid_remote_or_branch` | `remote` or `branch` contains characters outside the safe token set. |
|
|
132
|
+
| `absolute_git_roots_nested_or_preset_conflict` | `absoluteGitRoots` combined with `nestedRoots` or `preset`. |
|
|
133
|
+
| `absolute_git_roots_exclusive` | `absoluteGitRoots` combined with `workspaceRoot`, `rootIndex`, or `allWorkspaceRoots: true`. |
|
|
134
|
+
| `absolute_git_roots_preset_conflict` | `absoluteGitRoots` combined with a `preset` argument. |
|
|
135
|
+
| `invalid_absolute_git_root` | An `absoluteGitRoots` entry is not a git-recognized directory. |
|
|
136
|
+
| `absolute_git_roots_too_many` | More than 256 entries in `absoluteGitRoots`. |
|
|
137
|
+
| `absolute_git_roots_empty` | `absoluteGitRoots` resolved to zero toplevels. |
|
|
138
|
+
| `root_index_out_of_range` | `rootIndex` exceeds the number of MCP file roots. |
|
|
139
|
+
| `preset_not_found` | Named preset does not exist in the preset file. |
|
|
140
|
+
| `invalid_json` | Preset file contains invalid JSON. |
|
|
141
|
+
| `invalid_schema` | Preset file fails schema validation. |
|
|
142
|
+
|
|
143
|
+
Skip entries (individual repos that could not be inventoried) appear inline in `entries[*]` with `skipReason` rather than as top-level errors.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
### `git_parity` — parameters
|
|
148
|
+
|
|
149
|
+
| Parameter | Type | Notes |
|
|
150
|
+
|-----------|------|-------|
|
|
151
|
+
| `pairs` | `{left: string, right: string, label?: string}[]` | Path pairs to compare. `left` and `right` are relative to the workspace git toplevel. `label` is optional display name; defaults to `"left / right"`. At least one pair required (via inline `pairs` or `preset`). |
|
|
152
|
+
| `preset` | string | Preset name from `.rethunk/git-mcp-presets.json`. Loads `parityPairs` from the preset's entry. |
|
|
153
|
+
| `presetMerge` | boolean | Default `false`. When `true`, merge inline `pairs` with preset pairs instead of replacing. |
|
|
154
|
+
| `workspaceRoot` | string | Explicit root; highest priority. |
|
|
155
|
+
| `rootIndex` | int | Pick one of several MCP roots (0-based). |
|
|
156
|
+
| `allWorkspaceRoots` | boolean | `false` | Fan out across all MCP roots. |
|
|
157
|
+
| `absoluteGitRoots` | string[] | Explicit list of absolute paths; replaces normal workspace pick. Useful for checking parity across sibling clones. |
|
|
158
|
+
| `format` | `"markdown"` \| `"json"` | Output format. Default: `"markdown"`. |
|
|
159
|
+
|
|
160
|
+
### `git_parity` — JSON shape (`format: "json"`)
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"parity": [{
|
|
165
|
+
"workspace_root": "/abs/path",
|
|
166
|
+
"status": "MISMATCH",
|
|
167
|
+
"pairs": [
|
|
168
|
+
{
|
|
169
|
+
"label": "shared",
|
|
170
|
+
"leftPath": "/abs/path/left",
|
|
171
|
+
"rightPath": "/abs/path/right",
|
|
172
|
+
"match": true,
|
|
173
|
+
"sha": "a1b2c3d4e5f6…"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"label": "config",
|
|
177
|
+
"leftPath": "/abs/path/cfg-a",
|
|
178
|
+
"rightPath": "/abs/path/cfg-b",
|
|
179
|
+
"match": false,
|
|
180
|
+
"leftSha": "a1b2c3d…",
|
|
181
|
+
"rightSha": "f9e8d7c…"
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
}]
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
`status` is `"OK"` when every pair matches, `"MISMATCH"` when any pair differs or errors. On a match, `sha` carries the common HEAD SHA. On a mismatch, `leftSha` / `rightSha` carry the differing SHAs. On error (path escape or `git rev-parse HEAD` failure), `error` carries a description string and both SHA fields are absent. `presetSchemaVersion` is present when a preset was loaded.
|
|
189
|
+
|
|
190
|
+
### `git_parity` — error codes
|
|
191
|
+
|
|
192
|
+
| Code | Meaning |
|
|
193
|
+
|------|---------|
|
|
194
|
+
| `git_not_found` | `git` binary not on `PATH`. |
|
|
195
|
+
| `no_pairs` | Neither inline `pairs` nor a preset with `parityPairs` was supplied. |
|
|
196
|
+
| `absolute_git_roots_exclusive` | `absoluteGitRoots` combined with `workspaceRoot`, `rootIndex`, or `allWorkspaceRoots: true`. |
|
|
197
|
+
| `absolute_git_roots_preset_conflict` | `absoluteGitRoots` combined with a `preset` argument. |
|
|
198
|
+
| `invalid_absolute_git_root` | An `absoluteGitRoots` entry is not a git-recognized directory. |
|
|
199
|
+
| `absolute_git_roots_too_many` | More than 256 entries in `absoluteGitRoots`. |
|
|
200
|
+
| `absolute_git_roots_empty` | `absoluteGitRoots` resolved to zero toplevels. |
|
|
201
|
+
| `root_index_out_of_range` | `rootIndex` exceeds the number of MCP file roots. |
|
|
202
|
+
| `preset_not_found` | Named preset does not exist in the preset file. |
|
|
203
|
+
| `invalid_json` | Preset file contains invalid JSON. |
|
|
204
|
+
| `invalid_schema` | Preset file fails schema validation. |
|
|
205
|
+
|
|
206
|
+
Path-escape and `rev-parse` failures are reported inline in `pairs[*].error`, not as top-level error codes.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### `list_presets` — parameters
|
|
211
|
+
|
|
212
|
+
| Parameter | Type | Notes |
|
|
213
|
+
|-----------|------|-------|
|
|
214
|
+
| `workspaceRoot` | string | Explicit root; highest priority. |
|
|
215
|
+
| `rootIndex` | int | Pick one of several MCP roots (0-based). |
|
|
216
|
+
| `allWorkspaceRoots` | boolean | Default `false`. Fan out across all MCP roots. |
|
|
217
|
+
| `absoluteGitRoots` | string[] | Explicit list; replaces normal workspace pick. |
|
|
218
|
+
| `format` | `"markdown"` \| `"json"` | Output format. Default: `"markdown"`. |
|
|
219
|
+
|
|
220
|
+
### `list_presets` — JSON shape (`format: "json"`)
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
{
|
|
224
|
+
"roots": [{
|
|
225
|
+
"workspaceRoot": "/abs/workspace",
|
|
226
|
+
"gitTop": "/abs/workspace",
|
|
227
|
+
"presetFile": "/abs/workspace/.rethunk/git-mcp-presets.json",
|
|
228
|
+
"fileExists": true,
|
|
229
|
+
"presetSchemaVersion": "1",
|
|
230
|
+
"presets": [
|
|
231
|
+
{
|
|
232
|
+
"name": "monorepo",
|
|
233
|
+
"nestedRootsCount": 5,
|
|
234
|
+
"parityPairsCount": 2,
|
|
235
|
+
"workspaceRootHint": "/abs/workspace"
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}]
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`gitTop` is `null` when the workspace root is not inside a git repository. `presetSchemaVersion` is omitted when absent. `workspaceRootHint` is omitted when not set. When `fileExists: false` the `presets` array is empty and no `error` is present. When the file exists but fails to load, `error` contains a structured error object and `presets` is empty.
|
|
243
|
+
|
|
244
|
+
### `list_presets` — error codes
|
|
245
|
+
|
|
246
|
+
| Code | Meaning |
|
|
247
|
+
|------|---------|
|
|
248
|
+
| `git_not_found` | `git` binary not on `PATH`. |
|
|
249
|
+
| `not_a_git_repository` | Root is not inside a git repository (reported inline in the `roots[*].error` field, not top-level). |
|
|
250
|
+
| `invalid_json` | Preset file is not valid JSON (inline in `roots[*].error`). |
|
|
251
|
+
| `invalid_schema` | Preset file fails schema validation (inline in `roots[*].error`). |
|
|
252
|
+
| `absolute_git_roots_exclusive` | `absoluteGitRoots` combined with `workspaceRoot`, `rootIndex`, or `allWorkspaceRoots: true`. |
|
|
253
|
+
| `invalid_absolute_git_root` | An `absoluteGitRoots` entry is not a git-recognized directory. |
|
|
254
|
+
| `absolute_git_roots_too_many` | More than 256 entries in `absoluteGitRoots`. |
|
|
255
|
+
| `absolute_git_roots_empty` | `absoluteGitRoots` resolved to zero toplevels. |
|
|
256
|
+
| `root_index_out_of_range` | `rootIndex` exceeds the number of MCP file roots. |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
31
260
|
## JSON responses
|
|
32
261
|
|
|
33
262
|
Tool JSON bodies are minified and contain only the payload — no `rethunkGitMcp` envelope. Current `MCP_JSON_FORMAT_VERSION` is **`"3"`**; server + format version are discoverable via MCP `initialize`. Payload keys (`groups`, `inventories`, `parity`, `roots`) are stable within a given format version. Preset-related responses may include **`presetSchemaVersion`**.
|
|
34
263
|
|
|
35
|
-
The package also ships **`tool-parameters.schema.json`**, generated from the registered Zod parameter schemas via `bun run schema:tools`. Connected MCP clients should still prefer live schema discovery from `initialize` / tool listing; the
|
|
264
|
+
The package also ships **`tool-parameters.schema.json`**, generated from the registered Zod parameter schemas via `bun run schema:tools`, plus the published **`schemas/`** directory (`schemas/index.json` + one JSON Schema per tool) via `bun run schema:individual`. Connected MCP clients should still prefer live schema discovery from `initialize` / tool listing; the shipped artifacts are for offline inspection, drift checks, and code generation.
|
|
36
265
|
|
|
37
266
|
### v2/v3 field omission (consumer contract)
|
|
38
267
|
|
|
@@ -68,7 +297,7 @@ To keep responses compact, **optional fields are omitted when they would be empt
|
|
|
68
297
|
| `workspaceRoot` | string | — | Explicit root; highest priority. |
|
|
69
298
|
| `rootIndex` | int | — | Pick one of several MCP roots (0-based). |
|
|
70
299
|
| `allWorkspaceRoots` | boolean | `false` | Fan out across all MCP roots. |
|
|
71
|
-
| `format` | `"markdown"` \| `"json"` | `"markdown"` | Output format. |
|
|
300
|
+
| `format` | `"markdown"` \| `"json"` \| `"oneline"` | `"markdown"` | Output format. `oneline` returns `<sha7> <subject>` per line with no headers (single root) or `### repo (branch)` separators per group (multi-root). Lowest-token option for post-commit verification. |
|
|
72
301
|
|
|
73
302
|
### `git_log` — JSON shape (`format: "json"`)
|
|
74
303
|
|
|
@@ -179,12 +408,151 @@ The response contains one **`parity[]`** entry per resolved git toplevel. `absol
|
|
|
179
408
|
|
|
180
409
|
---
|
|
181
410
|
|
|
411
|
+
### `git_diff` — parameters
|
|
412
|
+
|
|
413
|
+
| Parameter | Type | Default | Notes |
|
|
414
|
+
|-----------|------|---------|-------|
|
|
415
|
+
| `base` | string | — | Base ref for a revision diff. When omitted with no `staged`, the tool shows unstaged changes. |
|
|
416
|
+
| `head` | string | `HEAD` | Head ref for a revision diff. Used only when `base` is provided. |
|
|
417
|
+
| `path` | string | — | Optional single file path to scope the diff. |
|
|
418
|
+
| `staged` | boolean | `false` | When `true`, runs `git diff --staged`. Ignored when `base` is provided. |
|
|
419
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
420
|
+
|
|
421
|
+
### `git_diff` — JSON shape (`format: "json"`)
|
|
422
|
+
|
|
423
|
+
```json
|
|
424
|
+
{
|
|
425
|
+
"range": "HEAD~1..HEAD (src/server.ts)",
|
|
426
|
+
"diff": "diff --git a/src/server.ts b/src/server.ts\n..."
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### `git_diff` — error codes
|
|
431
|
+
|
|
432
|
+
| Code | Meaning |
|
|
433
|
+
|------|---------|
|
|
434
|
+
| `unsafe_range_token` | `base` or `head` contains characters outside the argv-safe subset. |
|
|
435
|
+
| `git_diff_failed` | `git diff` exited non-zero. |
|
|
436
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
### `git_show` — parameters
|
|
441
|
+
|
|
442
|
+
| Parameter | Type | Notes |
|
|
443
|
+
|-----------|------|-------|
|
|
444
|
+
| `ref` | string | Commit, branch, tag, or other git rev-spec to inspect. |
|
|
445
|
+
| `path` | string | Optional single path. When provided, the response shows that path's content at `ref` instead of the full commit diff. |
|
|
446
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
447
|
+
|
|
448
|
+
### `git_show` — JSON shape (`format: "json"`)
|
|
449
|
+
|
|
450
|
+
```json
|
|
451
|
+
{
|
|
452
|
+
"ref": "HEAD",
|
|
453
|
+
"message": "feat: add tool",
|
|
454
|
+
"path": "src/server.ts",
|
|
455
|
+
"diff": "diff --git a/src/server.ts b/src/server.ts\n..."
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
`path` is omitted when not requested. `diff` is omitted when `git show` returns only a commit message.
|
|
460
|
+
|
|
461
|
+
### `git_show` — error codes
|
|
462
|
+
|
|
463
|
+
| Code | Meaning |
|
|
464
|
+
|------|---------|
|
|
465
|
+
| `git_show_failed` | `git show` exited non-zero (e.g. unknown ref). |
|
|
466
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
### `git_stash_list` — parameters
|
|
471
|
+
|
|
472
|
+
| Parameter | Type | Notes |
|
|
473
|
+
|-----------|------|-------|
|
|
474
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
475
|
+
|
|
476
|
+
### `git_stash_list` — JSON shape (`format: "json"`)
|
|
477
|
+
|
|
478
|
+
```json
|
|
479
|
+
{
|
|
480
|
+
"stashes": [
|
|
481
|
+
{ "index": 0, "message": "WIP on main: abc1234 feat: add tool", "sha": "abc1234" }
|
|
482
|
+
]
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### `git_stash_list` — error codes
|
|
487
|
+
|
|
488
|
+
| Code | Meaning |
|
|
489
|
+
|------|---------|
|
|
490
|
+
| `stash_list_failed` | `git stash list` failed unexpectedly. |
|
|
491
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
### `git_fetch` — parameters
|
|
496
|
+
|
|
497
|
+
| Parameter | Type | Default | Notes |
|
|
498
|
+
|-----------|------|---------|-------|
|
|
499
|
+
| `remote` | string | `"origin"` | Remote to fetch from. |
|
|
500
|
+
| `branch` | string | — | Optional branch/ref to fetch from that remote. |
|
|
501
|
+
| `prune` | boolean | `false` | Pass `--prune` to remove deleted remote-tracking refs. |
|
|
502
|
+
| `tags` | boolean | `false` | Pass `--tags` to also fetch all tags. |
|
|
503
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
504
|
+
|
|
505
|
+
### `git_fetch` — JSON shape (`format: "json"`)
|
|
506
|
+
|
|
507
|
+
```json
|
|
508
|
+
{
|
|
509
|
+
"ok": true,
|
|
510
|
+
"remote": "origin",
|
|
511
|
+
"updatedRefs": ["abc1234..def5678 main -> origin/main"],
|
|
512
|
+
"newRefs": ["[new tag] v2.0.0 -> v2.0.0"],
|
|
513
|
+
"output": "From origin\n..."
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
Fetch failures are reported as `ok: false` with the captured git output in `output`.
|
|
518
|
+
|
|
519
|
+
### `git_fetch` — error codes
|
|
520
|
+
|
|
521
|
+
| Code | Meaning |
|
|
522
|
+
|------|---------|
|
|
523
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
### `batch_commit` — atomic staging semantics
|
|
528
|
+
|
|
529
|
+
**Critical for AI agents:** Each call to `batch_commit` is **self-contained and atomic per-commit entry**.
|
|
530
|
+
|
|
531
|
+
- **All files in a single entry are staged together.** When you list `files: ["src/foo.ts", "src/bar.ts"]` in one commit entry, both are staged atomically as a unit with a single `git add` before the commit is created.
|
|
532
|
+
- **Each commit entry is processed sequentially within the call.** The tool stages files, commits, then moves to the next entry. All entries within a single `batch_commit` call happen in one atomic MCP transaction.
|
|
533
|
+
- **A single `batch_commit` call cannot be split across multiple MCP calls.** Do NOT attempt incremental staging like "call 1 with file A, then call 2 with file B hoping they stage together." Each call is independent — call 1's commit lands immediately; call 2's changes are a separate transaction.
|
|
534
|
+
- **Failed entry stops the batch.** If staging or commit fails on entry N, the tool aborts and skips remaining entries. However, **entries that succeeded before the failure remain committed** — they are not rolled back.
|
|
535
|
+
- **Include all files for a logical change in a single `batch_commit` call.** Group related files in each commit entry, list them all in the `files` array, and include all necessary entries in the `commits` array.
|
|
536
|
+
|
|
537
|
+
Example: to commit two related changes atomically, pass both entries in one call:
|
|
538
|
+
```json
|
|
539
|
+
{
|
|
540
|
+
"commits": [
|
|
541
|
+
{ "message": "feat: add foo module", "files": ["src/foo.ts", "tests/foo.test.ts"] },
|
|
542
|
+
{ "message": "feat: integrate foo into bar", "files": ["src/bar.ts", "docs/foo.md"] }
|
|
543
|
+
]
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
Do NOT do this: make two separate calls hoping to stage files incrementally. That breaks the contract.
|
|
548
|
+
|
|
182
549
|
### `batch_commit` — parameters
|
|
183
550
|
|
|
184
551
|
| Parameter | Type | Notes |
|
|
185
552
|
|-----------|------|-------|
|
|
186
|
-
| `commits` | `{message: string, files: string[]}[]` | Commits to create in order. 1–50 entries. Each `files` entry is a path relative to the git root;
|
|
553
|
+
| `commits` | `{message: string, files: (string \| {path: string, lines: {from: number, to: number}})[]}[]` | Commits to create in order. 1–50 entries. Each `files` entry is either: (a) a path relative to the git root, staged with `git add`; (b) a `{path, lines: {from, to}}` object for hunk-level staging — only unified-diff hunks overlapping the given 1-indexed line range are staged; or (c) a path to a **deleted tracked file** (missing on disk but tracked in HEAD), which is staged as a removal via `git rm --cached` — combining `{path, lines}` with a deleted file is an error. All paths must stay within the git toplevel. |
|
|
187
554
|
| `push` | `"never"` \| `"after"` | Default `"never"`. `"after"` pushes the current branch to its upstream **once all commits succeed**. Never auto-sets upstream — branches without an upstream fail with `push_no_upstream`. Commits are **not** rolled back on push failure. Enum reserved for future modes such as `"force-with-lease"`. |
|
|
555
|
+
| `dryRun` | boolean | Default `false`. When `true`, stages each entry, reports what would be committed (`staged`, `diffStat`), then unstages everything without writing commits. |
|
|
188
556
|
| `workspaceRoot` | string | Explicit root; highest priority. |
|
|
189
557
|
| `rootIndex` | int | Pick one of several MCP roots (0-based). |
|
|
190
558
|
| `format` | `"markdown"` \| `"json"` | Output format. Default: `"markdown"`. |
|
|
@@ -219,6 +587,8 @@ The response contains one **`parity[]`** entry per resolved git toplevel. `absol
|
|
|
219
587
|
|
|
220
588
|
On first failure `ok` is `false`, `committed` reflects only the entries that succeeded before the error, and the failing entry includes `error` and `detail` fields. Remaining entries are skipped and not included in `results`.
|
|
221
589
|
|
|
590
|
+
When `dryRun: true`, the top-level response includes `dryRun: true`; successful `results[*]` entries omit `sha` and instead include `staged` and `diffStat`.
|
|
591
|
+
|
|
222
592
|
The `push` object is present only when `push: "after"` was requested **and** every commit landed. On push failure the top-level `ok` stays `true` (the commits themselves succeeded) while `push.ok` is `false` and `push.error` carries the code.
|
|
223
593
|
|
|
224
594
|
### `batch_commit` — error codes (per-result `error` field)
|
|
@@ -226,7 +596,7 @@ The `push` object is present only when `push: "after"` was requested **and** eve
|
|
|
226
596
|
| Code | Meaning |
|
|
227
597
|
|------|---------|
|
|
228
598
|
| `path_escapes_repository` | One of the listed file paths resolves outside the git toplevel. |
|
|
229
|
-
| `stage_failed` | `git add`
|
|
599
|
+
| `stage_failed` | Staging failed. `git add` error for modified/new files; `git rm --cached` error for deleted files (e.g. path never tracked in HEAD); `{path, lines}` on a deleted file. |
|
|
230
600
|
| `commit_failed` | `git commit` failed (e.g. nothing staged, hooks rejected). |
|
|
231
601
|
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
232
602
|
|
|
@@ -310,8 +680,9 @@ On conflict: top-level `ok` is `false`, the conflicting entry has `ok: false` wi
|
|
|
310
680
|
|-----------|------|-------|
|
|
311
681
|
| `sources` | `string[]` | Source specs. 1–50 entries. Each entry is one of: a full/short SHA, an `A..B` / `A...B` range, or a branch name. Branch names expand to `onto..<branch>` (oldest-first). |
|
|
312
682
|
| `onto` | string | Destination branch. Defaults to the currently checked-out branch. Rejected when HEAD is detached. |
|
|
313
|
-
| `deleteMergedBranches` | boolean | Default `false`. After all commits apply, delete each **branch-kind** source locally
|
|
683
|
+
| `deleteMergedBranches` | boolean | Default `false`. After all commits apply, delete each **branch-kind** source locally. Deletion uses **patch-id equivalence** by default — correct for cherry-pick workflows where SHA differs but diff is identical. Protected names always skipped; never touches remote refs. |
|
|
314
684
|
| `deleteMergedWorktrees` | boolean | Default `false`. After success, remove any local worktree attached to a branch-kind source (`git worktree remove`). Protected tails always skipped. |
|
|
685
|
+
| `strictMergedRefEquality` | boolean | Default `false`. When `true`, branch deletion uses strict SHA-reachability (`git branch -d` ancestry semantics) instead of patch-id equivalence. Use when you need git's exact ancestry guarantee rather than content equivalence. |
|
|
315
686
|
| `workspaceRoot`, `rootIndex`, `format` | — | Standard workspace pick + output format. |
|
|
316
687
|
|
|
317
688
|
### `git_cherry_pick` — JSON shape (`format: "json"`)
|
|
@@ -399,6 +770,39 @@ For already-committed work, call **`git_push`** directly instead of creating an
|
|
|
399
770
|
|
|
400
771
|
---
|
|
401
772
|
|
|
773
|
+
### `git_tag` — parameters
|
|
774
|
+
|
|
775
|
+
| Parameter | Type | Default | Notes |
|
|
776
|
+
|-----------|------|---------|-------|
|
|
777
|
+
| `tag` | string | — | Tag name to create or delete. |
|
|
778
|
+
| `message` | string | — | When provided, creates an annotated tag; otherwise creates a lightweight tag. |
|
|
779
|
+
| `ref` | string | `HEAD` | Commit/ref to tag. Ignored when `delete: true`. |
|
|
780
|
+
| `delete` | boolean | `false` | Delete the named tag instead of creating it. |
|
|
781
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
782
|
+
|
|
783
|
+
### `git_tag` — JSON shape (`format: "json"`)
|
|
784
|
+
|
|
785
|
+
```json
|
|
786
|
+
{ "tag": "v2.3.5", "type": "annotated", "sha": "a1b2c3d4e5f6..." }
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
For deletions, `type` is `"deleted"` and `sha` is an empty string.
|
|
790
|
+
|
|
791
|
+
### `git_tag` — error codes
|
|
792
|
+
|
|
793
|
+
| Code | Meaning |
|
|
794
|
+
|------|---------|
|
|
795
|
+
| `tag_empty` | `tag` trimmed to an empty string. |
|
|
796
|
+
| `tag_unsafe` | `tag` contains disallowed characters. |
|
|
797
|
+
| `ref_unsafe` | `ref` contains disallowed characters. |
|
|
798
|
+
| `ref_not_found` | `ref` did not resolve to a commit. |
|
|
799
|
+
| `tag_create_failed` | `git tag` failed while creating the tag. |
|
|
800
|
+
| `tag_delete_failed` | `git tag -d` failed. |
|
|
801
|
+
| `tag_verification_failed` | The tag could not be read back after creation. |
|
|
802
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
803
|
+
|
|
804
|
+
---
|
|
805
|
+
|
|
402
806
|
### `git_reset_soft` — parameters
|
|
403
807
|
|
|
404
808
|
| Parameter | Type | Notes |
|
|
@@ -424,6 +828,35 @@ For already-committed work, call **`git_push`** directly instead of creating an
|
|
|
424
828
|
|
|
425
829
|
---
|
|
426
830
|
|
|
831
|
+
### `git_stash_apply` — parameters
|
|
832
|
+
|
|
833
|
+
| Parameter | Type | Default | Notes |
|
|
834
|
+
|-----------|------|---------|-------|
|
|
835
|
+
| `index` | int | `0` | Stash index to apply/pop (`stash@{index}`). |
|
|
836
|
+
| `pop` | boolean | `false` | When `true`, runs `git stash pop` instead of `git stash apply`. |
|
|
837
|
+
| `workspaceRoot`, `rootIndex`, `format` | — | Standard single-repo workspace pick + output format. |
|
|
838
|
+
|
|
839
|
+
### `git_stash_apply` — JSON shape (`format: "json"`)
|
|
840
|
+
|
|
841
|
+
```json
|
|
842
|
+
{
|
|
843
|
+
"applied": true,
|
|
844
|
+
"stashIndex": 0,
|
|
845
|
+
"popped": false,
|
|
846
|
+
"output": "On branch main\nChanges not staged for commit:\n..."
|
|
847
|
+
}
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
`output` is omitted when git produced no stdout/stderr text.
|
|
851
|
+
|
|
852
|
+
### `git_stash_apply` — error codes
|
|
853
|
+
|
|
854
|
+
| Code | Meaning |
|
|
855
|
+
|------|---------|
|
|
856
|
+
| `not_a_git_repository` | The resolved workspace root is not inside a git repository. |
|
|
857
|
+
|
|
858
|
+
---
|
|
859
|
+
|
|
427
860
|
### `git_worktree_list` — JSON shape (`format: "json"`)
|
|
428
861
|
|
|
429
862
|
```json
|
|
@@ -515,7 +948,7 @@ Order applied when resolving which directory(ies) tools run against:
|
|
|
515
948
|
2. **`rootIndex`** (0-based) — one `file://` MCP root when several exist.
|
|
516
949
|
3. **`allWorkspaceRoots`: true** — every `file://` root; markdown output emits one `# {tool}` header with per-root subsections (`git_inventory` uses `### {gitTop}`; `git_status` uses `### MCP root: ...`), or combined JSON.
|
|
517
950
|
4. **`preset`** set and multiple roots — first root whose git toplevel defines that preset (respecting **`workspaceRootHint`** on the preset entry when present).
|
|
518
|
-
5. Otherwise the first `file://` root
|
|
951
|
+
5. Otherwise the first `file://` root reported by the MCP client through **`roots/list`**.
|
|
519
952
|
6. **`process.cwd()`** if no file roots (e.g. CI with explicit `workspaceRoot`).
|
|
520
953
|
|
|
521
|
-
Roots come from
|
|
954
|
+
Roots come from active MCP sessions (**`FastMCP` with `roots: { enabled: true }`** in code); there is no fixed `cwd` in server config. This is what allows one globally installed server to follow the workspace opened in VS Code, Claude Code, Cursor, or any other roots-capable MCP client.
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rethunk/mcp-multi-root-git",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "MCP stdio server: multi-root git status, inventory, and HEAD parity checks. Generic tools usable by any workspace.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
|
-
"packageManager": "bun@1.3.
|
|
7
|
+
"packageManager": "bun@1.3.13",
|
|
8
8
|
"engines": {
|
|
9
9
|
"node": ">=22.0.0"
|
|
10
10
|
},
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"dist",
|
|
13
13
|
"git-mcp-presets.schema.json",
|
|
14
14
|
"tool-parameters.schema.json",
|
|
15
|
+
"schemas",
|
|
15
16
|
"docs/install.md",
|
|
16
17
|
"docs/mcp-tools.md",
|
|
17
18
|
"AGENTS.md",
|
|
@@ -35,10 +36,11 @@
|
|
|
35
36
|
"coverage:check": "bun scripts/check-coverage.ts",
|
|
36
37
|
"schema:tools": "bun scripts/generate-tool-parameters-schema.ts",
|
|
37
38
|
"schema:tools:check": "bun scripts/generate-tool-parameters-schema.ts --check",
|
|
39
|
+
"schema:individual": "bun scripts/generate-individual-schemas.ts",
|
|
38
40
|
"publish:preflight": "bun scripts/publish-preflight.ts",
|
|
39
41
|
"test": "bun test src/",
|
|
40
42
|
"test:coverage": "bun test src/ --coverage",
|
|
41
|
-
"prepublishOnly": "bun run schema:tools:check && bun run build && bun run check && bun run test",
|
|
43
|
+
"prepublishOnly": "bun run schema:tools:check && bun run schema:individual && bun run build && bun run check && bun run test",
|
|
42
44
|
"setup-hooks": "git config core.hooksPath .githooks"
|
|
43
45
|
},
|
|
44
46
|
"keywords": [
|
|
@@ -63,12 +65,22 @@
|
|
|
63
65
|
},
|
|
64
66
|
"dependencies": {
|
|
65
67
|
"fastmcp": "^4.0.1",
|
|
66
|
-
"zod": "^4.3
|
|
68
|
+
"zod": "^4.4.3"
|
|
67
69
|
},
|
|
68
70
|
"devDependencies": {
|
|
69
|
-
"@biomejs/biome": "^2.4.
|
|
70
|
-
"@types/node": "^25.
|
|
71
|
+
"@biomejs/biome": "^2.4.15",
|
|
72
|
+
"@types/node": "^25.8.0",
|
|
71
73
|
"rimraf": "^6.1.3",
|
|
72
74
|
"typescript": "^6.0.3"
|
|
75
|
+
},
|
|
76
|
+
"overrides": {
|
|
77
|
+
"@hono/node-server": "^1.19.14",
|
|
78
|
+
"hono": "^4.12.18",
|
|
79
|
+
"fast-uri": "^3.1.2",
|
|
80
|
+
"postcss": "^8.5.10",
|
|
81
|
+
"vite": "^7.3.2",
|
|
82
|
+
"ip-address": "^10.1.1",
|
|
83
|
+
"axios": "^1.15.2",
|
|
84
|
+
"follow-redirects": "^1.15.12"
|
|
73
85
|
}
|
|
74
86
|
}
|