@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
@@ -0,0 +1,189 @@
1
+ import { z } from 'zod';
2
+ import { IdOrPath, PaginationArgs, ProjectIdArg } from '../../shared/args.js';
3
+ import { safe } from '../../shared/handlers.js';
4
+ import { encodeId, resolveProjectId } from '../../shared/ids.js';
5
+ const Visibility = z.enum(['private', 'internal', 'public']);
6
+ const OrderBy = z.enum([
7
+ 'id',
8
+ 'name',
9
+ 'path',
10
+ 'created_at',
11
+ 'updated_at',
12
+ 'last_activity_at',
13
+ 'similarity',
14
+ 'star_count',
15
+ ]);
16
+ export function registerProjectTools(server, ctx) {
17
+ server.tool('project_list', 'List projects visible to the current user, with filters.', {
18
+ search: z.string().optional(),
19
+ search_namespaces: z.boolean().optional(),
20
+ membership: z.boolean().optional(),
21
+ owned: z.boolean().optional(),
22
+ starred: z.boolean().optional(),
23
+ archived: z.boolean().optional(),
24
+ visibility: Visibility.optional(),
25
+ with_issues_enabled: z.boolean().optional(),
26
+ with_merge_requests_enabled: z.boolean().optional(),
27
+ simple: z.boolean().optional(),
28
+ statistics: z.boolean().optional(),
29
+ with_programming_language: z.string().optional(),
30
+ min_access_level: z.number().int().optional(),
31
+ order_by: OrderBy.optional(),
32
+ sort: z.enum(['asc', 'desc']).optional(),
33
+ ...PaginationArgs,
34
+ }, async (args) => safe(async () => {
35
+ const res = await ctx.rest.request({ path: '/projects', query: args });
36
+ return res.data;
37
+ }));
38
+ server.tool('project_get', 'Get a single project by id or path.', {
39
+ ...ProjectIdArg,
40
+ statistics: z.boolean().optional(),
41
+ license: z.boolean().optional(),
42
+ with_custom_attributes: z.boolean().optional(),
43
+ }, async (args) => safe(async () => {
44
+ const projectId = resolveProjectId(ctx.config, args.project_id);
45
+ const { project_id: _p, ...rest } = args;
46
+ const res = await ctx.rest.request({
47
+ path: `/projects/${projectId}`,
48
+ query: rest,
49
+ });
50
+ return res.data;
51
+ }));
52
+ server.tool('project_create', 'Create a new project. If namespace_id is omitted, creates under the user namespace.', {
53
+ name: z.string().optional(),
54
+ path: z.string().optional().describe('At least one of name/path is required.'),
55
+ namespace_id: z.number().int().optional(),
56
+ description: z.string().optional(),
57
+ visibility: Visibility.optional(),
58
+ initialize_with_readme: z.boolean().optional(),
59
+ default_branch: z.string().optional(),
60
+ issues_enabled: z.boolean().optional(),
61
+ merge_requests_enabled: z.boolean().optional(),
62
+ wiki_enabled: z.boolean().optional(),
63
+ snippets_enabled: z.boolean().optional(),
64
+ container_registry_enabled: z.boolean().optional(),
65
+ lfs_enabled: z.boolean().optional(),
66
+ tag_list: z.array(z.string()).optional(),
67
+ topics: z.array(z.string()).optional(),
68
+ import_url: z.string().optional(),
69
+ }, async (args) => safe(async () => {
70
+ const res = await ctx.rest.request({
71
+ method: 'POST',
72
+ path: '/projects',
73
+ body: args,
74
+ });
75
+ return res.data;
76
+ }));
77
+ server.tool('project_fork', 'Fork a project. Optionally target a different namespace.', {
78
+ ...ProjectIdArg,
79
+ namespace_id: z.number().int().optional(),
80
+ namespace_path: z.string().optional(),
81
+ path: z.string().optional(),
82
+ name: z.string().optional(),
83
+ description: z.string().optional(),
84
+ visibility: Visibility.optional(),
85
+ mr_default_target_self: z.boolean().optional(),
86
+ }, async (args) => safe(async () => {
87
+ const projectId = resolveProjectId(ctx.config, args.project_id);
88
+ const { project_id: _p, ...body } = args;
89
+ const res = await ctx.rest.request({
90
+ method: 'POST',
91
+ path: `/projects/${projectId}/fork`,
92
+ body,
93
+ });
94
+ return res.data;
95
+ }));
96
+ server.tool('project_update', 'Update project settings.', {
97
+ ...ProjectIdArg,
98
+ name: z.string().optional(),
99
+ path: z.string().optional(),
100
+ description: z.string().optional(),
101
+ default_branch: z.string().optional(),
102
+ visibility: Visibility.optional(),
103
+ issues_enabled: z.boolean().optional(),
104
+ merge_requests_enabled: z.boolean().optional(),
105
+ wiki_enabled: z.boolean().optional(),
106
+ snippets_enabled: z.boolean().optional(),
107
+ container_registry_enabled: z.boolean().optional(),
108
+ lfs_enabled: z.boolean().optional(),
109
+ request_access_enabled: z.boolean().optional(),
110
+ tag_list: z.array(z.string()).optional(),
111
+ topics: z.array(z.string()).optional(),
112
+ remove_source_branch_after_merge: z.boolean().optional(),
113
+ squash_option: z.enum(['never', 'always', 'default_on', 'default_off']).optional(),
114
+ only_allow_merge_if_pipeline_succeeds: z.boolean().optional(),
115
+ only_allow_merge_if_all_discussions_are_resolved: z.boolean().optional(),
116
+ merge_method: z.enum(['merge', 'rebase_merge', 'ff']).optional(),
117
+ ci_default_git_depth: z.number().int().optional(),
118
+ auto_devops_enabled: z.boolean().optional(),
119
+ packages_enabled: z.boolean().optional(),
120
+ }, async (args) => safe(async () => {
121
+ const projectId = resolveProjectId(ctx.config, args.project_id);
122
+ const { project_id: _p, ...body } = args;
123
+ const res = await ctx.rest.request({
124
+ method: 'PUT',
125
+ path: `/projects/${projectId}`,
126
+ body,
127
+ });
128
+ return res.data;
129
+ }));
130
+ server.tool('project_archive', 'Archive a project (read-only).', { ...ProjectIdArg }, async (args) => safe(async () => {
131
+ const projectId = resolveProjectId(ctx.config, args.project_id);
132
+ const res = await ctx.rest.request({
133
+ method: 'POST',
134
+ path: `/projects/${projectId}/archive`,
135
+ });
136
+ return res.data;
137
+ }));
138
+ server.tool('project_unarchive', 'Unarchive a project.', { ...ProjectIdArg }, async (args) => safe(async () => {
139
+ const projectId = resolveProjectId(ctx.config, args.project_id);
140
+ const res = await ctx.rest.request({
141
+ method: 'POST',
142
+ path: `/projects/${projectId}/unarchive`,
143
+ });
144
+ return res.data;
145
+ }));
146
+ server.tool('project_delete', 'Delete a project. On gitlab.com this enters a 7-day delayed delete by default.', { ...ProjectIdArg, permanently_remove: z.boolean().optional(), full_path: z.string().optional() }, async (args) => safe(async () => {
147
+ const projectId = resolveProjectId(ctx.config, args.project_id);
148
+ const { project_id: _p, ...body } = args;
149
+ const res = await ctx.rest.request({
150
+ method: 'DELETE',
151
+ path: `/projects/${projectId}`,
152
+ body: Object.keys(body).length > 0 ? body : undefined,
153
+ });
154
+ return res.data ?? { ok: true };
155
+ }));
156
+ server.tool('project_languages', 'Get the language breakdown for a project.', { ...ProjectIdArg }, async (args) => safe(async () => {
157
+ const projectId = resolveProjectId(ctx.config, args.project_id);
158
+ const res = await ctx.rest.request({
159
+ path: `/projects/${projectId}/languages`,
160
+ });
161
+ return res.data;
162
+ }));
163
+ server.tool('project_star', 'Star a project as the current user.', { ...ProjectIdArg }, async (args) => safe(async () => {
164
+ const projectId = resolveProjectId(ctx.config, args.project_id);
165
+ const res = await ctx.rest.request({
166
+ method: 'POST',
167
+ path: `/projects/${projectId}/star`,
168
+ });
169
+ return res.data;
170
+ }));
171
+ server.tool('project_unstar', 'Remove a star from a project.', { ...ProjectIdArg }, async (args) => safe(async () => {
172
+ const projectId = resolveProjectId(ctx.config, args.project_id);
173
+ const res = await ctx.rest.request({
174
+ method: 'POST',
175
+ path: `/projects/${projectId}/unstar`,
176
+ });
177
+ return res.data;
178
+ }));
179
+ server.tool('project_transfer', 'Transfer a project to a new namespace (admin or maintainer on both sides).', { ...ProjectIdArg, namespace: IdOrPath }, async (args) => safe(async () => {
180
+ const projectId = resolveProjectId(ctx.config, args.project_id);
181
+ const res = await ctx.rest.request({
182
+ method: 'PUT',
183
+ path: `/projects/${projectId}/transfer`,
184
+ body: { namespace: encodeId(args.namespace).replace(/%2F/g, '/') },
185
+ });
186
+ return res.data;
187
+ }));
188
+ }
189
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/projects/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,IAAI;IACJ,MAAM;IACN,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAgB;IACtE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0DAA0D,EAC1D;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACzC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC7B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAChC,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC3C,2BAA2B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACnD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,yBAAyB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;QACxC,GAAG,cAAc;KAClB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,qCAAqC,EACrC;QACE,GAAG,YAAY;QACf,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC/B,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC/C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,IAAI,EAAE,aAAa,SAAS,EAAE;YAC9B,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,qFAAqF,EACrF;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC9E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACrC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACtC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9C,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACpC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACxC,0BAA0B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACnC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAClC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0DAA0D,EAC1D;QACE,GAAG,YAAY;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACzC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC/C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,SAAS,OAAO;YACnC,IAAI;SACL,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,0BAA0B,EAC1B;QACE,GAAG,YAAY;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACrC,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACtC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9C,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACpC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACxC,0BAA0B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACnC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtC,gCAAgC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACxD,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClF,qCAAqC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC7D,gDAAgD,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACxE,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACjD,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC3C,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,SAAS,EAAE;YAC9B,IAAI;SACL,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gCAAgC,EAChC,EAAE,GAAG,YAAY,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,SAAS,UAAU;SACvC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,sBAAsB,EACtB,EAAE,GAAG,YAAY,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,SAAS,YAAY;SACzC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gFAAgF,EAChF,EAAE,GAAG,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,EACjG,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,aAAa,SAAS,EAAE;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SACtD,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,2CAA2C,EAC3C,EAAE,GAAG,YAAY,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,IAAI,EAAE,aAAa,SAAS,YAAY;SACzC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,qCAAqC,EACrC,EAAE,GAAG,YAAY,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,SAAS,OAAO;SACpC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,+BAA+B,EAC/B,EAAE,GAAG,YAAY,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,SAAS,SAAS;SACtC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,4EAA4E,EAC5E,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,EACxC,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,IAAI,EAAE;QACd,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,SAAS,WAAW;YACvC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;SACnE,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../../tools/types.js';
3
+ export declare function registerProtectedEnvironmentTools(server: McpServer, ctx: ToolContext): void;
@@ -0,0 +1,77 @@
1
+ import { z } from 'zod';
2
+ import { PaginationArgs, ProjectIdArg } from '../../shared/args.js';
3
+ import { safe } from '../../shared/handlers.js';
4
+ import { resolveProjectId } from '../../shared/ids.js';
5
+ const AccessLevel = z.number().int();
6
+ const DeployAccessLevel = z.object({
7
+ user_id: z.number().int().optional(),
8
+ group_id: z.number().int().optional(),
9
+ access_level: AccessLevel.optional(),
10
+ group_inheritance_type: z.number().int().min(0).max(1).optional(),
11
+ });
12
+ const ApprovalRule = z.object({
13
+ user_id: z.number().int().optional(),
14
+ group_id: z.number().int().optional(),
15
+ access_level: AccessLevel.optional(),
16
+ required_approvals: z.number().int().min(1),
17
+ group_inheritance_type: z.number().int().min(0).max(1).optional(),
18
+ });
19
+ export function registerProtectedEnvironmentTools(server, ctx) {
20
+ server.tool('protected_environment_list', 'List protected environments in a project.', { ...ProjectIdArg, ...PaginationArgs }, async (args) => safe(async () => {
21
+ const projectId = resolveProjectId(ctx.config, args.project_id);
22
+ const { project_id: _p, ...rest } = args;
23
+ const res = await ctx.rest.request({
24
+ path: `/projects/${projectId}/protected_environments`,
25
+ query: rest,
26
+ });
27
+ return res.data;
28
+ }));
29
+ server.tool('protected_environment_get', 'Get a single protected environment by name.', { ...ProjectIdArg, name: z.string() }, async (args) => safe(async () => {
30
+ const projectId = resolveProjectId(ctx.config, args.project_id);
31
+ const res = await ctx.rest.request({
32
+ path: `/projects/${projectId}/protected_environments/${encodeURIComponent(args.name)}`,
33
+ });
34
+ return res.data;
35
+ }));
36
+ server.tool('protected_environment_protect', 'Protect an environment with deploy access levels and (optionally) approval rules.', {
37
+ ...ProjectIdArg,
38
+ name: z.string(),
39
+ deploy_access_levels: z.array(DeployAccessLevel).min(1),
40
+ approval_rules: z.array(ApprovalRule).optional(),
41
+ required_approval_count: z.number().int().min(0).optional(),
42
+ }, async (args) => safe(async () => {
43
+ const projectId = resolveProjectId(ctx.config, args.project_id);
44
+ const { project_id: _p, ...body } = args;
45
+ const res = await ctx.rest.request({
46
+ method: 'POST',
47
+ path: `/projects/${projectId}/protected_environments`,
48
+ body,
49
+ });
50
+ return res.data;
51
+ }));
52
+ server.tool('protected_environment_update', 'Update a protected environment\'s deploy levels or approval rules.', {
53
+ ...ProjectIdArg,
54
+ name: z.string(),
55
+ deploy_access_levels: z.array(DeployAccessLevel).optional(),
56
+ approval_rules: z.array(ApprovalRule).optional(),
57
+ required_approval_count: z.number().int().min(0).optional(),
58
+ }, async (args) => safe(async () => {
59
+ const projectId = resolveProjectId(ctx.config, args.project_id);
60
+ const { project_id: _p, name, ...body } = args;
61
+ const res = await ctx.rest.request({
62
+ method: 'PUT',
63
+ path: `/projects/${projectId}/protected_environments/${encodeURIComponent(name)}`,
64
+ body,
65
+ });
66
+ return res.data;
67
+ }));
68
+ server.tool('protected_environment_unprotect', 'Remove protection from an environment.', { ...ProjectIdArg, name: z.string() }, async (args) => safe(async () => {
69
+ const projectId = resolveProjectId(ctx.config, args.project_id);
70
+ const res = await ctx.rest.request({
71
+ method: 'DELETE',
72
+ path: `/projects/${projectId}/protected_environments/${encodeURIComponent(args.name)}`,
73
+ });
74
+ return res.data ?? { ok: true };
75
+ }));
76
+ }
77
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/protected_environments/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../../tools/types.js';
3
+ export declare function registerReleaseTools(server: McpServer, ctx: ToolContext): void;
@@ -0,0 +1,153 @@
1
+ import { z } from 'zod';
2
+ import { PaginationArgs, ProjectIdArg } from '../../shared/args.js';
3
+ import { safe } from '../../shared/handlers.js';
4
+ import { resolveProjectId } from '../../shared/ids.js';
5
+ const LinkType = z.enum(['other', 'runbook', 'image', 'package']);
6
+ const AssetLinkInput = z.object({
7
+ name: z.string(),
8
+ url: z.string().url(),
9
+ direct_asset_path: z.string().optional(),
10
+ link_type: LinkType.optional(),
11
+ });
12
+ const MilestoneInput = z.array(z.string()).optional().describe('Milestone titles to attach.');
13
+ function tagPath(projectId, tagName, suffix = '') {
14
+ return `/projects/${projectId}/releases/${encodeURIComponent(tagName)}${suffix}`;
15
+ }
16
+ export function registerReleaseTools(server, ctx) {
17
+ server.tool('release_list', 'List releases in a project.', {
18
+ ...ProjectIdArg,
19
+ order_by: z.enum(['released_at', 'created_at']).optional(),
20
+ sort: z.enum(['asc', 'desc']).optional(),
21
+ include_html_description: z.boolean().optional(),
22
+ ...PaginationArgs,
23
+ }, async (args) => safe(async () => {
24
+ const projectId = resolveProjectId(ctx.config, args.project_id);
25
+ const { project_id: _p, ...rest } = args;
26
+ const res = await ctx.rest.request({
27
+ path: `/projects/${projectId}/releases`,
28
+ query: rest,
29
+ });
30
+ return res.data;
31
+ }));
32
+ server.tool('release_get', 'Get a single release by tag name.', {
33
+ ...ProjectIdArg,
34
+ tag_name: z.string(),
35
+ include_html_description: z.boolean().optional(),
36
+ }, async (args) => safe(async () => {
37
+ const projectId = resolveProjectId(ctx.config, args.project_id);
38
+ const res = await ctx.rest.request({
39
+ path: tagPath(projectId, args.tag_name),
40
+ ...(args.include_html_description !== undefined
41
+ ? { query: { include_html_description: args.include_html_description } }
42
+ : {}),
43
+ });
44
+ return res.data;
45
+ }));
46
+ server.tool('release_create', 'Create a release for a tag. If `ref` is provided and the tag does not exist, it is created from ref.', {
47
+ ...ProjectIdArg,
48
+ tag_name: z.string(),
49
+ name: z.string().optional(),
50
+ description: z.string().optional(),
51
+ ref: z.string().optional(),
52
+ tag_message: z.string().optional(),
53
+ milestones: MilestoneInput,
54
+ released_at: z.string().optional().describe('ISO 8601; defaults to now.'),
55
+ assets: z
56
+ .object({ links: z.array(AssetLinkInput).optional() })
57
+ .optional(),
58
+ }, async (args) => safe(async () => {
59
+ const projectId = resolveProjectId(ctx.config, args.project_id);
60
+ const { project_id: _p, ...body } = args;
61
+ const res = await ctx.rest.request({
62
+ method: 'POST',
63
+ path: `/projects/${projectId}/releases`,
64
+ body,
65
+ });
66
+ return res.data;
67
+ }));
68
+ server.tool('release_update', 'Update an existing release.', {
69
+ ...ProjectIdArg,
70
+ tag_name: z.string(),
71
+ name: z.string().optional(),
72
+ description: z.string().optional(),
73
+ milestones: MilestoneInput,
74
+ released_at: z.string().optional(),
75
+ }, async (args) => safe(async () => {
76
+ const projectId = resolveProjectId(ctx.config, args.project_id);
77
+ const { project_id: _p, tag_name, ...body } = args;
78
+ const res = await ctx.rest.request({
79
+ method: 'PUT',
80
+ path: tagPath(projectId, tag_name),
81
+ body,
82
+ });
83
+ return res.data;
84
+ }));
85
+ server.tool('release_delete', 'Delete a release (the tag itself is not deleted).', { ...ProjectIdArg, tag_name: z.string() }, async (args) => safe(async () => {
86
+ const projectId = resolveProjectId(ctx.config, args.project_id);
87
+ const res = await ctx.rest.request({
88
+ method: 'DELETE',
89
+ path: tagPath(projectId, args.tag_name),
90
+ });
91
+ return res.data ?? { ok: true };
92
+ }));
93
+ server.tool('release_link_list', 'List asset links attached to a release.', { ...ProjectIdArg, tag_name: z.string(), ...PaginationArgs }, async (args) => safe(async () => {
94
+ const projectId = resolveProjectId(ctx.config, args.project_id);
95
+ const { project_id: _p, tag_name, ...rest } = args;
96
+ const res = await ctx.rest.request({
97
+ path: tagPath(projectId, tag_name, '/assets/links'),
98
+ query: rest,
99
+ });
100
+ return res.data;
101
+ }));
102
+ server.tool('release_link_get', 'Get a single asset link.', { ...ProjectIdArg, tag_name: z.string(), link_id: z.number().int().positive() }, async (args) => safe(async () => {
103
+ const projectId = resolveProjectId(ctx.config, args.project_id);
104
+ const res = await ctx.rest.request({
105
+ path: tagPath(projectId, args.tag_name, `/assets/links/${args.link_id}`),
106
+ });
107
+ return res.data;
108
+ }));
109
+ server.tool('release_link_create', 'Attach an asset link (download URL) to a release.', {
110
+ ...ProjectIdArg,
111
+ tag_name: z.string(),
112
+ name: z.string(),
113
+ url: z.string().url(),
114
+ direct_asset_path: z.string().optional(),
115
+ link_type: LinkType.optional(),
116
+ }, async (args) => safe(async () => {
117
+ const projectId = resolveProjectId(ctx.config, args.project_id);
118
+ const { project_id: _p, tag_name, ...body } = args;
119
+ const res = await ctx.rest.request({
120
+ method: 'POST',
121
+ path: tagPath(projectId, tag_name, '/assets/links'),
122
+ body,
123
+ });
124
+ return res.data;
125
+ }));
126
+ server.tool('release_link_update', 'Update an existing asset link.', {
127
+ ...ProjectIdArg,
128
+ tag_name: z.string(),
129
+ link_id: z.number().int().positive(),
130
+ name: z.string().optional(),
131
+ url: z.string().url().optional(),
132
+ direct_asset_path: z.string().optional(),
133
+ link_type: LinkType.optional(),
134
+ }, async (args) => safe(async () => {
135
+ const projectId = resolveProjectId(ctx.config, args.project_id);
136
+ const { project_id: _p, tag_name, link_id, ...body } = args;
137
+ const res = await ctx.rest.request({
138
+ method: 'PUT',
139
+ path: tagPath(projectId, tag_name, `/assets/links/${link_id}`),
140
+ body,
141
+ });
142
+ return res.data;
143
+ }));
144
+ server.tool('release_link_delete', 'Delete an asset link from a release.', { ...ProjectIdArg, tag_name: z.string(), link_id: z.number().int().positive() }, async (args) => safe(async () => {
145
+ const projectId = resolveProjectId(ctx.config, args.project_id);
146
+ const res = await ctx.rest.request({
147
+ method: 'DELETE',
148
+ path: tagPath(projectId, args.tag_name, `/assets/links/${args.link_id}`),
149
+ });
150
+ return res.data ?? { ok: true };
151
+ }));
152
+ }
153
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/releases/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../../tools/types.js';
3
+ export declare function registerRepositoryFileTools(server: McpServer, ctx: ToolContext): void;
@@ -0,0 +1,163 @@
1
+ import { z } from 'zod';
2
+ import { PaginationArgs, ProjectIdArg } from '../../shared/args.js';
3
+ import { safe } from '../../shared/handlers.js';
4
+ import { resolveProjectId } from '../../shared/ids.js';
5
+ const Encoding = z.enum(['text', 'base64']);
6
+ const CommitAction = z.object({
7
+ action: z.enum(['create', 'update', 'delete', 'move', 'chmod']),
8
+ file_path: z.string(),
9
+ previous_path: z.string().optional().describe('Required for action=move.'),
10
+ content: z.string().optional(),
11
+ encoding: Encoding.optional(),
12
+ last_commit_id: z.string().optional(),
13
+ execute_filemode: z.boolean().optional(),
14
+ });
15
+ function fileEndpoint(projectId, filePath, suffix = '') {
16
+ return `/projects/${projectId}/repository/files/${encodeURIComponent(filePath)}${suffix}`;
17
+ }
18
+ export function registerRepositoryFileTools(server, ctx) {
19
+ server.tool('file_get', 'Get a file from a repository. Returns metadata including base64-encoded content.', {
20
+ ...ProjectIdArg,
21
+ file_path: z.string(),
22
+ ref: z.string().describe('Branch, tag, or commit SHA.'),
23
+ }, async (args) => safe(async () => {
24
+ const projectId = resolveProjectId(ctx.config, args.project_id);
25
+ const res = await ctx.rest.request({
26
+ path: fileEndpoint(projectId, args.file_path),
27
+ query: { ref: args.ref },
28
+ });
29
+ return res.data;
30
+ }));
31
+ server.tool('file_get_raw', 'Get raw file content as plain text (response body is the file).', {
32
+ ...ProjectIdArg,
33
+ file_path: z.string(),
34
+ ref: z.string(),
35
+ }, async (args) => safe(async () => {
36
+ const projectId = resolveProjectId(ctx.config, args.project_id);
37
+ const res = await ctx.rest.request({
38
+ path: fileEndpoint(projectId, args.file_path, '/raw'),
39
+ query: { ref: args.ref },
40
+ });
41
+ return typeof res.data === 'string' ? res.data : String(res.data ?? '');
42
+ }));
43
+ server.tool('file_create', 'Create a new file in a branch.', {
44
+ ...ProjectIdArg,
45
+ file_path: z.string(),
46
+ branch: z.string(),
47
+ content: z.string(),
48
+ commit_message: z.string(),
49
+ start_branch: z.string().optional().describe('Create new `branch` from this ref first.'),
50
+ encoding: Encoding.optional(),
51
+ author_email: z.string().optional(),
52
+ author_name: z.string().optional(),
53
+ execute_filemode: z.boolean().optional(),
54
+ }, async (args) => safe(async () => {
55
+ const projectId = resolveProjectId(ctx.config, args.project_id);
56
+ const { project_id: _p, file_path, ...body } = args;
57
+ const res = await ctx.rest.request({
58
+ method: 'POST',
59
+ path: fileEndpoint(projectId, file_path),
60
+ body,
61
+ });
62
+ return res.data;
63
+ }));
64
+ server.tool('file_update', 'Update an existing file in a branch.', {
65
+ ...ProjectIdArg,
66
+ file_path: z.string(),
67
+ branch: z.string(),
68
+ content: z.string(),
69
+ commit_message: z.string(),
70
+ start_branch: z.string().optional(),
71
+ encoding: Encoding.optional(),
72
+ author_email: z.string().optional(),
73
+ author_name: z.string().optional(),
74
+ execute_filemode: z.boolean().optional(),
75
+ last_commit_id: z.string().optional().describe('Optimistic concurrency: reject if HEAD differs.'),
76
+ }, async (args) => safe(async () => {
77
+ const projectId = resolveProjectId(ctx.config, args.project_id);
78
+ const { project_id: _p, file_path, ...body } = args;
79
+ const res = await ctx.rest.request({
80
+ method: 'PUT',
81
+ path: fileEndpoint(projectId, file_path),
82
+ body,
83
+ });
84
+ return res.data;
85
+ }));
86
+ server.tool('file_delete', 'Delete a file from a branch.', {
87
+ ...ProjectIdArg,
88
+ file_path: z.string(),
89
+ branch: z.string(),
90
+ commit_message: z.string(),
91
+ start_branch: z.string().optional(),
92
+ author_email: z.string().optional(),
93
+ author_name: z.string().optional(),
94
+ last_commit_id: z.string().optional(),
95
+ }, async (args) => safe(async () => {
96
+ const projectId = resolveProjectId(ctx.config, args.project_id);
97
+ const { project_id: _p, file_path, ...body } = args;
98
+ const res = await ctx.rest.request({
99
+ method: 'DELETE',
100
+ path: fileEndpoint(projectId, file_path),
101
+ body,
102
+ });
103
+ return res.data ?? { ok: true };
104
+ }));
105
+ server.tool('file_blame', 'Get the blame view of a file at a given ref.', {
106
+ ...ProjectIdArg,
107
+ file_path: z.string(),
108
+ ref: z.string(),
109
+ range_start: z.number().int().optional(),
110
+ range_end: z.number().int().optional(),
111
+ }, async (args) => safe(async () => {
112
+ const projectId = resolveProjectId(ctx.config, args.project_id);
113
+ const { project_id: _p, file_path, range_start, range_end, ...rest } = args;
114
+ const query = { ...rest };
115
+ if (range_start !== undefined)
116
+ query['range[start]'] = range_start;
117
+ if (range_end !== undefined)
118
+ query['range[end]'] = range_end;
119
+ const res = await ctx.rest.request({
120
+ path: fileEndpoint(projectId, file_path, '/blame'),
121
+ query: query,
122
+ });
123
+ return res.data;
124
+ }));
125
+ server.tool('tree_list', 'List repository tree entries (files and directories) at a path.', {
126
+ ...ProjectIdArg,
127
+ path: z.string().optional().describe('Subdir to list (default repo root).'),
128
+ ref: z.string().optional(),
129
+ recursive: z.boolean().optional(),
130
+ ...PaginationArgs,
131
+ }, async (args) => safe(async () => {
132
+ const projectId = resolveProjectId(ctx.config, args.project_id);
133
+ const { project_id: _p, ...rest } = args;
134
+ const res = await ctx.rest.request({
135
+ path: `/projects/${projectId}/repository/tree`,
136
+ query: rest,
137
+ });
138
+ return res.data;
139
+ }));
140
+ server.tool('commit_actions', 'Create a commit with one or more file actions (create/update/delete/move/chmod) in a single transaction.', {
141
+ ...ProjectIdArg,
142
+ branch: z.string(),
143
+ commit_message: z.string(),
144
+ actions: z.array(CommitAction).min(1),
145
+ start_branch: z.string().optional(),
146
+ start_sha: z.string().optional(),
147
+ start_project: z.string().optional(),
148
+ author_email: z.string().optional(),
149
+ author_name: z.string().optional(),
150
+ stats: z.boolean().optional(),
151
+ force: z.boolean().optional(),
152
+ }, async (args) => safe(async () => {
153
+ const projectId = resolveProjectId(ctx.config, args.project_id);
154
+ const { project_id: _p, ...body } = args;
155
+ const res = await ctx.rest.request({
156
+ method: 'POST',
157
+ path: `/projects/${projectId}/repository/commits`,
158
+ body,
159
+ });
160
+ return res.data;
161
+ }));
162
+ }
163
+ //# sourceMappingURL=tools.js.map