@zereight/mcp-gitlab 2.1.67 → 2.1.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +4 -4
- package/README.md +10 -5
- package/README.pt-BR.md +585 -0
- package/README.zh-CN.md +4 -4
- package/build/index.js +234 -1
- package/build/schemas.js +187 -0
- package/build/scripts/generate-tool-docs.js +5 -0
- package/build/scripts/tool-coverage/coverage.js +2 -0
- package/build/test/test-dynamic-project-scope.js +160 -0
- package/build/test/test-permission-mode.js +1 -0
- package/build/test/test-snippets.js +735 -0
- package/build/test/test-toolset-filtering.js +3 -0
- package/build/tools/registry.js +42 -1
- package/package.json +1 -1
package/README.pt-BR.md
ADDED
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
# GitLab MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
4
|
+
[](vscode:mcp/install?%7B%22name%22%3A%22zereight.gitlab-mcp%22%2C%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%2C%22GITLAB_PERMISSION_MODE%22%3A%22full%22%7D%7D)
|
|
5
|
+
|
|
6
|
+
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
7
|
+
|
|
8
|
+
📖 **[Documentação →](https://zereight.github.io/gitlab-mcp/)** Guias de configuração, variáveis de ambiente e a referência completa de ferramentas estão disponíveis no site de documentação.
|
|
9
|
+
|
|
10
|
+
[](https://www.star-history.com/?repos=zereight%2Fgitlab-mcp&type=date&legend=top-left)
|
|
11
|
+
|
|
12
|
+
## @zereight/mcp-gitlab
|
|
13
|
+
|
|
14
|
+
**GitLab MCP otimizado para fluxos de trabalho com agentes de IA** — gerencie projetos, merge requests, issues, pipelines, Wiki, releases, milestones e muito mais via stdio, SSE e Streamable HTTP.
|
|
15
|
+
|
|
16
|
+
Suporta PAT, OAuth, modo somente leitura, URLs de API dinâmicas e autorização remota para VS Code, Claude, Cursor, Copilot e outros clientes MCP.
|
|
17
|
+
|
|
18
|
+
### Por que usar este GitLab MCP?
|
|
19
|
+
|
|
20
|
+
- **261 ferramentas + `discover_tools`** — comece com um toolset pequeno e ative mais categorias em tempo de execução
|
|
21
|
+
- **Revisão de MR em 2 etapas** — `list_merge_request_changed_files` → `get_merge_request_file_diff` em lote
|
|
22
|
+
- **Agent Skill integrado** — orientação de workflows em `skills/gitlab-mcp/`
|
|
23
|
+
- **Autenticação flexível** — Personal Access Token, fluxo OAuth2 local no navegador, proxy MCP OAuth e autorização remota por requisição
|
|
24
|
+
- **Múltiplos transportes** — stdio para clientes locais, SSE para clientes legados e Streamable HTTP para implantações remotas modernas
|
|
25
|
+
- **Configuração amigável para clientes** — exemplos para Claude Code, Codex, Antigravity, OpenCode, Copilot, Cline, Roo Code, Cursor, Kilo Code e Amp Code
|
|
26
|
+
- **Pronto para self-hosting** — funciona com instâncias GitLab personalizadas, configurações de proxy e roteamento dinâmico de URL da API
|
|
27
|
+
- **Filtragem de resultados com JMESPath** — o argumento opcional `jmespath` nas chamadas de ferramentas (veja `tools/list`) reduz os resultados JSON sem alterar as requisições à API do GitLab; quando o mascaramento de respostas está ativo, o JMESPath é aplicado aos dados já mascarados
|
|
28
|
+
|
|
29
|
+
### Comparação
|
|
30
|
+
|
|
31
|
+
| | @zereight/mcp-gitlab | GitLab MCP A (comunidade, estilo CQRS) |
|
|
32
|
+
| ------------------------- | ---------------------------------------------- | --------------------------------------------------------- |
|
|
33
|
+
| **Mais indicado para** | Workflows de agentes de IA | Múltiplas instâncias corporativas / ferramentas agrupadas |
|
|
34
|
+
| **Modelo de ferramentas** | ~261 ferramentas granulares + `discover_tools` | ~50–60 ferramentas agrupadas `browse_*` / `manage_*` |
|
|
35
|
+
| **Revisão de MR** | Diff em lote em 2 etapas | Varia |
|
|
36
|
+
| **Node.js** | >=18.17 | Frequentemente >=24 |
|
|
37
|
+
| **Licença** | MIT | Varia |
|
|
38
|
+
|
|
39
|
+
[Comparação completa →](./docs/comparison/community-gitlab-mcp-a.md)
|
|
40
|
+
|
|
41
|
+
Início rápido: escolha abaixo uma configuração com Personal Access Token ou OAuth2, instale `@zereight/mcp-gitlab` e use `zereight-mcp-gitlab` na configuração do seu cliente MCP.
|
|
42
|
+
|
|
43
|
+
### Guias de configuração de clientes
|
|
44
|
+
|
|
45
|
+
- [Guia de configuração do Claude Code](./docs/clients/claude-code.md)
|
|
46
|
+
- [Guia de configuração do VS Code](./docs/clients/vscode.md)
|
|
47
|
+
- [Guia de configuração do GitHub Copilot](./docs/clients/copilot.md)
|
|
48
|
+
- [Guia de configuração do Codex](./docs/clients/codex.md)
|
|
49
|
+
- [Guia de configuração do Cursor](./docs/clients/cursor.md)
|
|
50
|
+
- [Guia para clientes MCP baseados em JSON](./docs/clients/json-clients.md) - para Factory AI Droid, OpenClaw e clientes no estilo OpenCode
|
|
51
|
+
- [Guia de configuração de autenticação OAuth2](./docs/auth/oauth-setup.md)
|
|
52
|
+
- [Referência de variáveis de ambiente](./docs/configuration/environment-variables.md)
|
|
53
|
+
- [Modo Stateless — HPA com múltiplos Pods](./docs/configuration/stateless-mode.md)
|
|
54
|
+
- [Agentes personalizados e configuração com múltiplos PATs](./docs/auth/custom-agent-multiple-pat.md)
|
|
55
|
+
|
|
56
|
+
## Uso
|
|
57
|
+
|
|
58
|
+
### Visão geral da configuração
|
|
59
|
+
|
|
60
|
+
#### Métodos de autenticação
|
|
61
|
+
|
|
62
|
+
O servidor suporta quatro métodos de autenticação.
|
|
63
|
+
|
|
64
|
+
**Para uso local/desktop** (mais comum):
|
|
65
|
+
|
|
66
|
+
1. **Personal Access Token** (`GITLAB_PERSONAL_ACCESS_TOKEN`) — configuração mais simples
|
|
67
|
+
2. **OAuth2 — navegador local** (`GITLAB_USE_OAUTH`) — recomendado para maior segurança
|
|
68
|
+
|
|
69
|
+
**Para implantações em servidor/remotas**:
|
|
70
|
+
|
|
71
|
+
3. **OAuth2 — proxy MCP** (`GITLAB_MCP_OAUTH`) — para clientes MCP remotos, como Claude.ai
|
|
72
|
+
4. **Autorização remota** (`REMOTE_AUTHORIZATION`) — para implantações multiusuário em que cada chamador fornece seu próprio token
|
|
73
|
+
|
|
74
|
+
#### Caminhos rápidos de configuração
|
|
75
|
+
|
|
76
|
+
- **Claude Code**: veja o [Guia de configuração do Claude Code](./docs/clients/claude-code.md)
|
|
77
|
+
- **VS Code**: veja o [Guia de configuração do VS Code](./docs/clients/vscode.md)
|
|
78
|
+
- **GitHub Copilot**: veja o [Guia de configuração do GitHub Copilot](./docs/clients/copilot.md)
|
|
79
|
+
- **Codex**: veja o [Guia de configuração do Codex](./docs/clients/codex.md)
|
|
80
|
+
- **Cursor**: veja o [Guia de configuração do Cursor](./docs/clients/cursor.md)
|
|
81
|
+
- **Factory AI Droid / OpenClaw / clientes no estilo OpenCode**: veja o [Guia para clientes MCP baseados em JSON](./docs/clients/json-clients.md)
|
|
82
|
+
- **Detalhes do fluxo OAuth no navegador**: veja o [Guia de configuração de autenticação OAuth2](./docs/auth/oauth-setup.md)
|
|
83
|
+
- **OAuth sem callback em localhost** (SSO, shell remoto, clientes em background): execute `zereight-mcp-gitlab auth` (GitLab 17.9+ usa device flow; versões 17.2–17.8 precisam de `oauth2_device_grant_flow`) e depois inicie o servidor com `GITLAB_USE_OAUTH=true`. Veja o [comando independente de device flow](./docs/auth/oauth-setup.md#standalone-device-flow-auth-command).
|
|
84
|
+
|
|
85
|
+
Para a configuração local mais simples, comece com um Personal Access Token. Para autenticação local baseada em navegador, use OAuth2. Para implantações remotas ou multiusuário, consulte as seções de MCP OAuth e Autorização Remota mais abaixo neste README.
|
|
86
|
+
|
|
87
|
+
Instale o servidor uma vez:
|
|
88
|
+
|
|
89
|
+
```shell
|
|
90
|
+
brew tap zereight/gitlab-mcp https://github.com/zereight/gitlab-mcp
|
|
91
|
+
brew install zereight/gitlab-mcp/zereight-mcp-gitlab
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Ou com npm:
|
|
95
|
+
|
|
96
|
+
```shell
|
|
97
|
+
npm install -g @zereight/mcp-gitlab
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Ou com Nix, adicionando este flake ao seu:
|
|
101
|
+
|
|
102
|
+
```nix
|
|
103
|
+
# flake.nix
|
|
104
|
+
inputs.gitlab-mcp.url = "github:zereight/gitlab-mcp";
|
|
105
|
+
|
|
106
|
+
# wherever you configure your MCP client:
|
|
107
|
+
command = lib.getExe inputs.gitlab-mcp.packages.${system}.default;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
O caminho no store é fixado pelo seu lock file; atualize-o com `nix flake update gitlab-mcp`.
|
|
111
|
+
|
|
112
|
+
Os exemplos usam `zereight-mcp-gitlab`, um alias com menor chance de conflito que o binário legado `mcp-gitlab`. Se o seu cliente MCP não o encontrar, use o caminho absoluto retornado por `which zereight-mcp-gitlab`.
|
|
113
|
+
|
|
114
|
+
Não quer instalar globalmente? Fixe o `npx` na versão estável anterior (a versão recomendada por esta documentação), por exemplo `npx -y @zereight/mcp-gitlab@2.1.67`. Se quiser sempre a versão mais recente, use `npx -y @zereight/mcp-gitlab@latest`. O servidor exibe um aviso no stderr durante a inicialização quando existe uma versão mais nova disponível (desative com `GITLAB_DISABLE_VERSION_CHECK=true`).
|
|
115
|
+
|
|
116
|
+
#### Usando argumentos de CLI (para clientes com problemas com variáveis de ambiente)
|
|
117
|
+
|
|
118
|
+
Alguns clientes MCP, como o GitHub Copilot CLI, têm problemas com variáveis de ambiente. Nesse caso, use argumentos de CLI:
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"mcpServers": {
|
|
123
|
+
"gitlab": {
|
|
124
|
+
"command": "zereight-mcp-gitlab",
|
|
125
|
+
"args": ["--token=YOUR_GITLAB_TOKEN", "--api-url=https://gitlab.com/api/v4"],
|
|
126
|
+
"tools": ["*"]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Argumentos de CLI disponíveis:**
|
|
133
|
+
|
|
134
|
+
- `--token` - GitLab Personal Access Token (substitui `GITLAB_PERSONAL_ACCESS_TOKEN`)
|
|
135
|
+
- `--api-url` - URL da API do GitLab (substitui `GITLAB_API_URL`)
|
|
136
|
+
- `--read-only=true` - ativa o modo somente leitura (substitui `GITLAB_READ_ONLY_MODE`, obsoleto — prefira `--permission-mode=readonly`)
|
|
137
|
+
- `--permission-mode` - nível de permissão: `readonly`, `modify` (sem ferramentas de exclusão ou teardown) ou `full` (substitui `GITLAB_PERMISSION_MODE`, padrão `full`)
|
|
138
|
+
- `--use-wiki=true` - ativa a API de Wiki (substitui `USE_GITLAB_WIKI`, legado — prefira `GITLAB_TOOLSETS=wiki`)
|
|
139
|
+
- `--use-milestone=true` - ativa a API de milestones (substitui `USE_MILESTONE`, legado — prefira `GITLAB_TOOLSETS=milestones`)
|
|
140
|
+
- `--use-pipeline=true` - ativa a API de pipelines (substitui `USE_PIPELINE`, legado — prefira `GITLAB_TOOLSETS=pipelines`)
|
|
141
|
+
- `--disable-version-check=true` - desativa o aviso de nova versão na inicialização (substitui `GITLAB_DISABLE_VERSION_CHECK`)
|
|
142
|
+
- `--masking-enabled=true` - ativa o mascaramento de respostas de texto (substitui `GITLAB_MASKING_ENABLED`)
|
|
143
|
+
- `--masking-config` - caminho para um arquivo de configuração de mascaramento (substitui `GITLAB_MASKING_CONFIG`)
|
|
144
|
+
- `--masking-policy-file` - caminho para um arquivo protegido de política gerenciada (substitui `GITLAB_MASKING_POLICY_FILE`)
|
|
145
|
+
- `--masking-workspace-dir` - diretório usado para resolver arquivos de mascaramento (substitui `GITLAB_MASKING_WORKSPACE_DIR`)
|
|
146
|
+
|
|
147
|
+
Os argumentos de CLI têm precedência sobre as variáveis de ambiente.
|
|
148
|
+
|
|
149
|
+
`zereight-mcp-gitlab auth` é um subcomando, não uma flag do servidor MCP. Ele executa o device flow do GitLab e encerra. Veja [Argumentos de CLI](./docs/getting-started/cli-arguments.md#auth).
|
|
150
|
+
|
|
151
|
+
> **Filtragem granular de ferramentas:** use `GITLAB_PERMISSION_MODE=modify` para permitir criação/atualização enquanto
|
|
152
|
+
> bloqueia todas as ferramentas de exclusão e as ferramentas destrutivas de teardown (`cancel_pipeline`,
|
|
153
|
+
> `cancel_pipeline_job`, `stop_environment`, `stop_stale_environments`, `unprotect_branch`) —
|
|
154
|
+
> incluindo mutations destrutivas (verbos de exclusão e teardown) por meio de `execute_graphql` e
|
|
155
|
+
> ações `delete`/`move` do `push_files` — ou use `GITLAB_PERMISSION_MODE=readonly` para acesso somente leitura.
|
|
156
|
+
> Também é possível habilitar grupos de ferramentas com `GITLAB_TOOLSETS=<group,…>`, permitir ferramentas individuais com
|
|
157
|
+
> `GITLAB_TOOLS=<tool,…>` (por exemplo, grupos somente leitura mais algumas ferramentas específicas de escrita) e
|
|
158
|
+
> bloquear por padrão usando `GITLAB_DENIED_TOOLS_REGEX`. As flags legadas `USE_GITLAB_WIKI` /
|
|
159
|
+
> `USE_MILESTONE` / `USE_PIPELINE` são mantidas apenas para compatibilidade retroativa.
|
|
160
|
+
> Consulte a [Referência de ferramentas](./docs/tools/index.md#feature-toggles) e
|
|
161
|
+
> [Variáveis de ambiente](./docs/configuration/environment-variables.md).
|
|
162
|
+
|
|
163
|
+
#### SSE
|
|
164
|
+
|
|
165
|
+
```shell
|
|
166
|
+
docker run -i --rm \
|
|
167
|
+
-e HOST=0.0.0.0 \
|
|
168
|
+
-e GITLAB_PERSONAL_ACCESS_TOKEN=your_gitlab_token \
|
|
169
|
+
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
|
|
170
|
+
-e GITLAB_PERMISSION_MODE=readonly \
|
|
171
|
+
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
|
|
172
|
+
-e SSE=true \
|
|
173
|
+
-e SSE_AUTH_TOKEN=your_mcp_sse_token \
|
|
174
|
+
-p 3333:3002 \
|
|
175
|
+
zereight050/gitlab-mcp
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"mcpServers": {
|
|
181
|
+
"gitlab": {
|
|
182
|
+
"type": "sse",
|
|
183
|
+
"url": "http://localhost:3333/sse",
|
|
184
|
+
"headers": {
|
|
185
|
+
"Authorization": "Bearer your_mcp_sse_token"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
#### Streamable HTTP
|
|
193
|
+
|
|
194
|
+
```shell
|
|
195
|
+
docker run -i --rm \
|
|
196
|
+
-e HOST=0.0.0.0 \
|
|
197
|
+
-e REMOTE_AUTHORIZATION=true \
|
|
198
|
+
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
|
|
199
|
+
-e GITLAB_PERMISSION_MODE=readonly \
|
|
200
|
+
-e GITLAB_TOOLSETS=wiki,milestones,pipelines \
|
|
201
|
+
-e STREAMABLE_HTTP=true \
|
|
202
|
+
-p 3333:3002 \
|
|
203
|
+
zereight050/gitlab-mcp
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"mcpServers": {
|
|
209
|
+
"gitlab": {
|
|
210
|
+
"type": "streamable-http",
|
|
211
|
+
"url": "http://localhost:3333/mcp",
|
|
212
|
+
"headers": {
|
|
213
|
+
"Authorization": "Bearer glpat-..."
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Usando o proxy MCP OAuth (`GITLAB_MCP_OAUTH`)
|
|
221
|
+
|
|
222
|
+
> **Somente para implantações em servidor/remotas.** Este modo exige que o servidor MCP esteja implantado em uma URL HTTPS acessível publicamente. Para uso local/desktop, veja `GITLAB_USE_OAUTH` acima.
|
|
223
|
+
|
|
224
|
+
Para clientes MCP remotos que suportam a especificação MCP OAuth (por exemplo, Claude.ai). O servidor atua como um servidor de autorização OAuth 2.0 completo — requisições não autenticadas recebem uma resposta `401 + WWW-Authenticate`, que aciona automaticamente o fluxo OAuth no navegador do lado do cliente.
|
|
225
|
+
|
|
226
|
+
Clientes MCP remotos como OpenCode, MCPJam e Claude.ai podem enviar sua própria URL de callback durante a autorização. Se não for possível registrar no GitLab cada URL de callback de cliente, habilite `GITLAB_OAUTH_CALLBACK_PROXY=true`. Com o modo de proxy de callback, o GitLab precisa de apenas um Redirect URI registrado: `{MCP_SERVER_URL}/callback`.
|
|
227
|
+
|
|
228
|
+
`GITLAB_OAUTH_REDIRECT_URI` é usado apenas pelo OAuth local (`GITLAB_USE_OAUTH`). Ele não substitui URLs de callback de clientes MCP OAuth remotos e não deve ser usado para corrigir erros remotos `Unregistered redirect_uri`.
|
|
229
|
+
|
|
230
|
+
Essa variável existe porque o fluxo OAuth local abre um navegador na mesma máquina do servidor MCP e recebe o callback em um servidor HTTP local, por exemplo `http://127.0.0.1:8888/callback`.
|
|
231
|
+
|
|
232
|
+
O MCP OAuth remoto funciona de forma diferente. No modo `GITLAB_MCP_OAUTH=true`, o cliente MCP fornece sua própria URL de callback durante `/authorize`. `GITLAB_OAUTH_REDIRECT_URI` não substitui essa URL fornecida pelo cliente.
|
|
233
|
+
|
|
234
|
+
| Modo | Habilitar com | Variável de callback | Redirect URI no GitLab |
|
|
235
|
+
| ---------------- | ----------------------- | ---------------------------------- | ------------------------------------------------------ |
|
|
236
|
+
| OAuth local | `GITLAB_USE_OAUTH=true` | `GITLAB_OAUTH_REDIRECT_URI` | `http://127.0.0.1:8888/callback` ou seu callback local |
|
|
237
|
+
| MCP OAuth remoto | `GITLAB_MCP_OAUTH=true` | `GITLAB_OAUTH_CALLBACK_PROXY=true` | `{MCP_SERVER_URL}/callback` |
|
|
238
|
+
|
|
239
|
+
Use `GITLAB_OAUTH_REDIRECT_URI` somente quando o próprio servidor MCP receber o callback local do navegador. Use `GITLAB_OAUTH_CALLBACK_PROXY=true` quando um cliente MCP remoto for o responsável pela URL de callback.
|
|
240
|
+
|
|
241
|
+
**Como funciona**: você implanta este servidor MCP em um local com uma URL HTTPS pública. Os clientes MCP se conectam a `{MCP_SERVER_URL}/mcp`. O servidor processa o fluxo OAuth 2.0, trocando credenciais com o GitLab em nome do cliente.
|
|
242
|
+
|
|
243
|
+
**Pré-requisitos:**
|
|
244
|
+
|
|
245
|
+
1. Uma URL HTTPS de servidor acessível publicamente (`MCP_SERVER_URL`) — use [ngrok](https://ngrok.com) para testes locais
|
|
246
|
+
2. Um aplicativo OAuth do GitLab previamente registrado com os scopes `api` ou `read_api`
|
|
247
|
+
— acesse `Admin area` → `Applications` e defina o Redirect URI como `{MCP_SERVER_URL}/callback`
|
|
248
|
+
|
|
249
|
+
| Variável de ambiente | Obrigatória | Descrição |
|
|
250
|
+
| ----------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
251
|
+
| `GITLAB_MCP_OAUTH` | sim | Defina como `true` para habilitar |
|
|
252
|
+
| `GITLAB_API_URL` | sim | URL base da API do GitLab |
|
|
253
|
+
| `GITLAB_OAUTH_APP_ID` | sim | Application ID do OAuth do GitLab |
|
|
254
|
+
| `MCP_SERVER_URL` | sim | URL HTTPS pública deste servidor MCP |
|
|
255
|
+
| `STREAMABLE_HTTP` | sim | Deve ser `true` |
|
|
256
|
+
| `GITLAB_OAUTH_CALLBACK_PROXY` | opcional | Defina como `true` para usar a URL `/callback` fixa do servidor MCP |
|
|
257
|
+
| `GITLAB_OAUTH_SCOPES` | opcional | Scopes separados por vírgula (padrão: `api,read_api,read_user`) |
|
|
258
|
+
| `GITLAB_OAUTH_ALLOWED_GROUPS` | opcional | Caminhos completos de grupos GitLab separados por vírgula — apenas membros desses grupos e subgrupos podem obter um token (substitui o obsoleto `GITLAB_ALLOWED_GROUPS`) |
|
|
259
|
+
|
|
260
|
+
Quando `STREAMABLE_HTTP=true`, credenciais GitLab do lado do servidor (`GITLAB_PERSONAL_ACCESS_TOKEN`, `GITLAB_JOB_TOKEN`, `GITLAB_AUTH_COOKIE_PATH` ou `GITLAB_USE_OAUTH`) exigem `REMOTE_AUTHORIZATION=true`, `GITLAB_MCP_OAUTH=true` ou `STREAMABLE_HTTP_AUTH_TOKEN`.
|
|
261
|
+
|
|
262
|
+
> **Solução de problemas para `Unregistered redirect_uri`**
|
|
263
|
+
>
|
|
264
|
+
> Verifique o `redirect_uri` na URL do navegador. Se ele apontar para um callback do cliente, como `http://127.0.0.1:xxxxx/.../callback`, habilite:
|
|
265
|
+
>
|
|
266
|
+
> ```env
|
|
267
|
+
> GITLAB_OAUTH_CALLBACK_PROXY=true
|
|
268
|
+
> ```
|
|
269
|
+
>
|
|
270
|
+
> Não corrija o MCP OAuth remoto alterando `GITLAB_OAUTH_REDIRECT_URI`. Essa variável é usada apenas pelo OAuth local (`GITLAB_USE_OAUTH`).
|
|
271
|
+
|
|
272
|
+
```shell
|
|
273
|
+
docker run -i --rm \
|
|
274
|
+
-e HOST=0.0.0.0 \
|
|
275
|
+
-e GITLAB_MCP_OAUTH=true \
|
|
276
|
+
-e GITLAB_OAUTH_CALLBACK_PROXY=true \
|
|
277
|
+
-e STREAMABLE_HTTP=true \
|
|
278
|
+
-e MCP_SERVER_URL=https://your-server.example.com \
|
|
279
|
+
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
|
|
280
|
+
-e GITLAB_OAUTH_APP_ID=your_app_id \
|
|
281
|
+
-p 3000:3002 \
|
|
282
|
+
zereight050/gitlab-mcp
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Configuração do cliente MCP:
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"mcpServers": {
|
|
290
|
+
"gitlab": {
|
|
291
|
+
"type": "http",
|
|
292
|
+
"url": "https://your-server.example.com/mcp"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
#### Usando autorização remota (`REMOTE_AUTHORIZATION`)
|
|
299
|
+
|
|
300
|
+
> **Somente para implantações em servidor/remotas.** Cada chamador HTTP fornece seu próprio token do GitLab diretamente nos headers da requisição — sem fluxo OAuth.
|
|
301
|
+
|
|
302
|
+
Para implantações multiusuário ou multitenant em que cada chamador fornece seu próprio token do GitLab no header HTTP. Não há fluxo OAuth — o servidor MCP encaminha o token ao GitLab em nome do chamador.
|
|
303
|
+
|
|
304
|
+
**Prioridade de headers**: `Private-Token` > `JOB-TOKEN` > `Authorization: Bearer`
|
|
305
|
+
|
|
306
|
+
| Variável de ambiente | Obrigatória | Descrição |
|
|
307
|
+
| -------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
308
|
+
| `REMOTE_AUTHORIZATION` | sim | Defina como `true` para habilitar |
|
|
309
|
+
| `STREAMABLE_HTTP` | sim | Deve ser `true` |
|
|
310
|
+
| `ENABLE_DYNAMIC_API_URL` | opcional | Permite definir a URL do GitLab por requisição pelo header `X-GitLab-API-URL` |
|
|
311
|
+
| `GITLAB_ALLOWED_HOSTS` | opcional | Lista de hosts permitidos para `X-GitLab-API-URL`, separados por vírgula; os hosts em `GITLAB_API_URL` são sempre permitidos. Também são confiáveis como destinos de redirecionamento de downloads (assets de release, artefatos de jobs, anexos enviados); liste aqui hosts de rede privada |
|
|
312
|
+
| `GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY` | opcional | Permite apenas `initialize`, `notifications/initialized`, `tools/list` e `server/discover` sem autenticação (chamadas de ferramentas continuam exigindo autenticação) |
|
|
313
|
+
| `MCP_SERVER_URL` / `MCP_ALLOWED_HOSTS` / `MCP_ALLOWED_ORIGINS` | opcional | Hosts/origens públicos permitidos para `/mcp`, usados na proteção contra DNS rebinding |
|
|
314
|
+
| `MCP_TRUST_PROXY` | opcional | Confia nos headers `Forwarded` / `X-Forwarded-*` atrás de um reverse proxy (URLs de download, `req.ip` do Express, rate limiting por IP em `/mcp` e rate limiting do OAuth) |
|
|
315
|
+
|
|
316
|
+
`GITLAB_ALLOW_UNAUTHENTICATED_TOOL_DISCOVERY=true` é útil para gateways MCP ou UIs administrativas que precisam inspecionar metadados das ferramentas antes de o usuário fornecer um token do GitLab. Mantenha essa opção desabilitada, a menos que sua implantação possa expor com segurança a lista de ferramentas.
|
|
317
|
+
|
|
318
|
+
Quando `MCP_SERVER_URL` não está definido, as URLs de download remotas usam como fallback o endereço local do servidor. Defina `MCP_TRUST_PROXY=true` somente quando o servidor for acessível por um reverse proxy confiável e o acesso direto dos clientes ao servidor MCP estiver bloqueado. Isso habilita o `trust proxy` do Express para Streamable HTTP e SSE, deriva URLs públicas de download a partir de `Forwarded` / `X-Forwarded-Proto` / `X-Forwarded-Host` / `X-Forwarded-Prefix` e mantém o rate limiting dos endpoints OAuth funcional quando o proxy envia em `X-Forwarded-For` endereços com porta do cliente (por exemplo, `1.2.3.4:5678`). Após a introdução dessa flag, implantações OAuth+proxy existentes precisam defini-la explicitamente.
|
|
319
|
+
|
|
320
|
+
**Exemplos de headers:**
|
|
321
|
+
|
|
322
|
+
```http
|
|
323
|
+
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxx
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
ou com Bearer token:
|
|
327
|
+
|
|
328
|
+
```http
|
|
329
|
+
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
> ⚠️ `REMOTE_AUTHORIZATION` não é compatível com transporte SSE. É obrigatório usar `STREAMABLE_HTTP=true`.
|
|
333
|
+
|
|
334
|
+
### Variáveis de ambiente
|
|
335
|
+
|
|
336
|
+
Consulte a documentação de referência dedicada para a lista completa de variáveis de ambiente:
|
|
337
|
+
|
|
338
|
+
- [Referência de variáveis de ambiente](./docs/configuration/environment-variables.md)
|
|
339
|
+
|
|
340
|
+
A maioria dos usuários precisa apenas de uma destas combinações iniciais:
|
|
341
|
+
|
|
342
|
+
- **PAT local**: `GITLAB_PERSONAL_ACCESS_TOKEN`, `GITLAB_API_URL`
|
|
343
|
+
- **OAuth local**: `GITLAB_USE_OAUTH=true`, `GITLAB_OAUTH_CLIENT_ID`, `GITLAB_OAUTH_REDIRECT_URI`, `GITLAB_API_URL`
|
|
344
|
+
- **HTTP remoto multiusuário**: `STREAMABLE_HTTP=true`, `REMOTE_AUTHORIZATION=true` (ou `GITLAB_MCP_OAUTH=true`), `MCP_TRUST_PROXY=true` (atrás de reverse proxy), `MAX_REQUESTS_PER_MINUTE=300`, `MCP_SERVER_URL` ou `MCP_ALLOWED_HOSTS`, `HOST`, `PORT`
|
|
345
|
+
- **Múltiplas implantações em paralelo**: defina um `MCP_SERVER_NAME` diferente para cada instância (por exemplo, `gitlab-selfhosted-readonly`) para distingui-las em clientes, logs e telemetria
|
|
346
|
+
- **HPA com múltiplos Pods (stateless)**: configuração acima + `OAUTH_STATELESS_MODE=true`, `OAUTH_STATELESS_SECRET` (igual em todos os Pods). Veja [Modo Stateless](./docs/configuration/stateless-mode.md).
|
|
347
|
+
|
|
348
|
+
Variáveis usadas com frequência:
|
|
349
|
+
|
|
350
|
+
- `GITLAB_API_URL`
|
|
351
|
+
- `GITLAB_PERSONAL_ACCESS_TOKEN`
|
|
352
|
+
- `GITLAB_USE_OAUTH`
|
|
353
|
+
- `REMOTE_AUTHORIZATION`
|
|
354
|
+
- `MCP_TRUST_PROXY`
|
|
355
|
+
- `MAX_REQUESTS_PER_MINUTE`
|
|
356
|
+
- `MAX_SESSIONS`
|
|
357
|
+
- `MCP_ALLOWED_HOSTS`
|
|
358
|
+
- `MCP_ALLOWED_ORIGINS`
|
|
359
|
+
- `GITLAB_MCP_OAUTH`
|
|
360
|
+
- `GITLAB_OAUTH_CALLBACK_PROXY`
|
|
361
|
+
- `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR`
|
|
362
|
+
- `OAUTH_STATELESS_MODE`
|
|
363
|
+
- `OAUTH_STATELESS_SECRET`
|
|
364
|
+
|
|
365
|
+
A documentação de referência também inclui:
|
|
366
|
+
|
|
367
|
+
- variáveis de autenticação e OAuth
|
|
368
|
+
- variáveis do proxy MCP OAuth
|
|
369
|
+
- variáveis de filtragem de projetos e ferramentas
|
|
370
|
+
- descoberta dinâmica de ferramentas via `discover_tools` (habilitação de toolsets sob demanda)
|
|
371
|
+
- variáveis de transporte e sessão
|
|
372
|
+
- variáveis de proxy e TLS
|
|
373
|
+
|
|
374
|
+
Para detalhes do modo de proxy de callback, veja [GitLab MCP OAuth Callback Proxy](./docs/auth/oauth-callback-proxy.md).
|
|
375
|
+
|
|
376
|
+
#### Limites de sessão SSE
|
|
377
|
+
|
|
378
|
+
`GET /sse` está sujeito aos mesmos controles de transporte remoto do Streamable HTTP:
|
|
379
|
+
|
|
380
|
+
- **Capacidade:** no máximo `MAX_SESSIONS` sessões SSE simultâneas (padrão 1000); conexões excedentes recebem `503`.
|
|
381
|
+
- **Limite de criação:** novas conexões são limitadas por IP do cliente a `MAX_REQUESTS_PER_MINUTE` (padrão 60); conexões excedentes recebem `429`.
|
|
382
|
+
- **Timeout de inatividade:** sessões sem uma requisição `POST /messages` durante `SESSION_TIMEOUT_SECONDS` (padrão 1 hora) são encerradas, então clientes inativos precisam se reconectar em vez de ocupar indefinidamente um slot de capacidade. Diferentemente do Streamable HTTP, manter o stream SSE aberto **não** conta como atividade.
|
|
383
|
+
- Quando a instância atinge a capacidade, `/health` retorna `503` e `status: "degraded"`.
|
|
384
|
+
|
|
385
|
+
Ajuste esses limites com [`MAX_SESSIONS`](./docs/configuration/environment-variables.md#max_sessions), `MAX_REQUESTS_PER_MINUTE` e `SESSION_TIMEOUT_SECONDS`.
|
|
386
|
+
|
|
387
|
+
### Configuração de autorização remota (suporte multiusuário)
|
|
388
|
+
|
|
389
|
+
Com `REMOTE_AUTHORIZATION=true`, o servidor MCP pode atender vários usuários, cada um fornecendo seu próprio token do GitLab por headers HTTP. Isso é útil para:
|
|
390
|
+
|
|
391
|
+
- instâncias compartilhadas do servidor MCP em que cada usuário precisa de suas próprias permissões de acesso ao GitLab
|
|
392
|
+
- integrações com IDEs capazes de injetar tokens específicos de cada usuário nas requisições MCP
|
|
393
|
+
|
|
394
|
+
**Exemplo de configuração:**
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
docker run -d \
|
|
398
|
+
-e HOST=0.0.0.0 \
|
|
399
|
+
-e STREAMABLE_HTTP=true \
|
|
400
|
+
-e REMOTE_AUTHORIZATION=true \
|
|
401
|
+
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
|
|
402
|
+
-e GITLAB_PERMISSION_MODE=readonly \
|
|
403
|
+
-e SESSION_TIMEOUT_SECONDS=3600 \
|
|
404
|
+
-p 3333:3002 \
|
|
405
|
+
zereight050/gitlab-mcp
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
**Configuração do cliente:**
|
|
409
|
+
|
|
410
|
+
A IDE ou cliente MCP deve enviar um dos seguintes headers em cada requisição:
|
|
411
|
+
|
|
412
|
+
```http
|
|
413
|
+
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
ou
|
|
417
|
+
|
|
418
|
+
```http
|
|
419
|
+
Private-Token: glpat-xxxxxxxxxxxxxxxxxxxx
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
O token é armazenado por sessão (identificada pelo header `mcp-session-id`) e reutilizado nas requisições seguintes da mesma sessão.
|
|
423
|
+
|
|
424
|
+
#### Exemplo de configuração de autorização remota no Cursor
|
|
425
|
+
|
|
426
|
+
```json
|
|
427
|
+
{
|
|
428
|
+
"mcpServers": {
|
|
429
|
+
"GitLab": {
|
|
430
|
+
"url": "http(s)://<your_mcp_gitlab_server>/mcp",
|
|
431
|
+
"headers": {
|
|
432
|
+
"Authorization": "Bearer glpat-..."
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**Observações importantes:**
|
|
440
|
+
|
|
441
|
+
- A autorização remota **funciona apenas com o transporte Streamable HTTP**
|
|
442
|
+
- Cada sessão é isolada. O token de uma sessão não pode acessar os dados de outra sessão. Os tokens são limpos automaticamente quando a sessão é encerrada.
|
|
443
|
+
- **Timeout de sessão:** os tokens de autenticação expiram após `SESSION_TIMEOUT_SECONDS` (padrão 1 hora) sem atividade. Após o timeout, o cliente precisa enviar novamente os headers de autenticação. A sessão de transporte permanece ativa.
|
|
444
|
+
- Cada requisição reinicia o timer de timeout da sessão.
|
|
445
|
+
- **Rate limiting:** requisições a `/mcp` são limitadas por IP do cliente a `MAX_REQUESTS_PER_MINUTE`; ao usar OAuth ou autorização remota, também são limitadas por sessão MCP (padrão 60). Veja [environment-variables.md](docs/configuration/environment-variables.md#max_requests_per_minute).
|
|
446
|
+
- **Limite de capacidade:** o servidor aceita no máximo `MAX_SESSIONS` sessões simultâneas (padrão 1000).
|
|
447
|
+
|
|
448
|
+
### Configuração de MCP OAuth (OAuth nativo do Claude.ai)
|
|
449
|
+
|
|
450
|
+
Com `GITLAB_MCP_OAUTH=true`, o servidor atua como um proxy OAuth para sua instância GitLab. Claude.ai e qualquer cliente compatível com a especificação MCP processam automaticamente o fluxo completo de autenticação no navegador, sem necessidade de gerenciar manualmente um Personal Access Token.
|
|
451
|
+
|
|
452
|
+
**Pré-requisitos:**
|
|
453
|
+
|
|
454
|
+
É necessário um **aplicativo OAuth do GitLab previamente registrado**. O GitLab limita aplicativos não verificados registrados dinamicamente ao scope `mcp`, que não é suficiente para chamadas à API (é necessário `api` ou `read_api`).
|
|
455
|
+
|
|
456
|
+
1. Acesse sua instância GitLab → **Admin Area > Applications** (nível da instância) ou **User Settings > Applications** (pessoal).
|
|
457
|
+
2. Crie um novo aplicativo:
|
|
458
|
+
- **Confidential**: desmarcado
|
|
459
|
+
- **Scopes**: `api`, `read_api`, `read_user` ou os scopes que você pretende solicitar via `GITLAB_OAUTH_SCOPES`
|
|
460
|
+
3. Salve e copie o **Application ID**. Esse valor é `GITLAB_OAUTH_APP_ID`.
|
|
461
|
+
|
|
462
|
+
**Como funciona:**
|
|
463
|
+
|
|
464
|
+
1. O usuário adiciona a URL do servidor MCP ao Claude.ai.
|
|
465
|
+
2. O Claude.ai descobre os endpoints OAuth por meio de `/.well-known/oauth-authorization-server`.
|
|
466
|
+
3. O Claude.ai se registra usando Dynamic Client Registration (`POST /register`). O servidor MCP processa isso localmente e atribui um client ID virtual a cada cliente.
|
|
467
|
+
4. O Claude.ai usa o aplicativo OAuth previamente registrado para redirecionar o navegador do usuário à página de login do GitLab.
|
|
468
|
+
5. Após a autenticação, o GitLab redireciona para `https://claude.ai/api/mcp/auth_callback`.
|
|
469
|
+
6. O Claude.ai envia `Authorization: Bearer <token>` em cada requisição MCP.
|
|
470
|
+
7. O servidor valida o token com o GitLab e o armazena por sessão.
|
|
471
|
+
|
|
472
|
+
**Configuração do servidor:**
|
|
473
|
+
|
|
474
|
+
```bash
|
|
475
|
+
docker run -d \
|
|
476
|
+
-e STREAMABLE_HTTP=true \
|
|
477
|
+
-e GITLAB_MCP_OAUTH=true \
|
|
478
|
+
-e GITLAB_OAUTH_APP_ID="your-gitlab-oauth-app-client-id" \
|
|
479
|
+
-e GITLAB_API_URL="https://gitlab.example.com/api/v4" \
|
|
480
|
+
-e MCP_SERVER_URL="https://your-mcp-server.example.com" \
|
|
481
|
+
-p 3002:3002 \
|
|
482
|
+
zereight050/gitlab-mcp
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
Desenvolvimento local (HTTP permitido):
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL=true \
|
|
489
|
+
STREAMABLE_HTTP=true \
|
|
490
|
+
GITLAB_MCP_OAUTH=true \
|
|
491
|
+
GITLAB_OAUTH_APP_ID=your-gitlab-oauth-app-client-id \
|
|
492
|
+
MCP_SERVER_URL=http://localhost:3002 \
|
|
493
|
+
GITLAB_API_URL=https://gitlab.com/api/v4 \
|
|
494
|
+
node build/index.js
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**Configuração do Claude.ai:**
|
|
498
|
+
|
|
499
|
+
```json
|
|
500
|
+
{
|
|
501
|
+
"mcpServers": {
|
|
502
|
+
"GitLab": {
|
|
503
|
+
"url": "https://your-mcp-server.example.com/mcp"
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
Não é necessário definir `headers`. O Claude.ai obtém o token via OAuth.
|
|
510
|
+
|
|
511
|
+
**Variáveis de ambiente:**
|
|
512
|
+
|
|
513
|
+
| Variável | Obrigatória | Descrição |
|
|
514
|
+
| ------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
515
|
+
| `GITLAB_MCP_OAUTH` | sim | Defina como `true` para habilitar |
|
|
516
|
+
| `GITLAB_OAUTH_APP_ID` | sim | Client ID do aplicativo OAuth do GitLab previamente registrado |
|
|
517
|
+
| `MCP_SERVER_URL` | sim | URL HTTPS pública do servidor MCP |
|
|
518
|
+
| `GITLAB_API_URL` | sim | URL da API da instância GitLab (por exemplo, `https://gitlab.com/api/v4`) |
|
|
519
|
+
| `STREAMABLE_HTTP` | sim | Deve ser `true` (SSE não é suportado) |
|
|
520
|
+
| `GITLAB_OAUTH_SCOPES` | não | Scopes do GitLab a solicitar, separados por vírgula. O padrão é `api`, ou `read_api` quando `GITLAB_READ_ONLY_MODE=true`. O aplicativo previamente registrado deve ter pelo menos esses scopes configurados. |
|
|
521
|
+
| `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` | não | Limite rolling de Dynamic Client Registration (`POST /register`) por IP do cliente. Padrão `20`/hora, intervalo `1`–`1000`. Aumente se múltiplas janelas de IDE estiverem atingindo o limite. Não está relacionado aos limites da API do GitLab. |
|
|
522
|
+
| `MCP_DANGEROUSLY_ALLOW_INSECURE_ISSUER_URL` | não | Apenas para desenvolvimento local via HTTP |
|
|
523
|
+
|
|
524
|
+
**Observações importantes:**
|
|
525
|
+
|
|
526
|
+
- MCP OAuth **funciona apenas com transporte Streamable HTTP** (incompatível com `SSE=true`).
|
|
527
|
+
- Cada sessão de usuário mantém seu próprio token OAuth; as sessões são completamente isoladas.
|
|
528
|
+
- Timeout de sessão, rate limiting e limite de capacidade são os mesmos do modo `REMOTE_AUTHORIZATION` (`SESSION_TIMEOUT_SECONDS`, `MAX_REQUESTS_PER_MINUTE`, `MAX_SESSIONS`).
|
|
529
|
+
- **Rate limiting do DCR:** `POST /register` é limitado por IP do cliente por `OAUTH_REGISTER_RATE_LIMIT_PER_HOUR` (padrão 20/hora). Isso é independente do limite de `/mcp` e das cotas da API do GitLab. Veja [environment-variables.md](docs/configuration/environment-variables.md#oauth_register_rate_limit_per_hour).
|
|
530
|
+
- **Fallback de autenticação por header:** quando os headers `Private-Token` ou `JOB-TOKEN` estão presentes, a validação OAuth é ignorada e o token bruto é usado diretamente nessa sessão. Isso permite usar fluxos OAuth, PAT e CI job token na mesma instância do servidor. `Authorization: Bearer` é sempre tratado como token OAuth. Para autenticação PAT por header, use `Private-Token`.
|
|
531
|
+
|
|
532
|
+
## Arquivos de Agent Skill
|
|
533
|
+
|
|
534
|
+
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/).
|
|
535
|
+
|
|
536
|
+
- **[SKILL.md](./skills/gitlab-mcp/SKILL.md)** — guia principal com visão geral dos toolsets, workflows importantes e dicas de parâmetros
|
|
537
|
+
- **[reference/](./skills/gitlab-mcp/reference/)** — documentação detalhada de workflows para code review, merge requests, issues, pipelines e triagem de vulnerabilidades
|
|
538
|
+
|
|
539
|
+
Instale usando a CLI `skills`:
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
npx skills add zereight/gitlab-mcp --skill gitlab-mcp-skill
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
Registre o diretório da skill no seu cliente de IA para obter orientações melhores de uso das ferramentas sem depender totalmente da resposta completa de ListTools.
|
|
546
|
+
|
|
547
|
+
## Ferramentas 🛠️
|
|
548
|
+
|
|
549
|
+
Para a lista completa de ferramentas, consulte a [seção Tools do README em inglês](./README.md#tools-%EF%B8%8F). O servidor atual fornece ferramentas relacionadas a merge requests, issues, pipelines, deployments, environments, artifacts, milestones, Wiki, repositórios, releases, usuários, eventos, work items, webhooks, busca de código, variáveis CI/CD, dependency proxy, triagem de vulnerabilidades e execução GraphQL.
|
|
550
|
+
|
|
551
|
+
### Títulos e slugs de páginas Wiki
|
|
552
|
+
|
|
553
|
+
O GitLab deriva o **slug** de uma página Wiki (sua URL, `/-/wikis/<slug>`) a partir do título da página. Portanto, passar `title` para `update_wiki_page` / `update_group_wiki_page` **renomeia a página e altera sua URL** — em páginas aninhadas, isso também pode mover a página para outro caminho — quebrando links existentes.
|
|
554
|
+
|
|
555
|
+
Para alterar apenas o **título exibido** mantendo a URL estável, **não** passe `title`. Em vez disso, armazene o título exibido no YAML front matter do conteúdo da página e atualize o conteúdo:
|
|
556
|
+
|
|
557
|
+
```markdown
|
|
558
|
+
---
|
|
559
|
+
title: Meu título personalizado
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
Corpo da página…
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
O GitLab mantém o slug/URL intacto e exibe o título do front matter na interface. Para lê-lo, use `get_wiki_page` com `render_html: true`, que preenche o campo `front_matter` — o campo `title` simples sempre reflete o valor derivado do slug.
|
|
566
|
+
|
|
567
|
+
## Testes 🧪
|
|
568
|
+
|
|
569
|
+
O projeto inclui cobertura abrangente de testes, incluindo autorização remota:
|
|
570
|
+
|
|
571
|
+
```bash
|
|
572
|
+
# Executar todos os testes (validação da API + autorização remota)
|
|
573
|
+
npm test
|
|
574
|
+
|
|
575
|
+
# Executar apenas os testes de autorização remota
|
|
576
|
+
npm run test:remote-auth
|
|
577
|
+
|
|
578
|
+
# Executar todos os testes, incluindo testes MCP somente leitura
|
|
579
|
+
npm run test:all
|
|
580
|
+
|
|
581
|
+
# Executar apenas a validação da API
|
|
582
|
+
npm run test:integration
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
Todos os testes de autorização remota usam um servidor GitLab mockado e não exigem credenciais reais do GitLab.
|
package/README.zh-CN.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@zereight/mcp-gitlab)
|
|
4
4
|
[](vscode:mcp/install?%7B%22name%22%3A%22zereight.gitlab-mcp%22%2C%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%2C%22GITLAB_PERMISSION_MODE%22%3A%22full%22%7D%7D)
|
|
5
5
|
|
|
6
|
-
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md)
|
|
6
|
+
[English](./README.md) | [한국어](./README.ko.md) | [简体中文](./README.zh-CN.md) | [Português (Brasil)](./README.pt-BR.md)
|
|
7
7
|
|
|
8
8
|
📖 **[文档 →](https://zereight.github.io/gitlab-mcp/)** 设置指南、环境变量和完整工具参考请查看托管文档站点。
|
|
9
9
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
### 为什么使用这个 GitLab MCP?
|
|
19
19
|
|
|
20
|
-
- **
|
|
20
|
+
- **266 个工具 + `discover_tools`** — 从小型 toolset 开始,运行时按需激活类别
|
|
21
21
|
- **MR 两步审查** — `list_merge_request_changed_files` → 批量 `get_merge_request_file_diff`
|
|
22
22
|
- **内置 Agent Skill** — `skills/gitlab-mcp/` 工作流指南
|
|
23
23
|
- **认证灵活** — Personal Access Token、本地 OAuth2 浏览器流程、MCP OAuth 代理、按请求远程授权
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
| | @zereight/mcp-gitlab | GitLab MCP A(社区 CQRS 型) |
|
|
32
32
|
|---|----------------------|------------------------------|
|
|
33
33
|
| **更适合** | AI 代理工作流 | 企业多实例 / 分组工具 |
|
|
34
|
-
| **工具模型** | ~
|
|
34
|
+
| **工具模型** | ~266 个细粒度工具 + `discover_tools` | ~50–60 个 `browse_*` / `manage_*` 分组工具 |
|
|
35
35
|
| **MR 审查** | 两步批量 diff | 因服务器而异 |
|
|
36
36
|
| **Node.js** | >=18.17 | 通常 >=24 |
|
|
37
37
|
| **许可证** | MIT | 因服务器而异 |
|
|
@@ -111,7 +111,7 @@ command = lib.getExe inputs.gitlab-mcp.packages.${system}.default;
|
|
|
111
111
|
|
|
112
112
|
示例使用 `zereight-mcp-gitlab`,这是比旧的 `mcp-gitlab` 更不容易冲突的别名。如果 MCP 客户端找不到它,请使用 `which zereight-mcp-gitlab` 输出的绝对路径。
|
|
113
113
|
|
|
114
|
-
如果不想全局安装,请将 `npx` 固定到上一个稳定版本(即文档推荐的版本),例如 `npx -y @zereight/mcp-gitlab@2.1.
|
|
114
|
+
如果不想全局安装,请将 `npx` 固定到上一个稳定版本(即文档推荐的版本),例如 `npx -y @zereight/mcp-gitlab@2.1.67`。如果始终想使用最新版本,请改用 `npx -y @zereight/mcp-gitlab@latest`。有新版本发布时,服务器会在启动时通过 stderr 提示(可用 `GITLAB_DISABLE_VERSION_CHECK=true` 关闭)。
|
|
115
115
|
|
|
116
116
|
#### 使用 CLI 参数(适用于环境变量有问题的客户端)
|
|
117
117
|
|