gitlab-mcp-server
3.3.0
{ "inputs": [ { "type": "promptString", "id": "GITLAB_URL", "description": "GitLab instance URL (default: https://gitlab.com; set for self-managed instances)", "default": "https://gitlab.com" }, { "type": "promptString", "id": "GITLAB_TOKEN", "description": "GitLab Personal Access Token (glpat-...)", "password": true }, { "type": "promptString", "id": "GITLAB_MCP_SKIP_TLS_VERIFY", "description": "Skip TLS certificate verification for self-signed certs (default: false)", "default": "false" }, { "type": "pickString", "id": "GITLAB_MCP_TOOL_SURFACE", "description": "Tool catalog selector: dynamic, meta, or individual (default: dynamic)", "default": "dynamic", "options": ["meta", "individual", "dynamic"] }, { "type": "pickString", "id": "GITLAB_MCP_CAPABILITY_SURFACE", "description": "Resource and prompt catalog selector: full or minimal (default: full); resource subscriptions require full", "default": "full", "options": ["full", "minimal"] }, { "type": "pickString", "id": "GITLAB_MCP_META_PARAM_SCHEMA", "description": "Meta-tool input schema detail: opaque, compact, or full (default: opaque)", "default": "opaque", "options": ["opaque", "compact", "full"] }, { "type": "pickString", "id": "GITLAB_MCP_TIER", "description": "GitLab tier: free/ce, premium or ultimate, used as given. When unset, detected from the instance license, then from the plans of the namespaces the token administers, then, on GitLab.com, from the top-level groups the token is a member of, falling back to free. Gates Premium and Ultimate actions; GitLab.com Ultimate also serves the Orbit Knowledge Graph tools", "options": ["free", "ce", "premium", "ultimate"] }, { "type": "promptString", "id": "GITLAB_MCP_READ_ONLY", "description": "Read-only mode: removes every mutating action from the served surface; reads keep working (default: false)", "default": "false" }, { "type": "promptString", "id": "GITLAB_MCP_SAFE_MODE", "description": "Safe mode: a mutating action returns a preview card naming the action and echoing its arguments instead of running; reads keep working (default: false)", "default": "false" }, { "type": "promptString", "id": "GITLAB_MCP_EMBEDDED_RESOURCES", "description": "Append EmbeddedResource content blocks (clickable links to MCP resources) to get_* tool results (default: true)", "default": "true" }, { "type": "promptString", "id": "GITLAB_MCP_EXCLUDE_TOOLS", "description": "Comma-separated tool names, group names or canonical action IDs to exclude, on every surface (e.g. gitlab_admin,gitlab_runner)" }, { "type": "promptString", "id": "GITLAB_MCP_IGNORE_SCOPES", "description": "Skip the scope filter and the read_api narrowing and register all tools regardless of token permissions; a token carrying neither read_api nor api is still refused (default: false)", "default": "false" }, { "type": "promptString", "id": "GITLAB_MCP_UPLOAD_MAX_FILE_SIZE", "description": "Largest local file an upload or file-reading action accepts, in bytes or with a KB, MB or GB suffix (e.g. 2GB); at most 1 TB (default: 2147483648, 2 GB)", "default": "2147483648" }, { "type": "promptString", "id": "GITLAB_MCP_ALLOWED_UPLOAD_DIRS", "description": "Extra OS path-list-separated directories an action may read a local file from; the working directory (unless it is the filesystem root or your home directory) and the OS temp directory are always allowed. Unused in HTTP mode, which refuses local paths" }, { "type": "promptString", "id": "GITLAB_MCP_ALLOWED_DOWNLOAD_DIRS", "description": "Extra OS path-list-separated directories an action may write a downloaded file into; the working directory (unless it is the filesystem root or your home directory) and the OS temp directory are always allowed. Unused in HTTP mode, which refuses local paths" }, { "type": "promptString", "id": "GITLAB_MCP_ALLOWED_IMPORT_DIRS", "description": "Extra OS path-list-separated directories a project or group import archive may be read from; the working directory (unless it is the filesystem root or your home directory) and the OS temp directory are always allowed. Unused in HTTP mode, which refuses local paths" }, { "type": "promptString", "id": "GITLAB_MCP_RATE_LIMIT_RPS", "description": "Rate limit per credential, in requests per second, on every call that reaches GitLab, with tools/list charged to a bucket of its own; 0, the default on stdio, disables it (default: 0)", "default": "0" }, { "type": "promptString", "id": "GITLAB_MCP_RATE_LIMIT_BURST", "description": "Token-bucket burst size when GITLAB_MCP_RATE_LIMIT_RPS is greater than 0 (default: 40)", "default": "40" }, { "type": "pickString", "id": "GITLAB_MCP_LOG_LEVEL", "description": "Logging verbosity (default: info)", "default": "info", "options": ["debug", "info", "warn", "error"] } ], "servers": { "gitlab-mcp-server": { "type": "stdio", "command": "dnx", "args": ["gitlab-mcp-server@3.3.0", "--yes"], "env": { "GITLAB_URL": "${input:GITLAB_URL}", "GITLAB_TOKEN": "${input:GITLAB_TOKEN}", "GITLAB_MCP_SKIP_TLS_VERIFY": "${input:GITLAB_MCP_SKIP_TLS_VERIFY}", "GITLAB_MCP_TOOL_SURFACE": "${input:GITLAB_MCP_TOOL_SURFACE}", "GITLAB_MCP_CAPABILITY_SURFACE": "${input:GITLAB_MCP_CAPABILITY_SURFACE}", "GITLAB_MCP_META_PARAM_SCHEMA": "${input:GITLAB_MCP_META_PARAM_SCHEMA}", "GITLAB_MCP_TIER": "${input:GITLAB_MCP_TIER}", "GITLAB_MCP_READ_ONLY": "${input:GITLAB_MCP_READ_ONLY}", "GITLAB_MCP_SAFE_MODE": "${input:GITLAB_MCP_SAFE_MODE}", "GITLAB_MCP_EMBEDDED_RESOURCES": "${input:GITLAB_MCP_EMBEDDED_RESOURCES}", "GITLAB_MCP_EXCLUDE_TOOLS": "${input:GITLAB_MCP_EXCLUDE_TOOLS}", "GITLAB_MCP_IGNORE_SCOPES": "${input:GITLAB_MCP_IGNORE_SCOPES}", "GITLAB_MCP_UPLOAD_MAX_FILE_SIZE": "${input:GITLAB_MCP_UPLOAD_MAX_FILE_SIZE}", "GITLAB_MCP_ALLOWED_UPLOAD_DIRS": "${input:GITLAB_MCP_ALLOWED_UPLOAD_DIRS}", "GITLAB_MCP_ALLOWED_DOWNLOAD_DIRS": "${input:GITLAB_MCP_ALLOWED_DOWNLOAD_DIRS}", "GITLAB_MCP_ALLOWED_IMPORT_DIRS": "${input:GITLAB_MCP_ALLOWED_IMPORT_DIRS}", "GITLAB_MCP_RATE_LIMIT_RPS": "${input:GITLAB_MCP_RATE_LIMIT_RPS}", "GITLAB_MCP_RATE_LIMIT_BURST": "${input:GITLAB_MCP_RATE_LIMIT_BURST}", "GITLAB_MCP_LOG_LEVEL": "${input:GITLAB_MCP_LOG_LEVEL}" } } } }
.vscode/mcp.json settings file.
dotnet tool install --global gitlab-mcp-server --version 3.3.0
dotnet new tool-manifest
dotnet tool install --local gitlab-mcp-server --version 3.3.0
#tool dotnet:?package=gitlab-mcp-server&version=3.3.0
nuke :add-package gitlab-mcp-server --version 3.3.0
GitLab MCP Server
GitLab for your AI assistant: a Model Context Protocol server exposing GitLab REST API v4 and GraphQL operations as MCP tools. Projects, issues, merge requests, pipelines, CI/CD, wikis, releases, users, groups, search and more, against GitLab.com or any self-managed instance.
This package is a .NET tool whose entry point is the native gitlab-mcp-server binary (written in Go). It is a pointer package plus one package per runtime identifier, the layout the .NET 10 SDK uses for tools that ship a platform-specific executable: dotnet tool install and dnx resolve the package for your operating system and architecture and run the binary directly. No .NET runtime is involved once the server is running, nothing compiles, and nothing is downloaded at install time beyond the two packages.
Quick start
Run it directly with dnx (the .NET 10 SDK's tool runner):
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx dnx gitlab-mcp-server
Or install it on your PATH:
dotnet tool install -g gitlab-mcp-server
Either way the command is gitlab-mcp-server. Two things about dnx worth knowing: it reads its own options anywhere on the command line, so arguments meant for the server go after -- (dnx gitlab-mcp-server -- --version; without the separator, --version is read as dnx's own option and prints its usage); and the .NET 10 SDK's dnx installs the tool without asking when its standard input is not a terminal, which is how an MCP client starts it, so a client configuration needs no extra flag. A third: every dnx launch contacts NuGet.org, pinned (dnx gitlab-mcp-server@<version>) or not, cached or not: on a host that cannot reach NuGet.org, run the command dotnet tool install placed instead.
Typical MCP client configuration (stdio):
{
"mcpServers": {
"gitlab": {
"command": "dnx",
"args": ["gitlab-mcp-server"],
"env": {
"GITLAB_URL": "https://gitlab.com",
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
GITLAB_TOKEN is the only required setting. GITLAB_URL defaults to https://gitlab.com; point it at your own host for self-managed instances.
Verify what you run
The binary the SDK runs is the release asset byte for byte, so the build provenance attestation GitHub holds for it verifies it with the GitHub CLI: gh attestation verify ~/.nuget/packages/gitlab-mcp-server.<rid>/<version>/tools/any/<rid>/gitlab-mcp-server -R jmrplens/gitlab-mcp-server --signer-workflow jmrplens/gitlab-mcp-server/.github/workflows/release.yml for what dnx runs from the NuGet cache, and gh attestation verify "$(readlink -f "$(command -v gitlab-mcp-server)")" -R jmrplens/gitlab-mcp-server --signer-workflow jmrplens/gitlab-mcp-server/.github/workflows/release.yml after dotnet tool install -g on Linux and macOS, where the shim links into the tool store. --signer-workflow holds the attestation to the release workflow, since -R alone accepts one any workflow of the repository minted, and --source-ref refs/tags/v<version> holds it to one release. From the first release after 3.1.0 the packages themselves are attested as they were before NuGet.org added its repository signature: remove .signature.p7s from a downloaded copy with zip -d and run the same gh attestation verify on what is left. The steps are in the NuGet installation page.
Configuration
Everything is configured through environment variables: GITLAB_MCP_TOOL_SURFACE (dynamic, meta or individual tool catalogs), GITLAB_MCP_READ_ONLY, GITLAB_MCP_SAFE_MODE, GITLAB_MCP_TIER, rate limiting, telemetry and more. See the configuration guide for the full reference.
Platform support
Packages are published for linux-x64, linux-arm64, osx-x64, osx-arm64, win-x64 and win-arm64. The Linux binaries need glibc; on musl systems such as Alpine, use the container image ghcr.io/jmrplens/gitlab-mcp-server instead. Installing or running the tool needs the .NET 10 SDK or newer; the tool manifest format the runtime-specific packages use does not exist in older SDKs.
Links
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.