Skip to main content
Glama

GitLab MCP

GitLab MCP is a harness-neutral Model Context Protocol server plus shared Agent Skills for GitLab repository work. Codex, Claude Code, Cline, and Pi are supported distributions of the same canonical MCP core rather than separate GitLab implementations. ChatGPT can use the same core through the remote Streamable HTTP deployment.

The project provides:

  • a self-contained GitLab MCP server with typed tools;

  • a general $gitlab skill;

  • $gl-address-comments for unresolved merge-request discussions;

  • $gl-fix-ci for pipeline and job diagnosis;

  • $gl-publish for branch, commit, push, and draft-MR delivery;

  • GitLab-native runner, CI lint, governance, tag, release, and pipeline schedule workflows, plus secret-safe project and group CI/CD variable management;

  • thin Codex, Claude Code, Cline, and Pi distributions that reuse the same canonical core and Agent Skills; and

  • stateless Streamable HTTP transport and OAuth protected-resource metadata for ChatGPT deployment.

Start here

Audience

Documentation

GitLab MCP users

User guide

Codex users

Codex adapter

Claude Code users

Claude Code adapter

Cline users

Cline adapter

Pi users

Pi adapter

Operators

Configuration reference and troubleshooting

Contributors

Developer guide and contributing guide

Deployers

ChatGPT deployment

Maintainers

Release process, publication checklist, and generalisation audit

The documentation index links the complete user, operator, developer, security, compatibility, and release documentation set.

Related MCP server: GitLab MCP Server

Quick Start

For a local source installation, use Node.js 22 or newer, then build and verify the canonical MCP core:

npm.cmd ci
npm.cmd test
npm.cmd run build

Choose the adapter that matches the harness. All four supported adapters consume the same built MCP bundle and canonical Agent Skills.

For Codex, add this repository to a trusted local marketplace, install the gitlab plugin, and restart or refresh Codex. The established root Codex manifest, .mcp.json, preload, and artifact name remain supported compatibility surfaces. Configure the GitLab instance and token in the environment that launches Codex:

$env:GITLAB_URL = "https://gitlab.example.com"
$env:GITLAB_TOKEN = "<token>"

Start a new conversation and ask Codex to confirm the connection, for example:

Use GitLab to tell me which account and instance are connected.

Claude Code users can load the materialized native plugin distribution, which bundles the same MCP server and canonical Agent Skills. See the Claude Code adapter guide for package validation, --plugin-dir loading, and marketplace-compatible layout.

Cline users can use the same canonical MCP bundle over stdio and install the canonical Agent Skills without a separate GitLab implementation. See the Cline adapter guide for IDE and CLI setup.

Pi users can install the dedicated Pi package, which registers the canonical MCP tool inventory through a thin stdio bridge and exposes the same Agent Skills. See the Pi adapter guide for package installation, runtime dependency handling, and bridge limitations.

See the user guide for least-privilege token guidance, common GitLab workflows, and ChatGPT HTTP deployment.

Requirements

  • Node.js 22 or newer

  • a GitLab.com, GitLab Dedicated, or self-managed GitLab instance

  • for local stdio use, a GitLab token with the minimum scopes required by the operations you intend to perform

Build and verify

npm.cmd install
npm.cmd test
npm.cmd run adapters:check
npm.cmd run check:bundle
npm.cmd run build
npm.cmd run validate:codex
npm.cmd run validate:claude
npm.cmd run validate:cline
npm.cmd run validate:pi
npm.cmd run check:versions
npm.cmd run check:gitlab-oauth -- https://gitlab.example.com

The canonical MCP bundle path is defined by distribution.json; the current configuration builds server/dist/gitlab-mcp.cjs. The MCP bundle itself is generated and ignored in source control, then included in release artifacts. Harness packages may still declare a harness-side runtime dependency; the Pi package, for example, uses the MCP SDK to bridge Pi to that bundled server.

distribution.json is the authoritative source for shared distribution metadata, including the neutral gitlab distribution identifier, base version, description, license, canonical MCP bundle, and Skills path. After changing it, run npm run adapters:generate and review the generated Codex/Claude Code/Cline/Pi metadata. npm run adapters:check rejects metadata drift and a missing, non-directory, or repository-escaping canonical Skills path.

npm run check:bundle performs an in-memory clean build and fails if the canonical bundle contains harness-specific implementation references. npm run check:versions verifies generated package and Codex release metadata remain aligned with distribution.json. The Codex plugin manifest may append Codex build metadata after + without changing that base distribution version. SERVER_VERSION is owned independently by the harness-neutral MCP core and is bumped only when the core runtime itself changes.

The harness-neutral core and adapter boundary are documented in ADR-001. The GEN-08 focused audit and identity decisions are recorded in docs/GENERALISATION_AUDIT.md.

Continuous integration

GitLab merge-request, default-branch, and tag pipelines run syntax checks, tests, coverage, dependency-cruiser, formatting/linting, a production dependency audit, a clean bundle build, and bundled stdio/HTTP smoke tests. GitLab SAST and secret-detection templates are also enabled. Codex, Claude Code, Cline, and Pi each have focused adapter validation after the canonical build; those jobs validate harness packaging and MCP startup without repeating the core Node/security matrix.

Tag pipelines additionally publish the deterministic Codex archive with its CycloneDX SBOM and SHA256SUMS, plus reproducible Claude Code, Cline, and Pi MCP + Skills archives with matching .sha256 sidecars, as GitLab job artifacts. The final release-set gate requires exactly the four supported harnesses and compares their canonical MCP bundle and Skills digests. Releases are not considered complete until the artifacts are verified according to docs/PUBLICATION_CHECKLIST.md.

