@zereight/mcp-gitlab 2.1.45 → 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 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.44`처럼 직전 안정 버전(문서가 권장하는 버전)으로 고정하세요. 항상 최신 버전을 원하면 `npx -y @zereight/mcp-gitlab@latest`를 사용하세요. 새 버전이 나오면 서버가 시작 시 stderr로 알려줍니다(`GITLAB_DISABLE_VERSION_CHECK=true`로 비활성화 가능).
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.44`. 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`).
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. `list_labels` - List labels for a project
634
- 90. `get_label` - Get a single label from a project
635
- 91. `create_label` - Create a new label in a project
636
- 92. `update_label` - Update an existing label in a project
637
- 93. `delete_label` - Delete a label from a project
638
- 94. `list_group_projects` - List projects in a GitLab group with filtering options
639
- 95. `list_wiki_pages` - List wiki pages in a GitLab project
640
- 96. `get_wiki_page` - Get details of a specific wiki page
641
- 97. `create_wiki_page` - Create a new wiki page in a GitLab project
642
- 98. `update_wiki_page` - Update an existing wiki page in a GitLab project
643
- 99. `delete_wiki_page` - Delete a wiki page from a GitLab project
644
- 100. `list_group_wiki_pages` - List wiki pages in a GitLab group
645
- 101. `get_group_wiki_page` - Get details of a specific group wiki page
646
- 102. `create_group_wiki_page` - Create a new wiki page in a GitLab group
647
- 103. `update_group_wiki_page` - Update an existing wiki page in a GitLab group
648
- 104. `delete_group_wiki_page` - Delete a wiki page from a GitLab group
649
- 105. `get_repository_tree` - Get the repository tree for a GitLab project (list files and directories)
650
- 106. `list_pipelines` - List pipelines in a GitLab project with filtering options
651
- 107. `get_pipeline` - Get details of a specific pipeline in a GitLab project
652
- 108. `list_deployments` - List deployments in a GitLab project with filtering options
653
- 109. `get_deployment` - Get details of a specific deployment in a GitLab project
654
- 110. `list_environments` - List environments in a GitLab project
655
- 111. `get_environment` - Get details of a specific environment in a GitLab project
656
- 112. `list_pipeline_jobs` - List all jobs in a specific pipeline
657
- 113. `list_pipeline_trigger_jobs` - List all trigger jobs (bridges) in a specific pipeline that trigger downstream pipelines
658
- 114. `get_pipeline_job` - Get details of a GitLab pipeline job number
659
- 115. `get_pipeline_job_output` - Get the output/trace of a GitLab pipeline job with optional pagination to limit context window usage
660
- 116. `validate_ci_lint` - Validate provided GitLab CI/CD YAML content for a project
661
- 117. `validate_project_ci_lint` - Validate an existing `.gitlab-ci.yml` configuration for a project
662
- 118. `list_ci_catalog_resources` - List GitLab CI/CD Catalog resources/components visible to the user
663
- 119. `get_ci_catalog_resource` - Get details for a GitLab CI/CD Catalog resource, including versions and components
664
- 120. `create_pipeline` - Create a new pipeline for a branch or tag
665
- 121. `retry_pipeline` - Retry a failed or canceled pipeline
666
- 122. `cancel_pipeline` - Cancel a running pipeline
667
- 123. `play_pipeline_job` - Run a manual pipeline job
668
- 124. `retry_pipeline_job` - Retry a failed or canceled pipeline job
669
- 125. `cancel_pipeline_job` - Cancel a running pipeline job
670
- 126. `list_job_artifacts` - List artifact files in a job's artifacts archive. Returns file names, paths, types, and sizes
671
- 127. `download_job_artifacts` - Download the entire artifact archive (zip) for a job to a local path. Returns the saved file path
672
- 128. `get_job_artifact_file` - Get the content of a single file from a job's artifacts by its path within the archive
673
- 129. `list_merge_requests` - List merge requests globally or in a specific GitLab project with filtering options (project_id is now optional)
674
- 130. `list_milestones` - List milestones in a GitLab project with filtering options
675
- 131. `get_milestone` - Get details of a specific milestone
676
- 132. `create_milestone` - Create a new milestone in a GitLab project
677
- 133. `edit_milestone` - Edit an existing milestone in a GitLab project
678
- 134. `delete_milestone` - Delete a milestone from a GitLab project
679
- 135. `get_milestone_issue` - Get issues associated with a specific milestone
680
- 136. `get_milestone_merge_requests` - Get merge requests associated with a specific milestone
681
- 137. `promote_milestone` - Promote a milestone to the next stage
682
- 138. `get_milestone_burndown_events` - Get burndown events for a specific milestone
683
- 139. `list_group_milestones` - List milestones in a GitLab group with filtering options
684
- 140. `get_group_milestone` - Get details of a specific group milestone
685
- 141. `create_group_milestone` - Create a new milestone in a GitLab group
686
- 142. `edit_group_milestone` - Edit an existing group milestone
687
- 143. `delete_group_milestone` - Delete a milestone from a GitLab group
688
- 144. `get_group_milestone_issue` - Get issues associated with a specific group milestone
689
- 145. `get_group_milestone_merge_requests` - Get merge requests associated with a specific group milestone
690
- 146. `get_group_milestone_burndown_events` - Get burndown events for a specific group milestone
691
- 147. `get_users` - Get GitLab user details by usernames
692
- 148. `get_user` - Get user details by ID
693
- 149. `whoami` - Get current authenticated user details
694
- 150. `list_commits` - List repository commits with filtering options
695
- 151. `get_commit` - Get details of a specific commit
696
- 152. `get_commit_diff` - Get changes/diffs of a specific commit
697
- 153. `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.
698
- 154. `list_commit_statuses` - List statuses for a specific commit
699
- 155. `create_commit_status` - Create or update the status of a specific commit
700
- 156. `list_group_iterations` - List group iterations with filtering options
701
- 157. `upload_markdown` - Upload a file to a GitLab project for use in markdown content
702
- 158. `download_attachment` - Download an uploaded file from a GitLab project by secret and filename
703
- 159. `health_check` - Verify server status and authentication; when authenticated, reports GitLab instance version from `/api/v4/version` (`version`, `revision`, `enterprise`)
704
- 160. `list_events` - List all events for the currently authenticated user
705
- 161. `get_project_events` - List all visible events for a specified project
706
- 162. `list_releases` - List all releases for a project
707
- 163. `get_release` - Get a release by tag name
708
- 164. `create_release` - Create a new release in a GitLab project
709
- 165. `update_release` - Update an existing release in a GitLab project
710
- 166. `delete_release` - Delete a release from a GitLab project (does not delete the associated tag)
711
- 167. `create_release_evidence` - Create release evidence for an existing release (GitLab Premium/Ultimate only)
712
- 168. `download_release_asset` - Download a release asset file by direct asset path
713
- 169. `list_tags` - List repository tags with filtering and pagination support
714
- 170. `get_tag` - Get details of a specific repository tag
715
- 171. `create_tag` - Create a new tag in the repository
716
- 172. `delete_tag` - Delete a tag from the repository
717
- 173. `get_tag_signature` - Get the signature of a signed tag
718
- 174. `get_work_item` - Get a single work item with full details including status, hierarchy (parent/children), type, labels, assignees, and all widgets
719
- 175. `list_work_items` - List work items in a project with filters (type, state, search, assignees, labels). Returns items with status and hierarchy info
720
- 176. `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
721
- 177. `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
722
- 178. `convert_work_item_type` - Convert a work item to a different type (e.g. issue to task, task to incident)
723
- 179. `list_work_item_statuses` - List available statuses for a work item type in a project. Requires GitLab Premium/Ultimate with configurable statuses
724
- 180. `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
725
- 181. `move_work_item` - Move a work item (issue, task, etc.) to a different project. Uses GitLab GraphQL issueMove mutation
726
- 182. `list_work_item_notes` - List notes and discussions on a work item. Returns threaded discussions with author, body, timestamps, and system/internal flags
727
- 183. `create_work_item_note` - Add a note/comment to a work item. Supports Markdown, internal notes, and threaded replies
728
- 184. `list_work_item_emoji_reactions` - List all emoji reactions on a work item
729
- 185. `list_work_item_note_emoji_reactions` - List all emoji reactions on a work item note (comment, thread, or thread reply)
730
- 186. `create_work_item_emoji_reaction` - Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)
731
- 187. `delete_work_item_emoji_reaction` - Remove an emoji reaction from a work item
732
- 188. `create_work_item_note_emoji_reaction` - Add an emoji reaction to a work item note (comment, thread, or thread reply)
733
- 189. `delete_work_item_note_emoji_reaction` - Remove an emoji reaction from a work item note (comment, thread, or thread reply)
734
- 190. `get_timeline_events` - List timeline events for an incident. Returns chronological events with notes, timestamps, and tags
735
- 191. `create_timeline_event` - Create a timeline event on an incident. Supports tags: 'Start time', 'End time', 'Impact detected', 'Response initiated', 'Impact mitigated', 'Cause identified'
736
- 192. `list_webhooks` - List all configured webhooks for a GitLab project or group. Provide either project_id or group_id
737
- 193. `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
738
- 194. `get_webhook_event` - Get full details of a specific webhook event by ID, including request/response payloads
739
- 195. `search_code` - Search for code across all projects on the GitLab instance (requires advanced search or exact code search to be enabled)
740
- 196. `search_project_code` - Search for code within a specific GitLab project (requires advanced search or exact code search to be enabled)
741
- 197. `search_group_code` - Search for code within a specific GitLab group (requires advanced search or exact code search to be enabled)
742
- 198. `list_project_variables` - List CI/CD variables for a project with optional environment scope filter
743
- 199. `get_project_variable` - Get a single CI/CD variable from a project by key, with optional environment scope filter
744
- 200. `create_project_variable` - Create a new CI/CD variable in a project
745
- 201. `update_project_variable` - Update an existing CI/CD variable in a project, with optional filter to disambiguate by environment scope
746
- 202. `delete_project_variable` - Delete a CI/CD variable from a project, with optional filter to disambiguate by environment scope
747
- 203. `list_group_variables` - List CI/CD variables for a group with optional environment scope filter
748
- 204. `get_group_variable` - Get a single CI/CD variable from a group by key, with optional environment scope filter
749
- 205. `create_group_variable` - Create a new CI/CD variable in a group
750
- 206. `update_group_variable` - Update an existing CI/CD variable in a group, with optional filter to disambiguate by environment scope
751
- 207. `delete_group_variable` - Delete a CI/CD variable from a group, with optional filter to disambiguate by environment scope
752
- 208. `get_dependency_proxy_settings` - Get dependency proxy settings for a group (enabled status, blob count, total size, image prefix, TTL policy)
753
- 209. `update_dependency_proxy_settings` - Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)
754
- 210. `list_dependency_proxy_blobs` - List cached dependency proxy blobs for a group with cursor-based pagination
755
- 211. `purge_dependency_proxy_cache` - Schedule purge of all cached dependency proxy blobs for a group
756
- 212. `list_project_vulnerabilities` - List vulnerabilities for a project with optional state, severity, and report type filters (GraphQL-backed, cursor pagination)
757
- 213. `get_vulnerability` - Get full details of a specific vulnerability
758
- 214. `dismiss_vulnerability` - Dismiss a vulnerability with a reason (acceptable_risk, false_positive, used_in_tests, mitigating_control, not_applicable) and optional comment
759
- 215. `confirm_vulnerability` - Confirm a vulnerability as a real finding requiring remediation
760
- 216. `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.
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.44`。如果始终想使用最新版本,请改用 `npx -y @zereight/mcp-gitlab@latest`。有新版本发布时,服务器会在启动时通过 stderr 提示(可用 `GITLAB_DISABLE_VERSION_CHECK=true` 关闭)。
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, { dirname } from "node:path";
73
+ import path from "node:path";
74
74
  import { CookieJar, parse as parseCookie } from "tough-cookie";
