GitLab MCP
Provides tools for interacting with GitLab instances, enabling repository management, merge request workflows, CI/CD pipeline diagnosis and fixes, and other GitLab operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GitLab MCP diagnose why the CI pipeline failed on my latest merge request"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
$gitlabskill;$gl-address-commentsfor unresolved merge-request discussions;$gl-fix-cifor pipeline and job diagnosis;$gl-publishfor 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 | |
Codex users | |
Claude Code users | |
Cline users | |
Pi users | |
Operators | |
Contributors | |
Deployers | |
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 buildChoose 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.comThe 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:httpHTTP 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_ENTRIESlimits validated bearer identities, default 256, with a 60-second TTL and LRU eviction;MCP_AUTH_FAILURE_LIMITlimits rejected tokens per directly connected address withinMCP_AUTH_FAILURE_WINDOW_MS, default 20 failures per 60 seconds;MCP_AUTH_FAILURE_MAX_ENTRIESbounds failure-tracking state, default 1,024;MCP_MAX_CONCURRENT_REQUESTScaps active MCP requests, default 32; andMCP_MAX_CONCURRENT_REQUESTS_PER_IDENTITYcaps 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/mcpSafety model
Tools advertise read-only, write, and destructive annotations.
create_commitsupports only non-destructive file actions; deletion and forced commit updates require the separately annotatedcreate_destructive_committool 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 toolsadd_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 jobADestructive
Cancel a pending or running GitLab CI job.
Inputs: job_id (required), project (required). Returns: result
cancel_pipelineCancel pipelineCDestructive
Cancel all cancelable jobs in a running GitLab pipeline.
Inputs: project (required), pipeline_id (required). Returns: result
compare_refsCompare repository refsARead-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 commitADestructive
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_release_asset_linkCreate release asset linkC
Attach an external asset link to a GitLab release.
Inputs: url (required), name (required), project (required), tag_name (required), +2 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 branchADestructive
Delete a GitLab repository branch. Protected branches cannot be deleted through this operation.
Inputs: branch (required), project (required). Returns: result
delete_fileDelete repository fileADestructive
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 variableBDestructive
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 noteADestructive
Permanently delete a GitLab issue comment.
Inputs: note_id (required), project (required), issue_iid (required). Returns: result
delete_merge_request_noteDelete merge request noteADestructive
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 scheduleBDestructive
Delete a project pipeline schedule.
Inputs: project (required), pipeline_schedule_id (required). Returns: result
delete_pipeline_schedule_variableDelete pipeline schedule variableCDestructive
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 ruleADestructive
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 variableBDestructive
Delete a project CI/CD variable without returning its former value.
Inputs: key (required), project (required), filter_environment_scope. Returns: result
delete_releaseDelete releaseADestructive
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_release_asset_linkDelete release asset linkCDestructive
Delete an external asset link from a GitLab release.
Inputs: link_id (required), project (required), tag_name (required), acknowledge_asset_link_deletion (required). Returns: result
delete_tagDelete repository tagADestructive
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 attachmentARead-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 URLARead-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 blobARead-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 commitARead-onlyIdempotent
Fetch a GitLab commit and its optional diff statistics.
Inputs: sha (required), project (required), stats. Returns: result
get_current_userGet current GitLab userARead-onlyIdempotent
Return the profile and identity associated with the connected GitLab token.
Inputs: no named parameters. Returns: result
get_deploymentGet GitLab deploymentARead-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 statusARead-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 environmentARead-onlyIdempotent
Retrieve a single environment by its numeric ID.
Inputs: project (required), environment_id (required). Returns: result
get_fileGet repository fileARead-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 capabilitiesARead-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 groupBRead-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 metadataARead-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 memberARead-onlyIdempotent
Get one direct or inherited group member and their effective access level.
Inputs: group (required), user_id (required). Returns: result
get_issueGet GitLab issueARead-onlyIdempotent
Get one GitLab issue with labels, assignees, milestone, task status, and links.
Inputs: project (required), issue_iid (required). Returns: result
get_jobGet GitLab jobARead-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 archiveARead-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 fileARead-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 logARead-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 pipelineARead-onlyIdempotent
Get the latest pipeline for a project ref.
Inputs: ref (required), project (required). Returns: result
get_merge_requestGet GitLab merge requestARead-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 approvalsARead-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 patchARead-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 pipelineARead-onlyIdempotent
Get one pipeline with status, duration, coverage, ref, user, and timestamps.
Inputs: project (required), pipeline_id (required). Returns: result
get_pipeline_scheduleGet pipeline scheduleARead-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 reportBRead-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 summaryARead-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 projectARead-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 ruleARead-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 metadataARead-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 memberARead-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 webhookARead-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 eventARead-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 branchARead-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 tagARead-onlyIdempotent
Inspect one protected tag and its create-access policy.
Inputs: name (required), project (required). Returns: result
get_releaseGet releaseBRead-onlyIdempotent
Get one GitLab release by tag name.
Inputs: project (required), tag_name (required), include_html_description. Returns: result
get_release_asset_linkGet release asset linkARead-onlyIdempotent
Get one external asset link attached to a GitLab release.
Inputs: link_id (required), project (required), tag_name (required). Returns: result
get_runtime_infoGet MCP runtime informationARead-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 tagARead-onlyIdempotent
Get one Git tag and its associated release metadata.
Inputs: project (required), tag_name (required). Returns: result
lint_ci_configurationLint project CI configurationARead-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 branchesBRead-onlyIdempotent
List or search branches in a GitLab project.
Inputs: project (required), page, regex, search, +1 more. Returns: result
list_commit_diffsList commit diffsARead-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 commitsARead-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 statusesARead-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 deploymentsARead-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 environmentsARead-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 issuesBRead-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 variablesARead-onlyIdempotent
List group CI/CD variable metadata without exposing variable values.
Inputs: group (required), page, per_page. Returns: result
list_group_membersList GitLab group membersARead-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 projectsARead-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 groupsCRead-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 notesARead-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 reactionsARead-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 issuesBRead-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 commitsBRead-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 diffsARead-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 discussionsARead-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 pipelinesARead-onlyIdempotent
List pipelines associated with a GitLab merge request.
Inputs: project (required), merge_request_iid (required). Returns: result
list_merge_request_reactionsList merge request reactionsARead-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 requestsCRead-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 bridgesARead-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 jobsBRead-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 pipelinesARead-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 schedulesARead-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 rulesARead-onlyIdempotent
List project-level merge-request approval rules and eligible approvers.
Inputs: project (required). Returns: result
list_project_ci_variablesList project CI/CD variablesARead-onlyIdempotent
List project CI/CD variable metadata without exposing variable values.
Inputs: project (required), page, per_page. Returns: result
list_project_jobsList GitLab project jobsCRead-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 labelsARead-onlyIdempotent
List labels available in a GitLab project.
Inputs: project (required), page, search, per_page, +1 more. Returns: result
list_project_membersList GitLab project membersARead-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 runnersARead-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 eventsARead-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 webhooksARead-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 branchesARead-onlyIdempotent
Inspect protected-branch access policy for a GitLab project.
Inputs: project (required), page, search, per_page. Returns: result
list_protected_tagsList protected tagsARead-onlyIdempotent
Inspect protected-tag create-access policy for a GitLab project.
Inputs: project (required), page, per_page. Returns: result
list_release_asset_linksList release asset linksARead-onlyIdempotent
List external asset links attached to a GitLab release.
Inputs: project (required), tag_name (required). Returns: result
list_releasesList releasesBRead-onlyIdempotent
List GitLab releases for a project.
Inputs: project (required), page, sort, order_by, +2 more. Returns: result
list_repository_treeList repository treeARead-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 tagsARead-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 requestADestructive
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 reactionADestructive
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 reactionADestructive
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 codeARead-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 GitLabARead-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 projectsARead-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 branchADestructive
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 tagADestructive
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
update_release_asset_linkUpdate release asset linkB
Update an external asset link attached to a GitLab release.
Inputs: url (required), name (required), link_id (required), project (required), +3 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 147 tools
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.
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.
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.
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
Related MCP Connectors
Hosted MCP server and Agent Skills for specs, engineering threads, and project memory.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProduction-ready MCP server providing GitLab integration with OAuth authentication, enabling AI assistants to manage projects, issues, merge requests, branches, files, and commits across GitLab instances.MIT
- FlicenseNot gradedqualityDmaintenanceHTTP-based MCP server for GitLab API, enabling project management, issue tracking, merge requests, and file operations through natural language.-
- AlicenseAqualityCmaintenanceMCP server for GitLab REST API enabling AI agents to manage pipelines, merge requests, diffs, and local reviews.159 npmMIT
- FlicenseNot gradedqualityDmaintenanceMCP server enabling AI assistants to understand GitLab repositories through on-demand source code analysis using specialized AI agents.-