The committed docs/gitlab-tool-contracts.json inventory invokes every registered tool with boundary-valid inputs and locks its safety classification, HTTP method, encoded route, query/body mapping, and bounded response mode. Coverage covers every production source module and fails below 90% lines, 80% functions, or 75% branches; adding a tool without an inventory entry fails the test.

The syntax and test jobs run on both node:22-alpine and node:24-alpine; the threshold-enforced coverage job runs on Node 22. The core jobs require an untagged Linux runner that can run these images and reach the npm registry. The security templates pull their analyzer images from the GitLab registry. Privileged mode is not required for the core Node.js jobs. Configure at least one project, group, or instance runner that accepts untagged jobs and permits jobs to run for at least 10 minutes before requiring successful pipelines for merge.

Local Codex authentication

Set the instance URL and token in the environment that launches Codex:

$env:GITLAB_URL = "https://gitlab.example.com"
$env:GITLAB_TOKEN = "<token>"

GITLAB_URL must use HTTPS by default and rejects embedded credentials, queries, and fragments. For an explicitly local/private development GitLab instance that cannot use TLS, set GITLAB_ALLOW_INSECURE_HTTP=true. The override is rejected in production and for public hostnames; it accepts loopback, private-network IPs, single-label hosts, and the private-development suffixes .localhost, .local, .internal, and .home.arpa.

GITLAB_URL defaults to https://gitlab.com. The Codex .mcp.json starts the bundled server over stdio and loads the thin Codex distribution adapter before the harness-neutral core. Tokens are read at runtime and are never stored in a distribution.

Use the narrowest token scopes that cover the task. Read-only work can use a read-oriented token; repository, issue, merge-request, or CI mutations require the corresponding GitLab API permissions.

Capability discovery

Call get_gitlab_capabilities before diagnosing whether a GitLab operation is unsupported, unlicensed, disabled, or merely inaccessible to the current credential. It uses only read-only requests to /user, /version, /metadata, /personal_access_tokens/self, and (when the credential is not a personal access token) /oauth/token/info. OAuth diagnostics report scopes and remaining lifetime but never expose the token or OAuth application identifier. GitLab may hide or omit these endpoints, especially on older self-managed versions or for non-administrators, so ambiguous results are reported as unknown rather than guessed.

Each capability is one of available, unavailable, permission_required, license_required, not_configured, or unknown, with a concise reason and supporting evidence where useful. Pass detailed: true for normalized per-probe outcomes, or refresh: true to bypass the cache.

Results are cached for 60 seconds per normalized instance URL and authenticated credential identity. The cache key contains a one-way SHA-256 digest, never the raw bearer token. Entries expire after 60 seconds, are bypassed by refresh, and naturally separate instances or changed credentials. Expired entries are opportunistically removed, and a 256-entry LRU limit provides a hard memory bound. The cache is in-memory only and is cleared when the MCP server process restarts.

HTTP server

For local development:

$env:MCP_PUBLIC_URL = "https://mcp.example.com/mcp"
$env:GITLAB_URL = "https://gitlab.example.com"
npm.cmd run start:http

HTTP mode requires a bearer token on every /mcp request. A server-side token is disabled by default. ALLOW_SERVER_TOKEN_HTTP=true exists only for controlled private testing and should not be used for a shared deployment.

Set MCP_READ_ONLY=true for an inspection-only deployment. In that mode the server registers only tools annotated as read-only and advertises GitLab's read_api OAuth scope. The default write-enabled mode exposes the complete tool set and requires api. The server validates every tool annotation during registration so an unclassified or mutating tool cannot silently enter the read-only surface.

When binding to the IPv4 wildcard 0.0.0.0 or IPv6 wildcard ::, set MCP_ALLOWED_HOSTS to a comma-separated allowlist of public host names. Put the service behind HTTPS and set MCP_PUBLIC_URL to its canonical public /mcp URL. Production mode requires MCP_PUBLIC_URL, rejects embedded credentials, queries, fragments, and non-/mcp paths, and requires HTTPS. MCP_ALLOW_INSECURE_PUBLIC_URL=true is available only for explicit local development on a loopback listener and is rejected in production or on a public host. ALLOW_SERVER_TOKEN_HTTP=true is likewise limited to loopback private testing and must not be used for a shared deployment.

Use the read-only get_runtime_info tool after installation or deployment to confirm the core/distribution versions, deployment mode, read-only filtering, and the deterministic SHA-256 fingerprint of the registered tool inventory.

HTTP MCP request bodies are limited to 8 MiB by default. This accommodates bounded multi-file commits and other legitimate large tool payloads while preventing unbounded request buffering. Set MCP_MAX_REQUEST_BYTES to an integer from 65,536 through 26,214,400 bytes to use a different deployment limit. Any reverse proxy in front of the server must allow at least the same request size.

Long-running HTTP deployments also bound authentication and request state:

  • MCP_TOKEN_CACHE_MAX_ENTRIES limits validated bearer identities, default 256, with a 60-second TTL and LRU eviction;

  • MCP_AUTH_FAILURE_LIMIT limits rejected tokens per directly connected address within MCP_AUTH_FAILURE_WINDOW_MS, default 20 failures per 60 seconds;

  • MCP_AUTH_FAILURE_MAX_ENTRIES bounds failure-tracking state, default 1,024;

  • MCP_MAX_CONCURRENT_REQUESTS caps active MCP requests, default 32; and

  • MCP_MAX_CONCURRENT_REQUESTS_PER_IDENTITY caps requests for one validated GitLab user, default 4.

Configure complementary rate and connection limits at the TLS reverse proxy. The application deliberately uses the direct peer address rather than trusting forwarded headers by default, so proxy-level client-IP limits should be applied before traffic reaches this service.

