gitlab-mcp
Allows browsing merge requests, viewing parsed diffs with line numbers, and posting review comments (general, inline, and replies) on GitLab instances via the GitLab REST API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gitlab-mcpList merge requests awaiting my review"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
gitlab-mcp
MCP server (stdio) que funciona como proxy fino sobre a REST API v4 de uma instância GitLab CE self-hosted.
MVP com um objetivo só: navegar merge requests e deixar review inline sem abrir o browser. Tudo que não serve a isso está fora de escopo (nada de issues, pipelines, criar/mergear MR, aprovações, recursos Premium/Ultimate).
Como funciona
10 tools: 7 de leitura, 3 de escrita.
Toda resposta passa por whitelist explícita de campos — a API do GitLab devolve objetos com 40+ campos e nenhum deles chega cru no contexto do modelo.
Toda listagem tem
per_pagecom default 20 (máximo 100) e informa se há mais páginas.Read-only por default. As tools de escrita só funcionam com
GITLAB_READ_ONLY=false.O diff sai parseado, com os números de linha de cada lado impressos (
old=/new=), porque é isso que torna o comentário em linha confiável.
Related MCP server: gitlab-mcp
Instalação
npm install
npm run buildRequer Node >= 20 (usa fetch nativo e AbortSignal.timeout).
Configuração
Variável | Obrigatória | Default | Descrição |
| sim | — | Base da instância, ex.: |
| sim | — | Personal Access Token. |
| não |
| Só o literal |
| não | — | Caminho para CA privada / cert self-signed em PEM. |
| não |
| Timeout por request, em ms. |
Falta GITLAB_URL ou GITLAB_TOKEN → o server escreve o erro em stderr e sai com código 1. Não sobe quebrado.
Veja .env.example.
Escopos do token — leia antes de gerar
Tools | Escopo mínimo |
1–7 ( |
|
8–10 ( |
|
read_api não escreve. Se você gerar o token com read_api e tentar comentar, o GitLab devolve 403 — o server traduz isso para uma mensagem dizendo exatamente que provavelmente é esse o caso, mas o conserto é regerar o token com escopo api.
Configuração no client
claude_desktop_config.json ou .mcp.json:
{
"mcpServers": {
"gitlab": {
"command": "node",
"args": ["/caminho/absoluto/para/gitlab-mcp/dist/index.js"],
"env": {
"GITLAB_URL": "https://gitlab.empresa.com",
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx",
"GITLAB_READ_ONLY": "true"
}
}
}
}Para habilitar review inline, troque para "GITLAB_READ_ONLY": "false" (e use um token com escopo api).
Com CA privada:
"env": {
"GITLAB_URL": "https://gitlab.empresa.com",
"GITLAB_TOKEN": "glpat-...",
"GITLAB_CA_CERT": "/etc/ssl/certs/empresa-ca.pem"
}Não existe opção de desabilitar verificação TLS. De propósito.
Testar antes de plugar no client
npm run build
GITLAB_URL=https://gitlab.empresa.com \
GITLAB_TOKEN=glpat-xxx \
npx @modelcontextprotocol/inspector node dist/index.jsO Inspector abre no browser, lista as 10 tools e deixa você chamar cada uma com os argumentos na mão. Se algo falhar aqui, falha no client também — e aqui você vê a mensagem de erro inteira.
Logs do server saem em stderr (aba de logs do Inspector). stdout é exclusivo do protocolo MCP.
Checklist de validação manual
Nesta ordem. Cada passo alimenta o seguinte.
whoami— devolve seuusername? Se derToken inválido ou expirado., pare aqui.list_my_projects— anote opath_with_namespacede um projeto com MR aberto.list_mrs_awaiting_my_review— deve listar MRs onde você é reviewer. Se vier vazio e você sabe que tem MR esperando: confira que você está como reviewer e não como assignee (são campos diferentes no GitLab).get_mrcomproject+iid(o número da URL,/-/merge_requests/123) — confira quediff_refsnão énull.get_mr_diffcom o mesmoproject+iid— deve sair o diff comold=/new=em cada linha e osdiff_refsno rodapé. Anote uma linhaadde uma linhactx.A partir daqui precisa de
GITLAB_READ_ONLY=falsee token com escopoapi.comment_on_mr— comentário geral. Abra oweb_urlretornado e confirme que apareceu.comment_on_mr_linenuma linhaadd:side="new",line= o númeronew=daquela linha.comment_on_mr_linenuma linhactx:side="context",line= onew=,context_old_line= oold=da mesma linha. Os dois são obrigatórios — é o erro mais comum.list_mr_discussions— as duas threads criadas devem aparecer compositionediscussion_id.reply_to_mr_discussioncom um dosdiscussion_iddo passo 9.
Se o passo 7 ou 8 falhar, a mensagem de erro diz quais linhas de fato existem naquele lado do diff. Não é preciso adivinhar.
As 10 tools
# | Tool | Escrita | Resumo |
1 |
| Identidade do token. Cacheada no processo. | |
2 |
| Projetos onde você é membro, por atividade recente. | |
3 |
| MRs que você criou, em todos os projetos. | |
4 |
| MRs abertos onde você é reviewer. | |
5 |
| Detalhe do MR, incluindo | |
6 |
| Diff parseado com numeração de linha explícita. | |
7 |
| Threads de comentário, com | |
8 |
| sim | Comentário geral no MR. |
9 |
| sim | Thread ancorada numa linha do diff. |
10 |
| sim | Resposta numa thread existente. |
Notas de implementação que importam
iid, nãoid. Todas as tools de MR usam oiid— o número que aparece na URL. Oidglobal existe e a API aceita em outros contextos; usar o errado pega o MR de outro projeto ou dá 404.Resolução de projeto. O path (
grupo/subgrupo/projeto) é URL-encoded (%2F) e resolvido para id numérico, com cache em memória.comment_on_mr_linebuscadiff_refsfresco com um GET do MR imediatamente antes do POST, e nunca aceita os shas como parâmetro: se alguém deu push, os shas velhos invalidam a posição.Validação local antes do POST. A tool confere que o arquivo está no MR e que a linha existe no lado pedido. Se não existir, falha localmente listando as linhas válidas, em vez de mandar pro GitLab e devolver um 400 opaco. Se mesmo assim vier 400, a mensagem do GitLab volta na íntegra junto com o payload enviado.
Linha de contexto exige os dois números.
side="context"semcontext_old_lineé rejeitado localmente, com o valor correto na mensagem.Prompt injection.
descriptionde MR ebodyde comentário são conteúdo escrito por qualquer pessoa com acesso ao GitLab. Vêm envelopados em<untrusted source="gitlab:...">e a resposta carrega uma nota dizendo que aquilo é dado, não instrução. Não é blindagem; é o mínimo defensável.Comentário multi-linha está fora de escopo. Só linha única.
Testes
npm testCobrem só o parser de diff unificado (src/diff.ts) — a única lógica pura não-trivial, e a que quebra comment_on_mr_line quando erra: hunk misto, múltiplos hunks, arquivo novo/deletado/renomeado, \ No newline at end of file, truncamento em 400 linhas e arquivo binário.
Sem testes de integração e sem mock de HTTP — não vale o tempo no MVP.
Estrutura
src/
├── index.ts # entrypoint stdio. NUNCA escreve em stdout.
├── config.ts # env, validação no boot, normalização da URL
├── gitlab.ts # único ponto de saída HTTP: token, timeout, CA, paginação, 429, erros
├── errors.ts # GitLabError / ToolError
├── projects.ts # resolveProject + cache path <-> id
├── diff.ts # parser de diff unificado (puro, testado)
├── format.ts # whitelist, truncamento, blocos <untrusted>
└── tools/ # as 10 tools, agrupadas por domínioMaintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- -licenseAqualityAmaintenanceMCP Server for the GitLab API, enabling project management, file operations, and more.95,44589,405MIT
- Alicense-qualityBmaintenanceMCP server for interacting with GitLab API, supporting both self-hosted instances and gitlab.com. Provides tools for managing issues, merge requests, code review, pipelines, milestones, releases, search, and file access.703MIT
- Alicense-qualityAmaintenanceMCP server for the GitLab REST API providing tools to manage projects, merge requests, pipelines, CI/CD variables, approvals, issues, and code reviews.5MIT
- Flicense-qualityDmaintenanceHTTP-based MCP server for GitLab API, enabling project management, issue tracking, merge requests, and file operations through natural language.
Related MCP Connectors
Go MCP server for GitLab: 2 dynamic tools reach 1000+ REST/GraphQL actions. Free/CE, no paid tier.
GitLab Public MCP — wraps the GitLab REST API v4 (public endpoints, no auth)
A MCP server built for developers enabling Git based project management with project and personal…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vinihcrosa/gitlab-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server