Skip to content

Installation

GitLab MCP Server is one self-contained Go binary. Every channel on this page delivers that same binary, or a container that wraps it, and the same gitlab-mcp-server command, so the choice is about what you already have on the machine and how you want upgrades to arrive, not about features. Whatever you pick, the server needs one value to run: a GitLab personal access token in GITLAB_TOKEN (api scope; a read_api token also works, paired with GITLAB_MCP_READ_ONLY=true so the tool surface matches it, since over stdio the server does not narrow the surface to the token’s scope; only HTTP mode and the hosted endpoint do that on their own). GITLAB_URL defaults to https://gitlab.com, so set it only for a self-managed instance.

ChannelWhat you getNeedsUpgrade pathPlatforms
Native binaryThe release binary, placed by an install script or by handNothing (the script needs curl or wget; PowerShell on Windows)Re-run the script, or download the newer releaseLinux, macOS, Windows; amd64 and arm64
HomebrewThe release binary, installed by a formula from the jmrplens/tap tapHomebrewbrew upgrademacOS and Linux; Apple Silicon, Intel and arm64
Windows (winget)The release executable as a portable package with a PATH aliaswingetwinget upgradeWindows; x64 and arm64
DockerA container image on GHCR, mirrored on Docker HubDocker or a compatible runtimePull a newer tag and recreate the containerlinux/amd64 and linux/arm64 images, wherever Docker runs
npm and npxA launcher package plus one platform package carrying the binaryNode.js 18 or newernpm update -g; npx -y resolves the newest version on a cold runLinux (glibc), macOS, Windows; x64 and arm64
PyPI, uvx and pipxA wheel that places the binary on the environment’s scripts pathPython 3.9 or newer (uv or pipx optional)pipx upgrade, pip install -U or uv tool upgrade; uvx resolves the newest version on a cold runLinux (glibc), macOS 11 or newer, Windows; x64 and arm64
NuGet and dnxA .NET tool whose entry point is the binary, one package per runtime identifierThe .NET 10 SDK or newerdotnet tool update -g; dnx resolves the newest version on every launchLinux (glibc), macOS, Windows; x64 and arm64
Agent PluginsA plugin manifest that runs the Docker image over stdioA conformant host (Cursor, Claude Code, VS Code, OpenCode) and DockerThe image’s latest tag, pulled againWherever the host and Docker run
Claude Desktop (.mcpb)A desktop extension bundling the macOS universal binary and the Windows executableClaude Desktop 0.10.0 or newerA new extension version ships with every releasemacOS (Apple Silicon and Intel), Windows (x64)
Hosted endpointNothing installed: a public streamable HTTP endpointAn HTTP-capable MCP client and a GitLab.com tokenMoves on its own, normally to the newest releaseAny
  • You want the smallest footprint and no runtime. The native binary. Homebrew and winget install that same binary and take care of upgrades.
  • Your client already launches servers with npx, uvx or dnx. The npm, PyPI and NuGet packages: nothing to install ahead of time, and the client resolves the newest version on its own.
  • You would rather not put anything on the host, or you are deploying for a team. Docker, over stdio for one client or in HTTP mode behind a port.
  • You use Claude Desktop. The .mcpb extension: one click, and the token lives in the operating system keychain.
  • You just want to look first. The hosted endpoint, from any HTTP-capable client or straight from the browser inspector.

Every channel ends at the same place: your MCP client launches gitlab-mcp-server (or the docker, npx, uvx or dnx command that wraps it) with GITLAB_TOKEN in its environment. Each channel page closes with the minimal client snippet for its command, and the Quick Start has the per-client tabs for VS Code, Claude Desktop, Cursor, Claude Code, Windsurf, JetBrains, Zed, Kiro and Cline.

Two things worth knowing before the first run:

  • If you start the binary in a terminal, or double-click it on Windows, without both GITLAB_URL and GITLAB_TOKEN set, it prints what it is and the two values it needs, then waits for Enter. An MCP client never sees that screen, because it connects pipes rather than a terminal. There is no setup wizard.
  • The token can stay out of client JSON entirely: an explicit environment variable wins over the file GITLAB_MCP_ENV_FILE names, which wins over ~/.gitlab-mcp-server.env (one KEY=value per line). A .env in the working directory is not read. See Configuration.

Then open your client and ask “Who am I on GitLab?”. On the default dynamic surface the assistant calls gitlab_find_action and then gitlab_execute_action with the user.current action, and answers with your GitLab profile.