75
- import { fileURLToPath, URL } from "node:url";
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.
@@ -6168,6 +6153,35 @@ async function listProjectMembers(projectId, options = {}) {
6168
6153
  const data = await response.json();
6169
6154
  return z.array(GitLabProjectMemberSchema).parse(data);
6170
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
+ }
6171
6185
  /**
6172
6186
  * list group iterations
6173
6187
  *
@@ -7781,6 +7795,14 @@ async function handleToolCall(params) {
7781
7795
  content: [{ type: "text", text: JSON.stringify(members) }],
7782
7796
  };
7783
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
+ }
7784
7806
  case "get_users": {
7785
7807
  const args = GetUsersSchema.parse(params.arguments);
7786
7808
  const usersMap = await getUsers(args.usernames);
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
+ });
@@ -20,7 +20,7 @@ const TOOLSET_TOOL_COUNTS = {
20
20
  issues: 24,
21
21
  repositories: 7,
22
22
  branches: 15,
23
- projects: 10,
23
+ projects: 11,
24
24
  labels: 5,
25
25
  ci: 4,
26
26
  pipelines: 19,
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zereight/mcp-gitlab",
3
- "version": "2.1.45",
3
+ "version": "2.1.46",
4
4
  "mcpName": "io.github.zereight/gitlab-mcp",
5
5
  "description": "GitLab MCP server for projects, merge requests, issues, pipelines, wiki, releases, and more",
6
6
  "keywords": [