Forge
csharp8e44aa49
1using System.Text.Json;
2using ModelContextProtocol.Protocol;
3using Tool = ModelContextProtocol.Protocol.Tool;
4
5/// <summary>Каталог MCP-тулов. Согласован с <c>mcp-tools.manifest.json</c> и <c>docs/MCP-TOOLS.md</c> (генерация: <c>tools/ExportMcpManifest</c>).</summary>
6internal static class ToolCatalog
7{
8 private static JsonElement Schema(object schema) => JsonSerializer.SerializeToElement(schema);
9
10 internal static List<Tool> Build() =>
11 [
12 new()
13 {
14 Name = "git_status",
15 Description =
16 "Состояние репозитория: ветка, изменённые/добавленные/удалённые файлы. workspace_path — корень репо (каталог .git или файл .git у субмодуля).",
17 InputSchema = Schema(new
18 {
19 type = "object",
20 properties = new { workspace_path = new { type = "string", description = "Каталог workspace (корень репозитория)." } },
21 required = new[] { "workspace_path" }
22 })
23 },
24 new()
25 {
26 Name = "git_diff",
27 Description = "Дифф: не застейдженные изменения (или --staged по опции). Опционально path — один файл/путь.",
28 InputSchema = Schema(new
29 {
30 type = "object",
31 properties = new
32 {
33 workspace_path = new { type = "string", description = "Корень репозитория." },
34 path = new { type = "string", description = "Опционально: путь к файлу или каталогу для ограничения диффа." },
35 staged = new { type = "boolean", description = "Опционально: true — только staged изменения (git diff --staged)." }
36 },
37 required = new[] { "workspace_path" }
38 })
39 },
40 new()
41 {
42 Name = "git_log",
43 Description = "Лог коммитов (git log -n N --oneline). По умолчанию последние 20.",
44 InputSchema = Schema(new
45 {
46 type = "object",
47 properties = new
48 {
49 workspace_path = new { type = "string", description = "Корень репозитория." },
50 n = new { type = "integer", description = "Опционально: число коммитов (по умолчанию 20)." }
51 },
52 required = new[] { "workspace_path" }
53 })
54 },
55 new()
56 {
57 Name = "git_commit",
58 Description =
59 "Сделать коммит: git add (указанные пути или всё), затем git commit -m. Вызывать только по решению пользователя (логические коммиты).",
60 InputSchema = Schema(new
61 {
62 type = "object",
63 properties = new
64 {
65 workspace_path = new { type = "string", description = "Корень репозитория." },
66 message = new { type = "string", description = "Сообщение коммита." },
67 paths = new
68 {
69 type = "array",
70 items = new { type = "string" },
71 description = "Опционально: пути для add (файлы/каталоги). Если не задано — add -A (все изменения)."
72 }
73 },
74 required = new[] { "workspace_path", "message" }
75 })
76 },
77 new()
78 {
79 Name = "git_push",
80 Description =
81 "Отправить коммиты: git push [remote] [branch]. По умолчанию origin и текущая ветка. dry_run=true — git push --dry-run (без отправки). Вызывать по решению пользователя.",
82 InputSchema = Schema(new
83 {
84 type = "object",
85 properties = new
86 {
87 workspace_path = new { type = "string", description = "Корень репозитория." },
88 remote = new { type = "string", description = "Опционально: remote (по умолчанию origin)." },
89 branch = new { type = "string", description = "Опционально: ветка для push. Если не задано — текущая." },
90 dry_run = new { type = "boolean", description = "Опционально: true — только предпросмотр (--dry-run)." }
91 },
92 required = new[] { "workspace_path" }
93 })
94 },
95 new()
96 {
97 Name = "git_fetch",
98 Description =
99 "git fetch: обновить ссылки remote (refs/remotes). Опционально remote, --all или --prune. dry_run=true — git fetch --dry-run. Без слияния в рабочее дерево.",
100 InputSchema = Schema(new
101 {
102 type = "object",
103 properties = new
104 {
105 workspace_path = new { type = "string", description = "Корень репозитория." },
106 remote = new { type = "string", description = "Опционально: remote (например origin). Не использовать вместе с all=true." },
107 all = new { type = "boolean", description = "Опционально: true — git fetch --all (все remotes)." },
108 prune = new { type = "boolean", description = "Опционально: true — git fetch --prune." },
109 dry_run = new { type = "boolean", description = "Опционально: true — только предпросмотр (--dry-run)." }
110 },
111 required = new[] { "workspace_path" }
112 })
113 },
114 new()
115 {
116 Name = "git_pull",
117 Description =
118 "git pull: подтянуть и слить в текущую ветку. По умолчанию --ff-only (без merge-коммита от агента). dry_run=true — git pull --dry-run (Git 2.27+). Явно: remote + branch. Иначе — upstream текущей ветки.",
119 InputSchema = Schema(new
120 {
121 type = "object",
122 properties = new
123 {
124 workspace_path = new { type = "string", description = "Корень репозитория." },
125 remote = new { type = "string", description = "Опционально: вместе с branch — git pull remote branch." },
126 branch = new { type = "string", description = "Опционально: вместе с remote." },
127 ff_only = new { type = "boolean", description = "Опционально: по умолчанию true (--ff-only). false — разрешить merge при pull." },
128 dry_run = new { type = "boolean", description = "Опционально: true — только предпросмотр (--dry-run)." }
129 },
130 required = new[] { "workspace_path" }
131 })
132 },
133 new()
134 {
135 Name = "git_branch",
136 Description =
137 "Ветки: action=list (ветки -vv), create (git branch name [start_point]), delete (-d или -D при force). По умолчанию list.",
138 InputSchema = Schema(new
139 {
140 type = "object",
141 properties = new
142 {
143 workspace_path = new { type = "string", description = "Корень репозитория." },
144 action = new { type = "string", description = "list | create | delete (по умолчанию list)." },
145 name = new { type = "string", description = "Для create/delete: имя ветки." },
146 start_point = new { type = "string", description = "Опционально для create: от какой ревизии/ветки." },
147 force = new { type = "boolean", description = "Для delete: true — git branch -D (принудительно)." }
148 },
149 required = new[] { "workspace_path" }
150 })
151 },
152 new()
153 {
154 Name = "git_show",
155 Description =
156 "git show: содержимое коммита или объекта (rev: HEAD, хеш, ветка~1). Опционально path — файл в этой ревизии; stat_only — только --stat.",
157 InputSchema = Schema(new
158 {
159 type = "object",
160 properties = new
161 {
162 workspace_path = new { type = "string", description = "Корень репозитория." },
163 rev = new { type = "string", description = "Ревизия (обязательно): HEAD, sha, main~1, …" },
164 path = new { type = "string", description = "Опционально: путь к файлу внутри ревизии." },
165 stat_only = new { type = "boolean", description = "Опционально: true — только краткая статистика изменений." }
166 },
167 required = new[] { "workspace_path", "rev" }
168 })
169 },
170 new()
171 {
172 Name = "git_submodule",
173 Description =
174 "Субмодули: action=status (git submodule status) или update (git submodule update --init [--recursive], опционально path).",
175 InputSchema = Schema(new
176 {
177 type = "object",
178 properties = new
179 {
180 workspace_path = new { type = "string", description = "Корень репозитория." },
181 action = new { type = "string", description = "status | update (по умолчанию status)." },
182 path = new { type = "string", description = "Опционально для update: только этот субмодуль." },
183 recursive = new { type = "boolean", description = "Опционально для update: по умолчанию true (--recursive)." }
184 },
185 required = new[] { "workspace_path" }
186 })
187 },
188 new()
189 {
190 Name = "git_preflight",
191 Description =
192 "Preflight перед коммитом: классифицирует изменения на semantic/whitespace-only/eol-only/bom-only и возвращает safe-fix подсказки.",
193 InputSchema = Schema(new
194 {
195 type = "object",
196 properties = new
197 {
198 workspace_path = new { type = "string", description = "Корень репозитория." },
199 staged = new { type = "boolean", description = "Опционально: true — анализировать staged изменения." },
200 include_untracked = new { type = "boolean", description = "Опционально: true (по умолчанию) — включать untracked_files." },
201 include_patches = new { type = "boolean", description = "Опционально: true — включить эвристику BOM-only по патчам (медленнее)." }
202 },
203 required = new[] { "workspace_path" }
204 })
205 },
206 new()
207 {
208 Name = "git_preflight_fix_safe",
209 Description =
210 "Применить безопасные preflight-фиксы: git add --renormalize . и вернуть обновлённый preflight-отчёт.",
211 InputSchema = Schema(new
212 {
213 type = "object",
214 properties = new
215 {
216 workspace_path = new { type = "string", description = "Корень репозитория." },
217 include_patches = new { type = "boolean", description = "Опционально: true — включить эвристику BOM-only по патчам после фикса." }
218 },
219 required = new[] { "workspace_path" }
220 })
221 }
222 ];
223}
224
View only · write via MCP/CIDE