The unauthenticated /health endpoint is a topology-free process liveness check. /ready is a separate readiness check and returns 503 when its dependency probe is unavailable. Every response includes a generated X-Request-Id; internal MCP failures log only that identifier and the error type. Embedders can provide a request-completion observer for metrics without receiving bearer tokens or request payloads.

After deploying, verify the public resource metadata and both health semantics:

npm.cmd run check:mcp-deployment -- https://mcp.example.com/mcp

Safety model

  • Tools advertise read-only, write, and destructive annotations.

  • create_commit supports only non-destructive file actions; deletion and forced commit updates require the separately annotated create_destructive_commit tool with concurrency-safety fields.

  • GitLab response bodies, including job logs, artifacts, and API errors, are streamed under strict byte limits and remain covered by request timeouts;

  • API errors are normalized without echoing credentials;

  • capability discovery redacts error evidence and never reads private CI variables or mutation endpoints;

  • HTTP bearer tokens are validated against the configured GitLab instance and cached by a one-way token hash in a bounded TTL/LRU cache;

  • rejected credentials and concurrent requests are bounded without logging tokens or private identity details;

  • HTTP mode challenges unauthenticated requests with protected-resource metadata;

  • HTTP tools advertise per-tool OAuth or private server-token security schemes plus model-visible reauthorization challenges; and

  • Skills require explicit intent for merge, approval, deletion, discussion resolution, and CI state changes.

License

MIT

Available Tools

147 tools
add_issue_reactionAdd issue reactionA

Add an emoji reaction to a GitLab issue or to one of its comments.

Inputs: name (required), project (required), issue_iid (required), note_id. Returns: result

add_merge_request_reactionAdd merge request reactionA

Add an emoji reaction to a GitLab merge request or one of its notes.

Inputs: name (required), project (required), merge_request_iid (required), note_id. Returns: result

apply_merge_request_suggestionApply merge request suggestionA

Apply a single GitLab code suggestion by its suggestion ID. Performs preflight validation: confirms the suggestion belongs to the specified project/MR, is still applicable, has not already been applied, and that the MR head SHA matches the caller's expected value. Uses the Suggestions API at PUT /suggestions/:id/apply. Returns the suggestion state including applicable and applied flags. An explicit acknowledgement is required to apply. Note: GitLab's apply endpoint does not accept an expected-head parameter, so a TOCTOU race is possible between preflight and mutation; the server remains authoritative at mutation time.

Inputs: project (required), acknowledge (required), suggestion_id (required), expected_head_sha (required), +2 more. Returns: result

approve_merge_requestApprove merge requestB

Submit the authenticated user's approval for a GitLab merge request.

Inputs: project (required), merge_request_iid (required), sha, approval_password. Returns: result

batch_apply_merge_request_suggestionsBatch apply merge request suggestionsA

Apply multiple GitLab code suggestions in a single commit using the batch Suggestions API at PUT /suggestions/batch_apply. Performs preflight validation on every suggestion before any mutation: confirms each belongs to the specified project/MR, is still applicable, has not already been applied, and that the MR head SHA matches the caller's expected value. If any suggestion is invalid the entire batch is rejected before calling GitLab's batch-apply endpoint. Returns an array of suggestion states. An explicit acknowledgement is required. Note: GitLab's batch-apply endpoint does not accept an expected-head parameter, so a TOCTOU race is possible between preflight and mutation; the server remains authoritative at mutation time.

Inputs: ids (required), project (required), acknowledge (required), expected_head_sha (required), +2 more. Returns: result

cancel_jobCancel GitLab jobA
Destructive

Cancel a pending or running GitLab CI job.

Inputs: job_id (required), project (required). Returns: result

cancel_pipelineCancel pipelineC
Destructive

Cancel all cancelable jobs in a running GitLab pipeline.

Inputs: project (required), pipeline_id (required). Returns: result

compare_refsCompare repository refsA
Read-onlyIdempotent

Compare two branches, tags, or commits and return commits plus per-file diffs.

Inputs: to (required), from (required), project (required), unidiff, +1 more. Returns: result

create_branchCreate repository branchA

Create a branch from an existing branch, tag, or commit SHA.

Inputs: ref (required), branch (required), project (required). Returns: result

create_commitCreate repository commitA

Create one GitLab commit containing non-destructive atomic create, update, move, or chmod actions. update and move require a per-file last_commit_id to guard against concurrent overwrites. Do not supply both start_branch and start_sha; use start_branch for new-branch creation only.

Inputs: branch (required), actions (required), project (required), commit_message (required), +4 more. Returns: result

create_commit_statusCreate commit statusA

Create or update an external GitLab commit status for a ref.

Inputs: sha (required), state (required), project (required), ref, +5 more. Returns: result

create_destructive_commitCreate destructive repository commitA
Destructive

Create one GitLab commit that can delete files or force a branch update. For ordinary updates, the branch tip must match start_sha before the commit is submitted; forced updates use start_sha as GitLab's explicit replacement parent. Delete actions also require last_commit_id.

Inputs: branch (required), actions (required), project (required), start_sha (required), +4 more. Returns: result

create_fileCreate repository fileA

Create a new UTF-8 or base64 repository file and commit it to an existing branch.

Inputs: path (required), branch (required), content (required), project (required), +5 more. Returns: result

create_group_ci_variableCreate group CI/CD variableB

Create a group CI/CD variable without returning its value.

Inputs: key (required), group (required), value (required), raw, +6 more. Returns: result

create_issueCreate GitLab issueA

Create a GitLab issue with optional description, assignees, labels, milestone, due date, and confidentiality.

