@zereight/mcp-gitlab 2.3.8-next.146 → 2.3.8-next.147
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 +117 -15
- package/README.md +120 -16
- package/README.pt-BR.md +117 -15
- package/README.zh-CN.md +117 -15
- package/build/index.js +20 -0
- package/build/server/mcp-help.js +101 -0
- package/build/server/mcp-instructions.js +14 -0
- package/build/tools/exposed-tools.js +11 -5
- package/build/tools/registry.js +7 -0
- package/build/tools/tool-descriptions.js +1 -0
- package/package.json +1 -1
package/README.ko.md
CHANGED
|
@@ -1,30 +1,132 @@
|
|
|
1
1
|
# GitLab MCP Server
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
4
|
-
[](https://vscode.dev/redirect/mcp/install?name=zereight.gitlab-mcp&inputs=%5B%7B%22type%22%3A%22promptString%22%2C%22id%22%3A%22gitlab-token%22%2C%22description%22%3A%22GitLab%20Personal%20Access%20Token%22%2C%22password%22%3Atrue%7D%5D&config=%7B%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40zereight%2Fmcp-gitlab%40latest%22%5D%2C%22env%22%3A%7B%22GITLAB_PERSONAL_ACCESS_TOKEN%22%3A%22%24%7Binput%3Agitlab-token%7D%22%2C%22GITLAB_API_URL%22%3A%22https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%22%7D%7D)
|
|
5
|
-
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
6
4
|
|
|
7
5
|
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
8
6
|
|
|
9
|
-
📖 **[문서 →](https://zereight.github.io/gitlab-mcp/)**
|
|
7
|
+
📖 **[문서 →](https://zereight.github.io/gitlab-mcp/)** · [llms.txt](./llms.txt) · [llms-full.txt](./llms-full.txt)
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
**기본 노출: 40개 도구** (`core` 38개 + `discover_tools` + `help`). 전체는 278개(toolset 275개 + `execute_graphql` + `discover_tools` + `help`). 작게 시작하고, 세션에서 `discover_tools`로 확장하세요.
|
|
12
10
|
|
|
13
11
|
`zereight-mcp-gitlab` 바이너리를 먼저 설치하세요. `npm install -g @zereight/mcp-gitlab`, 또는 Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` 다음 `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`. 공식 MCP Registry 항목: [`io.github.zereight/gitlab-mcp`](https://registry.modelcontextprotocol.io/?q=io.github.zereight%2Fgitlab-mcp). 한 줄 설치: `npx -y @zereight/mcp-gitlab@latest`.
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
### Without → With
|
|
14
|
+
|
|
15
|
+
| 이 MCP 없이 | 이 MCP로 |
|
|
16
|
+
| ----------- | -------- |
|
|
17
|
+
| MR URL과 diff를 채팅에 붙여넣기 | `list_merge_request_changed_files` → 배치 `get_merge_request_file_diff` |
|
|
18
|
+
| GitLab UI에서 job 로그 찾기 | 페이지네이션과 함께 `get_pipeline_job_output` |
|
|
19
|
+
| 매 턴마다 프로젝트 경로를 다시 설명 | `project_id=group%2Fproject`, `merge_request_iid=123` |
|
|
20
|
+
|
|
21
|
+
### 설치 3경로
|
|
22
|
+
|
|
23
|
+
| 경로 | 언제 | 어떻게 |
|
|
24
|
+
| ---- | ---- | ------ |
|
|
25
|
+
| 로컬 IDE | 내 머신의 Cursor, Claude Code, Codex | stdio + PAT 또는 로컬 OAuth |
|
|
26
|
+
| 공유 HTTP | 팀 / 호스팅 MCP | Streamable HTTP URL + 원격 인증 또는 MCP OAuth |
|
|
27
|
+
| Claude.ai | Claude 웹 커넥터 | 공개 HTTPS + `GITLAB_MCP_OAUTH` |
|
|
28
|
+
|
|
29
|
+
### 설치
|
|
30
|
+
|
|
31
|
+
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
32
|
+
|
|
33
|
+
바이너리를 먼저 설치하세요 (`npm install -g @zereight/mcp-gitlab`, 또는 Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` 다음 `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`). 토큰은 화면에 표시하지 않고 읽으세요:
|
|
16
34
|
|
|
17
35
|
```bash
|
|
18
36
|
read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
19
37
|
```
|
|
20
38
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
```bash
|
|
40
|
+
# Claude Code
|
|
41
|
+
claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
42
|
+
|
|
43
|
+
# Codex
|
|
44
|
+
codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
다른 클라이언트: [VS Code](./docs/clients/vscode.md) · [GitHub Copilot](./docs/clients/copilot.md) · [JSON 클라이언트](./docs/clients/json-clients.md) · [Cursor 상세](./docs/clients/cursor.md)
|
|
48
|
+
|
|
49
|
+
### 에이전트용 붙여넣기 프롬프트
|
|
50
|
+
|
|
51
|
+
MCP 설정을 고칠 수 있는 에이전트에 그대로 붙여넣으세요:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
이 워크스페이스에 GitLab MCP 서버(@zereight/mcp-gitlab)를 설치하세요.
|
|
55
|
+
바이너리: zereight-mcp-gitlab (npm i -g @zereight/mcp-gitlab, 또는 npx -y @zereight/mcp-gitlab@latest).
|
|
56
|
+
인증: GITLAB_PERSONAL_ACCESS_TOKEN 과 GITLAB_API_URL=https://gitlab.com/api/v4 (또는 GITLAB_USE_OAUTH=true).
|
|
57
|
+
로컬: claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
58
|
+
또는: codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
59
|
+
Cursor: README deeplink 또는 docs/clients/cursor.md.
|
|
60
|
+
원격 HTTP: 클라이언트를 https://mcp.example.com/mcp (Streamable HTTP)로 연결. Claude.ai는 그 호스트에 GITLAB_MCP_OAUTH가 필요합니다.
|
|
61
|
+
기본 목록: 40개 도구(core 38 + discover_tools + help). 확장은 discover_tools. api toolset은 우회 위험을 받아들일 때만.
|
|
62
|
+
MCP 없는 동등 경로: npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill 와 zereight-mcp-gitlab CLI.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 원격 HTTP
|
|
66
|
+
|
|
67
|
+
호스팅/셀프호스트 서버의 1순위 옵션입니다. 클라이언트를 Streamable HTTP URL로 연결하세요:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"mcpServers": {
|
|
72
|
+
"gitlab": {
|
|
73
|
+
"type": "http",
|
|
74
|
+
"url": "https://mcp.example.com/mcp"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- 호스팅 / Claude.ai: 서버에서 `GITLAB_MCP_OAUTH=true` ([MCP OAuth](#mcp-oauth-프록시-사용하기-gitlab_mcp_oauth) 참고)
|
|
81
|
+
- 사용자별 PAT 헤더: `REMOTE_AUTHORIZATION=true` ([원격 인증](#원격-인증-사용하기-remote_authorization) 참고)
|
|
82
|
+
- 로컬 Docker 예시는 [사용법](#사용법)에 있습니다
|
|
83
|
+
|
|
84
|
+
### Skill + CLI (MCP 불필요)
|
|
85
|
+
|
|
86
|
+
Skill + CLI는 폴백이 아니라 동등한 경로입니다. 같은 워크플로우, 터미널의 전체 페이로드, MCP 등록 없음.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill
|
|
90
|
+
zereight-mcp-gitlab user whoami
|
|
91
|
+
zereight-mcp-gitlab mr list
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
[MCP 없이 CLI](./docs/getting-started/cli-without-mcp.md)와 [`skills/gitlab-mcp/`](./skills/gitlab-mcp/)를 보세요.
|
|
95
|
+
|
|
96
|
+
### MCP vs Human CLI
|
|
97
|
+
|
|
98
|
+
| MCP를 쓸 때 | CLI를 쓸 때 |
|
|
99
|
+
| ----------- | ----------- |
|
|
100
|
+
| 채팅에서 구조화된 도구가 필요할 때 | 전체 페이로드(diff, 로그, 아티팩트)가 필요할 때 |
|
|
101
|
+
| `jmespath`나 compact 결과로 충분할 때 | `GITLAB_MCP_COMPACT_RESULTS`가 켜져 있고 나머지는 터미널에서 볼 때 |
|
|
102
|
+
| 이미 MCP 서버를 등록했을 때 | PAT가 있거나 `auth`를 했고 MCP가 필요 없을 때 |
|
|
103
|
+
|
|
104
|
+
Human CLI는 compact되지 않습니다. 파괴적 도구와 `GITLAB_TOOL_POLICY_APPROVE` 도구는 `--yes`가 필요합니다.
|
|
105
|
+
|
|
106
|
+
### Tips
|
|
107
|
+
|
|
108
|
+
`project_id`는 숫자 ID 또는 URL 인코딩된 경로입니다. 예: 그룹 `group`, 프로젝트 `project`, MR `!123` → `project_id=group%2Fproject`, `merge_request_iid=123`. 중첩 그룹은 세그먼트마다 `%2F`를 씁니다 (`group%2Fsubgroup%2Fproject`).
|
|
109
|
+
|
|
110
|
+
### FAQ
|
|
111
|
+
|
|
112
|
+
**인증은 어떻게 하나요?** 로컬 데스크톱은 `GITLAB_PERSONAL_ACCESS_TOKEN`(또는 `GITLAB_PERSONAL_ACCESS_TOKEN_FILE`)이 가장 단순합니다. 로컬 OAuth는 `GITLAB_USE_OAUTH=true`. 원격 Claude.ai는 `GITLAB_MCP_OAUTH`. 멀티유저 HTTP는 `REMOTE_AUTHORIZATION`과 요청별 토큰 헤더입니다.
|
|
113
|
+
|
|
114
|
+
**도구가 40개만 보이는 이유는?** 기본 `core` toolset 38개에 항상 켜진 `discover_tools`와 `help`가 더해집니다. 인자 없이 `discover_tools`를 호출하면 카테고리 목록이 나오고, 카테고리(`pipelines`, `wiki` 등)를 넘기면 이 세션에 활성화됩니다. `GITLAB_TOOLSETS=all`도 `api`는 켜지 않습니다.
|
|
115
|
+
|
|
116
|
+
**로컬 OAuth / MCP OAuth / 원격 인증 차이는?** 로컬 OAuth는 서버와 같은 머신에서 브라우저를 엽니다. MCP OAuth는 공개 HTTPS 서버와 Claude.ai 같은 클라이언트용입니다. 원격 인증은 호출자의 PAT 또는 job token을 전달하며 OAuth 흐름이 없습니다.
|
|
117
|
+
|
|
118
|
+
**큰 응답을 줄이려면?** 도구 호출에 `jmespath`를 넘기세요. 또는 `GITLAB_MCP_COMPACT_RESULTS=true`로 큰 MCP 응답을 미리보기 + CLI 명령으로 바꿉니다. 전체 페이로드가 필요하면 CLI를 쓰세요.
|
|
119
|
+
|
|
120
|
+
**`api` toolset이 위험한 이유는?** `gitlab_api_request`는 그룹/프로젝트 허용 목록, 다른 도구 필터, 도구별 안전 검사를 우회합니다. 프롬프트 인젝션이 이 도구를 구동할 수 있습니다. `GITLAB_TOOLSETS`에 `api`를 직접 넣을 때만 켜세요. `all`, `discover_tools`, `GITLAB_TOOLS`는 켜지 않습니다.
|
|
121
|
+
|
|
122
|
+
### Cursor rule / CLAUDE.md 스니펫
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
GitLab 머지 리퀘스트, 이슈, 파이프라인은 이 MCP(@zereight/mcp-gitlab)로 처리하세요.
|
|
126
|
+
기본 core 도구로 시작하고, 확장은 discover_tools를 호출하세요.
|
|
127
|
+
list_merge_request_changed_files 다음 배치 get_merge_request_file_diff를 우선하세요.
|
|
128
|
+
결과는 jmespath 또는 compact를 쓰고, 전체 diff와 job 로그는 CLI를 쓰세요.
|
|
129
|
+
```
|
|
28
130
|
|
|
29
131
|
[](https://www.star-history.com/?repos=zereight%2Fgitlab-mcp&type=date&legend=top-left)
|
|
30
132
|
|
|
@@ -36,7 +138,7 @@ PAT, OAuth, 읽기 전용 모드, 동적 API URL, 원격 인증을 지원하며
|
|
|
36
138
|
|
|
37
139
|
### 왜 이 GitLab MCP를 사용하나요?
|
|
38
140
|
|
|
39
|
-
-
|
|
141
|
+
- **기본 40개 도구(`core` 38 + `discover_tools` + `help`); 전체 278개** — 작게 시작하고, `discover_tools`로 세션에서 확장
|
|
40
142
|
- **MR 2단계 리뷰** — `list_merge_request_changed_files` → 배치 `get_merge_request_file_diff`
|
|
41
143
|
- **Agent Skill 내장** — `skills/gitlab-mcp/` 워크플로우 가이드
|
|
42
144
|
- **유연한 인증** — Personal Access Token, 로컬 OAuth2 브라우저 플로우, MCP OAuth 프록시, 요청별 원격 인증
|
|
@@ -50,7 +152,7 @@ PAT, OAuth, 읽기 전용 모드, 동적 API URL, 원격 인증을 지원하며
|
|
|
50
152
|
| | @zereight/mcp-gitlab | GitLab MCP A (커뮤니티 CQRS형) | GitLab 공식 MCP 서버 |
|
|
51
153
|
| --------------- | ---------------------------------------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
154
|
| **적합한 경우** | AI 에이전트 워크플로우 | 엔터프라이즈 멀티 인스턴스 / 그룹형 도구 | GitLab에 내장, 별도 설치 없음 |
|
|
53
|
-
| **도구 모델** |
|
|
155
|
+
| **도구 모델** | 278개 도구: toolset 275개 + `execute_graphql` + `discover_tools` + `help` | ~50–60개 `browse_*` / `manage_*` 그룹 도구 | HTTP 헤더로 고르는 toolset |
|
|
54
156
|
| **MR 리뷰** | 2단계 배치 diff | 서버마다 다름 | `get_merge_request`에 diffs |
|
|
55
157
|
| **Node.js** | >=18.17 | 보통 >=24 | stdio는 `mcp-remote`, Node.js 20+ |
|
|
56
158
|
| **라이선스** | MIT | 서버마다 다름 | GitLab의 일부 |
|
|
@@ -603,7 +705,7 @@ node build/index.js
|
|
|
603
705
|
|
|
604
706
|
## Agent Skill Files
|
|
605
707
|
|
|
606
|
-
AI 에이전트가 skill/instruction 로딩을 지원하는 경우(Claude Code, GitHub Copilot, Cursor 등), [`skills/gitlab-mcp/`](./skills/gitlab-mcp/)에 미리 작성된 skill 파일을 사용할 수 있습니다.
|
|
708
|
+
Skill + CLI는 MCP와 동등한 경로입니다([Skill + CLI](#skill--cli-mcp-불필요) 참고). AI 에이전트가 skill/instruction 로딩을 지원하는 경우(Claude Code, GitHub Copilot, Cursor 등), [`skills/gitlab-mcp/`](./skills/gitlab-mcp/)에 미리 작성된 skill 파일을 사용할 수 있습니다.
|
|
607
709
|
|
|
608
710
|
- **[SKILL.md](./skills/gitlab-mcp/SKILL.md)** — 도구셋 개요, 핵심 워크플로우, 파라미터 힌트를 담은 핵심 가이드
|
|
609
711
|
- **[reference/](./skills/gitlab-mcp/reference/)** — 코드 리뷰, 머지 리퀘스트, 이슈, 파이프라인, 취약점 트리아지용 상세 워크플로우 문서
|
package/README.md
CHANGED
|
@@ -4,32 +4,135 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
5
5
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
6
6
|
[](https://github.com/zereight/gitlab-mcp/blob/main/LICENSE)
|
|
7
|
-
[](https://vscode.dev/redirect/mcp/install?name=zereight.gitlab-mcp&inputs=%5B%7B%22type%22%3A%22promptString%22%2C%22id%22%3A%22gitlab-token%22%2C%22description%22%3A%22GitLab%20Personal%20Access%20Token%22%2C%22password%22%3Atrue%7D%5D&config=%7B%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40zereight%2Fmcp-gitlab%40latest%22%5D%2C%22env%22%3A%7B%22GITLAB_PERSONAL_ACCESS_TOKEN%22%3A%22%24%7Binput%3Agitlab-token%7D%22%2C%22GITLAB_API_URL%22%3A%22https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%22%7D%7D)
|
|
8
|
-
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
9
7
|
[](https://deepwiki.com/zereight/gitlab-mcp)
|
|
10
|
-
[](https://mcptoplist.com/server/io.github.zereight%2Fgitlab-mcp)
|
|
8
|
+
[](https://mcptoplist.com/server/io.github.zereight%2Fgitlab-mcp)
|
|
9
|
+
[](https://mcpindex.ai/server/io-github-zereight-gitlab-mcp)
|
|
11
10
|
|
|
12
11
|
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
13
12
|
|
|
14
|
-
📖 **[Documentation →](https://zereight.github.io/gitlab-mcp/)**
|
|
13
|
+
📖 **[Documentation →](https://zereight.github.io/gitlab-mcp/)** · [llms.txt](./llms.txt) · [llms-full.txt](./llms-full.txt)
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
**Default: 40 tools** (38 `core` + `discover_tools` + `help`). 278 tools exist in total (275 in toolsets + `execute_graphql` + `discover_tools` + `help`). Start lean; call `discover_tools` to activate more for this session.
|
|
17
16
|
|
|
18
17
|
Install the `zereight-mcp-gitlab` binary first with `npm install -g @zereight/mcp-gitlab`, or Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` and `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`. Official MCP Registry listing: [`io.github.zereight/gitlab-mcp`](https://registry.modelcontextprotocol.io/?q=io.github.zereight%2Fgitlab-mcp). One-liner: `npx -y @zereight/mcp-gitlab@latest`.
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
### Without → With
|
|
20
|
+
|
|
21
|
+
| Without this MCP | With this MCP |
|
|
22
|
+
| ---------------- | ------------- |
|
|
23
|
+
| Paste MR URLs and diffs into chat | `list_merge_request_changed_files` → batched `get_merge_request_file_diff` |
|
|
24
|
+
| Hunt job logs in the GitLab UI | `get_pipeline_job_output` with pagination |
|
|
25
|
+
| Re-explain the project path every turn | `project_id=group%2Fproject` and `merge_request_iid=123` |
|
|
26
|
+
|
|
27
|
+
### Three install paths
|
|
28
|
+
|
|
29
|
+
| Path | When | How |
|
|
30
|
+
| ---- | ---- | --- |
|
|
31
|
+
| Local IDE | Cursor, Claude Code, Codex on your machine | stdio + PAT or local OAuth |
|
|
32
|
+
| Shared HTTP | Team or hosted MCP | Streamable HTTP URL + remote auth or MCP OAuth |
|
|
33
|
+
| Claude.ai | Claude web connectors | Public HTTPS + `GITLAB_MCP_OAUTH` |
|
|
34
|
+
|
|
35
|
+
### Install
|
|
36
|
+
|
|
37
|
+
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
38
|
+
|
|
39
|
+
Install the binary first (`npm install -g @zereight/mcp-gitlab`, or Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` then `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`). Read the token without echo:
|
|
21
40
|
|
|
22
41
|
```bash
|
|
23
42
|
read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
24
43
|
```
|
|
25
44
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
45
|
+
```bash
|
|
46
|
+
# Claude Code
|
|
47
|
+
claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
48
|
+
|
|
49
|
+
# Codex
|
|
50
|
+
codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Other clients: [VS Code](./docs/clients/vscode.md) · [GitHub Copilot](./docs/clients/copilot.md) · [JSON clients](./docs/clients/json-clients.md) · [Cursor details](./docs/clients/cursor.md)
|
|
54
|
+
|
|
55
|
+
### Agent paste-prompt
|
|
56
|
+
|
|
57
|
+
Copy this into an agent that can edit MCP config:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Install the GitLab MCP server (@zereight/mcp-gitlab) for this workspace.
|
|
61
|
+
Binary: zereight-mcp-gitlab (npm i -g @zereight/mcp-gitlab, or npx -y @zereight/mcp-gitlab@latest).
|
|
62
|
+
Auth: GITLAB_PERSONAL_ACCESS_TOKEN plus GITLAB_API_URL=https://gitlab.com/api/v4 (or GITLAB_USE_OAUTH=true).
|
|
63
|
+
Local: claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
64
|
+
Or: codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
65
|
+
Cursor: use the README deeplink or docs/clients/cursor.md.
|
|
66
|
+
Remote HTTP: point the client at https://mcp.example.com/mcp (Streamable HTTP). Claude.ai needs GITLAB_MCP_OAUTH on that host.
|
|
67
|
+
Default list: 40 tools (38 core + discover_tools + help). Call discover_tools to expand. Do not enable the api toolset unless you accept its bypass risk.
|
|
68
|
+
Equal non-MCP path: npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill plus the zereight-mcp-gitlab CLI.
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Remote HTTP
|
|
72
|
+
|
|
73
|
+
First-class option for a hosted or self-hosted server. Point the client at a Streamable HTTP URL:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"mcpServers": {
|
|
78
|
+
"gitlab": {
|
|
79
|
+
"type": "http",
|
|
80
|
+
"url": "https://mcp.example.com/mcp"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- Hosted / Claude.ai: `GITLAB_MCP_OAUTH=true` on the server (see [MCP OAuth](#mcp-oauth-setup-claudeai-native-oauth))
|
|
87
|
+
- Per-user PAT headers: `REMOTE_AUTHORIZATION=true` (see [Remote Authorization](#using-remote-authorization-remote_authorization))
|
|
88
|
+
- Local Docker examples are in [Usage](#usage)
|
|
89
|
+
|
|
90
|
+
### Skill + CLI (no MCP required)
|
|
91
|
+
|
|
92
|
+
Skill + CLI is an equal path, not a fallback. Same workflows, full payloads in a terminal, no MCP registration.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill
|
|
96
|
+
zereight-mcp-gitlab user whoami
|
|
97
|
+
zereight-mcp-gitlab mr list
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
See [CLI without MCP](./docs/getting-started/cli-without-mcp.md) and [`skills/gitlab-mcp/`](./skills/gitlab-mcp/).
|
|
101
|
+
|
|
102
|
+
### MCP vs Human CLI
|
|
103
|
+
|
|
104
|
+
| Use MCP when | Use the CLI when |
|
|
105
|
+
| ------------ | ---------------- |
|
|
106
|
+
| The agent needs structured tools in chat | You need the full payload (diffs, logs, artifacts) |
|
|
107
|
+
| `jmespath` or compact results are enough | `GITLAB_MCP_COMPACT_RESULTS` is on and you want the rest in a terminal |
|
|
108
|
+
| You already registered the server | You have a PAT or ran `auth` and do not want MCP |
|
|
109
|
+
|
|
110
|
+
Human CLI is never compacted. Destructive tools and `GITLAB_TOOL_POLICY_APPROVE` tools need `--yes`.
|
|
111
|
+
|
|
112
|
+
### Tips
|
|
113
|
+
|
|
114
|
+
`project_id` is a numeric ID or a URL-encoded path. Example: group `group`, project `project`, merge request `!123` → `project_id=group%2Fproject`, `merge_request_iid=123`. Nested groups use `%2F` between every segment (`group%2Fsubgroup%2Fproject`).
|
|
115
|
+
|
|
116
|
+
### FAQ
|
|
117
|
+
|
|
118
|
+
**How do I authenticate?** Local desktop: `GITLAB_PERSONAL_ACCESS_TOKEN` (or `GITLAB_PERSONAL_ACCESS_TOKEN_FILE`) is the simplest. Local OAuth is `GITLAB_USE_OAUTH=true`. Remote Claude.ai uses `GITLAB_MCP_OAUTH`. Multi-user HTTP uses `REMOTE_AUTHORIZATION` and a per-request token header.
|
|
119
|
+
|
|
120
|
+
**Why do I only see ~40 tools?** The default `core` toolset is 38 tools plus always-on `discover_tools` and `help`. Call `discover_tools` with no args to list categories, then pass a category (`pipelines`, `wiki`, …) to activate it for this session. `GITLAB_TOOLSETS=all` still does **not** enable `api`.
|
|
121
|
+
|
|
122
|
+
**Local OAuth vs MCP OAuth vs remote auth?** Local OAuth opens a browser on the same machine as the server. MCP OAuth is for a public HTTPS server and clients such as Claude.ai. Remote authorization forwards the caller's PAT or job token; there is no OAuth dance.
|
|
123
|
+
|
|
124
|
+
**How do I shrink huge replies?** Pass `jmespath` on any tool call. Or set `GITLAB_MCP_COMPACT_RESULTS=true` so oversized MCP replies become a preview plus a CLI command. Use the CLI when you need the full payload.
|
|
125
|
+
|
|
126
|
+
**Why is the `api` toolset dangerous?** `gitlab_api_request` bypasses group/project allowlists, other tool filters, and per-tool safety checks. Prompt injection can drive it. Enable it only by listing `api` in `GITLAB_TOOLSETS`. `all`, `discover_tools`, and `GITLAB_TOOLS` do not.
|
|
127
|
+
|
|
128
|
+
### Cursor rule / CLAUDE.md snippet
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
GitLab merge requests, issues, and pipelines go through this MCP (@zereight/mcp-gitlab).
|
|
132
|
+
Start with the default core tools. Call discover_tools to expand.
|
|
133
|
+
Prefer list_merge_request_changed_files, then batched get_merge_request_file_diff.
|
|
134
|
+
Use jmespath or compact results; use the CLI for full diffs and job logs.
|
|
135
|
+
```
|
|
33
136
|
|
|
34
137
|
[](https://www.star-history.com/?repos=zereight%2Fgitlab-mcp&type=date&legend=top-left)
|
|
35
138
|
|
|
@@ -41,7 +144,7 @@ Supports PAT, OAuth, read-only mode, dynamic API URLs, and remote authorization
|
|
|
41
144
|
|
|
42
145
|
### Why use this GitLab MCP?
|
|
43
146
|
|
|
44
|
-
- **
|
|
147
|
+
- **Default 40 tools (38 `core` + `discover_tools` + `help`); 278 total** — start lean; call `discover_tools` to activate more without CQRS-style grouping
|
|
45
148
|
- **MR 2-step review** — `list_merge_request_changed_files` → batched `get_merge_request_file_diff`
|
|
46
149
|
- **Agent Skill built in** — workflow guidance in `skills/gitlab-mcp/`
|
|
47
150
|
- **Flexible auth** — Personal Access Token, local OAuth2 browser flow, MCP OAuth proxy, and per-request remote authorization
|
|
@@ -55,7 +158,7 @@ Supports PAT, OAuth, read-only mode, dynamic API URLs, and remote authorization
|
|
|
55
158
|
| | @zereight/mcp-gitlab | GitLab MCP A (community CQRS-style) | GitLab official MCP server |
|
|
56
159
|
| -------------- | ----------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
57
160
|
| **Best for** | AI agent workflows | Enterprise multi-instance / grouped tools | Built into GitLab, no separate install |
|
|
58
|
-
| **Tool model** |
|
|
161
|
+
| **Tool model** | 278 tools: 275 in toolsets + `execute_graphql` + `discover_tools` + `help` | ~50–60 grouped `browse_*` / `manage_*` tools | Toolsets chosen with an HTTP header |
|
|
59
162
|
| **MR review** | 2-step batched diff | Varies | `get_merge_request` with diffs |
|
|
60
163
|
| **Node.js** | >=18.17 | Often >=24 | Node.js 20+ for stdio via `mcp-remote` |
|
|
61
164
|
| **License** | MIT | Varies | Part of GitLab |
|
|
@@ -653,7 +756,7 @@ No `headers` field is needed — Claude.ai obtains the token via OAuth automatic
|
|
|
653
756
|
|
|
654
757
|
## Agent Skill Files
|
|
655
758
|
|
|
656
|
-
Pre-built skill files are available in [`skills/gitlab-mcp/`](./skills/gitlab-mcp/) for AI agents that support skill/instruction loading (Claude Code, GitHub Copilot, Cursor, etc.).
|
|
759
|
+
Skill + CLI is an equal path to MCP (see [Skill + CLI](#skill--cli-no-mcp-required)). Pre-built skill files are available in [`skills/gitlab-mcp/`](./skills/gitlab-mcp/) for AI agents that support skill/instruction loading (Claude Code, GitHub Copilot, Cursor, etc.).
|
|
657
760
|
|
|
658
761
|
- **[SKILL.md](./skills/gitlab-mcp/SKILL.md)** — Core guide (~800 tokens) with toolset overview, key workflows, and parameter hints
|
|
659
762
|
- **[reference/](./skills/gitlab-mcp/reference/)** — Detailed workflow docs for code review, merge requests, issues, pipelines, and vulnerability triage
|
|
@@ -950,6 +1053,7 @@ Register the skill directory in your AI client to get optimal tool usage guidanc
|
|
|
950
1053
|
275. `rebase_merge_request` - Rebase the source branch of a merge request onto its target branch
|
|
951
1054
|
276. `gitlab_api_request` - Send one GitLab REST call under /api/v4. Enabled only when GITLAB_TOOLSETS lists api. Readonly allows GET; modify rejects DELETE.
|
|
952
1055
|
277. `discover_tools` - Discover and activate additional tool categories for this session. Available categories: core, merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response.
|
|
1056
|
+
278. `help` - Return a short GitLab workflow guide. Omit topic for the overview and topic list.
|
|
953
1057
|
|
|
954
1058
|
<!-- TOOLS-END -->
|
|
955
1059
|
|
package/README.pt-BR.md
CHANGED
|
@@ -1,30 +1,132 @@
|
|
|
1
1
|
# GitLab MCP Server
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
4
|
-
[](https://vscode.dev/redirect/mcp/install?name=zereight.gitlab-mcp&inputs=%5B%7B%22type%22%3A%22promptString%22%2C%22id%22%3A%22gitlab-token%22%2C%22description%22%3A%22GitLab%20Personal%20Access%20Token%22%2C%22password%22%3Atrue%7D%5D&config=%7B%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40zereight%2Fmcp-gitlab%40latest%22%5D%2C%22env%22%3A%7B%22GITLAB_PERSONAL_ACCESS_TOKEN%22%3A%22%24%7Binput%3Agitlab-token%7D%22%2C%22GITLAB_API_URL%22%3A%22https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%22%7D%7D)
|
|
5
|
-
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
6
4
|
|
|
7
5
|
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
8
6
|
|
|
9
|
-
📖 **[Documentação →](https://zereight.github.io/gitlab-mcp/)**
|
|
7
|
+
📖 **[Documentação →](https://zereight.github.io/gitlab-mcp/)** · [llms.txt](./llms.txt) · [llms-full.txt](./llms-full.txt)
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
**Padrão: 40 ferramentas** (38 `core` + `discover_tools` + `help`). Existem 278 no total (275 em toolsets + `execute_graphql` + `discover_tools` + `help`). Comece enxuto; chame `discover_tools` para ativar mais nesta sessão.
|
|
12
10
|
|
|
13
11
|
Instale o binário `zereight-mcp-gitlab` antes. `npm install -g @zereight/mcp-gitlab`, ou Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` e `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`. Listagem oficial no MCP Registry: [`io.github.zereight/gitlab-mcp`](https://registry.modelcontextprotocol.io/?q=io.github.zereight%2Fgitlab-mcp). Instalação em uma linha: `npx -y @zereight/mcp-gitlab@latest`.
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
### Without → With
|
|
14
|
+
|
|
15
|
+
| Sem este MCP | Com este MCP |
|
|
16
|
+
| ------------ | ------------ |
|
|
17
|
+
| Colar URLs e diffs de MR no chat | `list_merge_request_changed_files` → `get_merge_request_file_diff` em lote |
|
|
18
|
+
| Caçar logs de job na UI do GitLab | `get_pipeline_job_output` com paginação |
|
|
19
|
+
| Reexplicar o caminho do projeto a cada turno | `project_id=group%2Fproject` e `merge_request_iid=123` |
|
|
20
|
+
|
|
21
|
+
### Três caminhos de instalação
|
|
22
|
+
|
|
23
|
+
| Caminho | Quando | Como |
|
|
24
|
+
| ------- | ------ | ---- |
|
|
25
|
+
| IDE local | Cursor, Claude Code, Codex na sua máquina | stdio + PAT ou OAuth local |
|
|
26
|
+
| HTTP compartilhado | MCP de time ou hospedado | URL Streamable HTTP + auth remota ou MCP OAuth |
|
|
27
|
+
| Claude.ai | Conectores web do Claude | HTTPS público + `GITLAB_MCP_OAUTH` |
|
|
28
|
+
|
|
29
|
+
### Instalação
|
|
30
|
+
|
|
31
|
+
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
32
|
+
|
|
33
|
+
Instale o binário primeiro (`npm install -g @zereight/mcp-gitlab`, ou Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` e `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`). Leia o token sem eco:
|
|
16
34
|
|
|
17
35
|
```bash
|
|
18
36
|
read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
19
37
|
```
|
|
20
38
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
```bash
|
|
40
|
+
# Claude Code
|
|
41
|
+
claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
42
|
+
|
|
43
|
+
# Codex
|
|
44
|
+
codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Outros clientes: [VS Code](./docs/clients/vscode.md) · [GitHub Copilot](./docs/clients/copilot.md) · [Clientes JSON](./docs/clients/json-clients.md) · [Detalhes do Cursor](./docs/clients/cursor.md)
|
|
48
|
+
|
|
49
|
+
### Prompt para colar no agente
|
|
50
|
+
|
|
51
|
+
Cole isto em um agente que possa editar a config MCP:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Instale o servidor GitLab MCP (@zereight/mcp-gitlab) neste workspace.
|
|
55
|
+
Binário: zereight-mcp-gitlab (npm i -g @zereight/mcp-gitlab, ou npx -y @zereight/mcp-gitlab@latest).
|
|
56
|
+
Auth: GITLAB_PERSONAL_ACCESS_TOKEN e GITLAB_API_URL=https://gitlab.com/api/v4 (ou GITLAB_USE_OAUTH=true).
|
|
57
|
+
Local: claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
58
|
+
Ou: codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
59
|
+
Cursor: use o deeplink do README ou docs/clients/cursor.md.
|
|
60
|
+
HTTP remoto: aponte o cliente para https://mcp.example.com/mcp (Streamable HTTP). Claude.ai precisa de GITLAB_MCP_OAUTH nesse host.
|
|
61
|
+
Lista padrão: 40 ferramentas (38 core + discover_tools + help). Expanda com discover_tools. Não habilite o toolset api sem aceitar o risco de bypass.
|
|
62
|
+
Caminho equivalente sem MCP: npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill mais a CLI zereight-mcp-gitlab.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### HTTP remoto
|
|
66
|
+
|
|
67
|
+
Opção de primeira classe para servidor hospedado ou self-hosted. Aponte o cliente para uma URL Streamable HTTP:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"mcpServers": {
|
|
72
|
+
"gitlab": {
|
|
73
|
+
"type": "http",
|
|
74
|
+
"url": "https://mcp.example.com/mcp"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- Hospedado / Claude.ai: `GITLAB_MCP_OAUTH=true` no servidor (veja [MCP OAuth](#usando-o-proxy-mcp-oauth-gitlab_mcp_oauth))
|
|
81
|
+
- Cabeçalhos PAT por usuário: `REMOTE_AUTHORIZATION=true` (veja [autorização remota](#usando-autorização-remota-remote_authorization))
|
|
82
|
+
- Exemplos Docker locais estão em [Uso](#uso)
|
|
83
|
+
|
|
84
|
+
### Skill + CLI (MCP não é obrigatório)
|
|
85
|
+
|
|
86
|
+
Skill + CLI é um caminho equivalente, não um fallback. Os mesmos fluxos, payload completo no terminal, sem registrar MCP.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill
|
|
90
|
+
zereight-mcp-gitlab user whoami
|
|
91
|
+
zereight-mcp-gitlab mr list
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Veja [CLI sem MCP](./docs/getting-started/cli-without-mcp.md) e [`skills/gitlab-mcp/`](./skills/gitlab-mcp/).
|
|
95
|
+
|
|
96
|
+
### MCP vs Human CLI
|
|
97
|
+
|
|
98
|
+
| Use o MCP quando | Use a CLI quando |
|
|
99
|
+
| ---------------- | ---------------- |
|
|
100
|
+
| O agente precisa de ferramentas estruturadas no chat | Você precisa do payload completo (diffs, logs, artefatos) |
|
|
101
|
+
| `jmespath` ou resultados compactos bastam | `GITLAB_MCP_COMPACT_RESULTS` está ligado e o resto vai para o terminal |
|
|
102
|
+
| Você já registrou o servidor | Você tem um PAT ou rodou `auth` e não quer MCP |
|
|
103
|
+
|
|
104
|
+
A CLI humana nunca é compactada. Ferramentas destrutivas e `GITLAB_TOOL_POLICY_APPROVE` precisam de `--yes`.
|
|
105
|
+
|
|
106
|
+
### Tips
|
|
107
|
+
|
|
108
|
+
`project_id` é um ID numérico ou um caminho com URL-encoding. Exemplo: grupo `group`, projeto `project`, merge request `!123` → `project_id=group%2Fproject`, `merge_request_iid=123`. Grupos aninhados usam `%2F` entre cada segmento (`group%2Fsubgroup%2Fproject`).
|
|
109
|
+
|
|
110
|
+
### FAQ
|
|
111
|
+
|
|
112
|
+
**Como autenticar?** No desktop local, `GITLAB_PERSONAL_ACCESS_TOKEN` (ou `GITLAB_PERSONAL_ACCESS_TOKEN_FILE`) é o mais simples. OAuth local é `GITLAB_USE_OAUTH=true`. Claude.ai remoto usa `GITLAB_MCP_OAUTH`. HTTP multi-usuário usa `REMOTE_AUTHORIZATION` e um cabeçalho de token por requisição.
|
|
113
|
+
|
|
114
|
+
**Por que vejo só ~40 ferramentas?** O toolset `core` padrão tem 38 ferramentas mais o `discover_tools` e o `help` sempre ligados. Chame `discover_tools` sem args para listar categorias e passe uma (`pipelines`, `wiki`, …) para ativá-la nesta sessão. `GITLAB_TOOLSETS=all` ainda **não** habilita `api`.
|
|
115
|
+
|
|
116
|
+
**OAuth local vs MCP OAuth vs auth remota?** OAuth local abre o navegador na mesma máquina do servidor. MCP OAuth é para um servidor HTTPS público e clientes como Claude.ai. Autorização remota encaminha o PAT ou job token do chamador; não há fluxo OAuth.
|
|
117
|
+
|
|
118
|
+
**Como encolher respostas enormes?** Passe `jmespath` em qualquer chamada. Ou defina `GITLAB_MCP_COMPACT_RESULTS=true` para trocar respostas MCP grandes por um preview e um comando CLI. Use a CLI quando quiser o payload completo.
|
|
119
|
+
|
|
120
|
+
**Por que o toolset `api` é perigoso?** `gitlab_api_request` ignora allowlists de grupo/projeto, outros filtros de ferramenta e checagens de segurança por ferramenta. Prompt injection pode acioná-lo. Habilite só listando `api` em `GITLAB_TOOLSETS`. `all`, `discover_tools` e `GITLAB_TOOLS` não fazem isso.
|
|
121
|
+
|
|
122
|
+
### Snippet de Cursor rule / CLAUDE.md
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
Merge requests, issues e pipelines do GitLab passam por este MCP (@zereight/mcp-gitlab).
|
|
126
|
+
Comece pelas ferramentas core padrão. Chame discover_tools para expandir.
|
|
127
|
+
Prefira list_merge_request_changed_files e depois get_merge_request_file_diff em lote.
|
|
128
|
+
Use jmespath ou resultados compactos; use a CLI para diffs e logs completos.
|
|
129
|
+
```
|
|
28
130
|
|
|
29
131
|
[](https://www.star-history.com/?repos=zereight%2Fgitlab-mcp&type=date&legend=top-left)
|
|
30
132
|
|
|
@@ -36,7 +138,7 @@ Suporta PAT, OAuth, modo somente leitura, URLs de API dinâmicas e autorização
|
|
|
36
138
|
|
|
37
139
|
### Por que usar este GitLab MCP?
|
|
38
140
|
|
|
39
|
-
- **
|
|
141
|
+
- **40 ferramentas por padrão (38 `core` + `discover_tools` + `help`); 278 no total** — comece enxuto; chame `discover_tools` para expandir nesta sessão
|
|
40
142
|
- **Revisão de MR em 2 etapas** — `list_merge_request_changed_files` → `get_merge_request_file_diff` em lote
|
|
41
143
|
- **Agent Skill integrado** — orientação de workflows em `skills/gitlab-mcp/`
|
|
42
144
|
- **Autenticação flexível** — Personal Access Token, fluxo OAuth2 local no navegador, proxy MCP OAuth e autorização remota por requisição
|
|
@@ -50,7 +152,7 @@ Suporta PAT, OAuth, modo somente leitura, URLs de API dinâmicas e autorização
|
|
|
50
152
|
| | @zereight/mcp-gitlab | GitLab MCP A (comunidade, estilo CQRS) | Servidor MCP oficial do GitLab |
|
|
51
153
|
| ------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
154
|
| **Mais indicado para** | Workflows de agentes de IA | Múltiplas instâncias corporativas / ferramentas agrupadas | Integrado ao GitLab, sem instalação separada |
|
|
53
|
-
| **Modelo de ferramentas** |
|
|
155
|
+
| **Modelo de ferramentas** | 278 ferramentas: 275 em toolsets + `execute_graphql` + `discover_tools` + `help` | ~50–60 ferramentas agrupadas `browse_*` / `manage_*` | Toolsets escolhidos por cabeçalho HTTP |
|
|
54
156
|
| **Revisão de MR** | Diff em lote em 2 etapas | Varia | `get_merge_request` com diffs |
|
|
55
157
|
| **Node.js** | >=18.17 | Frequentemente >=24 | Node.js 20+ para stdio via `mcp-remote` |
|
|
56
158
|
| **Licença** | MIT | Varia | Parte do GitLab |
|
|
@@ -603,7 +705,7 @@ Não é necessário definir `headers`. O Claude.ai obtém o token via OAuth.
|
|
|
603
705
|
|
|
604
706
|
## Arquivos de Agent Skill
|
|
605
707
|
|
|
606
|
-
Para agentes de IA que suportam carregamento de skills/instructions (Claude Code, GitHub Copilot, Cursor etc.), arquivos de skill pré-configurados estão disponíveis em [`skills/gitlab-mcp/`](./skills/gitlab-mcp/).
|
|
708
|
+
Skill + CLI é um caminho equivalente ao MCP (veja [Skill + CLI](#skill--cli-mcp-não-é-obrigatório)). Para agentes de IA que suportam carregamento de skills/instructions (Claude Code, GitHub Copilot, Cursor etc.), arquivos de skill pré-configurados estão disponíveis em [`skills/gitlab-mcp/`](./skills/gitlab-mcp/).
|
|
607
709
|
|
|
608
710
|
- **[SKILL.md](./skills/gitlab-mcp/SKILL.md)** — guia principal com visão geral dos toolsets, workflows importantes e dicas de parâmetros
|
|
609
711
|
- **[reference/](./skills/gitlab-mcp/reference/)** — documentação detalhada de workflows para code review, merge requests, issues, pipelines e triagem de vulnerabilidades
|
package/README.zh-CN.md
CHANGED
|
@@ -1,30 +1,132 @@
|
|
|
1
1
|
# GitLab MCP Server
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
4
|
-
[](https://vscode.dev/redirect/mcp/install?name=zereight.gitlab-mcp&inputs=%5B%7B%22type%22%3A%22promptString%22%2C%22id%22%3A%22gitlab-token%22%2C%22description%22%3A%22GitLab%20Personal%20Access%20Token%22%2C%22password%22%3Atrue%7D%5D&config=%7B%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40zereight%2Fmcp-gitlab%40latest%22%5D%2C%22env%22%3A%7B%22GITLAB_PERSONAL_ACCESS_TOKEN%22%3A%22%24%7Binput%3Agitlab-token%7D%22%2C%22GITLAB_API_URL%22%3A%22https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%22%7D%7D)
|
|
5
|
-
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
6
4
|
|
|
7
5
|
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
8
6
|
|
|
9
|
-
📖 **[文档 →](https://zereight.github.io/gitlab-mcp/)**
|
|
7
|
+
📖 **[文档 →](https://zereight.github.io/gitlab-mcp/)** · [llms.txt](./llms.txt) · [llms-full.txt](./llms-full.txt)
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
**默认暴露 40 个工具**(38 个 `core` + `discover_tools` + `help`)。总共 278 个(toolset 中 275 个 + `execute_graphql` + `discover_tools` + `help`)。先用精简集,再在本会话中用 `discover_tools` 扩展。
|
|
12
10
|
|
|
13
11
|
先安装 `zereight-mcp-gitlab` 二进制。`npm install -g @zereight/mcp-gitlab`,或 Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` 然后 `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`。官方 MCP Registry 条目:[`io.github.zereight/gitlab-mcp`](https://registry.modelcontextprotocol.io/?q=io.github.zereight%2Fgitlab-mcp)。一键安装:`npx -y @zereight/mcp-gitlab@latest`。
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
### Without → With
|
|
14
|
+
|
|
15
|
+
| 没有此 MCP | 有此 MCP |
|
|
16
|
+
| ---------- | -------- |
|
|
17
|
+
| 把 MR URL 和 diff 粘贴进聊天 | `list_merge_request_changed_files` → 批量 `get_merge_request_file_diff` |
|
|
18
|
+
| 在 GitLab UI 里翻 job 日志 | 带分页的 `get_pipeline_job_output` |
|
|
19
|
+
| 每一轮都重新说明项目路径 | `project_id=group%2Fproject` 和 `merge_request_iid=123` |
|
|
20
|
+
|
|
21
|
+
### 三条安装路径
|
|
22
|
+
|
|
23
|
+
| 路径 | 适用 | 方式 |
|
|
24
|
+
| ---- | ---- | ---- |
|
|
25
|
+
| 本地 IDE | 本机上的 Cursor、Claude Code、Codex | stdio + PAT 或本地 OAuth |
|
|
26
|
+
| 共享 HTTP | 团队 / 托管 MCP | Streamable HTTP URL + 远程授权或 MCP OAuth |
|
|
27
|
+
| Claude.ai | Claude 网页连接器 | 公网 HTTPS + `GITLAB_MCP_OAUTH` |
|
|
28
|
+
|
|
29
|
+
### 安装
|
|
30
|
+
|
|
31
|
+
[](https://cursor.com/en/install-mcp?name=zereight.gitlab-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkB6ZXJlaWdodC9tY3AtZ2l0bGFiQGxhdGVzdCJdLCJlbnYiOnsiR0lUTEFCX1BFUlNPTkFMX0FDQ0VTU19UT0tFTiI6IiR7ZW52OkdJVExBQl9QRVJTT05BTF9BQ0NFU1NfVE9LRU59IiwiR0lUTEFCX0FQSV9VUkwiOiJodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0In19)
|
|
32
|
+
|
|
33
|
+
先安装二进制(`npm install -g @zereight/mcp-gitlab`,或 Homebrew `brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp` 然后 `brew install zereight/gitlab-mcp/zereight-mcp-gitlab`)。不回显地读取令牌:
|
|
16
34
|
|
|
17
35
|
```bash
|
|
18
36
|
read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
19
37
|
```
|
|
20
38
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
```bash
|
|
40
|
+
# Claude Code
|
|
41
|
+
claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
42
|
+
|
|
43
|
+
# Codex
|
|
44
|
+
codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
其他客户端:[VS Code](./docs/clients/vscode.md) · [GitHub Copilot](./docs/clients/copilot.md) · [JSON 客户端](./docs/clients/json-clients.md) · [Cursor 详情](./docs/clients/cursor.md)
|
|
48
|
+
|
|
49
|
+
### 代理粘贴提示
|
|
50
|
+
|
|
51
|
+
把下面内容粘贴给能改 MCP 配置的代理:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
为此工作区安装 GitLab MCP 服务器(@zereight/mcp-gitlab)。
|
|
55
|
+
二进制:zereight-mcp-gitlab(npm i -g @zereight/mcp-gitlab,或 npx -y @zereight/mcp-gitlab@latest)。
|
|
56
|
+
认证:GITLAB_PERSONAL_ACCESS_TOKEN 和 GITLAB_API_URL=https://gitlab.com/api/v4(或 GITLAB_USE_OAUTH=true)。
|
|
57
|
+
本地:claude mcp add gitlab --transport stdio --scope local --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
58
|
+
或:codex mcp add gitlab --env GITLAB_PERSONAL_ACCESS_TOKEN="$GITLAB_PERSONAL_ACCESS_TOKEN" --env GITLAB_API_URL=https://gitlab.com/api/v4 -- zereight-mcp-gitlab
|
|
59
|
+
Cursor:使用 README deeplink 或 docs/clients/cursor.md。
|
|
60
|
+
远程 HTTP:将客户端指向 https://mcp.example.com/mcp(Streamable HTTP)。Claude.ai 需要该主机启用 GITLAB_MCP_OAUTH。
|
|
61
|
+
默认列表:40 个工具(38 个 core + discover_tools + help)。用 discover_tools 扩展。除非接受绕过风险,否则不要启用 api toolset。
|
|
62
|
+
同等非 MCP 路径:npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill 加上 zereight-mcp-gitlab CLI。
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 远程 HTTP
|
|
66
|
+
|
|
67
|
+
托管或自建服务器的一等选项。把客户端指向 Streamable HTTP URL:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"mcpServers": {
|
|
72
|
+
"gitlab": {
|
|
73
|
+
"type": "http",
|
|
74
|
+
"url": "https://mcp.example.com/mcp"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- 托管 / Claude.ai:服务器上设置 `GITLAB_MCP_OAUTH=true`(见 [MCP OAuth](#使用-mcp-oauth-代理gitlab_mcp_oauth))
|
|
81
|
+
- 每用户 PAT 头:`REMOTE_AUTHORIZATION=true`(见 [远程授权](#使用远程授权remote_authorization))
|
|
82
|
+
- 本地 Docker 示例见 [使用方法](#使用方法)
|
|
83
|
+
|
|
84
|
+
### Skill + CLI(不需要 MCP)
|
|
85
|
+
|
|
86
|
+
Skill + CLI 是同等路径,不是备选。同样的工作流,终端里拿完整载荷,无需注册 MCP。
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill
|
|
90
|
+
zereight-mcp-gitlab user whoami
|
|
91
|
+
zereight-mcp-gitlab mr list
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
见 [不使用 MCP 的 CLI](./docs/getting-started/cli-without-mcp.md) 和 [`skills/gitlab-mcp/`](./skills/gitlab-mcp/)。
|
|
95
|
+
|
|
96
|
+
### MCP vs Human CLI
|
|
97
|
+
|
|
98
|
+
| 使用 MCP 当 | 使用 CLI 当 |
|
|
99
|
+
| ----------- | ----------- |
|
|
100
|
+
| 代理需要聊天里的结构化工具 | 需要完整载荷(diff、日志、产物) |
|
|
101
|
+
| `jmespath` 或 compact 结果已够用 | 已开 `GITLAB_MCP_COMPACT_RESULTS`,其余要在终端看 |
|
|
102
|
+
| 已经注册了 MCP 服务器 | 已有 PAT 或跑过 `auth`,不想要 MCP |
|
|
103
|
+
|
|
104
|
+
Human CLI 从不 compact。破坏性工具和 `GITLAB_TOOL_POLICY_APPROVE` 工具需要 `--yes`。
|
|
105
|
+
|
|
106
|
+
### Tips
|
|
107
|
+
|
|
108
|
+
`project_id` 是数字 ID 或 URL 编码路径。例如:组 `group`、项目 `project`、合并请求 `!123` → `project_id=group%2Fproject`,`merge_request_iid=123`。嵌套组的每一段之间用 `%2F`(`group%2Fsubgroup%2Fproject`)。
|
|
109
|
+
|
|
110
|
+
### FAQ
|
|
111
|
+
|
|
112
|
+
**如何认证?** 本地桌面最简单的是 `GITLAB_PERSONAL_ACCESS_TOKEN`(或 `GITLAB_PERSONAL_ACCESS_TOKEN_FILE`)。本地 OAuth 用 `GITLAB_USE_OAUTH=true`。远程 Claude.ai 用 `GITLAB_MCP_OAUTH`。多用户 HTTP 用 `REMOTE_AUTHORIZATION` 和每请求令牌头。
|
|
113
|
+
|
|
114
|
+
**为什么只看到大约 40 个工具?** 默认 `core` toolset 有 38 个工具,外加始终开启的 `discover_tools` 和 `help`。不带参数调用 `discover_tools` 可列出类别,再传入类别(`pipelines`、`wiki` 等)即可在本会话激活。`GITLAB_TOOLSETS=all` 仍然**不会**启用 `api`。
|
|
115
|
+
|
|
116
|
+
**本地 OAuth、MCP OAuth 和远程授权有何区别?** 本地 OAuth 在服务器同一台机器上打开浏览器。MCP OAuth 用于公网 HTTPS 服务器和 Claude.ai 这类客户端。远程授权转发调用者的 PAT 或 job token,没有 OAuth 流程。
|
|
117
|
+
|
|
118
|
+
**如何缩小巨大响应?** 在任意工具调用上传递 `jmespath`。或设置 `GITLAB_MCP_COMPACT_RESULTS=true`,把过大的 MCP 回复变成预览加 CLI 命令。需要完整载荷时用 CLI。
|
|
119
|
+
|
|
120
|
+
**为什么 `api` toolset 危险?** `gitlab_api_request` 会绕过组/项目允许列表、其他工具过滤和单工具安全检查。提示注入可以驱动它。只有在 `GITLAB_TOOLSETS` 中列出 `api` 时才启用。`all`、`discover_tools` 和 `GITLAB_TOOLS` 都不会启用它。
|
|
121
|
+
|
|
122
|
+
### Cursor rule / CLAUDE.md 片段
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
GitLab 合并请求、议题和流水线走此 MCP(@zereight/mcp-gitlab)。
|
|
126
|
+
从默认 core 工具开始,用 discover_tools 扩展。
|
|
127
|
+
优先 list_merge_request_changed_files,再批量 get_merge_request_file_diff。
|
|
128
|
+
结果用 jmespath 或 compact;完整 diff 和 job 日志用 CLI。
|
|
129
|
+
```
|
|
28
130
|
|
|
29
131
|
[](https://www.star-history.com/?repos=zereight%2Fgitlab-mcp&type=date&legend=top-left)
|
|
30
132
|
|
|
@@ -36,7 +138,7 @@ read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
|
36
138
|
|
|
37
139
|
### 为什么使用这个 GitLab MCP?
|
|
38
140
|
|
|
39
|
-
-
|
|
141
|
+
- **默认 40 个工具(38 个 `core` + `discover_tools` + `help`);共 278 个** — 先精简,再用 `discover_tools` 在本会话扩展
|
|
40
142
|
- **MR 两步审查** — `list_merge_request_changed_files` → 批量 `get_merge_request_file_diff`
|
|
41
143
|
- **内置 Agent Skill** — `skills/gitlab-mcp/` 工作流指南
|
|
42
144
|
- **认证灵活** — Personal Access Token、本地 OAuth2 浏览器流程、MCP OAuth 代理、按请求远程授权
|
|
@@ -50,7 +152,7 @@ read -rs GITLAB_PERSONAL_ACCESS_TOKEN && export GITLAB_PERSONAL_ACCESS_TOKEN
|
|
|
50
152
|
| | @zereight/mcp-gitlab | GitLab MCP A(社区 CQRS 型) | GitLab 官方 MCP 服务器 |
|
|
51
153
|
| ------------ | -------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
154
|
| **更适合** | AI 代理工作流 | 企业多实例 / 分组工具 | 内置于 GitLab,无需单独安装 |
|
|
53
|
-
| **工具模型** |
|
|
155
|
+
| **工具模型** | 278 个工具:toolset 中 275 个 + `execute_graphql` + `discover_tools` + `help` | ~50–60 个 `browse_*` / `manage_*` 分组工具 | 用 HTTP 头选择 toolset |
|
|
54
156
|
| **MR 审查** | 两步批量 diff | 因服务器而异 | `get_merge_request` 带 diffs |
|
|
55
157
|
| **Node.js** | >=18.17 | 通常 >=24 | stdio 经 `mcp-remote`,需要 Node.js 20+ |
|
|
56
158
|
| **许可证** | MIT | 因服务器而异 | GitLab 的一部分 |
|
|
@@ -602,7 +704,7 @@ node build/index.js
|
|
|
602
704
|
|
|
603
705
|
## Agent Skill Files
|
|
604
706
|
|
|
605
|
-
|
|
707
|
+
Skill + CLI 与 MCP 同等(见 [Skill + CLI](#skill--cli不需要-mcp))。对于支持 skill/instruction 加载的 AI 代理(Claude Code、GitHub Copilot、Cursor 等),[`skills/gitlab-mcp/`](./skills/gitlab-mcp/) 中提供了预构建 skill 文件。
|
|
606
708
|
|
|
607
709
|
- **[SKILL.md](./skills/gitlab-mcp/SKILL.md)** — 核心指南,包含工具集概览、关键工作流和参数提示
|
|
608
710
|
- **[reference/](./skills/gitlab-mcp/reference/)** — 代码审查、合并请求、议题、流水线和漏洞分类的详细工作流文档
|
package/build/index.js
CHANGED
|
@@ -94,6 +94,8 @@ import { formatPrometheusMetrics } from "./server/metrics.js";
|
|
|
94
94
|
import { SERVER_VERSION } from "./server/version.js";
|
|
95
95
|
import { listMcpResources, listMcpResourceTemplates, readMcpResource, } from "./server/mcp-resources.js";
|
|
96
96
|
import { getMcpPrompt, listMcpPrompts } from "./server/mcp-prompts.js";
|
|
97
|
+
import { MCP_INSTRUCTIONS } from "./server/mcp-instructions.js";
|
|
98
|
+
import { formatUnknownHelpTopic, getWorkflowGuide, readHelpTopic, } from "./server/mcp-help.js";
|
|
97
99
|
import { isInitializationRequestBody, isUnauthenticatedDiscoveryRequestBody, readAcceptHeader, readMcpSessionIdHeader, redactSessionIdForLog, } from "./server/request-helpers.js";
|
|
98
100
|
export { readMcpSessionIdHeader } from "./server/request-helpers.js";
|
|
99
101
|
import { apiUrlUserinfoWarning, commaSplitHint, configuredApiUrlErrors, encodeGitLabPath, encodeGitLabPathSegment, invalidListEntryError, isCleartextRemoteUrl, normalizeGitLabApiUrl, parseConfiguredGitLabApiUrls, } from "./utils/url.js";
|
|
@@ -213,6 +215,7 @@ function createServer() {
|
|
|
213
215
|
prompts: {},
|
|
214
216
|
resources: {},
|
|
215
217
|
},
|
|
218
|
+
instructions: MCP_INSTRUCTIONS,
|
|
216
219
|
});
|
|
217
220
|
mcpServer.server.setRequestHandler(ListPromptsRequestSchema, async () => listMcpPrompts());
|
|
218
221
|
mcpServer.server.setRequestHandler(GetPromptRequestSchema, async (request) => getMcpPrompt(request.params.name, (request.params.arguments ?? {})));
|
|
@@ -337,6 +340,23 @@ function createServer() {
|
|
|
337
340
|
!filteredTools.some(t => t.name === toolName)) {
|
|
338
341
|
throw new Error(buildToolUnavailableMessage(toolName));
|
|
339
342
|
}
|
|
343
|
+
if (toolName === "help") {
|
|
344
|
+
const topic = readHelpTopic(request.params.arguments?.topic);
|
|
345
|
+
if (topic === "invalid") {
|
|
346
|
+
return logCompletion({
|
|
347
|
+
content: [
|
|
348
|
+
{
|
|
349
|
+
type: "text",
|
|
350
|
+
text: formatUnknownHelpTopic(request.params.arguments?.topic),
|
|
351
|
+
},
|
|
352
|
+
],
|
|
353
|
+
isError: true,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
return logCompletion({
|
|
357
|
+
content: [{ type: "text", text: getWorkflowGuide(topic) }],
|
|
358
|
+
});
|
|
359
|
+
}
|
|
340
360
|
// Handle discover_tools meta-tool directly (needs access to mcpServer and filteredTools)
|
|
341
361
|
if (toolName === "discover_tools") {
|
|
342
362
|
const category = request.params.arguments?.category?.trim()?.toLowerCase();
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const HELP_TOPICS = [
|
|
3
|
+
"overview",
|
|
4
|
+
"code-review",
|
|
5
|
+
"merge-requests",
|
|
6
|
+
"issues",
|
|
7
|
+
"pipelines",
|
|
8
|
+
"search",
|
|
9
|
+
"token-saving",
|
|
10
|
+
];
|
|
11
|
+
export const HelpInputSchema = z.object({
|
|
12
|
+
topic: z
|
|
13
|
+
.enum(HELP_TOPICS)
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Guide to return. Omit for the overview and the list of topics. " +
|
|
16
|
+
"Values: overview, code-review, merge-requests, issues, pipelines, search, token-saving."),
|
|
17
|
+
});
|
|
18
|
+
export function isHelpTopic(value) {
|
|
19
|
+
for (const topic of HELP_TOPICS) {
|
|
20
|
+
if (topic === value) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function assertNever(value) {
|
|
27
|
+
throw new Error(`Unhandled help topic: ${String(value)}`);
|
|
28
|
+
}
|
|
29
|
+
const GUIDES = {
|
|
30
|
+
overview: [
|
|
31
|
+
"GitLab MCP workflow guide. Default tools/list is 38 core tools plus discover_tools and help (40).",
|
|
32
|
+
"Call help with topic: code-review, merge-requests, issues, pipelines, search, token-saving.",
|
|
33
|
+
"Activate more categories with discover_tools. api is explicit-only (GITLAB_TOOLSETS=api).",
|
|
34
|
+
"project_id is a numeric ID or URL-encoded path (group%2Fproject). MR !123 → merge_request_iid=123.",
|
|
35
|
+
].join("\n"),
|
|
36
|
+
"code-review": [
|
|
37
|
+
"Code review (2-step diffs):",
|
|
38
|
+
"1. list_merge_request_changed_files — paths only, no diff text.",
|
|
39
|
+
"2. get_merge_request_file_diff — 3-5 files per call.",
|
|
40
|
+
"3. create_merge_request_thread or create_draft_note, then bulk_publish_draft_notes.",
|
|
41
|
+
"Do not dump get_merge_request_diffs for a whole MR. Prefer jmespath on large results.",
|
|
42
|
+
].join("\n"),
|
|
43
|
+
"merge-requests": [
|
|
44
|
+
"MR lifecycle: create_merge_request → review → approve_merge_request → merge_merge_request.",
|
|
45
|
+
"Lookup: project_id plus merge_request_iid (or source_branch).",
|
|
46
|
+
"Inspect: get_merge_request, get_merge_request_approval_state, get_merge_request_conflicts.",
|
|
47
|
+
"Discussions: mr_discussions, create_merge_request_thread, resolve_merge_request_thread.",
|
|
48
|
+
"merge_merge_request needs merge permission and often sha from get_merge_request.",
|
|
49
|
+
].join("\n"),
|
|
50
|
+
issues: [
|
|
51
|
+
"Issues: list_issues (default scope is issues you created; use scope=all), my_issues, get_issue.",
|
|
52
|
+
"Write: create_issue, update_issue, create_issue_note, list_issue_discussions.",
|
|
53
|
+
"Small description edits: update_issue_description_patch instead of resending the full body.",
|
|
54
|
+
"project_id is a numeric ID or URL-encoded path.",
|
|
55
|
+
].join("\n"),
|
|
56
|
+
pipelines: [
|
|
57
|
+
"Pipelines: discover_tools with category pipelines if those tools are hidden.",
|
|
58
|
+
"list_pipelines / get_pipeline, then list_pipeline_jobs / get_pipeline_job.",
|
|
59
|
+
"Logs: get_pipeline_job_output with pagination (limit / offset). Do not pull a whole trace.",
|
|
60
|
+
"Create/retry/cancel: create_pipeline, retry_pipeline, cancel_pipeline (destructive).",
|
|
61
|
+
].join("\n"),
|
|
62
|
+
search: [
|
|
63
|
+
"search_repositories for projects. Code search: search_code, search_project_code, search_group_code",
|
|
64
|
+
"(needs GitLab advanced search or Zoekt; enable the search toolset via discover_tools).",
|
|
65
|
+
"If you already have an id or path, use get_project / get_issue / get_merge_request instead.",
|
|
66
|
+
].join("\n"),
|
|
67
|
+
"token-saving": [
|
|
68
|
+
"Do not dump get_merge_request_diffs for a whole MR. Use list_merge_request_changed_files",
|
|
69
|
+
"then batched get_merge_request_file_diff.",
|
|
70
|
+
"Pass jmespath on any tool to shrink JSON. GITLAB_MCP_COMPACT_RESULTS replaces oversized",
|
|
71
|
+
"MCP replies with a preview plus a CLI command. Human CLI is never compacted.",
|
|
72
|
+
"Paginate logs (get_pipeline_job_output) and list endpoints. Prefer typed tools over",
|
|
73
|
+
"execute_graphql. Do not enable gitlab_api_request unless you accept its bypass risk.",
|
|
74
|
+
].join("\n"),
|
|
75
|
+
};
|
|
76
|
+
export function getWorkflowGuide(topic = "overview") {
|
|
77
|
+
switch (topic) {
|
|
78
|
+
case "overview":
|
|
79
|
+
case "code-review":
|
|
80
|
+
case "merge-requests":
|
|
81
|
+
case "issues":
|
|
82
|
+
case "pipelines":
|
|
83
|
+
case "search":
|
|
84
|
+
case "token-saving":
|
|
85
|
+
return GUIDES[topic];
|
|
86
|
+
default:
|
|
87
|
+
return assertNever(topic);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function readHelpTopic(value) {
|
|
91
|
+
if (value === undefined || value === null || value === "") {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
if (typeof value === "string" && isHelpTopic(value)) {
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
return "invalid";
|
|
98
|
+
}
|
|
99
|
+
export function formatUnknownHelpTopic(value) {
|
|
100
|
+
return `Unknown help topic ${JSON.stringify(value)}. Available: ${HELP_TOPICS.join(", ")}`;
|
|
101
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP initialize `instructions` — a short session briefing.
|
|
3
|
+
* Keep this under MCP_INSTRUCTIONS_MAX_BYTES so the handshake stays cheap.
|
|
4
|
+
*/
|
|
5
|
+
export const MCP_INSTRUCTIONS_MAX_BYTES = 2048;
|
|
6
|
+
export const MCP_INSTRUCTIONS = [
|
|
7
|
+
"GitLab MCP. Default list: 38 core tools plus discover_tools and help (40). Call help for workflows.",
|
|
8
|
+
"MR review: list_merge_request_changed_files, then get_merge_request_file_diff for 3-5 files. Do not dump get_merge_request_diffs.",
|
|
9
|
+
"project_id: numeric ID or URL-encoded path (group%2Fproject). MR !123 uses merge_request_iid=123.",
|
|
10
|
+
"discover_tools: omit category to list; pass a category to activate for this session. api is explicit-only (GITLAB_TOOLSETS=api).",
|
|
11
|
+
"Shrink results: pass jmespath on any tool. Set GITLAB_MCP_COMPACT_RESULTS for oversized replies. Paginate get_pipeline_job_output.",
|
|
12
|
+
"Prefer typed tools over execute_graphql. Do not enable gitlab_api_request unless you accept allowlist and safety-check bypass. Prompt injection can drive it.",
|
|
13
|
+
"Destructive tools change GitLab state. Use the CLI (zereight-mcp-gitlab) for full diffs, logs, and artifacts.",
|
|
14
|
+
].join("\n");
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { isExcludedBySlimProfile } from "./tool-profile.js";
|
|
2
|
+
/** Meta tools re-added after every toolset filter so progressive disclosure stays available. */
|
|
3
|
+
export const ALWAYS_LISTED_META_TOOLS = ["discover_tools", "help"];
|
|
2
4
|
export function selectExposedTools(input) {
|
|
3
5
|
const additiveAllowed = input.isAdditiveEnablementAllowed ?? (() => true);
|
|
4
6
|
const toolsAfterToolsets = input.tools.filter(tool => input.isInEnabledToolset(tool.name));
|
|
@@ -22,12 +24,16 @@ export function selectExposedTools(input) {
|
|
|
22
24
|
? toolsAfterPermission.filter(tool => !deniedToolsRegex.test(tool.name))
|
|
23
25
|
: [...toolsAfterPermission];
|
|
24
26
|
const filteredToolNames = new Set(toolsAfterRegex.map(tool => tool.name));
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
for (const metaName of ALWAYS_LISTED_META_TOOLS) {
|
|
28
|
+
const metaTool = input.tools.find(tool => tool.name === metaName);
|
|
29
|
+
if (!metaTool || filteredToolNames.has(metaName)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const passesPermissionMode = input.isAllowedByPermissionMode(metaName);
|
|
33
|
+
const passesRegex = deniedToolsRegex ? !deniedToolsRegex.test(metaName) : true;
|
|
29
34
|
if (passesPermissionMode && passesRegex) {
|
|
30
|
-
toolsAfterRegex.push(
|
|
35
|
+
toolsAfterRegex.push(metaTool);
|
|
36
|
+
filteredToolNames.add(metaName);
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
39
|
const withoutHidden = input.hiddenToolNames.size > 0
|
package/build/tools/registry.js
CHANGED
|
@@ -3,6 +3,7 @@ import { USE_GITLAB_WIKI, USE_MILESTONE, USE_PIPELINE, SSE, STREAMABLE_HTTP } fr
|
|
|
3
3
|
import { getToolDescription } from "./tool-descriptions.js";
|
|
4
4
|
import { ApproveMergeRequestSchema, BulkPublishDraftNotesSchema, CancelPipelineJobSchema, ErasePipelineJobSchema, 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, CreateWebhookSchema, CreateWikiPageSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, CreateWorkItemSchema, DeleteBranchSchema, GetProtectedBranchSchema, ListProtectedBranchesSchema, ProtectBranchSchema, UpdateProtectedBranchSchema, ProtectTagSchema, UnprotectBranchSchema, UnprotectTagSchema, UpdateDefaultBranchSchema, DeleteDraftNoteSchema, DeleteGroupMilestoneSchema, DeleteGroupWikiPageSchema, DeleteIssueLinkSchema, DeleteIssueSchema, DeleteIssueEmojiReactionSchema, DeleteIssueNoteEmojiReactionSchema, DeleteLabelSchema, DeleteMergeRequestDiscussionNoteSchema, DeleteMergeRequestNoteSchema, DeleteMergeRequestEmojiReactionSchema, DeleteMergeRequestNoteEmojiReactionSchema, DeleteProjectMilestoneSchema, DeleteReleaseSchema, DeleteTagSchema, DeleteWebhookSchema, DeleteWikiPageSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, DownloadAttachmentSchema, DownloadAttachmentRemoteSchema, DownloadJobArtifactsSchema, DownloadJobArtifactsRemoteSchema, DownloadReleaseAssetSchema, EditProjectMilestoneSchema, EditGroupMilestoneSchema, ExecuteGraphQLSchema, ForkRepositorySchema, HealthCheckSchema, GetBranchSchema, GetBranchDiffsSchema, GetCommitDiffSchema, GetCommitSchema, GetFileBlameSchema, GetDeploymentSchema, CreateDeploymentSchema, UpdateDeploymentSchema, DeploymentApprovalSchema, ListDeploymentMergeRequestsSchema, GetDraftNoteSchema, GetEnvironmentSchema, UpdateEnvironmentSchema, StopEnvironmentSchema, StopStaleEnvironmentsSchema, DeleteReviewAppEnvironmentsSchema, PipelineTriggerIdSchema, ListPipelineTriggersSchema, CreatePipelineTriggerSchema, UpdatePipelineTriggerSchema, TriggerPipelineSchema, GetFileContentsSchema, GetGroupWikiPageSchema, GetIssueLinkSchema, GetIssueSchema, GetJobArtifactFileSchema, GetLabelSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GetMergeRequestDiffsSchema, GetMergeRequestFileDiffSchema, GetMergeRequestDiscussionSchema, GetMergeRequestNoteSchema, GetMergeRequestNotesSchema, GetMergeRequestSchema, GetMergeRequestVersionSchema, GetMilestoneBurndownEventsSchema, GetMilestoneIssuesSchema, GetMilestoneMergeRequestsSchema, GetGroupMilestoneSchema, GetGroupMilestoneIssuesSchema, GetGroupMilestoneMergeRequestsSchema, GetGroupMilestoneBurndownEventsSchema, GetNamespaceSchema, GetPipelineJobOutputSchema, PipelineJobControlSchema, GetPipelineSchema, GetRunnerSchema, GetPipelineVariablesSchema, UpdatePipelineMetadataSchema, DeletePipelineSchema, PipelineReportSchema, WaitForPipelineSchema, WaitForPipelineJobSchema, PlayPipelineJobsSchema, GetProjectEventsSchema, GetProjectMilestoneSchema, GetProjectSchema, GetReleaseSchema, GetRepositoryTreeSchema, GetTagSchema, GetTagSignatureSchema, GetProtectedTagSchema, 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, ListGroupMergeRequestsSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListCiCatalogResourcesSchema, GetCiCatalogResourceSchema, ListPipelinesSchema, ListPipelineSchedulesSchema, GetPipelineScheduleSchema, ListPipelineSchedulePipelinesSchema, CreatePipelineScheduleSchema, UpdatePipelineScheduleSchema, DeletePipelineScheduleSchema, PlayPipelineScheduleSchema, TakeOwnershipPipelineScheduleSchema, GetPipelineScheduleVariableSchema, CreatePipelineScheduleVariableSchema, UpdatePipelineScheduleVariableSchema, DeletePipelineScheduleVariableSchema, ListGroupMembersSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListProjectsSchema, ListProjectRunnersSchema, ListReleasesSchema, ListTagsSchema, ListProtectedTagsSchema, ListWebhookEventsSchema, ListWebhooksSchema, ListWikiPagesSchema, ListWorkItemNotesSchema, ListWorkItemStatusesSchema, ListWorkItemsSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, MergeMergeRequestSchema, MoveWorkItemSchema, MyIssuesSchema, OrbitQuerySchema, OrbitSchemaSchema, OrbitStatusSchema, OrbitToolsSchema, PlayPipelineJobSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PushFilesSchema, ResolveMergeRequestThreadSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, ListSnippetsSchema, GetSnippetSchema, CreateSnippetSchema, UpdateSnippetSchema, DeleteSnippetSchema, UnapproveMergeRequestSchema, RebaseMergeRequestSchema, UpdateDraftNoteSchema, UpdateGroupWikiPageSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateProjectSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestSchema, UpdateReleaseSchema, UpdateWebhookSchema, 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
|
import { GitLabApiRequestSchema } from "./gitlab-api-request.js";
|
|
6
|
+
import { HelpInputSchema } from "../server/mcp-help.js";
|
|
6
7
|
const IS_REMOTE = SSE || STREAMABLE_HTTP;
|
|
7
8
|
// Define all available tools
|
|
8
9
|
export const allTools = [
|
|
@@ -1427,10 +1428,16 @@ export const allTools = [
|
|
|
1427
1428
|
},
|
|
1428
1429
|
},
|
|
1429
1430
|
},
|
|
1431
|
+
{
|
|
1432
|
+
name: "help",
|
|
1433
|
+
description: "Return a short GitLab workflow guide. Omit topic for the overview and topic list.",
|
|
1434
|
+
inputSchema: toJSONSchema(HelpInputSchema),
|
|
1435
|
+
},
|
|
1430
1436
|
];
|
|
1431
1437
|
// Define which tools are read-only
|
|
1432
1438
|
export const readOnlyTools = new Set([
|
|
1433
1439
|
"discover_tools",
|
|
1440
|
+
"help",
|
|
1434
1441
|
"health_check",
|
|
1435
1442
|
"search_repositories",
|
|
1436
1443
|
"search_code",
|
|
@@ -39,6 +39,7 @@ const TOOL_GUIDANCE = {
|
|
|
39
39
|
download_attachment: "Retrieve a project attachment. Remote HTTP returns inline base64 or a URL; local stdio saves under GITLAB_DOWNLOAD_DIR and never overwrites.",
|
|
40
40
|
gitlab_api_request: "Send one GitLab REST call under /api/v4. Readonly allows GET only; modify rejects DELETE. Enable only by listing api in GITLAB_TOOLSETS; all, discover_tools, and GITLAB_TOOLS do not. Prompt injection can drive this tool, so operators who rely on group, project, or tool restrictions must not enable it. With GITLAB_ALLOWED_PROJECT_IDS or a session project scope, only /projects/:id paths for an allowed project are accepted; body and query parameters that name another project are not checked.",
|
|
41
41
|
execute_graphql: "Use only when no typed REST tool covers the operation. The query is sent directly and may include mutations.",
|
|
42
|
+
help: "Use this for a short workflow guide (code-review, pipelines, issues, token-saving). Omit topic for the overview. Detailed GitLab operations stay on the typed tools.",
|
|
42
43
|
whoami: "Requires classic read_user or fine-grained User:Read. Use `get_user` or `get_users` to look up another user.",
|
|
43
44
|
list_project_members: "Search project members by name or username. Use `list_group_members` for a group.",
|
|
44
45
|
get_commit_diff: "Return the file diffs for one commit. Use `get_commit` for metadata without the patch.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zereight/mcp-gitlab",
|
|
3
|
-
"version": "2.3.8-next.
|
|
3
|
+
"version": "2.3.8-next.147",
|
|
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": [
|