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: the server detects it at startup and serves the actions GitLab accepts from it, on stdio as in HTTP mode and on the hosted endpoint). 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 per operating system: the macOS universal binary, the Windows executable, or the Linux x64 and arm64 binaries (from the first release after 3.1.0; up to 3.1.0, one universal bundle for all three)Claude Desktop 0.10.0 or newerA new extension version ships with every releasemacOS (Apple Silicon and Intel), Windows (x64), Linux (glibc; x64 and arm64)
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 is encrypted with a key from the operating system’s credential store where one exists.
  • 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, Cline and Codex. Every client’s entry over stdio, and over HTTP with a token or with OAuth, is on Client configuration.

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.

The native binary, Homebrew, winget, npm, PyPI, NuGet and the Claude Desktop extension all carry the binary GoReleaser built for the release, byte for byte; the container image, and the Agent Plugins entry that runs it, carry a build of their own. The release workflow publishes them in an order that keeps a partial release out of sight:

  1. The container image is built by its own job from the same tag, with its own copy of the binary (see Docker). Both platform variants are started and asked for their version before the image is pushed, and it is signed and attested before any other channel is published.
  2. The GitHub release is created as a draft with the binaries, checksums.txt and its Cosign signature, the SBOMs and the Claude Desktop bundles, which are assembled in the same job from the same binaries. It is published only after every asset is attached and attested, so a release you can see is never a partial one.
  3. npm, PyPI and NuGet are packed afterwards, each in a job of its own that downloads the published release assets and checks them against the signed checksums.txt before packing anything.
  4. A read-back job then downloads what npm, PyPI and NuGet serve and compares the binaries inside the packages with the same signed checksums.txt; from the first release after 3.1.0 it also holds each NuGet package, with NuGet.org’s repository signature removed, to the digest the release attested for it.
  5. Nothing that advertises the version runs before that comparison passes: the Homebrew tap, the MCP Registry entry, the manifest commit to main and the winget pull request all wait on it. A release whose npm, PyPI or NuGet publish failed leaves them on the previous version.

How to check a download yourself is on the Native binary page, and the background is under Verifying release integrity.