Inputs: title (required), project (required), labels, weight, +6 more. Returns: result

create_issue_noteCreate issue noteA

Add a top-level comment to a GitLab issue as the authenticated user.

Inputs: body (required), project (required), issue_iid (required), internal. Returns: result

create_merge_requestCreate GitLab merge requestB

Open a GitLab merge request from an existing source branch. Draft merge requests are supported.

Inputs: title (required), project (required), source_branch (required), target_branch (required), +10 more. Returns: result

create_merge_request_discussionCreate merge request discussionA

Create a top-level or inline review thread on a GitLab merge request. Inline comments require the latest diff version SHAs and file position.

Inputs: body (required), project (required), merge_request_iid (required), position. Returns: result

create_pipelineCreate pipelineA

Create a GitLab pipeline for a ref with bounded structured inputs or variables. Variable values are sent only to GitLab and are omitted from the normalized response. Input values may be strings, numbers, booleans, arrays, or objects — bounded by depth, length, and size limits.

Inputs: ref (required), project (required), inputs, variables. Returns: result

create_pipeline_scheduleCreate pipeline scheduleC

Create a project pipeline schedule.

Inputs: ref (required), cron (required), project (required), description (required), +3 more. Returns: result

create_pipeline_schedule_variableCreate pipeline schedule variableB

Create a pipeline schedule variable without returning its value.

Inputs: key (required), value (required), project (required), pipeline_schedule_id (required), +1 more. Returns: result

create_project_approval_ruleCreate project approval ruleA

Create a merge-request approval rule after a capability preflight. The explicit acknowledgement prevents accidental governance changes.

Inputs: name (required), project (required), approvals_required (required), acknowledge_policy_change (required), +5 more. Returns: result

create_project_ci_variableCreate project CI/CD variableA

Create a project CI/CD variable without returning its value.

Inputs: key (required), value (required), project (required), raw, +6 more. Returns: result

create_releaseCreate releaseA

Create a GitLab release and optionally create its tag from a ref.

Inputs: project (required), tag_name (required), ref, name, +4 more. Returns: result

create_tagCreate repository tagA

Create a Git tag from a branch, ref, or commit SHA.

Inputs: ref (required), project (required), tag_name (required), message. Returns: result

delete_branchDelete repository branchA
Destructive

Delete a GitLab repository branch. Protected branches cannot be deleted through this operation.

Inputs: branch (required), project (required). Returns: result

delete_fileDelete repository fileA
Destructive

Delete a repository file and commit the deletion. Supply last_commit_id to guard against concurrent edits.

Inputs: path (required), branch (required), project (required), commit_message (required), +4 more. Returns: result

delete_group_ci_variableDelete group CI/CD variableB
Destructive

Delete a group CI/CD variable without returning its former value.

Inputs: key (required), group (required), filter_environment_scope. Returns: result

delete_issue_noteDelete issue noteA
Destructive

Permanently delete a GitLab issue comment.

Inputs: note_id (required), project (required), issue_iid (required). Returns: result

delete_merge_request_noteDelete merge request noteA
Destructive

Permanently delete a note or reply from a GitLab merge request discussion.

Inputs: note_id (required), project (required), discussion_id (required), merge_request_iid (required). Returns: result

delete_pipeline_scheduleDelete pipeline scheduleB
Destructive

Delete a project pipeline schedule.

Inputs: project (required), pipeline_schedule_id (required). Returns: result

delete_pipeline_schedule_variableDelete pipeline schedule variableC
Destructive

Delete a pipeline schedule variable without returning its former value.

Inputs: key (required), project (required), pipeline_schedule_id (required). Returns: result

delete_project_approval_ruleDelete project approval ruleA
Destructive

Delete a project approval rule only after reading it and explicitly acknowledging the destructive governance change.

Inputs: project (required), approval_rule_id (required), acknowledge_policy_change (required). Returns: result

delete_project_ci_variableDelete project CI/CD variableB
Destructive

Delete a project CI/CD variable without returning its former value.

Inputs: key (required), project (required), filter_environment_scope. Returns: result

delete_releaseDelete releaseA
Destructive

Delete release metadata without deleting the Git tag with the same name.

Inputs: project (required), tag_name (required), acknowledge_release_deletion (required). Returns: result

delete_tagDelete repository tagA
Destructive

Delete a Git tag. This does not delete a release with the same tag name.

Inputs: project (required), tag_name (required), acknowledge_tag_deletion (required). Returns: result

download_gitlab_attachmentDownload GitLab attachmentA
Read-onlyIdempotent

Download a same-instance GitLab issue or merge-request upload as bounded base64 data. Only GitLab upload paths are accepted.

Inputs: url (required), max_bytes. Returns: result

fetch_gitlab_file_urlFetch GitLab repository file URLA
Read-onlyIdempotent

Fetch bounded UTF-8 repository-file content from a same-instance GitLab blob, raw, or repository-files API URL.

Inputs: url (required), end_line, max_bytes, start_line. Returns: result

get_blobGet repository blobA
Read-onlyIdempotent

Fetch repository blob content by Git object SHA. UTF-8 text is decoded by default; binary content remains bounded base64.

Inputs: project (required), blob_sha (required), max_bytes, decode_text. Returns: result

get_commitGet repository commitA
Read-onlyIdempotent

Fetch a GitLab commit and its optional diff statistics.

Inputs: sha (required), project (required), stats. Returns: result

get_current_userGet current GitLab userA
Read-onlyIdempotent

Return the profile and identity associated with the connected GitLab token.

Inputs: no named parameters. Returns: result

get_deploymentGet GitLab deploymentA
Read-onlyIdempotent

