@zereight/mcp-gitlab 2.1.44 → 2.1.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +4 -1
- package/README.md +135 -129
- package/README.zh-CN.md +4 -1
- package/build/index.js +59 -20
- package/build/schemas.js +16 -0
- package/build/server/version.js +28 -0
- package/build/test/server/version.test.js +13 -0
- package/build/test/test-list-group-members.js +150 -0
- package/build/test/test-toolset-filtering.js +1 -1
- package/build/tools/registry.js +8 -1
- package/package.json +1 -1
package/README.ko.md
CHANGED
|
@@ -80,7 +80,7 @@ npm install -g @zereight/mcp-gitlab
|
|
|
80
80
|
|
|
81
81
|
예시는 기존 `mcp-gitlab`보다 충돌 가능성이 낮은 `zereight-mcp-gitlab` 별칭을 사용합니다. MCP 클라이언트가 찾지 못하면 `which zereight-mcp-gitlab`의 절대 경로를 사용하세요.
|
|
82
82
|
|
|
83
|
-
전역 설치를 쓰지 않으려면 `npx -y @zereight/mcp-gitlab@2.1.
|
|
83
|
+
전역 설치를 쓰지 않으려면 `npx -y @zereight/mcp-gitlab@2.1.45`처럼 직전 안정 버전(문서가 권장하는 버전)으로 고정하세요. 항상 최신 버전을 원하면 `npx -y @zereight/mcp-gitlab@latest`를 사용하세요. 새 버전이 나오면 서버가 시작 시 stderr로 알려줍니다(`GITLAB_DISABLE_VERSION_CHECK=true`로 비활성화 가능).
|
|
84
84
|
|
|
85
85
|
#### CLI 인자 사용하기(환경 변수 문제가 있는 클라이언트용)
|
|
86
86
|
|
|
@@ -317,6 +317,7 @@ Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx
|
|
|
317
317
|
- `MCP_ALLOWED_ORIGINS`
|
|
318
318
|
- `GITLAB_MCP_OAUTH`
|
|
319
319
|
- `GITLAB_OAUTH_CALLBACK_PROXY`
|
|
320
|
+
- `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`
|
|
320
321
|
- `OAUTH_STATELESS_MODE`
|
|
321
322
|
- `OAUTH_STATELESS_SECRET`
|
|
322
323
|
|
|
@@ -465,6 +466,7 @@ node build/index.js
|
|
|
465
466
|
| `GITLAB_API_URL` | 예 | GitLab 인스턴스 API URL(예: `https://gitlab.com/api/v4`) |
|
|
466
467
|
| `STREAMABLE_HTTP` | 예 | 반드시 `true`(SSE 미지원) |
|
|
467
468
|
| `GITLAB_OAUTH_SCOPES` | 아니오 | 요청할 GitLab scope 목록(쉼표 구분). 기본값은 `api` 또는 `GITLAB_READ_ONLY_MODE=true`일 때 `read_api`입니다. 사전 등록 애플리케이션에 해당 scope가 설정되어 있어야 합니다. |
|
|
469
|
+
| `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` | 아니오 | Dynamic Client Registration(`POST /register`)의 클라이언트 IP당 rolling 한도. 기본 `20`/시간, 범위 `1`–`1000`. IDE 창 여러 개 등으로 등록이 막히면 올리세요. GitLab API 한도와 무관합니다. |
|
|
468
470
|
| `MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL` | 아니오 | 로컬 HTTP 개발에서만 `true` |
|
|
469
471
|
|
|
470
472
|
**중요 사항:**
|
|
@@ -472,6 +474,7 @@ node build/index.js
|
|
|
472
474
|
- MCP OAuth는 **Streamable HTTP 전송에서만** 동작합니다(`SSE=true`와 호환되지 않음).
|
|
473
475
|
- 각 사용자 세션은 자체 OAuth 토큰을 저장하며 완전히 격리됩니다.
|
|
474
476
|
- 세션 타임아웃, rate limiting, capacity limit은 `REMOTE_AUTHORIZATION` 모드와 동일하게 적용됩니다(`SESSION_TIMEOUT_SECONDS`, `MAX_REQUESTS_PER_MINUTE`, `MAX_SESSIONS`).
|
|
477
|
+
- **DCR rate limiting:** `POST /register`는 클라이언트 IP당 `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`로 제한됩니다(기본 20/시간). `/mcp` 한도 및 GitLab API quota와 별개입니다. [environment-variables.md](docs/configuration/environment-variables.md#oauth_register_rate_limit_per_hour) 참고.
|
|
475
478
|
- **헤더 인증 fallback:** `Private-Token` 또는 `JOB-TOKEN` 요청 헤더가 있으면 OAuth 검증을 건너뛰고 raw token을 해당 세션에 직접 사용합니다. 같은 서버 인스턴스에서 OAuth 플로우와 함께 PAT 및 CI job token을 사용할 수 있습니다. `Authorization: Bearer`는 항상 OAuth token으로 처리됩니다. PAT 기반 헤더 인증에는 `Private-Token`을 사용하세요.
|
|
476
479
|
|
|
477
480
|
## Agent Skill Files
|
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ npm install -g @zereight/mcp-gitlab
|
|
|
82
82
|
|
|
83
83
|
The examples use `zereight-mcp-gitlab`, a less collision-prone alias for the legacy `mcp-gitlab` binary. If your MCP client cannot find it, use the absolute path from `which zereight-mcp-gitlab`.
|
|
84
84
|
|
|
85
|
-
No global install? Pin `npx` to the previous stable release (the version these docs recommend), for example `npx -y @zereight/mcp-gitlab@2.1.
|
|
85
|
+
No global install? Pin `npx` to the previous stable release (the version these docs recommend), for example `npx -y @zereight/mcp-gitlab@2.1.45`. If you always want the newest release, use `npx -y @zereight/mcp-gitlab@latest` instead. The server prints a notice to stderr on startup when a newer version is available (disable with `GITLAB_DISABLE_VERSION_CHECK=true`).
|
|
86
86
|
|
|
87
87
|
#### Using CLI Arguments (for clients with env var issues)
|
|
88
88
|
|
|
@@ -351,6 +351,7 @@ Commonly referenced variables:
|
|
|
351
351
|
- `MCP_ALLOWED_ORIGINS`
|
|
352
352
|
- `GITLAB_MCP_OAUTH`
|
|
353
353
|
- `GITLAB_OAUTH_CALLBACK_PROXY`
|
|
354
|
+
- `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`
|
|
354
355
|
- `OAUTH_STATELESS_MODE`
|
|
355
356
|
- `OAUTH_STATELESS_SECRET`
|
|
356
357
|
|
|
@@ -505,6 +506,7 @@ No `headers` field is needed — Claude.ai obtains the token via OAuth automatic
|
|
|
505
506
|
| `GITLAB_API_URL` | Yes | Your GitLab instance API URL (e.g. `https://gitlab.com/api/v4`) |
|
|
506
507
|
| `STREAMABLE_HTTP` | Yes | Must be `true` (SSE is not supported) |
|
|
507
508
|
| `GITLAB_OAUTH_SCOPES` | No | Comma-separated GitLab scopes to request (e.g. `api,read_user`). Defaults to `api` (or `read_api` when `GITLAB_READ_ONLY_MODE=true`). The pre-registered application must be configured with at least these scopes. |
|
|
509
|
+
| `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` | No | Per-IP rolling limit for Dynamic Client Registration (`POST /register`). Default `20`/hour; range `1`–`1000`. Raise when clients (e.g. multiple IDE windows) hit registration throttling. Not a GitLab API limit. |
|
|
508
510
|
| `MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL` | No | Set `true` for local HTTP dev only |
|
|
509
511
|
|
|
510
512
|
**Important Notes:**
|
|
@@ -514,6 +516,9 @@ No `headers` field is needed — Claude.ai obtains the token via OAuth automatic
|
|
|
514
516
|
- Session timeout, rate limiting, and capacity limits apply identically to the
|
|
515
517
|
`REMOTE_AUTHORIZATION` mode (`SESSION_TIMEOUT_SECONDS`, `MAX_REQUESTS_PER_MINUTE`,
|
|
516
518
|
`MAX_SESSIONS`)
|
|
519
|
+
- **DCR rate limiting:** `POST /register` is limited to `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`
|
|
520
|
+
per client IP (default 20/hour). Separate from `/mcp` limits and GitLab API quotas.
|
|
521
|
+
See [environment-variables.md](docs/configuration/environment-variables.md#oauth_register_rate_limit_per_hour).
|
|
517
522
|
- **Header auth fallback:** when `Private-Token` or `JOB-TOKEN` request headers are
|
|
518
523
|
present, OAuth validation is skipped and the raw token is used directly for that
|
|
519
524
|
session. This allows PATs and CI job tokens to be used alongside the OAuth flow on
|
|
@@ -630,134 +635,135 @@ Register the skill directory in your AI client to get optimal tool usage guidanc
|
|
|
630
635
|
86. `list_projects` - List projects accessible by the current user
|
|
631
636
|
87. `update_project` - Update project settings such as description, visibility, default branch, and feature access levels
|
|
632
637
|
88. `list_project_members` - List members of a GitLab project
|
|
633
|
-
89. `
|
|
634
|
-
90. `
|
|
635
|
-
91. `
|
|
636
|
-
92. `
|
|
637
|
-
93. `
|
|
638
|
-
94. `
|
|
639
|
-
95. `
|
|
640
|
-
96. `
|
|
641
|
-
97. `
|
|
642
|
-
98. `
|
|
643
|
-
99. `
|
|
644
|
-
100. `
|
|
645
|
-
101. `
|
|
646
|
-
102. `
|
|
647
|
-
103. `
|
|
648
|
-
104. `
|
|
649
|
-
105. `
|
|
650
|
-
106. `
|
|
651
|
-
107. `
|
|
652
|
-
108. `
|
|
653
|
-
109. `
|
|
654
|
-
110. `
|
|
655
|
-
111. `
|
|
656
|
-
112. `
|
|
657
|
-
113. `
|
|
658
|
-
114. `
|
|
659
|
-
115. `
|
|
660
|
-
116. `
|
|
661
|
-
117. `
|
|
662
|
-
118. `
|
|
663
|
-
119. `
|
|
664
|
-
120. `
|
|
665
|
-
121. `
|
|
666
|
-
122. `
|
|
667
|
-
123. `
|
|
668
|
-
124. `
|
|
669
|
-
125. `
|
|
670
|
-
126. `
|
|
671
|
-
127. `
|
|
672
|
-
128. `
|
|
673
|
-
129. `
|
|
674
|
-
130. `
|
|
675
|
-
131. `
|
|
676
|
-
132. `
|
|
677
|
-
133. `
|
|
678
|
-
134. `
|
|
679
|
-
135. `
|
|
680
|
-
136. `
|
|
681
|
-
137. `
|
|
682
|
-
138. `
|
|
683
|
-
139. `
|
|
684
|
-
140. `
|
|
685
|
-
141. `
|
|
686
|
-
142. `
|
|
687
|
-
143. `
|
|
688
|
-
144. `
|
|
689
|
-
145. `
|
|
690
|
-
146. `
|
|
691
|
-
147. `
|
|
692
|
-
148. `
|
|
693
|
-
149. `
|
|
694
|
-
150. `
|
|
695
|
-
151. `
|
|
696
|
-
152. `
|
|
697
|
-
153. `
|
|
698
|
-
154. `
|
|
699
|
-
155. `
|
|
700
|
-
156. `
|
|
701
|
-
157. `
|
|
702
|
-
158. `
|
|
703
|
-
159. `
|
|
704
|
-
160. `
|
|
705
|
-
161. `
|
|
706
|
-
162. `
|
|
707
|
-
163. `
|
|
708
|
-
164. `
|
|
709
|
-
165. `
|
|
710
|
-
166. `
|
|
711
|
-
167. `
|
|
712
|
-
168. `
|
|
713
|
-
169. `
|
|
714
|
-
170. `
|
|
715
|
-
171. `
|
|
716
|
-
172. `
|
|
717
|
-
173. `
|
|
718
|
-
174. `
|
|
719
|
-
175. `
|
|
720
|
-
176. `
|
|
721
|
-
177. `
|
|
722
|
-
178. `
|
|
723
|
-
179. `
|
|
724
|
-
180. `
|
|
725
|
-
181. `
|
|
726
|
-
182. `
|
|
727
|
-
183. `
|
|
728
|
-
184. `
|
|
729
|
-
185. `
|
|
730
|
-
186. `
|
|
731
|
-
187. `
|
|
732
|
-
188. `
|
|
733
|
-
189. `
|
|
734
|
-
190. `
|
|
735
|
-
191. `
|
|
736
|
-
192. `
|
|
737
|
-
193. `
|
|
738
|
-
194. `
|
|
739
|
-
195. `
|
|
740
|
-
196. `
|
|
741
|
-
197. `
|
|
742
|
-
198. `
|
|
743
|
-
199. `
|
|
744
|
-
200. `
|
|
745
|
-
201. `
|
|
746
|
-
202. `
|
|
747
|
-
203. `
|
|
748
|
-
204. `
|
|
749
|
-
205. `
|
|
750
|
-
206. `
|
|
751
|
-
207. `
|
|
752
|
-
208. `
|
|
753
|
-
209. `
|
|
754
|
-
210. `
|
|
755
|
-
211. `
|
|
756
|
-
212. `
|
|
757
|
-
213. `
|
|
758
|
-
214. `
|
|
759
|
-
215. `
|
|
760
|
-
216. `
|
|
638
|
+
89. `list_group_members` - List members of a GitLab group with optional name or username search
|
|
639
|
+
90. `list_labels` - List labels for a project
|
|
640
|
+
91. `get_label` - Get a single label from a project
|
|
641
|
+
92. `create_label` - Create a new label in a project
|
|
642
|
+
93. `update_label` - Update an existing label in a project
|
|
643
|
+
94. `delete_label` - Delete a label from a project
|
|
644
|
+
95. `list_group_projects` - List projects in a GitLab group with filtering options
|
|
645
|
+
96. `list_wiki_pages` - List wiki pages in a GitLab project
|
|
646
|
+
97. `get_wiki_page` - Get details of a specific wiki page
|
|
647
|
+
98. `create_wiki_page` - Create a new wiki page in a GitLab project
|
|
648
|
+
99. `update_wiki_page` - Update an existing wiki page in a GitLab project
|
|
649
|
+
100. `delete_wiki_page` - Delete a wiki page from a GitLab project
|
|
650
|
+
101. `list_group_wiki_pages` - List wiki pages in a GitLab group
|
|
651
|
+
102. `get_group_wiki_page` - Get details of a specific group wiki page
|
|
652
|
+
103. `create_group_wiki_page` - Create a new wiki page in a GitLab group
|
|
653
|
+
104. `update_group_wiki_page` - Update an existing wiki page in a GitLab group
|
|
654
|
+
105. `delete_group_wiki_page` - Delete a wiki page from a GitLab group
|
|
655
|
+
106. `get_repository_tree` - Get the repository tree for a GitLab project (list files and directories)
|
|
656
|
+
107. `list_pipelines` - List pipelines in a GitLab project with filtering options
|
|
657
|
+
108. `get_pipeline` - Get details of a specific pipeline in a GitLab project
|
|
658
|
+
109. `list_deployments` - List deployments in a GitLab project with filtering options
|
|
659
|
+
110. `get_deployment` - Get details of a specific deployment in a GitLab project
|
|
660
|
+
111. `list_environments` - List environments in a GitLab project
|
|
661
|
+
112. `get_environment` - Get details of a specific environment in a GitLab project
|
|
662
|
+
113. `list_pipeline_jobs` - List all jobs in a specific pipeline
|
|
663
|
+
114. `list_pipeline_trigger_jobs` - List all trigger jobs (bridges) in a specific pipeline that trigger downstream pipelines
|
|
664
|
+
115. `get_pipeline_job` - Get details of a GitLab pipeline job number
|
|
665
|
+
116. `get_pipeline_job_output` - Get the output/trace of a GitLab pipeline job with optional pagination to limit context window usage
|
|
666
|
+
117. `validate_ci_lint` - Validate provided GitLab CI/CD YAML content for a project
|
|
667
|
+
118. `validate_project_ci_lint` - Validate an existing `.gitlab-ci.yml` configuration for a project
|
|
668
|
+
119. `list_ci_catalog_resources` - List GitLab CI/CD Catalog resources/components visible to the user
|
|
669
|
+
120. `get_ci_catalog_resource` - Get details for a GitLab CI/CD Catalog resource, including versions and components
|
|
670
|
+
121. `create_pipeline` - Create a new pipeline for a branch or tag
|
|
671
|
+
122. `retry_pipeline` - Retry a failed or canceled pipeline
|
|
672
|
+
123. `cancel_pipeline` - Cancel a running pipeline
|
|
673
|
+
124. `play_pipeline_job` - Run a manual pipeline job
|
|
674
|
+
125. `retry_pipeline_job` - Retry a failed or canceled pipeline job
|
|
675
|
+
126. `cancel_pipeline_job` - Cancel a running pipeline job
|
|
676
|
+
127. `list_job_artifacts` - List artifact files in a job's artifacts archive. Returns file names, paths, types, and sizes
|
|
677
|
+
128. `download_job_artifacts` - Download the entire artifact archive (zip) for a job to a local path. Returns the saved file path
|
|
678
|
+
129. `get_job_artifact_file` - Get the content of a single file from a job's artifacts by its path within the archive
|
|
679
|
+
130. `list_merge_requests` - List merge requests globally or in a specific GitLab project with filtering options (project_id is now optional)
|
|
680
|
+
131. `list_milestones` - List milestones in a GitLab project with filtering options
|
|
681
|
+
132. `get_milestone` - Get details of a specific milestone
|
|
682
|
+
133. `create_milestone` - Create a new milestone in a GitLab project
|
|
683
|
+
134. `edit_milestone` - Edit an existing milestone in a GitLab project
|
|
684
|
+
135. `delete_milestone` - Delete a milestone from a GitLab project
|
|
685
|
+
136. `get_milestone_issue` - Get issues associated with a specific milestone
|
|
686
|
+
137. `get_milestone_merge_requests` - Get merge requests associated with a specific milestone
|
|
687
|
+
138. `promote_milestone` - Promote a milestone to the next stage
|
|
688
|
+
139. `get_milestone_burndown_events` - Get burndown events for a specific milestone
|
|
689
|
+
140. `list_group_milestones` - List milestones in a GitLab group with filtering options
|
|
690
|
+
141. `get_group_milestone` - Get details of a specific group milestone
|
|
691
|
+
142. `create_group_milestone` - Create a new milestone in a GitLab group
|
|
692
|
+
143. `edit_group_milestone` - Edit an existing group milestone
|
|
693
|
+
144. `delete_group_milestone` - Delete a milestone from a GitLab group
|
|
694
|
+
145. `get_group_milestone_issue` - Get issues associated with a specific group milestone
|
|
695
|
+
146. `get_group_milestone_merge_requests` - Get merge requests associated with a specific group milestone
|
|
696
|
+
147. `get_group_milestone_burndown_events` - Get burndown events for a specific group milestone
|
|
697
|
+
148. `get_users` - Get GitLab user details by usernames
|
|
698
|
+
149. `get_user` - Get user details by ID
|
|
699
|
+
150. `whoami` - Get current authenticated user details
|
|
700
|
+
151. `list_commits` - List repository commits with filtering options
|
|
701
|
+
152. `get_commit` - Get details of a specific commit
|
|
702
|
+
153. `get_commit_diff` - Get changes/diffs of a specific commit
|
|
703
|
+
154. `get_file_blame` - Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.
|
|
704
|
+
155. `list_commit_statuses` - List statuses for a specific commit
|
|
705
|
+
156. `create_commit_status` - Create or update the status of a specific commit
|
|
706
|
+
157. `list_group_iterations` - List group iterations with filtering options
|
|
707
|
+
158. `upload_markdown` - Upload a file to a GitLab project for use in markdown content
|
|
708
|
+
159. `download_attachment` - Download an uploaded file from a GitLab project by secret and filename
|
|
709
|
+
160. `health_check` - Verify server status and authentication; when authenticated, reports GitLab instance version from `/api/v4/version` (`version`, `revision`, `enterprise`)
|
|
710
|
+
161. `list_events` - List all events for the currently authenticated user
|
|
711
|
+
162. `get_project_events` - List all visible events for a specified project
|
|
712
|
+
163. `list_releases` - List all releases for a project
|
|
713
|
+
164. `get_release` - Get a release by tag name
|
|
714
|
+
165. `create_release` - Create a new release in a GitLab project
|
|
715
|
+
166. `update_release` - Update an existing release in a GitLab project
|
|
716
|
+
167. `delete_release` - Delete a release from a GitLab project (does not delete the associated tag)
|
|
717
|
+
168. `create_release_evidence` - Create release evidence for an existing release (GitLab Premium/Ultimate only)
|
|
718
|
+
169. `download_release_asset` - Download a release asset file by direct asset path
|
|
719
|
+
170. `list_tags` - List repository tags with filtering and pagination support
|
|
720
|
+
171. `get_tag` - Get details of a specific repository tag
|
|
721
|
+
172. `create_tag` - Create a new tag in the repository
|
|
722
|
+
173. `delete_tag` - Delete a tag from the repository
|
|
723
|
+
174. `get_tag_signature` - Get the signature of a signed tag
|
|
724
|
+
175. `get_work_item` - Get a single work item with full details including status, hierarchy (parent/children), type, labels, assignees, and all widgets
|
|
725
|
+
176. `list_work_items` - List work items in a project with filters (type, state, search, assignees, labels). Returns items with status and hierarchy info
|
|
726
|
+
177. `create_work_item` - Create a new work item (issue, task, incident, test_case, epic, key_result, objective, requirement, ticket). Supports setting title, description, labels, assignees, weight, parent, health status, start/due dates, milestone, and confidentiality
|
|
727
|
+
178. `update_work_item` - Update a work item. Can modify title, description, labels, assignees, weight, state, status, parent hierarchy, children, health status, start/due dates, milestone, confidentiality, linked items, and custom fields
|
|
728
|
+
179. `convert_work_item_type` - Convert a work item to a different type (e.g. issue to task, task to incident)
|
|
729
|
+
180. `list_work_item_statuses` - List available statuses for a work item type in a project. Requires GitLab Premium/Ultimate with configurable statuses
|
|
730
|
+
181. `list_custom_field_definitions` - List available custom field definitions for a work item type in a project. Returns field names, types, and IDs needed for setting custom fields via update_work_item
|
|
731
|
+
182. `move_work_item` - Move a work item (issue, task, etc.) to a different project. Uses GitLab GraphQL issueMove mutation
|
|
732
|
+
183. `list_work_item_notes` - List notes and discussions on a work item. Returns threaded discussions with author, body, timestamps, and system/internal flags
|
|
733
|
+
184. `create_work_item_note` - Add a note/comment to a work item. Supports Markdown, internal notes, and threaded replies
|
|
734
|
+
185. `list_work_item_emoji_reactions` - List all emoji reactions on a work item
|
|
735
|
+
186. `list_work_item_note_emoji_reactions` - List all emoji reactions on a work item note (comment, thread, or thread reply)
|
|
736
|
+
187. `create_work_item_emoji_reaction` - Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)
|
|
737
|
+
188. `delete_work_item_emoji_reaction` - Remove an emoji reaction from a work item
|
|
738
|
+
189. `create_work_item_note_emoji_reaction` - Add an emoji reaction to a work item note (comment, thread, or thread reply)
|
|
739
|
+
190. `delete_work_item_note_emoji_reaction` - Remove an emoji reaction from a work item note (comment, thread, or thread reply)
|
|
740
|
+
191. `get_timeline_events` - List timeline events for an incident. Returns chronological events with notes, timestamps, and tags
|
|
741
|
+
192. `create_timeline_event` - Create a timeline event on an incident. Supports tags: 'Start time', 'End time', 'Impact detected', 'Response initiated', 'Impact mitigated', 'Cause identified'
|
|
742
|
+
193. `list_webhooks` - List all configured webhooks for a GitLab project or group. Provide either project_id or group_id
|
|
743
|
+
194. `list_webhook_events` - List recent webhook events (past 7 days) for a project or group webhook. Use summary mode for overview, then get_webhook_event for full details
|
|
744
|
+
195. `get_webhook_event` - Get full details of a specific webhook event by ID, including request/response payloads
|
|
745
|
+
196. `search_code` - Search for code across all projects on the GitLab instance (requires advanced search or exact code search to be enabled)
|
|
746
|
+
197. `search_project_code` - Search for code within a specific GitLab project (requires advanced search or exact code search to be enabled)
|
|
747
|
+
198. `search_group_code` - Search for code within a specific GitLab group (requires advanced search or exact code search to be enabled)
|
|
748
|
+
199. `list_project_variables` - List CI/CD variables for a project with optional environment scope filter
|
|
749
|
+
200. `get_project_variable` - Get a single CI/CD variable from a project by key, with optional environment scope filter
|
|
750
|
+
201. `create_project_variable` - Create a new CI/CD variable in a project
|
|
751
|
+
202. `update_project_variable` - Update an existing CI/CD variable in a project, with optional filter to disambiguate by environment scope
|
|
752
|
+
203. `delete_project_variable` - Delete a CI/CD variable from a project, with optional filter to disambiguate by environment scope
|
|
753
|
+
204. `list_group_variables` - List CI/CD variables for a group with optional environment scope filter
|
|
754
|
+
205. `get_group_variable` - Get a single CI/CD variable from a group by key, with optional environment scope filter
|
|
755
|
+
206. `create_group_variable` - Create a new CI/CD variable in a group
|
|
756
|
+
207. `update_group_variable` - Update an existing CI/CD variable in a group, with optional filter to disambiguate by environment scope
|
|
757
|
+
208. `delete_group_variable` - Delete a CI/CD variable from a group, with optional filter to disambiguate by environment scope
|
|
758
|
+
209. `get_dependency_proxy_settings` - Get dependency proxy settings for a group (enabled status, blob count, total size, image prefix, TTL policy)
|
|
759
|
+
210. `update_dependency_proxy_settings` - Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)
|
|
760
|
+
211. `list_dependency_proxy_blobs` - List cached dependency proxy blobs for a group with cursor-based pagination
|
|
761
|
+
212. `purge_dependency_proxy_cache` - Schedule purge of all cached dependency proxy blobs for a group
|
|
762
|
+
213. `list_project_vulnerabilities` - List vulnerabilities for a project with optional state, severity, and report type filters (GraphQL-backed, cursor pagination)
|
|
763
|
+
214. `get_vulnerability` - Get full details of a specific vulnerability
|
|
764
|
+
215. `dismiss_vulnerability` - Dismiss a vulnerability with a reason (acceptable_risk, false_positive, used_in_tests, mitigating_control, not_applicable) and optional comment
|
|
765
|
+
216. `confirm_vulnerability` - Confirm a vulnerability as a real finding requiring remediation
|
|
766
|
+
217. `discover_tools` - Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities. Already-active categories are listed in the response.
|
|
761
767
|
|
|
762
768
|
<!-- TOOLS-END -->
|
|
763
769
|
|
package/README.zh-CN.md
CHANGED
|
@@ -80,7 +80,7 @@ npm install -g @zereight/mcp-gitlab
|
|
|
80
80
|
|
|
81
81
|
示例使用 `zereight-mcp-gitlab`,这是比旧的 `mcp-gitlab` 更不容易冲突的别名。如果 MCP 客户端找不到它,请使用 `which zereight-mcp-gitlab` 输出的绝对路径。
|
|
82
82
|
|
|
83
|
-
如果不想全局安装,请将 `npx` 固定到上一个稳定版本(即文档推荐的版本),例如 `npx -y @zereight/mcp-gitlab@2.1.
|
|
83
|
+
如果不想全局安装,请将 `npx` 固定到上一个稳定版本(即文档推荐的版本),例如 `npx -y @zereight/mcp-gitlab@2.1.45`。如果始终想使用最新版本,请改用 `npx -y @zereight/mcp-gitlab@latest`。有新版本发布时,服务器会在启动时通过 stderr 提示(可用 `GITLAB_DISABLE_VERSION_CHECK=true` 关闭)。
|
|
84
84
|
|
|
85
85
|
#### 使用 CLI 参数(适用于环境变量有问题的客户端)
|
|
86
86
|
|
|
@@ -317,6 +317,7 @@ Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx
|
|
|
317
317
|
- `MCP_ALLOWED_ORIGINS`
|
|
318
318
|
- `GITLAB_MCP_OAUTH`
|
|
319
319
|
- `GITLAB_OAUTH_CALLBACK_PROXY`
|
|
320
|
+
- `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`
|
|
320
321
|
- `OAUTH_STATELESS_MODE`
|
|
321
322
|
- `OAUTH_STATELESS_SECRET`
|
|
322
323
|
|
|
@@ -465,6 +466,7 @@ node build/index.js
|
|
|
465
466
|
| `GITLAB_API_URL` | 是 | GitLab 实例 API URL(例如 `https://gitlab.com/api/v4`) |
|
|
466
467
|
| `STREAMABLE_HTTP` | 是 | 必须为 `true`(不支持 SSE) |
|
|
467
468
|
| `GITLAB_OAUTH_SCOPES` | 否 | 要请求的 GitLab scopes,以逗号分隔。默认值为 `api`,当 `GITLAB_READ_ONLY_MODE=true` 时为 `read_api`。预注册应用必须配置至少这些 scopes。 |
|
|
469
|
+
| `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` | 否 | Dynamic Client Registration(`POST /register`)的每客户端 IP rolling 限制。默认 `20`/小时,范围 `1`–`1000`。多个 IDE 窗口等导致注册被限流时可调高。与 GitLab API 限额无关。 |
|
|
468
470
|
| `MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL` | 否 | 仅用于本地 HTTP 开发 |
|
|
469
471
|
|
|
470
472
|
**重要说明:**
|
|
@@ -472,6 +474,7 @@ node build/index.js
|
|
|
472
474
|
- MCP OAuth **仅适用于 Streamable HTTP 传输**(与 `SSE=true` 不兼容)。
|
|
473
475
|
- 每个用户会话保存自己的 OAuth token,会话完全隔离。
|
|
474
476
|
- 会话超时、rate limiting 和 capacity limit 与 `REMOTE_AUTHORIZATION` 模式相同(`SESSION_TIMEOUT_SECONDS`, `MAX_REQUESTS_PER_MINUTE`, `MAX_SESSIONS`)。
|
|
477
|
+
- **DCR rate limiting:** `POST /register` 按客户端 IP 受 `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` 限制(默认 20/小时)。与 `/mcp` 限制及 GitLab API 配额无关。详见 [environment-variables.md](docs/configuration/environment-variables.md#oauth_register_rate_limit_per_hour)。
|
|
475
478
|
- **请求头认证 fallback:** 当请求头中存在 `Private-Token` 或 `JOB-TOKEN` 时,会跳过 OAuth 验证,并直接将原始 token 用于该会话。这样可以在同一服务器实例中同时使用 OAuth 流程、PAT 和 CI job token。`Authorization: Bearer` 始终被视为 OAuth token。PAT 请求头认证请使用 `Private-Token`。
|
|
476
479
|
|
|
477
480
|
## Agent Skill Files
|
package/build/index.js
CHANGED
|
@@ -70,9 +70,9 @@ import fs from "node:fs";
|
|
|
70
70
|
import { pipeline as streamPipeline } from "node:stream/promises";
|
|
71
71
|
import os from "node:os";
|
|
72
72
|
import nodeFetch from "node-fetch";
|
|
73
|
-
import path
|
|
73
|
+
import path from "node:path";
|
|
74
74
|
import { CookieJar, parse as parseCookie } from "tough-cookie";
|
|
75
|
-
import {
|
|
75
|
+
import { URL } from "node:url";
|
|
76
76
|
import { z } from "zod";
|
|
77
77
|
import { initializeOAuthClient } from "./oauth.js";
|
|
78
78
|
import { createGitLabOAuthProvider } from "./oauth-proxy.js";
|
|
@@ -84,6 +84,7 @@ import { registerDownloadProxy } from "./downloads/proxy.js";
|
|
|
84
84
|
import { createDownloadToken } from "./utils/download-token.js";
|
|
85
85
|
import { determineTransportMode, TransportMode } from "./server/transport-mode.js";
|
|
86
86
|
import { formatPrometheusMetrics } from "./server/metrics.js";
|
|
87
|
+
import { SERVER_VERSION } from "./server/version.js";
|
|
87
88
|
import { normalizeGitLabApiUrl } from "./utils/url.js";
|
|
88
89
|
import { estimateMergeCommitCount, filterDiffsByPatterns, summarizeWebhookEvents, } from "./utils/helpers.js";
|
|
89
90
|
import { graphqlQueryContainsWriteOperation, graphqlQueryContainsDeleteOperation, } from "./utils/graphql-query.js";
|
|
@@ -105,26 +106,10 @@ GitLabDiscussionNoteSchema, // Added
|
|
|
105
106
|
GitLabDiscussionSchema,
|
|
106
107
|
// Draft Notes Schemas
|
|
107
108
|
GitLabDraftNoteSchema, GitLabForkSchema, GitLabBranchSchema, GitLabProtectedBranchSchema, GitLabGroupSchema, GitLabIssueLinkSchema, GitLabIssueSchema, GitLabIssueWithLinkDetailsSchema, GitLabMarkdownUploadSchema, GitLabMergeRequestPipelineSchema, GitLabMergeRequestSchema, GitLabMilestonesSchema, GitLabGroupMilestonesSchema, GitLabNamespaceExistsResponseSchema, GitLabNamespaceSchema, GitLabPipelineJobSchema, GitLabDeploymentSchema, GitLabEnvironmentSchema, GitLabPipelineSchema, GitLabPipelineTriggerJobSchema, GitLabProjectMemberSchema, GitLabProjectSchema, GitLabTodoSchema, GitLabReferenceSchema, GitLabRepositorySchema, GitLabSearchBlobResultSchema, GitLabSearchResponseSchema, GitLabTreeItemSchema, GitLabUserSchema, GitLabUsersResponseSchema, GitLabWikiPageSchema, GroupIteration, ListCommitStatusesSchema, ListBranchesSchema, ListCommitsSchema, ListDraftNotesSchema, ListGroupIterationsSchema, ListGroupProjectsSchema, GitLabCiVariableSchema, ListProjectVariablesSchema, GetProjectVariableSchema, CreateProjectVariableSchema, UpdateProjectVariableSchema, DeleteProjectVariableSchema, ListGroupVariablesSchema, GetGroupVariableSchema, CreateGroupVariableSchema, UpdateGroupVariableSchema, DeleteGroupVariableSchema, GitLabDependencyProxySchema, GitLabDependencyProxyBlobSchema, GetDependencyProxySettingsSchema, UpdateDependencyProxySettingsSchema, ListDependencyProxyBlobsSchema, PurgeDependencyProxyCacheSchema, ListProjectVulnerabilitiesSchema, GetVulnerabilitySchema, DismissVulnerabilitySchema, ConfirmVulnerabilitySchema, ListIssueDiscussionsSchema, ListIssueLinksSchema, ListIssuesSchema, ListTodosSchema, ListLabelsSchema, ListMergeRequestDiffsSchema, // Added
|
|
108
|
-
GetMergeRequestFileDiffSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestsSchema, ListMergeRequestVersionsSchema, GetMergeRequestVersionSchema, GitLabMergeRequestVersionSchema, GitLabMergeRequestVersionDetailSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelinesSchema, ListDeploymentsSchema, ListEnvironmentsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListCiCatalogResourcesSchema, GetCiCatalogResourceSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListGroupMilestonesSchema, ListProjectsSchema, ListWikiPagesSchema, GetGroupWikiPageSchema, ListGroupWikiPagesSchema, UpdateGroupWikiPageSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, DownloadAttachmentSchema, DownloadJobArtifactsSchema, GetJobArtifactFileSchema, GitLabArtifactEntrySchema, ListJobArtifactsSchema, MergeMergeRequestSchema, ApproveMergeRequestSchema, UnapproveMergeRequestSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GitLabMergeRequestApprovalsResponseSchema, GitLabMergeRequestApprovalStateSchema, MyIssuesSchema, MarkAllTodosDoneSchema, MarkTodoDoneSchema, PaginatedDiscussionsResponseSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PlayPipelineJobSchema, PushFilesSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UpdateDraftNoteSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateProjectSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestSchema, UpdateWikiPageSchema, VerifyNamespaceSchema, GitLabEventSchema, ListEventsSchema, GetProjectEventsSchema, ExecuteGraphQLSchema, GitLabReleaseSchema, ListReleasesSchema, GetReleaseSchema, CreateReleaseSchema, UpdateReleaseSchema, DeleteReleaseSchema, CreateReleaseEvidenceSchema, DownloadReleaseAssetSchema, ListTagsSchema, GetTagSchema, CreateTagSchema, DeleteTagSchema, GetTagSignatureSchema, GitLabTagSchema, GitLabTagSignatureSchema, GetMergeRequestNotesSchema, GetMergeRequestNoteSchema, DeleteMergeRequestDiscussionNoteSchema, ResolveMergeRequestThreadSchema, GetWorkItemSchema, ListWorkItemsSchema, CreateWorkItemSchema, UpdateWorkItemSchema, ConvertWorkItemTypeSchema, ListWorkItemStatusesSchema, ListWorkItemNotesSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, MoveWorkItemSchema, ListCustomFieldDefinitionsSchema, GetTimelineEventsSchema, CreateTimelineEventSchema, ListWebhooksSchema, ListWebhookEventsSchema, GetWebhookEventSchema, HealthCheckSchema, } from "./schemas.js";
|
|
109
|
+
GetMergeRequestFileDiffSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestsSchema, ListMergeRequestVersionsSchema, GetMergeRequestVersionSchema, GitLabMergeRequestVersionSchema, GitLabMergeRequestVersionDetailSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelinesSchema, ListDeploymentsSchema, ListEnvironmentsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListCiCatalogResourcesSchema, GetCiCatalogResourceSchema, ListProjectMembersSchema, ListGroupMembersSchema, ListProjectMilestonesSchema, ListGroupMilestonesSchema, ListProjectsSchema, ListWikiPagesSchema, GetGroupWikiPageSchema, ListGroupWikiPagesSchema, UpdateGroupWikiPageSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, DownloadAttachmentSchema, DownloadJobArtifactsSchema, GetJobArtifactFileSchema, GitLabArtifactEntrySchema, ListJobArtifactsSchema, MergeMergeRequestSchema, ApproveMergeRequestSchema, UnapproveMergeRequestSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GitLabMergeRequestApprovalsResponseSchema, GitLabMergeRequestApprovalStateSchema, MyIssuesSchema, MarkAllTodosDoneSchema, MarkTodoDoneSchema, PaginatedDiscussionsResponseSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PlayPipelineJobSchema, PushFilesSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UpdateDraftNoteSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateProjectSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestSchema, UpdateWikiPageSchema, VerifyNamespaceSchema, GitLabEventSchema, ListEventsSchema, GetProjectEventsSchema, ExecuteGraphQLSchema, GitLabReleaseSchema, ListReleasesSchema, GetReleaseSchema, CreateReleaseSchema, UpdateReleaseSchema, DeleteReleaseSchema, CreateReleaseEvidenceSchema, DownloadReleaseAssetSchema, ListTagsSchema, GetTagSchema, CreateTagSchema, DeleteTagSchema, GetTagSignatureSchema, GitLabTagSchema, GitLabTagSignatureSchema, GetMergeRequestNotesSchema, GetMergeRequestNoteSchema, DeleteMergeRequestDiscussionNoteSchema, ResolveMergeRequestThreadSchema, GetWorkItemSchema, ListWorkItemsSchema, CreateWorkItemSchema, UpdateWorkItemSchema, ConvertWorkItemTypeSchema, ListWorkItemStatusesSchema, ListWorkItemNotesSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, MoveWorkItemSchema, ListCustomFieldDefinitionsSchema, GetTimelineEventsSchema, CreateTimelineEventSchema, ListWebhooksSchema, ListWebhookEventsSchema, GetWebhookEventSchema, HealthCheckSchema, } from "./schemas.js";
|
|
109
110
|
import { randomUUID, timingSafeEqual, } from "node:crypto";
|
|
110
111
|
import { createLogger } from "./utils/logger.js";
|
|
111
112
|
const logger = createLogger();
|
|
112
|
-
/**
|
|
113
|
-
* Read version from package.json
|
|
114
|
-
*/
|
|
115
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
116
|
-
const __dirname = dirname(__filename);
|
|
117
|
-
const packageJsonPath = path.resolve(__dirname, "../package.json");
|
|
118
|
-
let SERVER_VERSION = "unknown";
|
|
119
|
-
try {
|
|
120
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
121
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
122
|
-
SERVER_VERSION = packageJson.version || SERVER_VERSION;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// Intentionally ignored: version read failure is non-critical
|
|
127
|
-
}
|
|
128
113
|
const SERVER_NAME = process.env.MCP_SERVER_NAME?.trim() || "zereight-gitlab-mcp-server";
|
|
129
114
|
/**
|
|
130
115
|
* Create a new MCP Server instance with request handlers registered.
|
|
@@ -538,6 +523,14 @@ function validateConfiguration() {
|
|
|
538
523
|
errors.push(`MAX_REQUESTS_PER_MINUTE must be between 1 and 1000, got: ${maxReqStr}`);
|
|
539
524
|
}
|
|
540
525
|
}
|
|
526
|
+
// Validate OAUTH_REGISTER_RATE_LIMIT_PER_HOUR
|
|
527
|
+
const registerRateLimitStr = process.env.OAUTH_REGISTER_RATE_LIMIT_PER_HOUR;
|
|
528
|
+
if (registerRateLimitStr) {
|
|
529
|
+
const limit = Number(registerRateLimitStr);
|
|
530
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000) {
|
|
531
|
+
errors.push(`OAUTH_REGISTER_RATE_LIMIT_PER_HOUR must be an integer between 1 and 1000, got: ${registerRateLimitStr}`);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
541
534
|
// Validate PORT
|
|
542
535
|
const portStr = getConfig("port", "PORT");
|
|
543
536
|
if (portStr) {
|
|
@@ -6160,6 +6153,35 @@ async function listProjectMembers(projectId, options = {}) {
|
|
|
6160
6153
|
const data = await response.json();
|
|
6161
6154
|
return z.array(GitLabProjectMemberSchema).parse(data);
|
|
6162
6155
|
}
|
|
6156
|
+
/**
|
|
6157
|
+
* List members of a GitLab group
|
|
6158
|
+
* GitLab 그룹 멤버 목록 조회
|
|
6159
|
+
*
|
|
6160
|
+
* @param {string} groupId - Group ID or URL-encoded path
|
|
6161
|
+
* @param {Omit<ListGroupMembersOptions, "group_id">} options - Options for filtering members
|
|
6162
|
+
* @returns {Promise<GitLabProjectMember[]>} List of group members
|
|
6163
|
+
*/
|
|
6164
|
+
async function listGroupMembers(groupId, options = {}) {
|
|
6165
|
+
groupId = decodeURIComponent(groupId);
|
|
6166
|
+
const membersPath = options.include_inheritance ? "members/all" : "members";
|
|
6167
|
+
const url = new URL(`${getEffectiveApiUrl()}/groups/${encodeURIComponent(groupId)}/${membersPath}`);
|
|
6168
|
+
if (options.query)
|
|
6169
|
+
url.searchParams.append("query", options.query);
|
|
6170
|
+
if (options.user_ids) {
|
|
6171
|
+
options.user_ids.forEach(id => url.searchParams.append("user_ids[]", id.toString()));
|
|
6172
|
+
}
|
|
6173
|
+
if (options.skip_users) {
|
|
6174
|
+
options.skip_users.forEach(id => url.searchParams.append("skip_users[]", id.toString()));
|
|
6175
|
+
}
|
|
6176
|
+
if (options.per_page)
|
|
6177
|
+
url.searchParams.append("per_page", options.per_page.toString());
|
|
6178
|
+
if (options.page)
|
|
6179
|
+
url.searchParams.append("page", options.page.toString());
|
|
6180
|
+
const response = await fetch(url.toString(), getFetchConfig());
|
|
6181
|
+
await handleGitLabError(response);
|
|
6182
|
+
const data = await response.json();
|
|
6183
|
+
return z.array(GitLabProjectMemberSchema).parse(data);
|
|
6184
|
+
}
|
|
6163
6185
|
/**
|
|
6164
6186
|
* list group iterations
|
|
6165
6187
|
*
|
|
@@ -7773,6 +7795,14 @@ async function handleToolCall(params) {
|
|
|
7773
7795
|
content: [{ type: "text", text: JSON.stringify(members) }],
|
|
7774
7796
|
};
|
|
7775
7797
|
}
|
|
7798
|
+
case "list_group_members": {
|
|
7799
|
+
const args = ListGroupMembersSchema.parse(params.arguments);
|
|
7800
|
+
const { group_id, ...options } = args;
|
|
7801
|
+
const members = await listGroupMembers(group_id, options);
|
|
7802
|
+
return {
|
|
7803
|
+
content: [{ type: "text", text: JSON.stringify(members) }],
|
|
7804
|
+
};
|
|
7805
|
+
}
|
|
7776
7806
|
case "get_users": {
|
|
7777
7807
|
const args = GetUsersSchema.parse(params.arguments);
|
|
7778
7808
|
const usersMap = await getUsers(args.usernames);
|
|
@@ -10166,6 +10196,15 @@ async function startStreamableHTTPServer() {
|
|
|
10166
10196
|
// ERR_ERL_INVALID_IP_ADDRESS. Strip the port first, then delegate to
|
|
10167
10197
|
// ipKeyGenerator for correct IPv6 subnet handling.
|
|
10168
10198
|
const rateLimitOptions = { keyGenerator: mcpRateLimitKeyGenerator };
|
|
10199
|
+
const parsedRegisterLimit = Number(process.env.OAUTH_REGISTER_RATE_LIMIT_PER_HOUR);
|
|
10200
|
+
const OAUTH_REGISTER_RATE_LIMIT_PER_HOUR = Number.isInteger(parsedRegisterLimit) && parsedRegisterLimit >= 1
|
|
10201
|
+
? parsedRegisterLimit
|
|
10202
|
+
: 20;
|
|
10203
|
+
const clientRegistrationRateLimitOptions = {
|
|
10204
|
+
...rateLimitOptions,
|
|
10205
|
+
windowMs: 60 * 60 * 1000, // 1 hour
|
|
10206
|
+
max: OAUTH_REGISTER_RATE_LIMIT_PER_HOUR,
|
|
10207
|
+
};
|
|
10169
10208
|
app.use(mcpAuthRouter({
|
|
10170
10209
|
provider: oauthProvider,
|
|
10171
10210
|
issuerUrl,
|
|
@@ -10175,7 +10214,7 @@ async function startStreamableHTTPServer() {
|
|
|
10175
10214
|
authorizationOptions: { rateLimit: rateLimitOptions },
|
|
10176
10215
|
tokenOptions: { rateLimit: rateLimitOptions },
|
|
10177
10216
|
revocationOptions: { rateLimit: rateLimitOptions },
|
|
10178
|
-
clientRegistrationOptions: { rateLimit:
|
|
10217
|
+
clientRegistrationOptions: { rateLimit: clientRegistrationRateLimitOptions },
|
|
10179
10218
|
}));
|
|
10180
10219
|
// Expose provider so the /mcp route middleware can reference it
|
|
10181
10220
|
app._mcpOAuthProvider = oauthProvider;
|
package/build/schemas.js
CHANGED
|
@@ -2941,6 +2941,22 @@ export const ListProjectMembersSchema = z.object({
|
|
|
2941
2941
|
.describe("Number of items per page (default: 20, max: 100)"),
|
|
2942
2942
|
page: z.coerce.number().optional().describe("Page number for pagination (default: 1)"),
|
|
2943
2943
|
});
|
|
2944
|
+
// Schema for listing group members
|
|
2945
|
+
export const ListGroupMembersSchema = z.object({
|
|
2946
|
+
group_id: z.string().describe("Group ID or URL-encoded path"),
|
|
2947
|
+
query: z.string().optional().describe("Search for members by name or username"),
|
|
2948
|
+
user_ids: z.array(z.coerce.number()).optional().describe("Filter by user IDs"),
|
|
2949
|
+
skip_users: z.array(z.coerce.number()).optional().describe("User IDs to exclude"),
|
|
2950
|
+
include_inheritance: z.coerce
|
|
2951
|
+
.boolean()
|
|
2952
|
+
.optional()
|
|
2953
|
+
.describe("Include inherited members. Defaults to false."),
|
|
2954
|
+
per_page: z.coerce
|
|
2955
|
+
.number()
|
|
2956
|
+
.optional()
|
|
2957
|
+
.describe("Number of items per page (default: 20, max: 100)"),
|
|
2958
|
+
page: z.coerce.number().optional().describe("Page number for pagination (default: 1)"),
|
|
2959
|
+
});
|
|
2944
2960
|
// Schema for GitLab project member
|
|
2945
2961
|
export const GitLabProjectMemberSchema = z.object({
|
|
2946
2962
|
id: z.coerce.number(),
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path, { dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
const packageJsonPaths = [
|
|
7
|
+
// Source file under tsx/node:test: server/version.ts -> ../package.json
|
|
8
|
+
path.resolve(__dirname, "../package.json"),
|
|
9
|
+
// Built file: build/server/version.js -> ../../package.json
|
|
10
|
+
path.resolve(__dirname, "../../package.json"),
|
|
11
|
+
];
|
|
12
|
+
export const SERVER_VERSION = (() => {
|
|
13
|
+
for (const packageJsonPath of packageJsonPaths) {
|
|
14
|
+
try {
|
|
15
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
16
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
17
|
+
const version = packageJson.version;
|
|
18
|
+
if (typeof version === "string" && version.length > 0) {
|
|
19
|
+
return version;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Intentionally ignored: version read failure is non-critical.
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return "unknown";
|
|
28
|
+
})();
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path, { dirname } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { SERVER_VERSION } from "../../server/version.js";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const packageJsonPath = path.resolve(__dirname, "../../package.json");
|
|
10
|
+
const packageVersion = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")).version;
|
|
11
|
+
test("SERVER_VERSION matches package.json", () => {
|
|
12
|
+
assert.strictEqual(SERVER_VERSION, packageVersion);
|
|
13
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { describe, test, before, after, beforeEach } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { MockGitLabServer, findMockServerPort } from './utils/mock-gitlab-server.js';
|
|
5
|
+
const MOCK_TOKEN = 'glpat-mock-token-12345';
|
|
6
|
+
const TEST_GROUP_ID = '456';
|
|
7
|
+
const directMembers = [
|
|
8
|
+
{
|
|
9
|
+
id: 1,
|
|
10
|
+
username: 'direct-user',
|
|
11
|
+
name: 'Direct User',
|
|
12
|
+
state: 'active',
|
|
13
|
+
avatar_url: null,
|
|
14
|
+
web_url: 'https://gitlab.mock/users/1',
|
|
15
|
+
access_level: 30,
|
|
16
|
+
created_at: '2024-01-01T00:00:00Z'
|
|
17
|
+
}
|
|
18
|
+
];
|
|
19
|
+
const inheritedMembers = [
|
|
20
|
+
{
|
|
21
|
+
id: 2,
|
|
22
|
+
username: 'inherited-user',
|
|
23
|
+
name: 'Inherited User',
|
|
24
|
+
state: 'active',
|
|
25
|
+
avatar_url: null,
|
|
26
|
+
web_url: 'https://gitlab.mock/users/2',
|
|
27
|
+
access_level: 20,
|
|
28
|
+
created_at: '2024-01-02T00:00:00Z'
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
async function callListGroupMembers(args, env) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const proc = spawn('node', ['build/index.js'], {
|
|
34
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
35
|
+
env: {
|
|
36
|
+
...process.env,
|
|
37
|
+
...env,
|
|
38
|
+
GITLAB_READ_ONLY_MODE: 'true'
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
let output = '';
|
|
42
|
+
let errorOutput = '';
|
|
43
|
+
proc.stdout?.on('data', d => output += d);
|
|
44
|
+
proc.stderr?.on('data', d => errorOutput += d);
|
|
45
|
+
proc.on('close', (code) => {
|
|
46
|
+
if (code !== 0)
|
|
47
|
+
return reject(new Error(`Process exited with code ${code}: ${errorOutput}`));
|
|
48
|
+
const line = output.split('\n').find(l => l.startsWith('{'));
|
|
49
|
+
if (!line)
|
|
50
|
+
return reject(new Error('No JSON output found'));
|
|
51
|
+
try {
|
|
52
|
+
const response = JSON.parse(line);
|
|
53
|
+
if (response.error) {
|
|
54
|
+
reject(response.error);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const content = response.result?.content?.[0]?.text;
|
|
58
|
+
if (content) {
|
|
59
|
+
try {
|
|
60
|
+
resolve(JSON.parse(content));
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
reject(new Error(`Failed to parse tool output JSON: ${content}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
resolve(response.result);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
reject(e);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
proc.stdin?.end(JSON.stringify({
|
|
76
|
+
jsonrpc: "2.0", id: 1, method: "tools/call",
|
|
77
|
+
params: { name: "list_group_members", arguments: args }
|
|
78
|
+
}) + '\n');
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
describe('list_group_members', () => {
|
|
82
|
+
let mockGitLab;
|
|
83
|
+
let mockGitLabUrl;
|
|
84
|
+
let directEndpointHit = false;
|
|
85
|
+
let inheritedEndpointHit = false;
|
|
86
|
+
let queryParam = null;
|
|
87
|
+
before(async () => {
|
|
88
|
+
const mockPort = await findMockServerPort();
|
|
89
|
+
mockGitLab = new MockGitLabServer({
|
|
90
|
+
port: mockPort,
|
|
91
|
+
validTokens: [MOCK_TOKEN]
|
|
92
|
+
});
|
|
93
|
+
await mockGitLab.start();
|
|
94
|
+
mockGitLabUrl = mockGitLab.getUrl();
|
|
95
|
+
mockGitLab.addMockHandler('get', `/groups/${TEST_GROUP_ID}/members`, (req, res) => {
|
|
96
|
+
directEndpointHit = true;
|
|
97
|
+
queryParam = req.query.query ?? null;
|
|
98
|
+
res.json(directMembers);
|
|
99
|
+
});
|
|
100
|
+
mockGitLab.addMockHandler('get', `/groups/${TEST_GROUP_ID}/members/all`, (req, res) => {
|
|
101
|
+
inheritedEndpointHit = true;
|
|
102
|
+
res.json([...directMembers, ...inheritedMembers]);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
directEndpointHit = false;
|
|
107
|
+
inheritedEndpointHit = false;
|
|
108
|
+
queryParam = null;
|
|
109
|
+
});
|
|
110
|
+
after(async () => {
|
|
111
|
+
await mockGitLab.stop();
|
|
112
|
+
});
|
|
113
|
+
describe('When listing group members', () => {
|
|
114
|
+
describe('with direct membership only', () => {
|
|
115
|
+
test('should return direct members', async () => {
|
|
116
|
+
const members = await callListGroupMembers({ group_id: TEST_GROUP_ID }, {
|
|
117
|
+
GITLAB_API_URL: `${mockGitLabUrl}/api/v4`,
|
|
118
|
+
GITLAB_PERSONAL_ACCESS_TOKEN: MOCK_TOKEN
|
|
119
|
+
});
|
|
120
|
+
assert.ok(Array.isArray(members), 'Response should be an array');
|
|
121
|
+
assert.strictEqual(members.length, 1, 'Should return direct members');
|
|
122
|
+
assert.strictEqual(members[0].username, 'direct-user');
|
|
123
|
+
assert.strictEqual(directEndpointHit, true, 'Direct members endpoint should be called');
|
|
124
|
+
assert.strictEqual(inheritedEndpointHit, false, 'Inherited members endpoint should not be called');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('with include_inheritance', () => {
|
|
128
|
+
test('should return inherited members', async () => {
|
|
129
|
+
const members = await callListGroupMembers({ group_id: TEST_GROUP_ID, include_inheritance: true }, {
|
|
130
|
+
GITLAB_API_URL: `${mockGitLabUrl}/api/v4`,
|
|
131
|
+
GITLAB_PERSONAL_ACCESS_TOKEN: MOCK_TOKEN
|
|
132
|
+
});
|
|
133
|
+
assert.ok(Array.isArray(members), 'Response should be an array');
|
|
134
|
+
assert.strictEqual(members.length, 2, 'Should return inherited members');
|
|
135
|
+
assert.strictEqual(members[1].username, 'inherited-user');
|
|
136
|
+
assert.strictEqual(inheritedEndpointHit, true, 'Inherited members endpoint should be called');
|
|
137
|
+
assert.strictEqual(directEndpointHit, false, 'Direct members endpoint should not be called');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('with query', () => {
|
|
141
|
+
test('should pass query to the members endpoint', async () => {
|
|
142
|
+
await callListGroupMembers({ group_id: TEST_GROUP_ID, query: 'alice' }, {
|
|
143
|
+
GITLAB_API_URL: `${mockGitLabUrl}/api/v4`,
|
|
144
|
+
GITLAB_PERSONAL_ACCESS_TOKEN: MOCK_TOKEN
|
|
145
|
+
});
|
|
146
|
+
assert.strictEqual(queryParam, 'alice', 'Query parameter should be forwarded');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
package/build/tools/registry.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
2
2
|
import { toJSONSchema } from "../utils/schema.js";
|
|
3
3
|
import { USE_GITLAB_WIKI, USE_MILESTONE, USE_PIPELINE, SSE, STREAMABLE_HTTP, } from "../config.js";
|
|
4
|
-
import { ApproveMergeRequestSchema, BulkPublishDraftNotesSchema, CancelPipelineJobSchema, CancelPipelineSchema, ConvertWorkItemTypeSchema, CreateBranchSchema, CreateDraftNoteSchema, CreateGroupSchema, CreateGroupWikiPageSchema, CreateIssueLinkSchema, CreateIssueNoteSchema, CreateIssueSchema, CreateIssueEmojiReactionSchema, CreateIssueNoteEmojiReactionSchema, ListIssueEmojiReactionsSchema, ListIssueNoteEmojiReactionsSchema, CreateLabelSchema, MarkAllTodosDoneSchema, ListTodosSchema, MarkTodoDoneSchema, CreateMergeRequestDiscussionNoteSchema, CreateMergeRequestEmojiReactionSchema, ListMergeRequestEmojiReactionsSchema, ListMergeRequestNoteEmojiReactionsSchema, CreateMergeRequestNoteSchema, CreateMergeRequestNoteEmojiReactionSchema, CreateMergeRequestSchema, CreateMergeRequestThreadSchema, CreateNoteSchema, CreateCommitStatusSchema, CreateOrUpdateFileSchema, CreatePipelineSchema, CreateProjectMilestoneSchema, CreateGroupMilestoneSchema, CreateReleaseEvidenceSchema, CreateReleaseSchema, CreateRepositorySchema, CreateTagSchema, CreateTimelineEventSchema, CreateWikiPageSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, CreateWorkItemSchema, DeleteBranchSchema, GetProtectedBranchSchema, ListProtectedBranchesSchema, ProtectBranchSchema, UnprotectBranchSchema, UpdateDefaultBranchSchema, DeleteDraftNoteSchema, DeleteGroupMilestoneSchema, DeleteGroupWikiPageSchema, DeleteIssueLinkSchema, DeleteIssueSchema, DeleteIssueEmojiReactionSchema, DeleteIssueNoteEmojiReactionSchema, DeleteLabelSchema, DeleteMergeRequestDiscussionNoteSchema, DeleteMergeRequestNoteSchema, DeleteMergeRequestEmojiReactionSchema, DeleteMergeRequestNoteEmojiReactionSchema, DeleteProjectMilestoneSchema, DeleteReleaseSchema, DeleteTagSchema, DeleteWikiPageSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, DownloadAttachmentSchema, DownloadAttachmentRemoteSchema, DownloadJobArtifactsSchema, DownloadJobArtifactsRemoteSchema, DownloadReleaseAssetSchema, EditProjectMilestoneSchema, EditGroupMilestoneSchema, ExecuteGraphQLSchema, ForkRepositorySchema, HealthCheckSchema, GetBranchSchema, GetBranchDiffsSchema, GetCommitDiffSchema, GetCommitSchema, GetFileBlameSchema, GetDeploymentSchema, GetDraftNoteSchema, GetEnvironmentSchema, GetFileContentsSchema, GetGroupWikiPageSchema, GetIssueLinkSchema, GetIssueSchema, GetJobArtifactFileSchema, GetLabelSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GetMergeRequestDiffsSchema, GetMergeRequestFileDiffSchema, GetMergeRequestNoteSchema, GetMergeRequestNotesSchema, GetMergeRequestSchema, GetMergeRequestVersionSchema, GetMilestoneBurndownEventsSchema, GetMilestoneIssuesSchema, GetMilestoneMergeRequestsSchema, GetGroupMilestoneSchema, GetGroupMilestoneIssuesSchema, GetGroupMilestoneMergeRequestsSchema, GetGroupMilestoneBurndownEventsSchema, GetNamespaceSchema, GetPipelineJobOutputSchema, PipelineJobControlSchema, GetPipelineSchema, GetProjectEventsSchema, GetProjectMilestoneSchema, GetProjectSchema, GetReleaseSchema, GetRepositoryTreeSchema, GetTagSchema, GetTagSignatureSchema, GetTimelineEventsSchema, GetUsersSchema, GetUserSchema, WhoAmISchema, GetWebhookEventSchema, GetWikiPageSchema, GetWorkItemSchema, ListBranchesSchema, ListCommitsSchema, ListCommitStatusesSchema, ListCustomFieldDefinitionsSchema, ListDeploymentsSchema, ListDraftNotesSchema, ListEnvironmentsSchema, ListEventsSchema, ListGroupIterationsSchema, ListGroupMilestonesSchema, ListGroupProjectsSchema, ListGroupWikiPagesSchema, ListIssueDiscussionsSchema, ListIssueLinksSchema, ListIssuesSchema, ListJobArtifactsSchema, ListLabelsSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiffsSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestVersionsSchema, ListMergeRequestsSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListCiCatalogResourcesSchema, GetCiCatalogResourceSchema, ListPipelinesSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListProjectsSchema, ListReleasesSchema, ListTagsSchema, ListWebhookEventsSchema, ListWebhooksSchema, ListWikiPagesSchema, ListWorkItemNotesSchema, ListWorkItemStatusesSchema, ListWorkItemsSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, MergeMergeRequestSchema, MoveWorkItemSchema, MyIssuesSchema, PlayPipelineJobSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PushFilesSchema, ResolveMergeRequestThreadSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UnapproveMergeRequestSchema, UpdateDraftNoteSchema, UpdateGroupWikiPageSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateProjectSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestSchema, UpdateReleaseSchema, UpdateWikiPageSchema, UpdateWorkItemSchema, VerifyNamespaceSchema, ListProjectVariablesSchema, GetProjectVariableSchema, CreateProjectVariableSchema, UpdateProjectVariableSchema, DeleteProjectVariableSchema, ListGroupVariablesSchema, GetGroupVariableSchema, CreateGroupVariableSchema, UpdateGroupVariableSchema, DeleteGroupVariableSchema, GetDependencyProxySettingsSchema, UpdateDependencyProxySettingsSchema, ListDependencyProxyBlobsSchema, PurgeDependencyProxyCacheSchema, ListProjectVulnerabilitiesSchema, GetVulnerabilitySchema, DismissVulnerabilitySchema, ConfirmVulnerabilitySchema, } from "../schemas.js";
|
|
4
|
+
import { ApproveMergeRequestSchema, BulkPublishDraftNotesSchema, CancelPipelineJobSchema, CancelPipelineSchema, ConvertWorkItemTypeSchema, CreateBranchSchema, CreateDraftNoteSchema, CreateGroupSchema, CreateGroupWikiPageSchema, CreateIssueLinkSchema, CreateIssueNoteSchema, CreateIssueSchema, CreateIssueEmojiReactionSchema, CreateIssueNoteEmojiReactionSchema, ListIssueEmojiReactionsSchema, ListIssueNoteEmojiReactionsSchema, CreateLabelSchema, MarkAllTodosDoneSchema, ListTodosSchema, MarkTodoDoneSchema, CreateMergeRequestDiscussionNoteSchema, CreateMergeRequestEmojiReactionSchema, ListMergeRequestEmojiReactionsSchema, ListMergeRequestNoteEmojiReactionsSchema, CreateMergeRequestNoteSchema, CreateMergeRequestNoteEmojiReactionSchema, CreateMergeRequestSchema, CreateMergeRequestThreadSchema, CreateNoteSchema, CreateCommitStatusSchema, CreateOrUpdateFileSchema, CreatePipelineSchema, CreateProjectMilestoneSchema, CreateGroupMilestoneSchema, CreateReleaseEvidenceSchema, CreateReleaseSchema, CreateRepositorySchema, CreateTagSchema, CreateTimelineEventSchema, CreateWikiPageSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, CreateWorkItemSchema, DeleteBranchSchema, GetProtectedBranchSchema, ListProtectedBranchesSchema, ProtectBranchSchema, UnprotectBranchSchema, UpdateDefaultBranchSchema, DeleteDraftNoteSchema, DeleteGroupMilestoneSchema, DeleteGroupWikiPageSchema, DeleteIssueLinkSchema, DeleteIssueSchema, DeleteIssueEmojiReactionSchema, DeleteIssueNoteEmojiReactionSchema, DeleteLabelSchema, DeleteMergeRequestDiscussionNoteSchema, DeleteMergeRequestNoteSchema, DeleteMergeRequestEmojiReactionSchema, DeleteMergeRequestNoteEmojiReactionSchema, DeleteProjectMilestoneSchema, DeleteReleaseSchema, DeleteTagSchema, DeleteWikiPageSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, DownloadAttachmentSchema, DownloadAttachmentRemoteSchema, DownloadJobArtifactsSchema, DownloadJobArtifactsRemoteSchema, DownloadReleaseAssetSchema, EditProjectMilestoneSchema, EditGroupMilestoneSchema, ExecuteGraphQLSchema, ForkRepositorySchema, HealthCheckSchema, GetBranchSchema, GetBranchDiffsSchema, GetCommitDiffSchema, GetCommitSchema, GetFileBlameSchema, GetDeploymentSchema, GetDraftNoteSchema, GetEnvironmentSchema, GetFileContentsSchema, GetGroupWikiPageSchema, GetIssueLinkSchema, GetIssueSchema, GetJobArtifactFileSchema, GetLabelSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GetMergeRequestDiffsSchema, GetMergeRequestFileDiffSchema, GetMergeRequestNoteSchema, GetMergeRequestNotesSchema, GetMergeRequestSchema, GetMergeRequestVersionSchema, GetMilestoneBurndownEventsSchema, GetMilestoneIssuesSchema, GetMilestoneMergeRequestsSchema, GetGroupMilestoneSchema, GetGroupMilestoneIssuesSchema, GetGroupMilestoneMergeRequestsSchema, GetGroupMilestoneBurndownEventsSchema, GetNamespaceSchema, GetPipelineJobOutputSchema, PipelineJobControlSchema, GetPipelineSchema, GetProjectEventsSchema, GetProjectMilestoneSchema, GetProjectSchema, GetReleaseSchema, GetRepositoryTreeSchema, GetTagSchema, GetTagSignatureSchema, GetTimelineEventsSchema, GetUsersSchema, GetUserSchema, WhoAmISchema, GetWebhookEventSchema, GetWikiPageSchema, GetWorkItemSchema, ListBranchesSchema, ListCommitsSchema, ListCommitStatusesSchema, ListCustomFieldDefinitionsSchema, ListDeploymentsSchema, ListDraftNotesSchema, ListEnvironmentsSchema, ListEventsSchema, ListGroupIterationsSchema, ListGroupMilestonesSchema, ListGroupProjectsSchema, ListGroupWikiPagesSchema, ListIssueDiscussionsSchema, ListIssueLinksSchema, ListIssuesSchema, ListJobArtifactsSchema, ListLabelsSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiffsSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestVersionsSchema, ListMergeRequestsSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListCiCatalogResourcesSchema, GetCiCatalogResourceSchema, ListPipelinesSchema, ListGroupMembersSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListProjectsSchema, ListReleasesSchema, ListTagsSchema, ListWebhookEventsSchema, ListWebhooksSchema, ListWikiPagesSchema, ListWorkItemNotesSchema, ListWorkItemStatusesSchema, ListWorkItemsSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, MergeMergeRequestSchema, MoveWorkItemSchema, MyIssuesSchema, PlayPipelineJobSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PushFilesSchema, ResolveMergeRequestThreadSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UnapproveMergeRequestSchema, UpdateDraftNoteSchema, UpdateGroupWikiPageSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateProjectSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestSchema, UpdateReleaseSchema, UpdateWikiPageSchema, UpdateWorkItemSchema, VerifyNamespaceSchema, ListProjectVariablesSchema, GetProjectVariableSchema, CreateProjectVariableSchema, UpdateProjectVariableSchema, DeleteProjectVariableSchema, ListGroupVariablesSchema, GetGroupVariableSchema, CreateGroupVariableSchema, UpdateGroupVariableSchema, DeleteGroupVariableSchema, GetDependencyProxySettingsSchema, UpdateDependencyProxySettingsSchema, ListDependencyProxyBlobsSchema, PurgeDependencyProxyCacheSchema, ListProjectVulnerabilitiesSchema, GetVulnerabilitySchema, DismissVulnerabilitySchema, ConfirmVulnerabilitySchema, } from "../schemas.js";
|
|
5
5
|
const IS_REMOTE = SSE || STREAMABLE_HTTP;
|
|
6
6
|
// Define all available tools
|
|
7
7
|
export const allTools = [
|
|
@@ -449,6 +449,11 @@ export const allTools = [
|
|
|
449
449
|
description: "List members of a GitLab project",
|
|
450
450
|
inputSchema: toJSONSchema(ListProjectMembersSchema),
|
|
451
451
|
},
|
|
452
|
+
{
|
|
453
|
+
name: "list_group_members",
|
|
454
|
+
description: "List members of a GitLab group with optional name or username search",
|
|
455
|
+
inputSchema: toJSONSchema(ListGroupMembersSchema),
|
|
456
|
+
},
|
|
452
457
|
{
|
|
453
458
|
name: "list_labels",
|
|
454
459
|
description: "List labels for a project",
|
|
@@ -1161,6 +1166,7 @@ export const readOnlyTools = new Set([
|
|
|
1161
1166
|
"get_project",
|
|
1162
1167
|
"list_projects",
|
|
1163
1168
|
"list_project_members",
|
|
1169
|
+
"list_group_members",
|
|
1164
1170
|
"get_pipeline",
|
|
1165
1171
|
"list_pipelines",
|
|
1166
1172
|
"list_deployments",
|
|
@@ -1477,6 +1483,7 @@ export const TOOLSET_DEFINITIONS = [
|
|
|
1477
1483
|
"list_projects",
|
|
1478
1484
|
"update_project",
|
|
1479
1485
|
"list_project_members",
|
|
1486
|
+
"list_group_members",
|
|
1480
1487
|
"list_namespaces",
|
|
1481
1488
|
"get_namespace",
|
|
1482
1489
|
"verify_namespace",
|
package/package.json
CHANGED