@ekho/gitlab-mcp 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/LICENSE +21 -0
  2. package/PLAN.md +517 -0
  3. package/README.md +429 -0
  4. package/dist/config.d.ts +35 -0
  5. package/dist/config.js +59 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/groups/access_tokens/tools.d.ts +3 -0
  8. package/dist/groups/access_tokens/tools.js +198 -0
  9. package/dist/groups/access_tokens/tools.js.map +1 -0
  10. package/dist/groups/admin/tools.d.ts +3 -0
  11. package/dist/groups/admin/tools.js +136 -0
  12. package/dist/groups/admin/tools.js.map +1 -0
  13. package/dist/groups/ai_catalog/queries.d.ts +3 -0
  14. package/dist/groups/ai_catalog/queries.js +75 -0
  15. package/dist/groups/ai_catalog/queries.js.map +1 -0
  16. package/dist/groups/ai_catalog/tools.d.ts +3 -0
  17. package/dist/groups/ai_catalog/tools.js +40 -0
  18. package/dist/groups/ai_catalog/tools.js.map +1 -0
  19. package/dist/groups/analytics/queries.d.ts +1 -0
  20. package/dist/groups/analytics/queries.js +28 -0
  21. package/dist/groups/analytics/queries.js.map +1 -0
  22. package/dist/groups/analytics/tools.d.ts +3 -0
  23. package/dist/groups/analytics/tools.js +110 -0
  24. package/dist/groups/analytics/tools.js.map +1 -0
  25. package/dist/groups/audit_events/tools.d.ts +3 -0
  26. package/dist/groups/audit_events/tools.js +112 -0
  27. package/dist/groups/audit_events/tools.js.map +1 -0
  28. package/dist/groups/boards/tools.d.ts +3 -0
  29. package/dist/groups/boards/tools.js +46 -0
  30. package/dist/groups/boards/tools.js.map +1 -0
  31. package/dist/groups/branches/tools.d.ts +3 -0
  32. package/dist/groups/branches/tools.js +122 -0
  33. package/dist/groups/branches/tools.js.map +1 -0
  34. package/dist/groups/ci_catalog/queries.d.ts +2 -0
  35. package/dist/groups/ci_catalog/queries.js +63 -0
  36. package/dist/groups/ci_catalog/queries.js.map +1 -0
  37. package/dist/groups/ci_catalog/tools.d.ts +3 -0
  38. package/dist/groups/ci_catalog/tools.js +45 -0
  39. package/dist/groups/ci_catalog/tools.js.map +1 -0
  40. package/dist/groups/ci_lint/tools.d.ts +3 -0
  41. package/dist/groups/ci_lint/tools.js +36 -0
  42. package/dist/groups/ci_lint/tools.js.map +1 -0
  43. package/dist/groups/ci_variables/tools.d.ts +3 -0
  44. package/dist/groups/ci_variables/tools.js +201 -0
  45. package/dist/groups/ci_variables/tools.js.map +1 -0
  46. package/dist/groups/code_search/tools.d.ts +3 -0
  47. package/dist/groups/code_search/tools.js +70 -0
  48. package/dist/groups/code_search/tools.js.map +1 -0
  49. package/dist/groups/commits/tools.d.ts +3 -0
  50. package/dist/groups/commits/tools.js +192 -0
  51. package/dist/groups/commits/tools.js.map +1 -0
  52. package/dist/groups/compliance/queries.d.ts +1 -0
  53. package/dist/groups/compliance/queries.js +22 -0
  54. package/dist/groups/compliance/queries.js.map +1 -0
  55. package/dist/groups/compliance/tools.d.ts +3 -0
  56. package/dist/groups/compliance/tools.js +104 -0
  57. package/dist/groups/compliance/tools.js.map +1 -0
  58. package/dist/groups/container_registry/tools.d.ts +3 -0
  59. package/dist/groups/container_registry/tools.js +113 -0
  60. package/dist/groups/container_registry/tools.js.map +1 -0
  61. package/dist/groups/custom_roles/queries.d.ts +5 -0
  62. package/dist/groups/custom_roles/queries.js +69 -0
  63. package/dist/groups/custom_roles/queries.js.map +1 -0
  64. package/dist/groups/custom_roles/tools.d.ts +3 -0
  65. package/dist/groups/custom_roles/tools.js +84 -0
  66. package/dist/groups/custom_roles/tools.js.map +1 -0
  67. package/dist/groups/deployments/tools.d.ts +3 -0
  68. package/dist/groups/deployments/tools.js +98 -0
  69. package/dist/groups/deployments/tools.js.map +1 -0
  70. package/dist/groups/discussions/tools.d.ts +3 -0
  71. package/dist/groups/discussions/tools.js +144 -0
  72. package/dist/groups/discussions/tools.js.map +1 -0
  73. package/dist/groups/duo_chat/queries.d.ts +4 -0
  74. package/dist/groups/duo_chat/queries.js +76 -0
  75. package/dist/groups/duo_chat/queries.js.map +1 -0
  76. package/dist/groups/duo_chat/tools.d.ts +3 -0
  77. package/dist/groups/duo_chat/tools.js +95 -0
  78. package/dist/groups/duo_chat/tools.js.map +1 -0
  79. package/dist/groups/environments/tools.d.ts +3 -0
  80. package/dist/groups/environments/tools.js +105 -0
  81. package/dist/groups/environments/tools.js.map +1 -0
  82. package/dist/groups/events/tools.d.ts +3 -0
  83. package/dist/groups/events/tools.js +64 -0
  84. package/dist/groups/events/tools.js.map +1 -0
  85. package/dist/groups/feature_flags/tools.d.ts +3 -0
  86. package/dist/groups/feature_flags/tools.js +137 -0
  87. package/dist/groups/feature_flags/tools.js.map +1 -0
  88. package/dist/groups/groups/tools.d.ts +3 -0
  89. package/dist/groups/groups/tools.js +145 -0
  90. package/dist/groups/groups/tools.js.map +1 -0
  91. package/dist/groups/integrations/tools.d.ts +3 -0
  92. package/dist/groups/integrations/tools.js +143 -0
  93. package/dist/groups/integrations/tools.js.map +1 -0
  94. package/dist/groups/jobs/tools.d.ts +3 -0
  95. package/dist/groups/jobs/tools.js +209 -0
  96. package/dist/groups/jobs/tools.js.map +1 -0
  97. package/dist/groups/keys/tools.d.ts +3 -0
  98. package/dist/groups/keys/tools.js +140 -0
  99. package/dist/groups/keys/tools.js.map +1 -0
  100. package/dist/groups/labels/tools.d.ts +3 -0
  101. package/dist/groups/labels/tools.js +110 -0
  102. package/dist/groups/labels/tools.js.map +1 -0
  103. package/dist/groups/members/tools.d.ts +3 -0
  104. package/dist/groups/members/tools.js +136 -0
  105. package/dist/groups/members/tools.js.map +1 -0
  106. package/dist/groups/merge_requests/tools.d.ts +3 -0
  107. package/dist/groups/merge_requests/tools.js +288 -0
  108. package/dist/groups/merge_requests/tools.js.map +1 -0
  109. package/dist/groups/milestones/tools.d.ts +3 -0
  110. package/dist/groups/milestones/tools.js +143 -0
  111. package/dist/groups/milestones/tools.js.map +1 -0
  112. package/dist/groups/packages/tools.d.ts +3 -0
  113. package/dist/groups/packages/tools.js +157 -0
  114. package/dist/groups/packages/tools.js.map +1 -0
  115. package/dist/groups/pipeline_schedules/tools.d.ts +3 -0
  116. package/dist/groups/pipeline_schedules/tools.js +127 -0
  117. package/dist/groups/pipeline_schedules/tools.js.map +1 -0
  118. package/dist/groups/pipeline_triggers/tools.d.ts +3 -0
  119. package/dist/groups/pipeline_triggers/tools.js +74 -0
  120. package/dist/groups/pipeline_triggers/tools.js.map +1 -0
  121. package/dist/groups/pipelines/tools.d.ts +3 -0
  122. package/dist/groups/pipelines/tools.js +140 -0
  123. package/dist/groups/pipelines/tools.js.map +1 -0
  124. package/dist/groups/projects/tools.d.ts +3 -0
  125. package/dist/groups/projects/tools.js +189 -0
  126. package/dist/groups/projects/tools.js.map +1 -0
  127. package/dist/groups/protected_environments/tools.d.ts +3 -0
  128. package/dist/groups/protected_environments/tools.js +77 -0
  129. package/dist/groups/protected_environments/tools.js.map +1 -0
  130. package/dist/groups/releases/tools.d.ts +3 -0
  131. package/dist/groups/releases/tools.js +153 -0
  132. package/dist/groups/releases/tools.js.map +1 -0
  133. package/dist/groups/repository_files/tools.d.ts +3 -0
  134. package/dist/groups/repository_files/tools.js +163 -0
  135. package/dist/groups/repository_files/tools.js.map +1 -0
  136. package/dist/groups/runners/tools.d.ts +3 -0
  137. package/dist/groups/runners/tools.js +108 -0
  138. package/dist/groups/runners/tools.js.map +1 -0
  139. package/dist/groups/search/tools.d.ts +3 -0
  140. package/dist/groups/search/tools.js +58 -0
  141. package/dist/groups/search/tools.js.map +1 -0
  142. package/dist/groups/secrets/queries.d.ts +10 -0
  143. package/dist/groups/secrets/queries.js +121 -0
  144. package/dist/groups/secrets/queries.js.map +1 -0
  145. package/dist/groups/secrets/tools.d.ts +8 -0
  146. package/dist/groups/secrets/tools.js +167 -0
  147. package/dist/groups/secrets/tools.js.map +1 -0
  148. package/dist/groups/security_policies/queries.d.ts +3 -0
  149. package/dist/groups/security_policies/queries.js +75 -0
  150. package/dist/groups/security_policies/queries.js.map +1 -0
  151. package/dist/groups/security_policies/tools.d.ts +3 -0
  152. package/dist/groups/security_policies/tools.js +40 -0
  153. package/dist/groups/security_policies/tools.js.map +1 -0
  154. package/dist/groups/security_reports/queries.d.ts +1 -0
  155. package/dist/groups/security_reports/queries.js +75 -0
  156. package/dist/groups/security_reports/queries.js.map +1 -0
  157. package/dist/groups/security_reports/tools.d.ts +3 -0
  158. package/dist/groups/security_reports/tools.js +51 -0
  159. package/dist/groups/security_reports/tools.js.map +1 -0
  160. package/dist/groups/snippets/tools.d.ts +3 -0
  161. package/dist/groups/snippets/tools.js +148 -0
  162. package/dist/groups/snippets/tools.js.map +1 -0
  163. package/dist/groups/statistics/queries.d.ts +2 -0
  164. package/dist/groups/statistics/queries.js +32 -0
  165. package/dist/groups/statistics/queries.js.map +1 -0
  166. package/dist/groups/statistics/tools.d.ts +3 -0
  167. package/dist/groups/statistics/tools.js +35 -0
  168. package/dist/groups/statistics/tools.js.map +1 -0
  169. package/dist/groups/tags/tools.d.ts +3 -0
  170. package/dist/groups/tags/tools.js +97 -0
  171. package/dist/groups/tags/tools.js.map +1 -0
  172. package/dist/groups/todos/tools.d.ts +3 -0
  173. package/dist/groups/todos/tools.js +93 -0
  174. package/dist/groups/todos/tools.js.map +1 -0
  175. package/dist/groups/users/tools.d.ts +3 -0
  176. package/dist/groups/users/tools.js +121 -0
  177. package/dist/groups/users/tools.js.map +1 -0
  178. package/dist/groups/vulnerabilities/queries.d.ts +3 -0
  179. package/dist/groups/vulnerabilities/queries.js +104 -0
  180. package/dist/groups/vulnerabilities/queries.js.map +1 -0
  181. package/dist/groups/vulnerabilities/tools.d.ts +3 -0
  182. package/dist/groups/vulnerabilities/tools.js +131 -0
  183. package/dist/groups/vulnerabilities/tools.js.map +1 -0
  184. package/dist/groups/webhooks/tools.d.ts +3 -0
  185. package/dist/groups/webhooks/tools.js +213 -0
  186. package/dist/groups/webhooks/tools.js.map +1 -0
  187. package/dist/groups/wiki/tools.d.ts +3 -0
  188. package/dist/groups/wiki/tools.js +142 -0
  189. package/dist/groups/wiki/tools.js.map +1 -0
  190. package/dist/groups/work_items/queries.d.ts +16 -0
  191. package/dist/groups/work_items/queries.js +181 -0
  192. package/dist/groups/work_items/queries.js.map +1 -0
  193. package/dist/groups/work_items/tools.d.ts +3 -0
  194. package/dist/groups/work_items/tools.js +250 -0
  195. package/dist/groups/work_items/tools.js.map +1 -0
  196. package/dist/http/errors.d.ts +21 -0
  197. package/dist/http/errors.js +62 -0
  198. package/dist/http/errors.js.map +1 -0
  199. package/dist/http/graphql.d.ts +29 -0
  200. package/dist/http/graphql.js +93 -0
  201. package/dist/http/graphql.js.map +1 -0
  202. package/dist/http/rest.d.ts +96 -0
  203. package/dist/http/rest.js +369 -0
  204. package/dist/http/rest.js.map +1 -0
  205. package/dist/index.d.ts +2 -0
  206. package/dist/index.js +25 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/shared/args.d.ts +51 -0
  209. package/dist/shared/args.js +46 -0
  210. package/dist/shared/args.js.map +1 -0
  211. package/dist/shared/handlers.d.ts +6 -0
  212. package/dist/shared/handlers.js +14 -0
  213. package/dist/shared/handlers.js.map +1 -0
  214. package/dist/shared/ids.d.ts +18 -0
  215. package/dist/shared/ids.js +43 -0
  216. package/dist/shared/ids.js.map +1 -0
  217. package/dist/tools/meta.d.ts +3 -0
  218. package/dist/tools/meta.js +22 -0
  219. package/dist/tools/meta.js.map +1 -0
  220. package/dist/tools/registry.d.ts +3 -0
  221. package/dist/tools/registry.js +117 -0
  222. package/dist/tools/registry.js.map +1 -0
  223. package/dist/tools/types.d.ts +18 -0
  224. package/dist/tools/types.js +20 -0
  225. package/dist/tools/types.js.map +1 -0
  226. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Boris Gorbylev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/PLAN.md ADDED