Retrieve a single deployment with status, environment, deployable, pipeline, and (on Premium/Ultimate) approval summary information.

Inputs: project (required), deployment_id (required). Returns: result

get_deployment_approval_statusGet deployment approval statusA
Read-onlyIdempotent

Retrieve the approval status for a deployment, including approval rules and individual approval decisions. Requires GitLab Premium or Ultimate with protected-environment approval rules configured. On Free or non-protected environments the approval fields may be absent.

Inputs: project (required), deployment_id (required). Returns: result

get_environmentGet GitLab environmentA
Read-onlyIdempotent

Retrieve a single environment by its numeric ID.

Inputs: project (required), environment_id (required). Returns: result

get_fileGet repository fileA
Read-onlyIdempotent

Fetch one repository file at a ref. Text is decoded from base64 by default; binary or unusually large content stays base64.

Inputs: path (required), project (required), ref, end_line, +2 more. Returns: result

get_gitlab_capabilitiesGet GitLab capabilitiesA
Read-onlyIdempotent

Discover the connected GitLab instance, identity, token metadata, API support, permissions, licensing, and configuration evidence using read-only probes.

Inputs: project, refresh, detailed. Returns: result

get_groupGet GitLab groupB
Read-onlyIdempotent

Get one GitLab group or namespace with visibility, project, sharing, and permission metadata.

Inputs: group (required), statistics, with_projects, root_storage_statistics. Returns: result

get_group_ci_variableGet group CI/CD variable metadataA
Read-onlyIdempotent

Get group CI/CD variable metadata without exposing its value.

Inputs: key (required), group (required), filter_environment_scope. Returns: result

get_group_memberGet GitLab group memberA
Read-onlyIdempotent

Get one direct or inherited group member and their effective access level.

Inputs: group (required), user_id (required). Returns: result

get_issueGet GitLab issueA
Read-onlyIdempotent

Get one GitLab issue with labels, assignees, milestone, task status, and links.

Inputs: project (required), issue_iid (required). Returns: result

get_jobGet GitLab jobA
Read-onlyIdempotent

Get detailed status, runner, artifacts, timestamps, commit, and pipeline information for one CI job.

Inputs: job_id (required), project (required). Returns: result

get_job_artifact_archiveGet job artifact archiveA
Read-onlyIdempotent

Download a GitLab job's complete artifact ZIP archive as bounded base64 data.

Inputs: job_id (required), project (required), max_bytes. Returns: result

get_job_artifact_fileGet job artifact fileA
Read-onlyIdempotent

Download one file from a GitLab job artifact archive as base64, subject to a strict size limit.

Inputs: job_id (required), project (required), artifact_path (required), max_bytes. Returns: result

get_job_logGet GitLab job logA
Read-onlyIdempotent

Retrieve the plain-text trace for a GitLab CI job, up to the configured response safety limit.

Inputs: job_id (required), project (required), max_bytes. Returns: result

get_latest_pipelineGet latest pipelineA
Read-onlyIdempotent

Get the latest pipeline for a project ref.

Inputs: ref (required), project (required). Returns: result

get_merge_requestGet GitLab merge requestA
Read-onlyIdempotent

Get merge request metadata, branches, participants, mergeability, pipeline, approvals, and discussion status.

Inputs: project (required), merge_request_iid (required), include_rebase_in_progress, include_diverged_commits_count. Returns: result

get_merge_request_approvalsGet merge request approvalsA
Read-onlyIdempotent

Get approval rules, approvals received, approvals still required, and eligible approvers.

Inputs: project (required), merge_request_iid (required). Returns: result

get_merge_request_file_patchGet merge request file patchA
Read-onlyIdempotent

Find one exact changed path across paginated merge-request diffs and return its patch metadata and hunks.

Inputs: path (required), project (required), merge_request_iid (required), unidiff, +1 more. Returns: result

get_pipelineGet GitLab pipelineA
Read-onlyIdempotent

Get one pipeline with status, duration, coverage, ref, user, and timestamps.

Inputs: project (required), pipeline_id (required). Returns: result

get_pipeline_scheduleGet pipeline scheduleA
Read-onlyIdempotent

Get one pipeline schedule without exposing schedule variable values.

Inputs: project (required), pipeline_schedule_id (required). Returns: result

get_pipeline_test_reportGet pipeline test reportB
Read-onlyIdempotent

Get bounded test-suite and test-case results for one pipeline.

Inputs: project (required), pipeline_id (required). Returns: result

get_pipeline_test_report_summaryGet pipeline test report summaryA
Read-onlyIdempotent

Get aggregate test-report counts and pass/fail/error totals for one pipeline.

Inputs: project (required), pipeline_id (required). Returns: result

get_projectGet GitLab projectA
Read-onlyIdempotent

Get repository, namespace, default branch, visibility, permissions, and feature metadata for one GitLab project.

Inputs: project (required), statistics. Returns: result

get_project_approval_ruleGet project approval ruleA
Read-onlyIdempotent

Get one project-level merge-request approval rule by ID.

Inputs: project (required), approval_rule_id (required). Returns: result

get_project_ci_variableGet project CI/CD variable metadataA
Read-onlyIdempotent

Get project CI/CD variable metadata without exposing its value.

Inputs: key (required), project (required), filter_environment_scope. Returns: result

get_project_memberGet GitLab project memberA
Read-onlyIdempotent

Get one direct or inherited project member and their effective access level.

Inputs: project (required), user_id (required). Returns: result

get_project_webhookGet project webhookA
Read-onlyIdempotent

Get one project webhook configuration by ID. Secret tokens and secret custom headers are never exposed.

