
Mcp Gitlab
io.github.vish288Published by GitHub account vish288v0.22.0Updated Nov 7, 2026
GitLab MCP server (MCP 2026-07-28): projects, MRs, pipelines, CI/CD, issues; writes or read-only
The publisher's own server: Gitlab
Overview
MCP server for the GitLab REST API that lets an assistant read and manage projects, merge requests, code review, pipelines and issues, with an optional…
- What you can do
- Read and manage projects, groups, branches, commits, repository files, tags and releases
- Review merge requests: changes, approvals, notes, inline discussions, draft notes, merge, rebase
- Inspect and control CI/CD: pipelines, jobs and logs, retry or cancel, project and group variables
- Track issues: list, get, create, update and comment
- Use bundled workflow guides as resources and prompts for MR review, pipeline diagnosis, releases and issue triage
- When to use it
- Useful when an assistant should work inside a GitLab instance — reviewing merge requests, diagnosing failed pipelines, drafting releases or triaging issues — on gitlab.com or a self-hosted CE/EE instance, without needing GitLab Duo or Premium.
- Requirements
- Runs locally as a Python package (uvx mcp-gitlab, uv required). Needs GITLAB_URL and a GitLab token in GITLAB_TOKEN (or GITLAB_PAT, GITLAB_PERSONAL_ACCESS_TOKEN, GITLAB_API_TOKEN), or a local sign-in via mcp-gitlab auth login. Optional OAuth mode needs GITLAB_OAUTH_CLIENT_ID and GITLAB_OAUTH_CLIENT_SECRET; HTTP binding to a non-loopback host needs GITLAB_HTTP_BEARER_TOKEN. Network access to the GitLab instance.
Installation
In SourceWeft
- Open Mcp Gitlab in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
mcp-gitlab
[PyPI version] [PyPI downloads] [Python] [License: MIT] [CI] [MCP Registry]
mcp-gitlab is a Model Context Protocol (MCP) server for the GitLab REST API. It gives AI assistants 91 tools, 7 resources, and 6 prompts to manage projects, merge requests, pipelines, CI/CD variables, approvals, issues, and code reviews. Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client. Runs in one of two modes: with writes, or locked read-only (MCP_READ_ONLY=true) so the 57 write tools are never offered to the model.
Supports GitLab.com and self-hosted GitLab instances (CE/EE). No GitLab Duo or Premium required.
Supports the MCP 2026-07-28 specification, often called MCP 2.0, and stays compatible with 2025-11-25 clients.
Built with FastMCP 4.x, httpx, and Pydantic.
Install: uvx mcp-gitlab | PyPI | MCP Registry | Changelog
1-Click Installation
[Install in VS Code] [Install in VS Code Insiders]
💡 Tip: For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the GitLab MCP Installation Gateway.
Manual Setup Guides (Click to expand)
Prerequisite: Install
uvfirst (required for alluvxinstall flows). Install uv.
Claude Code
Windsurf & IntelliJ
Windsurf: Add to ~/.codeium/windsurf/mcp_config.json
IntelliJ: Add to Settings | Tools | MCP Servers
Note: The actual server config starts at
gitlabinside themcpServersobject. RemoveMCP_READ_ONLYto allow writes.
Gemini CLI
VS Code
Add to .vscode/mcp.json. Remove MCP_READ_ONLY to allow writes.
Codex
pip / uv
Drop MCP_READ_ONLY to allow writes. On a shared or hosted server put it in the deployer's env, not the client config.
Configuration
Supported Token Types
The server checks these environment variables in order — first match wins:
GITLAB_TOKENGITLAB_PATGITLAB_PERSONAL_ACCESS_TOKENGITLAB_API_TOKEN
These accept any of the following token types:
Sign in without a token
Use this when you run the server for yourself over stdio and have no personal
access token. mcp-gitlab auth login signs you in to GitLab as a public OAuth
client and stores the tokens locally. The server then reads them at startup and
refreshes them on its own. This is not OAuth mode; the server stays in token
mode and nothing on the MCP wire changes.
Three commands:
auth login prints a code and a URL. Open the URL, enter the code, and approve.
The server then works with GITLAB_URL set and no token.
Client ID
Each sign-in needs an OAuth application ID. Resolution order: --client-id,
then GITLAB_OAUTH_CLIENT_ID, then a built-in default for https://gitlab.com.
The gitlab.com default is not registered yet. Until it is, set
GITLAB_OAUTH_CLIENT_ID or pass --client-id for gitlab.com too.
Register an app (self-managed, or gitlab.com until the default ships)
Create an application under User Settings → Applications → Add new application with these settings:
Use 127.0.0.1, not localhost. The device flow needs GitLab 17.9 or later; on
older instances use mcp-gitlab auth login --web.
Storage and precedence
Credentials live in ~/.config/mcp-gitlab/credentials.json, one entry per
GitLab URL, mode 0600. An environment token always wins: if GITLAB_TOKEN is
set, the server uses it and ignores the stored credentials.
Pass --scopes read_api for a read-only session; the server then blocks write
tools before any API call.
OAuth 2.1 (remote deployments)
For a server shared by several people, --auth oauth turns mcp-gitlab into an
MCP 2026-07-28 resource server with GitLab as the upstream OAuth provider: each
user signs in with their own GitLab account, every request runs with that
user's token, and no personal access token is configured on the server. Use it
when you host the server once and multiple users connect to it; keep the
default --auth token for a single-user local setup.
OAuth mode requires --transport streamable-http (OAuth applies to HTTP only;
stdio keeps using the environment token).
1. Register a GitLab OAuth application (User Settings → Applications, or a
group/instance application). Set the redirect URI to <base>/auth/callback
(e.g. https://mcp.example.com/auth/callback), mark it confidential, and grant
the api scope (or read_api for a read-only deployment). Copy the
Application ID and Secret.
2. Configure the server:
Point an MCP client (or the MCP Inspector, pnpm dlx @modelcontextprotocol/inspector)
at <base>/mcp; it discovers the authorization server, runs the OAuth flow, and
each tool call then uses that user's GitLab token. A read_api-only token can
read but is refused writes with an actionable hint.
Full guide, client setup and troubleshooting: docs/oauth.md.
Compatibility
Protocol support
mcp-gitlab implements the Model Context Protocol. It supports the 2026-07-28 specification, often called MCP 2.0. It stays compatible with 2025-11-25 clients.
- Specification: MCP 2026-07-28 (MCP 2.0). Verified over
stdioandstreamable-http. - Legacy clients: 2025-11-25 clients still work.
- Built on: FastMCP 4.x and the MCP Python SDK 2.x.
- Transports:
stdio(default) andstreamable-http(recommended for remote). Thesse(HTTP+SSE) transport still works, but the 2026-07-28 specification deprecates it. The server prints a warning when you use it. - Capabilities: tools, resources, and prompts. The server uses no roots, sampling, logging, elicitation, or resource subscriptions, so the 2026-07-28 deprecations do not affect it.
Error results
An expected failure (a 404, a 401, a validation error, or a write that reaches the read-only guard) comes back as a tool result with the protocol-level isError flag set, so a client can detect and self-correct instead of parsing an "error" key out of an otherwise successful result. In locked read-only mode the write tools are hidden, so calling one returns an Unknown tool error; the read-only envelope is the guard's own response, returned only when a client reaches a write tool anyway (a cached listing, or a future untagged tool). The body is a JSON object with error and, where it helps, status_code, body, and an actionable hint. That object is the result's text content; the error sets no structuredContent, because a strict client (the TypeScript MCP SDK) validates structuredContent against the tool's output schema even on an isError result and the schema would reject the error body. An unexpected bug is also an isError result but carries only TypeName: message text, likewise with no structuredContent.
A successful result carries the response as a JSON object in both the pretty text content and structuredContent (the object itself, not the old {"result": "<json string>"} wrapper a strict client would otherwise reject). Tools advertise no outputSchema: upstream GitLab fields pass through untyped, so a new API field never breaks a schema; a typed schema is opt-in per tool via output_schema= when a client needs one.
Tools (91)
Full tool reference (click to expand)
Projects
Project Approvals
Groups
Branches
Commits
Repository Files
Merge Requests
MR Notes
MR Discussions
Draft Notes
Pipelines
Jobs
Tags
Releases
CI/CD Variables
Issues
Resources (7)
The server exposes curated workflow guides as MCP resources that clients can read on demand.
Prompts (6)
The server provides MCP prompts — reusable multi-tool workflow templates that clients can surface as slash commands.
Usage Examples
Projects & Branches
Merge Requests & Code Review
Pipelines & CI/CD
Issues
Security Considerations
- Token scope: Use the minimum required scope.
apiscope grants full access; preferread_apifor read-only deployments. - Read-only mode: Set
MCP_READ_ONLY=true(orGITLAB_READ_ONLY=true) in the launch you control and the server starts locked: the 57 write tools and the write-workflow prompts are not listed, a call to one returns "Unknown tool", and the guard refuses any write that still reaches it. Nothing lifts the lock at runtime — not afalsefrom another source, not a.envfile, not tool arguments; any value other thanfalse/0/no/off/empty locks, and--read-onlycan only raise it. The lock is only as strong as the launch: set it where users cannot edit it (a managed MCP config such as Claude Codemanaged-mcp.json, a container, k8s or systemd env, or a hosted HTTP deployment). A user who starts the server themselves controls its environment. In OAuth mode also setGITLAB_OAUTH_SCOPES=read_apiso each user's GitLab token lacks write scope. - SSL verification:
GITLAB_SSL_VERIFY=trueby default. Only disable for self-signed certificates in trusted networks. - CI/CD variable masking:
gitlab_list_variablesandgitlab_list_group_variablesautomatically mask values of variables marked as masked in GitLab, returning***MASKED***instead of the actual value. - MCP tool annotations: Each tool declares
readOnlyHint,destructiveHint, andidempotentHintfor client-side permission prompts. - Credential storage: The server reads
GITLAB_TOKENfrom the environment and never writes it.mcp-gitlab auth loginstores OAuth tokens in~/.config/mcp-gitlab/credentials.json(mode 0600) and refreshes them in place.
Rate Limits & Permissions
Rate Limits
GitLab enforces per-user rate limits (default: 2000 requests/minute for authenticated users). When rate-limited, tools return a 429 error with a hint to wait before retrying. Paginated endpoints default to 20 results per page; use per_page (max 100) to reduce the number of API calls.
Required Permissions
CLI & Transport Options
--gitlab-token still works but is deprecated and hidden from --help: it exposes the token to
ps and shell history. Use GITLAB_TOKEN.
--auth {token,oauth} selects the authentication mode (token by default);
oauth requires --transport streamable-http.
In token mode an HTTP transport serves every tool with the single GITLAB_TOKEN to
anyone who reaches the port, so binding to a non-loopback --host is refused unless
you set GITLAB_HTTP_BEARER_TOKEN (≥ 16 chars; clients send it as
Authorization: Bearer <token>) or switch to --auth oauth for per-user sign-in.
The default 127.0.0.1 bind needs neither.
The server loads .env files from the working directory automatically via python-dotenv.
Docker
A minimal non-root image builds straight from this repo (uv, the committed uv.lock). The image
defaults to locked read-only (MCP_READ_ONLY=true); override it to allow writes.
For an HTTP transport, append --transport streamable-http --host 0.0.0.0; a non-loopback bind in
token mode needs GITLAB_HTTP_BEARER_TOKEN (≥ 16 chars) or GITLAB_AUTH=oauth (see above).
FAQ
Does mcp-gitlab support MCP 2.0?
Yes. It supports the MCP 2026-07-28 specification, often called MCP 2.0. It also stays compatible with 2025-11-25 clients.
Does it work with self-hosted GitLab?
Yes. It works with GitLab.com and self-hosted GitLab (CE and EE). It needs no GitLab Duo or Premium.
Which transports does it support?
It supports stdio (the default) and streamable-http. The sse transport still works, but the 2026-07-28 specification deprecates it. OAuth 2.1 mode (--auth oauth) is available on streamable-http only.
Can I run mcp-gitlab read-only so the assistant cannot merge, push or comment?
Yes. Start it with MCP_READ_ONLY=true (or GITLAB_READ_ONLY=true). The 57 write tools and the write-workflow prompts are then not listed at all, so the model never sees them; a call to one returns "Unknown tool", and nothing can turn writes back on while the process runs. Set it in a launch you control — a managed MCP config, a container or systemd env, or a hosted deployment — because a user who starts the server themselves can start it without the variable.
What token scopes does it need?
Use a token with the api scope for full access. Use the read_api scope for read-only deployments. The server reads a GITLAB_TOKEN from the environment and never writes it; tokens from mcp-gitlab auth login are stored in ~/.config/mcp-gitlab/credentials.json.
Which AI assistants work with it?
It works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client.
How do I install mcp-gitlab?
Run uvx mcp-gitlab, or add it to your MCP client configuration. See the installation section above.
Related MCP Servers
- mcp-atlassian-extended — Jira + Confluence integration (22 tools, 15 resources, 5 prompts)
- mcp-coda — Coda integration (53 tools, 12 resources, 5 prompts)
- mcp-argocd — Argo CD integration (37 tools, 7 resources, 7 prompts)
Development
License
MIT
Source: README.md at commit dddae53
Tools
0Version history
23- v0.22.0LatestNov 7, 2026
- v0.21.3Nov 4, 2026
- v0.21.2Oct 22, 2026
- v0.21.1Oct 21, 2026
- v0.21.0Oct 18, 2026
- v0.20.2Oct 14, 2026
- v0.20.1Oct 14, 2026
- v0.20.0Oct 13, 2026
- v0.19.0Oct 13, 2026
- v0.18.0Oct 12, 2026
- v0.17.0Oct 12, 2026
- v0.16.0Oct 10, 2026
- v0.15.0Oct 6, 2026
- v0.14.0Oct 6, 2026
- v0.12.2Oct 3, 2026
- v0.12.1Sep 28, 2026
- v0.12.0Sep 27, 2026
- v0.11.0Sep 27, 2026
- v0.10.3Sep 25, 2026
- v0.10.2Sep 21, 2026
- v0.10.0Sep 20, 2026
- v0.9.7Sep 20, 2026
- v0.9.3Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Other Gitlab integrations
Gitlab
com.gitlabOfficial publisher
Gitlab's hosted MCP server, published by gitlab.com; credential required; Streamable HTTP.

GitLab MCP Server
Published by GitHub account sumirati
A local GitLab MCP server that lets an assistant read and manage projects, branches, commits, merge requests, issues and CI/CD pipelines on GitLab.com or self‑h

Gitlab Mcp
Published by GitHub account mmedum
Local stdio MCP server that lets an assistant work inside your gitlab.com projects as you: issues, merge requests, reviews, repository and CI.

Gitlab Ci Break Lint
Published by GitHub account jmshinhwa
A local MCP server that flags lines in a .gitlab-ci.yml file that a GitLab runner will reject after the next major upgrade.

Gitlab Mcp
Published by GitHub account mrfentmen
Lets an assistant look up public GitLab projects and users without any API key.