Skip to content

PyPI, uvx and pipx

GitLab MCP Server is published on PyPI as jmrplens-gitlab-mcp-server. The wheels follow the model uv and ruff use: each one carries the native Go binary for one platform, the installer places that binary on the environment’s scripts path as the command itself, and no Python runs while the server does.

Six platform wheels, one per operating system and architecture, tagged py3-none (no dependency on a Python ABI) and requiring Python 3.9 or newer:

PlatformWheel platform tag
Linux x86_64 (glibc 2.17+)manylinux_2_17_x86_64
Linux aarch64 (glibc 2.17+)manylinux_2_17_aarch64
macOS Intelmacosx_11_0_x86_64
macOS Apple Siliconmacosx_11_0_arm64
Windows x64win_amd64
Windows ARM64win_arm64

Inside each wheel the binary sits in the .data/scripts directory, which the wheel specification obliges the installer to place on the environment’s scripts path (bin/ or Scripts/) with the executable bit set. That makes it the gitlab-mcp-server command directly. The wheel also ships a tiny gitlab_mcp_server Python package with two jobs: a jmrplens-gitlab-mcp-server console script that hands over to the binary, which is what lets uvx resolve the tool by its distribution name, and python -m gitlab_mcp_server for programmatic lookup.

Two commands therefore appear after an install:

CommandWhat it is
gitlab-mcp-serverThe native binary. Use this one in client configuration.
jmrplens-gitlab-mcp-serverA Python wrapper that execs the binary. It exists so uvx can find the tool by distribution name.

The unprefixed gitlab-mcp-server name on PyPI is an empty registration held by an unrelated account, and a PEP 541 reclamation request for it is open. Until that resolves, the author-prefixed distribution is the official one. The import package and the native command already use the unprefixed name, so client configuration built on gitlab-mcp-server will not change when the distribution is renamed; only the name you type into uvx, pipx or pip will.

The Linux wheels are manylinux_2_17: the binaries are position-independent executables that need the glibc dynamic loader. On musl systems such as Alpine, use the container image ghcr.io/jmrplens/gitlab-mcp-server instead; see Docker.

Nothing to install: uv fetches the wheel into its cache and runs the command. Clients can launch it this way directly.

Terminal window
uvx jmrplens-gitlab-mcp-server

Check the install:

Terminal window
gitlab-mcp-server --version
# gitlab-mcp-server 2.7.5 (commit: ...)

With uvx no command lands on your PATH; uvx jmrplens-gitlab-mcp-server --version runs the same check. Started in a terminal without both GITLAB_URL and GITLAB_TOKEN set, the binary prints what it is and the two values it needs, then waits for Enter. That is the first-run screen, not an error: an MCP client connects pipes rather than a terminal and never sees it. There is no setup wizard; configuration lives in your client’s JSON, below.

The portable form needs no install at all. Point the client at uvx:

{
"mcpServers": {
"gitlab": {
"command": "uvx",
"args": ["jmrplens-gitlab-mcp-server"],
"env": { "GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx" }
}
}
}

After an install with pipx, uv tool or pip, use the native command instead:

{
"mcpServers": {
"gitlab": {
"command": "gitlab-mcp-server",
"env": { "GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx" }
}
}
}

GITLAB_TOKEN is the only required value: a personal access token with the api scope (read_api also works; pair it with GITLAB_MCP_READ_ONLY=true, since over stdio the server does not narrow the tool surface to the token’s scope). GITLAB_URL defaults to https://gitlab.com; add it to env only for a self-managed instance. A client that does not inherit your shell’s PATH may need the full path to the command; which gitlab-mcp-server (or where gitlab-mcp-server on Windows) prints it. To pin a release rather than follow the newest one with uvx, name it in the argument: "jmrplens-gitlab-mcp-server@2.7.5".

Per-client file locations and shapes (VS Code uses servers with "type": "stdio", Zed uses context_servers) are in the Quick Start’s client tabs.

The server never checks for updates and never replaces its own binary; the Python tool you installed it with owns it, as each channel owns what it installed.

uv resolves the newest published version on a cold run and reuses its cache afterwards. To force the latest release, name it explicitly:

Terminal window
uvx jmrplens-gitlab-mcp-server@latest

Nothing was installed, so there is nothing to uninstall beyond the entry in your client’s configuration.

Other channels are compared in the installation overview.