Inputs: project (required), webhook_id (required). Returns: result

get_project_webhook_eventGet project webhook delivery eventA
Read-onlyIdempotent

Get one webhook delivery event by ID. Searches through GitLab's documented event-list endpoint (events from the past 7 days only). Inspects at most 10 pages (1,000 events). Not a direct event lookup — the event must appear in the paginated list. Response body contents are never exposed; only presence and size metadata are returned. Header secrets are redacted.

Inputs: project (required), event_id (required), webhook_id (required). Returns: result

get_protected_branchGet protected branchA
Read-onlyIdempotent

Inspect one protected branch and its push, merge, unprotect, and code-owner approval policy.

Inputs: name (required), project (required). Returns: result

get_protected_tagGet protected tagA
Read-onlyIdempotent

Inspect one protected tag and its create-access policy.

Inputs: name (required), project (required). Returns: result

get_releaseGet releaseB
Read-onlyIdempotent

Get one GitLab release by tag name.

Inputs: project (required), tag_name (required), include_html_description. Returns: result

get_runtime_infoGet MCP runtime informationA
Read-onlyIdempotent

Report this installed MCP runtime's versions, deployment mode, and deterministic registered-tool inventory fingerprint without exposing credentials or general environment values.

Inputs: no named parameters. Returns: result

get_tagGet repository tagA
Read-onlyIdempotent

Get one Git tag and its associated release metadata.

Inputs: project (required), tag_name (required). Returns: result

lint_ci_configurationLint project CI configurationA
Read-onlyIdempotent

Validate GitLab CI YAML in project context and return status, errors, warnings, and jobs without returning merged YAML or protected variables.

Inputs: content (required), project (required), ref, dry_run, +1 more. Returns: result

list_branchesList repository branchesB
Read-onlyIdempotent

List or search branches in a GitLab project.

Inputs: project (required), page, regex, search, +1 more. Returns: result

list_commit_diffsList commit diffsA
Read-onlyIdempotent

Return the files and patch hunks changed by one GitLab commit.

Inputs: sha (required), project (required), page, unidiff, +1 more. Returns: result

list_commitsList repository commitsA
Read-onlyIdempotent

List commits for a project, optionally scoped to a ref, path, or time range.

Inputs: project (required), all, page, path, +8 more. Returns: result

list_commit_statusesList commit statusesA
Read-onlyIdempotent

List CI and external status checks attached to a GitLab commit.

Inputs: sha (required), project (required), all, ref, +6 more. Returns: result

list_deploymentsList GitLab deploymentsA
Read-onlyIdempotent

List deployments for a project with status, environment, ordering, and time-range filters. Pagination is bounded to 100 per page.

Inputs: project (required), ref, page, sort, +8 more. Returns: result

list_environmentsList GitLab environmentsA
Read-onlyIdempotent

List all environments for a project, optionally filtered by name, search term, or state (available, stopping, stopped).

Inputs: project (required), name, page, search, +2 more. Returns: result

list_global_issuesList accessible GitLab issuesB
Read-onlyIdempotent

List recent issues across all projects visible to the connected user, with account-wide triage filters.

Inputs: page, sort, scope, state, +12 more. Returns: result

list_group_ci_variablesList group CI/CD variablesA
Read-onlyIdempotent

List group CI/CD variable metadata without exposing variable values.

Inputs: group (required), page, per_page. Returns: result

list_group_membersList GitLab group membersA
Read-onlyIdempotent

List direct, inherited, and invited members of a GitLab group.

Inputs: group (required), page, query, per_page, +2 more. Returns: result

list_group_projectsList GitLab group projectsA
Read-onlyIdempotent

List projects in a GitLab group with subgroup, membership, visibility, archive, search, and ordering filters.

Inputs: group (required), page, sort, owned, +9 more. Returns: result

list_groupsList GitLab groupsC
Read-onlyIdempotent

List groups visible to the connected user, including membership, ownership, access-level, and search filters.

Inputs: page, sort, owned, search, +5 more. Returns: result

list_issue_notesList issue notesA
Read-onlyIdempotent

List user and system notes on one GitLab issue in chronological or reverse order.

Inputs: project (required), issue_iid (required), page, sort, +2 more. Returns: result

list_issue_reactionsList issue reactionsA
Read-onlyIdempotent

List emoji reactions on a GitLab issue or one of its comments.

Inputs: project (required), issue_iid (required), page, note_id, +1 more. Returns: result

list_issuesList GitLab issuesB
Read-onlyIdempotent

List or search issues in one GitLab project with common triage filters.

Inputs: project (required), page, sort, scope, +11 more. Returns: result

list_merge_request_commitsList merge request commitsB
Read-onlyIdempotent

List commits contained in a GitLab merge request.

Inputs: project (required), merge_request_iid (required), page, per_page. Returns: result

list_merge_request_diffsList merge request diffsA
Read-onlyIdempotent

Return changed files and patch hunks for a GitLab merge request.

Inputs: project (required), merge_request_iid (required), page, unidiff, +1 more. Returns: result

list_merge_request_discussionsList merge request discussionsA
Read-onlyIdempotent

List complete GitLab merge request discussion threads, including resolution state and diff positions.

Inputs: project (required), merge_request_iid (required), page, per_page. Returns: result

list_merge_request_pipelinesList merge request pipelinesA
Read-onlyIdempotent

List pipelines associated with a GitLab merge request.

Inputs: project (required), merge_request_iid (required). Returns: result

list_merge_request_reactionsList merge request reactionsA
Read-onlyIdempotent

List emoji reactions on a GitLab merge request or one of its notes.

Inputs: project (required), merge_request_iid (required), page, note_id, +1 more. Returns: result