@@ -0,0 +1,517 @@
1
+ # GitLab MCP — план реализации
2
+
3
+ ## 0. Текущий прогресс
4
+
5
+ | Фаза | Группа | Статус | Версия |
6
+ |---|---|---|---|
7
+ | 0 | Скелет проекта | ✅ Готово | 0.0.1 |
8
+ | 1 | B — Совместная работа | ✅ Готово | 0.1.0 |
9
+ | 2 | C — CI/CD | ✅ Готово | 0.2.0 |
10
+ | 3 | A — Код и репозиторий | ✅ Готово | 0.3.0 |
11
+ | 4 | D — Релизы и доставка | ✅ Готово | 0.4.0 |
12
+ | 5 | F — Доступ и пользователи | ✅ Готово | 0.5.0 |
13
+ | 6 | E — Безопасность и compliance | ✅ Готово | 0.6.0 |
14
+ | 7 | G — Интеграции и события | ✅ Готово | 0.7.0 |
15
+ | 8 | H — Контент | ✅ Готово | 0.8.0 |
16
+ | 9 | J — Аналитика и админка | ✅ Готово | 0.9.0 |
17
+ | 10 | I — AI / GitLab Duo | ✅ Готово | 1.0.0 |
18
+
19
+ ## 1. Цели
20
+
21
+ Реализовать MCP-сервер для GitLab, который умеет работать одновременно с **REST API** и **GraphQL** и выбирает оптимальный транспорт под каждую операцию. С первого релиза — **read + write**. Первичная цель — **gitlab.com**, по возможности совместимость с **self-hosted** (EE/CE).
22
+
23
+ ## 2. Стек
24
+
25
+ - **Язык:** TypeScript (Node 20+)
26
+ - **MCP SDK:** `@modelcontextprotocol/sdk` (stdio-transport)
27
+ - **HTTP:** `undici` (нативный fetch с лучшим контролем connection pool)
28
+ - **GraphQL:** `graphql-request` или сырые POST через тот же HTTP-клиент (легче для batch/типизации схемы)
29
+ - **Валидация:** `zod` для входов/выходов MCP-tools
30
+ - **Тесты:** `vitest` + `nock`/`msw` для HTTP-моков; smoke-тесты против реального gitlab.com через переменные окружения
31
+
32
+ ## 3. Аутентификация и конфигурация
33
+
34
+ Поддерживаемые типы токенов:
35
+ - Personal Access Token (PAT) — основной для разработки
36
+ - Project / Group Access Token — для скоупа в проде
37
+ - OAuth2 access token — для интеграций пользователя
38
+ - Job Token (CI) — read-only варианты, для запуска MCP внутри пайплайнов
39
+
40
+ Конфигурация (env / MCP server config):
41
+ - `GITLAB_BASE_URL` (default: `https://gitlab.com`)
42
+ - `GITLAB_TOKEN`
43
+ - `GITLAB_TOKEN_TYPE` (`pat` | `oauth` | `job`) — влияет на заголовок (`PRIVATE-TOKEN` vs `Authorization: Bearer` vs `JOB-TOKEN`)
44
+ - `GITLAB_DEFAULT_PROJECT` (опционально) — чтобы не таскать `project_id` в каждом вызове
45
+ - `GITLAB_DEFAULT_GROUP` (опционально)
46
+
47
+ ## 4. Архитектура
48
+
49
+ ```
50
+ src/
51
+ index.ts # MCP entry, регистрация tools
52
+ config.ts # парсинг env, валидация
53
+ http/
54
+ rest.ts # REST клиент (pagination, rate limit, error mapping)
55
+ graphql.ts # GraphQL клиент
56
+ errors.ts # унифицированные ошибки GitLabApiError
57
+ groups/
58
+ work_items/ # B: каждая группа — папка с tools.ts + handlers.ts + schemas.ts
59
+ merge_requests/
60
+ pipelines/
61
+ ...
62
+ shared/
63
+ pagination.ts # REST keyset + offset; GraphQL cursor
64
+ ids.ts # резолв project/group по id или path
65
+ markdown.ts # хелперы для GitLab Flavored Markdown (suggestions, mentions)
66
+ tools.ts # сборка манифеста всех tools
67
+ ```
68
+
69
+ Соглашения:
70
+ - Имена MCP-tools: `<resource>_<verb>`, snake_case (`merge_request_list`, `pipeline_retry`, `work_item_create`).
71
+ - Любой tool, делающий запись, принимает `dry_run: boolean` где это осмысленно.
72
+ - Идентификатор проекта/группы — либо числовой `id`, либо URL-encoded `path` (`group%2Fproject`). Хелпер `resolveProjectId()` это маскирует.
73
+ - Пагинация: tools отдают первую страницу + `next_cursor`. Опционально `auto_paginate: true` (с потолком, чтобы не утечь по rate limit).
74
+ - Rate limit: на 429 — экспоненциальный бэкофф с честным `Retry-After`.
75
+
76
+ ## 5. Транспортные правила
77
+
78
+ | Случай | Выбор |
79
+ |---|---|
80
+ | Work Items, Epics, иерархия parent/children | **GraphQL** (REST не покрывает Work Items полностью) |
81
+ | Большие списки с фильтрами и nested полями | **GraphQL** (меньше round-trips) |
82
+ | Файловые операции, batch commits, raw content | **REST** |
83
+ | CI Catalog, Duo, Security Policies, Custom Roles, Secrets Management | **GraphQL only** |
84
+ | Простой CRUD одной сущности | **REST** (проще, меньше схемы) |
85
+
86
+ ---
87
+
88
+ # 6. Группы (в порядке реализации)
89
+
90
+ Приоритет: **B → C → A → D → F → E → G → H → J → I**.
91
+
92
+ Каждая группа — это отдельная фаза. После каждой фазы — релиз минорной версии и smoke-тесты.
93
+
94
+ ---
95
+
96
+ ## Фаза 1 — Группа B: Совместная работа
97
+
98
+ > **Статус: ✅ Готово (v0.1.0).** 55+ tools, 32/32 unit-теста зелёные. Отличия от исходного плана: approval rules — только project-level (MR-level overrides отложены); boards — read-only; iterations — только list. Epics через `work_item_*` с `type=Epic` (отдельных epic tools нет).
99
+
100
+ ### B1. Merge Requests (REST + GraphQL)
101
+ - `merge_request_list` — фильтры: state, author, assignee, reviewer, scope, labels, milestone, target_branch, source_branch, search, updated_after
102
+ - `merge_request_get`
103
+ - `merge_request_create` — source/target branch, title, description, assignees, reviewers, labels, milestone, remove_source_branch, squash, draft
104
+ - `merge_request_update` — title, description, assignees, reviewers, labels, milestone, target_branch, state_event, draft
105
+ - `merge_request_merge` — squash, merge_commit_message, sha, should_remove_source_branch
106
+ - `merge_request_rebase`
107
+ - `merge_request_close` / `merge_request_reopen`
108
+ - `merge_request_changes` (diff)
109
+ - `merge_request_commits`
110
+ - `merge_request_pipelines`
111
+ - `merge_request_participants`
112
+
113
+ ### B2. Reviews & Approvals
114
+ - `merge_request_approve` / `merge_request_unapprove`
115
+ - `merge_request_approval_state`
116
+ - `approval_rule_list` / `approval_rule_create` / `approval_rule_update` / `approval_rule_delete`
117
+
118
+ ### B3. Discussions & Notes
119
+ - `discussion_list` (issue/MR/commit)
120
+ - `discussion_create` — general и inline (с position для diff)
121
+ - `discussion_reply`
122
+ - `discussion_resolve` / `discussion_unresolve`
123
+ - `note_update` / `note_delete`
124
+ - `suggestion_create` — обёртка над `note_create` с блоком ```suggestion (только для MR diff)
125
+
126
+ ### B4. Issues / Work Items (преимущественно GraphQL)
127
+ - `work_item_list` — фильтры: state, type (issue/task/incident/epic), assignee, author, labels, milestone, iteration, due_date, confidential, search
128
+ - `work_item_get`
129
+ - `work_item_create` — namespace, type, title, description, assignees, labels, milestone, parent_id, confidential
130
+ - `work_item_update` — title, description, state, assignees, labels, milestone, iteration, due_date, weight, health_status, parent
131
+ - `work_item_delete`
132
+ - `issue_link_list` / `issue_link_create` / `issue_link_delete` (relates_to, blocks, is_blocked_by)
133
+
134
+ ### B5. Epics
135
+ Используем `work_item_*` с `type=EPIC`. Отдельных tools не плодим — иерархия через `parent_id`/`children`. Для legacy-инстансов на старых версиях GitLab — fallback на REST `/groups/:id/epics` (отложено в техдолг).
136
+
137
+ ### B6. Labels
138
+ - `label_list_project` / `label_list_group`
139
+ - `label_create` / `label_update` / `label_delete`
140
+ - `label_subscribe` / `label_unsubscribe`
141
+ - Поддержка scoped labels (`scope::value`) — просто строкой
142
+
143
+ ### B7. Milestones & Iterations
144
+ - `milestone_list_project` / `milestone_list_group`
145
+ - `milestone_create` / `milestone_update` / `milestone_close` / `milestone_delete`
146
+ - `iteration_list_group` / `iteration_create` / `iteration_update`
147
+
148
+ ### B8. Boards
149
+ - `board_list_project` / `board_list_group`
150
+ - `board_get`
151
+ - `board_list_lists` / `board_create_list` / `board_delete_list`
152
+ - (write-операции по drag & drop в MVP не делаем — у боардов сложная семантика позиций)
153
+
154
+ ### B9. Todos & Notifications
155
+ - `todo_list` — state (pending/done), type, project_id
156
+ - `todo_mark_done` / `todo_mark_all_done`
157
+ - `notification_settings_get` / `notification_settings_update`
158
+
159
+ **DoD фазы 1:** запускается локально, читает свой собственный issue tracker, создаёт MR с разметкой ревьюеров, оставляет inline-комментарий с suggestion, мержит после approve.
160
+
161
+ ---
162
+
163
+ ## Фаза 2 — Группа C: CI/CD
164
+
165
+ > **Статус: ✅ Готово (v0.2.0).** ~52 tools. Отличия от плана: job artifact download (бинарные данные) пропущен — `job_get` отдаёт метаданные, скачивать удобнее напрямую через URL. Runner `register_runner` не реализован (deprecated в новых версиях).
166
+
167
+ ### C1. Pipelines
168
+ - `pipeline_list` — фильтры: status, ref, sha, source, username, updated_after, name
169
+ - `pipeline_get` / `pipeline_get_latest`
170
+ - `pipeline_create` — ref, variables[]
171
+ - `pipeline_retry` / `pipeline_cancel` / `pipeline_delete`
172
+ - `pipeline_variables`
173
+ - `pipeline_test_report` / `pipeline_test_report_summary`
174
+
175
+ ### C2. Jobs
176
+ - `job_list_pipeline` / `job_list_project`
177
+ - `job_get`
178
+ - `job_log` — trace, с опциональным offset/limit и `tail` режимом
179
+ - `job_retry` / `job_cancel` / `job_play` (manual jobs с variables) / `job_erase`
180
+ - `job_artifacts_list` / `job_artifact_download` / `job_artifacts_keep` / `job_artifacts_delete`
181
+
182
+ ### C3. Pipeline Schedules
183
+ - `schedule_list` / `schedule_get`
184
+ - `schedule_create` / `schedule_update` / `schedule_delete`
185
+ - `schedule_play` / `schedule_take_ownership`
186
+ - `schedule_variable_create` / `schedule_variable_update` / `schedule_variable_delete`
187
+
188
+ ### C4. Pipeline Triggers
189
+ - `trigger_list` / `trigger_create` / `trigger_revoke`
190
+ - `trigger_run_pipeline` — token + ref + variables
191
+
192
+ ### C5. CI/CD Variables
193
+ - `variable_list_project` / `variable_get_project` / `variable_create_project` / `variable_update_project` / `variable_delete_project`
194
+ - Аналогично для `group` и `instance`
195
+ - Поля: key, value, protected, masked, environment_scope, raw, description, variable_type
196
+
197
+ ### C6. Runners
198
+ - `runner_list` (instance/group/project), фильтры: scope, type, status, paused, tag_list
199
+ - `runner_get`
200
+ - `runner_update` / `runner_pause` / `runner_delete`
201
+ - `runner_jobs`
202
+ - `runner_register` (через registration token; флагнуть deprecation в 17+)
203
+
204
+ ### C7. CI Lint / Config
205
+ - `ci_lint` — content (опционально с project_id для контекста include)
206
+ - `ci_config_merged_get` — итоговый YAML с подставленными includes
207
+
208
+ ### C8. CI Catalog (GraphQL)
209
+ - `catalog_resource_list`
210
+ - `catalog_resource_get`
211
+
212
+ **DoD фазы 2:** через MCP можно перезапустить упавший пайплайн, дочитать лог job-а, поднять переменную окружения для feature-флага.
213
+
214
+ ---
215
+
216
+ ## Фаза 3 — Группа A: Код и репозиторий
217
+
218
+ > **Статус: ✅ Готово (v0.3.0).** ~57 tools. `code_search`/`commit_search`/`wiki_search` идут через REST `/search?scope=` (на gitlab.com работает с advanced search; на self-hosted без Elasticsearch — degraded). GraphQL `blobSearch` не использовался — REST покрывает кейс с меньшей зависимостью от версии.
219
+
220
+ ### A1. Projects
221
+ - `project_list` — фильтры: membership, owned, starred, archived, search, visibility, with_issues_enabled, etc.
222
+ - `project_get`
223
+ - `project_create` / `project_fork`
224
+ - `project_update` / `project_archive` / `project_unarchive` / `project_delete`
225
+ - `project_statistics`
226
+ - `project_languages`
227
+
228
+ ### A2. Groups
229
+ - `group_list` / `group_get`
230
+ - `group_create` / `group_update` / `group_delete`
231
+ - `group_subgroups` / `group_descendants`
232
+ - `group_projects` / `group_shared_projects`
233
+ - `group_transfer_project`
234
+
235
+ ### A3. Repository files
236
+ - `file_get` — path, ref → base64 content, sha, size, encoding
237
+ - `file_get_raw`
238
+ - `file_create` / `file_update` / `file_delete` (одиночные)
239
+ - `file_blame`
240
+ - `commit_actions` — batch: массив `{action: create|update|delete|move, file_path, content, ...}` в одном коммите
241
+ - `tree_list` — листинг директории, recursive
242
+
243
+ ### A4. Branches
244
+ - `branch_list` / `branch_get`
245
+ - `branch_create` (ref source) / `branch_delete`
246
+ - `protected_branch_list` / `protected_branch_protect` / `protected_branch_unprotect`
247
+ - `protected_branch_update` — allowed_to_push, allowed_to_merge, code_owner_approval_required
248
+
249
+ ### A5. Tags
250
+ - `tag_list` / `tag_get`
251
+ - `tag_create` — message, release_description
252
+ - `tag_delete`
253
+ - `protected_tag_list` / `protected_tag_protect` / `protected_tag_unprotect`
254
+
255
+ ### A6. Commits
256
+ - `commit_list` — ref, since, until, path, author
257
+ - `commit_get` / `commit_diff`
258
+ - `commit_cherry_pick` / `commit_revert`
259
+ - `commit_comment_list` / `commit_comment_create`
260
+ - `commit_status_list` / `commit_status_set` (внешние CI-статусы)
261
+
262
+ ### A7. Compare / Diff
263
+ - `repository_compare` — from, to, straight
264
+ - `repository_merge_base`
265
+
266
+ ### A8. Code search
267
+ - `search_blobs` — global / group / project scope, через GraphQL `blobSearch` где доступно
268
+ - `search_commits` / `search_wiki_blobs`
269
+
270
+ **DoD фазы 3:** через MCP можно прочитать `README.md`, создать ветку, закоммитить batch-изменение в нескольких файлах, найти все упоминания строки в репозитории.
271
+
272
+ ---
273
+
274
+ ## Фаза 4 — Группа D: Релизы и доставка
275
+
276
+ > **Статус: ✅ Готово (v0.4.0).** ~45 tools. Скачивание содержимого пакетов (Maven/NPM/PyPI raw protocols) не входит — только метаданные + delete. Dependency Proxy опущен по плану. Container expiration policy — через `project_update` с `container_expiration_policy_attributes` (отдельных tools нет).
277
+
278
+ ### D1. Releases
279
+ - `release_list` / `release_get`
280
+ - `release_create` / `release_update` / `release_delete`
281
+ - `release_link_list` / `release_link_create` / `release_link_delete`
282
+
283
+ ### D2. Environments
284
+ - `environment_list` / `environment_get`
285
+ - `environment_create` / `environment_update` / `environment_delete` / `environment_stop`
286
+
287
+ ### D3. Deployments
288
+ - `deployment_list` / `deployment_get`
289
+ - `deployment_create`
290
+ - `deployment_approve` — для protected environments
291
+
292
+ ### D4. Feature Flags
293
+ - `feature_flag_list` / `feature_flag_get`
294
+ - `feature_flag_create` / `feature_flag_update` / `feature_flag_delete`
295
+ - `feature_flag_user_list_list` / `feature_flag_user_list_create` / ...
296
+
297
+ ### D5. Packages
298
+ - `package_list_project` / `package_list_group`
299
+ - `package_get` / `package_files`
300
+ - `package_delete`
301
+ - (upload/download конкретных форматов — не в MVP, требует отдельных протоколов)
302
+
303
+ ### D6. Container Registry
304
+ - `registry_repository_list_project` / `registry_repository_list_group`
305
+ - `registry_repository_get` / `registry_repository_delete`
306
+ - `registry_tag_list` / `registry_tag_get`
307
+ - `registry_tag_delete` / `registry_tag_bulk_delete` (по name_regex)
308
+ - `registry_cleanup_policy_get` / `registry_cleanup_policy_update`
309
+
310
+ ### D7. Dependency Proxy
311
+ Отложено: чисто instance-настройка, редкий use case.
312
+
313
+ **DoD фазы 4:** через MCP можно зарелизить тег с changelog'ом, утвердить деплой в production, протухший тег в registry — удалить.
314
+
315
+ ---
316
+
317
+ ## Фаза 5 — Группа F: Доступ и пользователи
318
+
319
+ > **Статус: ✅ Готово (v0.5.0).** ~45 tools. `user_current` уже в meta — не дублируется. PAT self-creation через `/personal_access_tokens/self` (требует GitLab 16.5+); для старых инстансов или создания за другого пользователя — `pat_create_for_user` (admin). Custom roles — только group-level через GraphQL (instance-level требует admin-only схемы, не реализовано).
320
+
321
+ ### F1. Users
322
+ - `user_list` / `user_get` / `user_current`
323
+ - `user_search` (username/email)
324
+ - `user_create` / `user_update` / `user_delete` (admin)
325
+ - `user_block` / `user_unblock` / `user_activate` / `user_deactivate`
326
+
327
+ ### F2. Members
328
+ - `member_list_project` / `member_list_group` (all / direct)
329
+ - `member_get`
330
+ - `member_add` — user_id, access_level, expires_at, member_role_id
331
+ - `member_update`
332
+ - `member_remove`
333
+ - `billable_member_list_group` (только gitlab.com / paid)
334
+
335
+ ### F3. Access Tokens
336
+ - `pat_list_self` / `pat_create_self` / `pat_revoke`
337
+ - `project_access_token_list` / `project_access_token_create` / `project_access_token_revoke` / `project_access_token_rotate`
338
+ - `group_access_token_list` / `group_access_token_create` / `group_access_token_revoke` / `group_access_token_rotate`
339
+
340
+ ### F4. SSH/GPG/Deploy Keys
341
+ - `ssh_key_list` / `ssh_key_create` / `ssh_key_delete`
342
+ - `gpg_key_list` / `gpg_key_create` / `gpg_key_delete`
343
+ - `deploy_key_list_project` / `deploy_key_add` / `deploy_key_enable` / `deploy_key_delete`
344
+
345
+ ### F5. Custom Roles (GraphQL, premium+)
346
+ - `member_role_list` / `member_role_get`
347
+ - `member_role_create` / `member_role_update` / `member_role_delete`
348
+
349
+ **DoD фазы 5:** через MCP можно пригласить пользователя в проект с нужной ролью, ротировать project access token.
350
+
351
+ ---
352
+
353
+ ## Фаза 6 — Группа E: Безопасность и compliance
354
+
355
+ > Большинство фич — Premium/Ultimate. На CE/Free часть tools будет возвращать «not available on this tier» — это нормально, обрабатываем как ожидаемую ошибку.
356
+
357
+ > **Статус: ✅ Готово (v0.6.0).** ~45 tools. Vulnerability listing — через GraphQL (REST endpoint deprecated); state changes (dismiss/confirm/resolve/revert) — REST. Security policies — read-only (write через policy MR в специальном repo). Secrets Manager: project (17.8+), group (18.9+). Compliance assign-to-project — через GraphQL `projectSetComplianceFramework`. Streaming destinations — пока только HTTP (GCP/AWS назначения не реализованы).
358
+
359
+ ### E1. Vulnerabilities
360
+ - `vulnerability_list_project` / `vulnerability_list_group`
361
+ - `vulnerability_get`
362
+ - `vulnerability_dismiss` / `vulnerability_confirm` / `vulnerability_resolve` / `vulnerability_revert_to_detected`
363
+ - `vulnerability_create_issue`
364
+
365
+ ### E2. Security Reports
366
+ - `security_report_list_pipeline` — SAST, DAST, Dependency Scanning, Secret Detection, Container Scanning
367
+ - `vulnerability_finding_list`
368
+
369
+ ### E3. Security Policies (GraphQL, read-only в MVP)
370
+ - `security_policy_list_project` / `security_policy_list_group`
371
+ - `security_policy_sync_status`
372
+
373
+ ### E4. Compliance Frameworks
374
+ - `compliance_framework_list` / `compliance_framework_get`
375
+ - `compliance_framework_create` / `compliance_framework_update` / `compliance_framework_delete`
376
+ - `compliance_framework_assign_project`
377
+
378
+ ### E5. Audit Events
379
+ - `audit_event_list_project` / `audit_event_list_group` / `audit_event_list_instance`
380
+ - `audit_streaming_destination_list` / `audit_streaming_destination_create` / `audit_streaming_destination_update` / `audit_streaming_destination_delete`
381
+
382
+ ### E6. Secrets Management (GraphQL)
383
+ - `project_secret_list` / `project_secret_get` / `project_secret_create` / `project_secret_update` / `project_secret_delete`
384
+ - Аналогично для `group_secret_*`
385
+
386
+ ### E7. Protected Environments
387
+ - `protected_environment_list` / `protected_environment_protect` / `protected_environment_unprotect`
388
+ - (Protected branches/tags уже в A4/A5)
389
+
390
+ **DoD фазы 6:** через MCP можно посмотреть свежие уязвимости из пайплайна, дисмиссить ложноположительные, выгрузить audit log за неделю.
391
+
392
+ ---
393
+
394
+ ## Фаза 7 — Группа G: Интеграции и события
395
+
396
+ > **Статус: ✅ Готово (v0.7.0).** ~25 tools. Для интеграций — общий `integration_set`/`integration_get` плюс shortcut'ы для Slack, Mattermost, Jira, Microsoft Teams. Group `events` REST endpoint не существует — есть только `audit_events` (это в E5).
397
+
398
+ ### G1. Webhooks
399
+ - `hook_list_project` / `hook_list_group` / `hook_list_system`
400
+ - `hook_get` / `hook_create` / `hook_update` / `hook_delete` / `hook_test`
401
+ - События: push, tag_push, issue, MR, note, pipeline, job, deployment, releases, feature_flag
402
+
403
+ ### G2. Integrations
404
+ - `integration_list_project`
405
+ - `integration_get` / `integration_update` / `integration_delete`
406
+ - Отдельные shortcut-tools для популярных: `integration_set_slack`, `integration_set_jira`, `integration_set_mattermost`
407
+
408
+ ### G3. Events
409
+ - `event_list_user` / `event_list_current_user`
410
+ - `event_list_project` / `event_list_group`
411
+
412
+ **DoD фазы 7:** через MCP можно поставить вебхук на push + MR события, протестировать его доставку.
413
+
414
+ ---
415
+
416
+ ## Фаза 8 — Группа H: Контент
417
+
418
+ > **Статус: ✅ Готово (v0.8.0).** ~21 tools. `wiki_attachment_upload` пропущен — требует multipart, текущий REST-клиент только JSON. `search` — единый tool с `where: global|group|project` и полным набором scope'ов.
419
+
420
+ ### H1. Wiki
421
+ - `wiki_list` (project / group)
422
+ - `wiki_get` / `wiki_create` / `wiki_update` / `wiki_delete`
423
+ - `wiki_attachment_upload`
424
+
425
+ ### H2. Snippets
426
+ - `snippet_list_personal` / `snippet_list_project`
427
+ - `snippet_get` / `snippet_create` / `snippet_update` / `snippet_delete`
428
+ - `snippet_file_raw`
429
+
430
+ ### H3. Global Search
431
+ - `search_global` — scope: projects, issues, merge_requests, milestones, users, blobs, commits, wiki_blobs, notes
432
+ - `search_group` / `search_project`
433
+
434
+ **DoD фазы 8:** через MCP можно сделать сниппет с кодом из чата и поделиться ссылкой.
435
+
436
+ ---
437
+
438
+ ## Фаза 9 — Группа J: Аналитика и админка
439
+
440
+ > **Статус: ✅ Готово (v0.9.0).** ~25 tools. Value stream analytics не реализован — гора endpoint'ов под разные stages, и REST покрытие неполное. Storage breakdown — через `project_get` со `statistics=true` (отдельного REST endpoint нет). Admin-разделы (settings/applications/broadcast/license) работают только при наличии админских прав.
441
+
442
+ ### J1. Analytics
443
+ - `dora_metrics_project` / `dora_metrics_group` — deployment_frequency, lead_time_for_changes, change_failure_rate, time_to_restore_service
444
+ - `value_stream_analytics_get`
445
+ - `contribution_analytics_get`
446
+ - `usage_trends_get` (instance, GraphQL)
447
+
448
+ ### J2. Statistics
449
+ - `storage_breakdown_project`
450
+ - `runner_usage_get` (GraphQL)
451
+
452
+ ### J3. Admin / Instance (только если токен с правами admin)
453
+ - `application_settings_get` / `application_settings_update`
454
+ - `application_list` / `application_create` / `application_delete`
455
+ - `broadcast_message_list` / `broadcast_message_create` / `broadcast_message_update` / `broadcast_message_delete`
456
+ - `license_get` / `license_current`
457
+ - `version_get` / `metadata_get`
458
+
459
+ **DoD фазы 9:** через MCP можно сводку DORA метрик за квартал положить в чат.
460
+
461
+ ---
462
+
463
+ ## Фаза 10 — Группа I: AI / GitLab Duo (GraphQL only)
464
+
465
+ > Доступно только на gitlab.com при включённом Duo или self-hosted Duo Enterprise.
466
+
467
+ > **Статус: ✅ Готово (v1.0.0).** ~7 tools. `ai_chat_send` возвращает `request_id` + `thread_id` — ответ Duo приходит асинхронно, его нужно подтянуть `ai_message_list` с `request_ids=[<id>]`. `aiAction` mutation универсальная (поддерживает explain_code, summarize, etc.); в MVP реализован только `chat` input.
468
+
469
+ ### I1. Duo Chat
470
+ - `ai_message_list` — по conversation thread
471
+ - `ai_thread_list`
472
+ - `ai_chat_send` (mutation) — отправка сообщения в Duo Chat и получение ответа
473
+ - `ai_chat_context_presets`
474
+
475
+ ### I2. AI Catalog
476
+ - `ai_catalog_item_list` / `ai_catalog_item_get`
477
+ - `ai_self_hosted_model_list` (если on-prem с Duo Enterprise)
478
+
479
+ **DoD фазы 10:** через MCP можно дёрнуть Duo Chat с контекстом из проекта.
480
+
481
+ ---
482
+
483
+ # 7. Общие задачи (вне фаз)
484
+
485
+ - **Phase 0 (стартовый sprint) — ✅ Готово:**
486
+ - Скелет проекта, tsconfig, eslint, prettier
487
+ - HTTP-клиент с pagination/retry/error mapping
488
+ - GraphQL-клиент с typed-document подходом (`graphql-codegen` от схемы gitlab.com)
489
+ - Аутентификация и `resolveProjectId`/`resolveGroupId`
490
+ - Базовый smoke-тест: `metadata_get` + `user_current`
491
+ - CI: lint, typecheck, unit tests, build → npm publish
492
+
493
+ - **Сквозные требования к каждому tool:**
494
+ - Zod-схема входа и выхода
495
+ - Описание (для MCP discovery) с примерами
496
+ - Покрытие unit-тестом с моком HTTP
497
+ - Один happy-path integration тест против gitlab.com под env-флагом
498
+
499
+ - **Документация:**
500
+ - `README.md` — установка, конфигурация, примеры
501
+ - Авто-генерация списка tools из манифеста в `TOOLS.md`
502
+
503
+ # 8. Что НЕ делаем в обозримом будущем
504
+
505
+ - Загрузка/скачивание пакетов конкретных форматов (Maven/NPM/PyPI raw protocol) — слишком много форматов. **Generic package формат реализован в v1.1.**
506
+ - GitLab Pages deployment API — нишево
507
+ - Geo replication endpoints — admin-only, узкий use case
508
+ - Dependency Proxy — instance-настройка
509
+ - Push/pull mirrors — настройка через Git, не через API
510
+
511
+ # 9. Дополнения после v1.0
512
+
513
+ ## v1.1 — Multipart + Binary
514
+ - REST-клиент расширен `requestMultipart` (FormData) и `downloadBinary` / `uploadBinary` (Buffer).
515
+ - H1 Wiki: `wiki_attachment_upload` — multipart upload, принимает `content_base64` или `local_path`.
516
+ - C2 Jobs: `job_artifacts_download`, `job_artifact_file_download`, `job_artifacts_download_by_ref`, `job_artifact_file_download_by_ref` — все принимают `save_to` (сохранить в файл) или возвращают base64 (с лимитом).
517
+ - D5 Packages: `package_file_download_generic`, `package_file_upload_generic` — Generic protocol.