list_merge_requestsList GitLab merge requestsC
Read-onlyIdempotent

List or search merge requests in one GitLab project with common review and triage filters.

Inputs: project (required), page, sort, draft, +14 more. Returns: result

list_pipeline_bridgesList pipeline bridgesA
Read-onlyIdempotent

List bridge jobs for a pipeline to discover downstream child or multi-project pipelines.

Inputs: project (required), pipeline_id (required), page, per_page. Returns: result

list_pipeline_jobsList pipeline jobsB
Read-onlyIdempotent

List jobs in a GitLab pipeline, including stages, status, runner, artifacts, and failure reason.

Inputs: project (required), pipeline_id (required), page, scope, +2 more. Returns: result

list_pipelinesList GitLab pipelinesA
Read-onlyIdempotent

List project pipelines by status, ref, source, user, or update time.

Inputs: project (required), ref, sha, name, +9 more. Returns: result

list_pipeline_schedulesList pipeline schedulesA
Read-onlyIdempotent

List project pipeline schedules without exposing schedule variable values.

Inputs: project (required), page, scope, per_page. Returns: result

list_project_approval_rulesList project approval rulesA
Read-onlyIdempotent

List project-level merge-request approval rules and eligible approvers.

Inputs: project (required). Returns: result

list_project_ci_variablesList project CI/CD variablesA
Read-onlyIdempotent

List project CI/CD variable metadata without exposing variable values.

Inputs: project (required), page, per_page. Returns: result

list_project_jobsList GitLab project jobsC
Read-onlyIdempotent

List recent jobs across all pipelines in a GitLab project.

Inputs: project (required), page, sort, scope, +3 more. Returns: result

list_project_labelsList GitLab project labelsA
Read-onlyIdempotent

List labels available in a GitLab project.

Inputs: project (required), page, search, per_page, +1 more. Returns: result

list_project_membersList GitLab project membersA
Read-onlyIdempotent

List direct and inherited project members, optionally filtering by username or name.

Inputs: project (required), page, query, per_page, +2 more. Returns: result

list_project_runnersList project runnersA
Read-onlyIdempotent

List runners available to a project without returning runner authentication tokens or CI variables.

Inputs: project (required), page, type, scope, +5 more. Returns: result

list_project_webhook_eventsList project webhook delivery eventsA
Read-onlyIdempotent

List recent delivery events for a specific project webhook. Response body contents are never exposed; only presence and size metadata are returned. Header secrets are redacted.

Inputs: project (required), webhook_id (required), page, status, +1 more. Returns: result

list_project_webhooksList project webhooksA
Read-onlyIdempotent

List project webhook configurations. Secret tokens and secret custom headers are never exposed.

Inputs: project (required), page, per_page. Returns: result

list_protected_branchesList protected branchesA
Read-onlyIdempotent

Inspect protected-branch access policy for a GitLab project.

Inputs: project (required), page, search, per_page. Returns: result

list_protected_tagsList protected tagsA
Read-onlyIdempotent

Inspect protected-tag create-access policy for a GitLab project.

Inputs: project (required), page, per_page. Returns: result

list_releasesList releasesB
Read-onlyIdempotent

List GitLab releases for a project.

Inputs: project (required), page, sort, order_by, +2 more. Returns: result

list_repository_treeList repository treeA
Read-onlyIdempotent

List files and directories in a GitLab repository at a branch, tag, or commit.

Inputs: project (required), ref, page, path, +2 more. Returns: result

list_tagsList repository tagsA
Read-onlyIdempotent

List Git tags and release metadata for a project.

Inputs: project (required), page, sort, search, +2 more. Returns: result

merge_merge_requestMerge GitLab merge requestA
Destructive

Merge a GitLab merge request now or when its pipeline succeeds. This changes the target branch.

Inputs: project (required), merge_request_iid (required), sha, squash, +5 more. Returns: result

play_jobPlay manual GitLab jobA

Start a manual GitLab CI job.

Inputs: job_id (required), project (required), job_variables_attributes. Returns: result

protect_branchProtect branchA

Create protected-branch policy after a capability preflight. An explicit acknowledgement and unprotect rule are required to avoid accidental lockout.

Inputs: name (required), project (required), allowed_to_unprotect (required), acknowledge_protection_change (required), +4 more. Returns: result

protect_tagProtect tagA

Create a protected-tag policy after a capability preflight. An explicit acknowledgement is required to prevent accidental governance changes.

Inputs: name (required), project (required), acknowledge_protection_change (required), allowed_to_create, +1 more. Returns: result

rebase_merge_requestRebase GitLab merge requestA

Enqueue a GitLab rebase for the merge request source branch. Use get_merge_request with include_rebase_in_progress to poll the result. Only available when the source branch is a fast-forward of the target.

Inputs: project (required), merge_request_iid (required), skip_ci. Returns: result

remove_issue_reactionRemove issue reactionA
Destructive

Remove an emoji reaction from a GitLab issue or issue comment by award ID.

Inputs: project (required), award_id (required), issue_iid (required), note_id. Returns: result

remove_merge_request_reactionRemove merge request reactionA
Destructive

Remove an emoji reaction from a GitLab merge request or note by award ID.

Inputs: project (required), award_id (required), merge_request_iid (required), note_id. Returns: result

reply_merge_request_discussionReply to merge request discussionB

Reply to an existing GitLab merge request review thread.

Inputs: body (required), project (required), discussion_id (required), merge_request_iid (required). Returns: result

resolve_merge_request_discussionResolve merge request discussionC

Resolve or reopen a GitLab merge request review thread.

Inputs: project (required), resolved (required), discussion_id (required), merge_request_iid (required). Returns: result

retry_jobRetry GitLab jobB

Retry a failed or canceled GitLab CI job.

Inputs: job_id (required), project (required). Returns: result

retry_pipelineRetry pipelineB

Retry failed or canceled jobs in a GitLab pipeline.

Inputs: project (required), pipeline_id (required). Returns: result

run_pipeline_scheduleRun pipeline scheduleB

Run a project pipeline schedule immediately.

Inputs: project (required), pipeline_schedule_id (required). Returns: result

search_codeSearch GitLab repository codeA
Read-onlyIdempotent

Search blobs in a specific GitLab project. Use plain code terms, filenames, symbols, or error text.

Inputs: search (required), project (required), ref, page, +1 more. Returns: result

search_gitlabSearch GitLabA
Read-onlyIdempotent

Search globally, within a group, or within a project. Supported scopes include projects, issues, merge requests, users, commits, blobs, notes, milestones, and work items; availability depends on GitLab tier and search configuration.

Inputs: scope (required), search (required), page, sort, +12 more. Returns: result

search_projectsSearch GitLab projectsA
Read-onlyIdempotent

Search accessible GitLab projects by name, path, or description. Use this to resolve an ambiguous project before other calls.

Inputs: page, sort, owned, search, +6 more. Returns: result

take_ownership_pipeline_scheduleTake ownership of pipeline scheduleB

Make the current GitLab user the owner of a pipeline schedule.

Inputs: project (required), pipeline_schedule_id (required). Returns: result

unapprove_merge_requestRemove merge request approvalA

Remove the authenticated user's approval from a GitLab merge request.

Inputs: project (required), merge_request_iid (required). Returns: result

unprotect_branchUnprotect branchA
Destructive

Remove protected-branch policy only after reading the current policy and explicitly acknowledging the destructive governance change.

Inputs: name (required), project (required), acknowledge_protection_change (required). Returns: result

unprotect_tagUnprotect tagA
Destructive

Remove a protected-tag policy only after reading the current policy and explicitly acknowledging the destructive governance change.

Inputs: name (required), project (required), acknowledge_protection_change (required). Returns: result

update_fileUpdate repository fileA

Replace a repository file and commit the change. Supply last_commit_id to prevent overwriting a concurrent edit.

Inputs: path (required), branch (required), content (required), project (required), +6 more. Returns: result

update_group_ci_variableUpdate group CI/CD variableA

Update a group CI/CD variable without returning its value.

Inputs: key (required), group (required), value (required), raw, +6 more. Returns: result

update_issueUpdate GitLab issueC

Update issue metadata, assignees, labels, milestone, confidentiality, or open/closed state.

Inputs: project (required), issue_iid (required), title, labels, +10 more. Returns: result

update_issue_noteUpdate issue noteB

Replace the body of an existing GitLab issue comment.

Inputs: body (required), note_id (required), project (required), issue_iid (required). Returns: result

update_merge_requestUpdate GitLab merge requestB

Update merge request metadata, branches, assignees, reviewers, labels, draft/ready title state, or open/closed state.

Inputs: project (required), merge_request_iid (required), title, labels, +13 more. Returns: result

update_merge_request_noteUpdate merge request noteA

Replace the body of a note or reply inside a GitLab merge request discussion.

Inputs: body (required), note_id (required), project (required), discussion_id (required), +1 more. Returns: result

update_pipeline_scheduleUpdate pipeline scheduleC

Update a project pipeline schedule.

Inputs: project (required), pipeline_schedule_id (required), cron, active, +3 more. Returns: result

update_pipeline_schedule_variableUpdate pipeline schedule variableC

Update a pipeline schedule variable without returning its value.

Inputs: key (required), value (required), project (required), pipeline_schedule_id (required), +1 more. Returns: result

update_project_approval_ruleUpdate project approval ruleA

Update a project approval rule only after reading the current rule and explicitly acknowledging the governance change.

Inputs: project (required), approval_rule_id (required), approvals_required (required), acknowledge_policy_change (required), +6… Returns: result

update_project_ci_variableUpdate project CI/CD variableB

Update a project CI/CD variable without returning its value.

Inputs: key (required), value (required), project (required), raw, +6 more. Returns: result

update_protected_branchUpdate protected branchA

Update protected-branch policy only after reading the current policy. An explicit acknowledgement and unprotect rule are required.

Inputs: name (required), project (required), allowed_to_unprotect (required), acknowledge_protection_change (required), +4 more. Returns: result

update_releaseUpdate releaseB

Update the metadata or assets of an existing GitLab release.

Inputs: project (required), tag_name (required), name, milestones, +2 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 147 tools

    Disambiguation4/5

    Most tools follow a clear resource+action pattern, and descriptions generally disambiguate close pairs like get_file/get_blob or create_commit/create_destructive_commit. However, the sheer volume of 147 tools increases the chance of selecting a similar-sounding tool, especially in file retrieval and commit creation areas.

    Naming Consistency5/5

    All tool names use a consistent snake_case verb_noun pattern (get_, list_, create_, update_, delete_, etc.). The naming convention is uniform across all 147 tools, making the API predictable and easy to navigate.

    Tool Count2/5

    147 tools is far beyond the typical well-scoped MCP server range and imposes heavy selection overhead on agents. While GitLab is a broad platform, this surface could be consolidated or split into focused sub-servers to remain manageable.

    Completeness4/5

    The tool set covers nearly all core GitLab workflows: projects, issues, merge requests, repositories, CI/CD, releases, environments, and webhooks. Some resources are read-only or lack full CRUD (e.g., labels, environments, deployments), and enterprise features like epics are absent, but the primary developer workflows have no dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers