GitLab MCP Server
Provides tools for interacting with GitLab's API, enabling AI agents to manage merge requests, issues, branches, projects, repositories, users, labels, CI/CD pipelines, runners, and other GitLab resources on GitLab SaaS or self-hosted instances.
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 Servercan you list open merge requests in the backend project?"
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 Server
A production-grade Model Context Protocol (MCP) server for GitLab. Engineered for autonomous AI coding assistants, agents, and pair programmers — featuring deep integration with Google Antigravity, Claude Code, Cursor, and VS Code.
Overview
This repository provides a comprehensive, production-ready GitLab Model Context Protocol (MCP) server. It exposes a rich set of 218 tools across 20 toolsets, granting AI agents full read, write, and orchestration capabilities across GitLab SaaS (gitlab.com) or self-hosted GitLab CE/EE instances.
Key Features & Capabilities
🚀 CI/CD Runner Management: Built-in 6-tool suite for managing GitLab runners (list, inspect, pause, resume, delete, and job execution logs).
🤖 Native Google Antigravity Integration: Pre-configured and tested for both Antigravity IDE and Antigravity CLI via Docker.
🛡️ Fine-Grained Safety Tiers: Three distinct permission modes (
full,modify,readonly) preventing accidental deletions in production environments.⚡ Dynamic On-Demand Toolsets: Keep agent context windows lean by starting with 9 default toolsets and loading opt-in toolsets at runtime using
discover_tools.🔌 Multi-Transport Architecture: Native support for
stdio(local process IPC),Streamable HTTP(remote sessions), andSSE(Server-Sent Events).
Related MCP server: GitLab MCP Server
Table of Contents
Toolsets Overview
Tools are grouped into 20 domain toolsets. The server boots with 9 core toolsets active by default (114 tools) to minimize token overhead. Opt-in toolsets (104 tools) can be activated via environment variables or on the fly by the AI.
Toolset ID | Tools | Default State | Core Responsibilities |
| 43 | Active | MR creation, updates, diffs, conflicts, approvals, threads, and draft notes |
| 24 | Active | Issue tracking, description patches, links, discussions, and todo items |
| 15 | Active | Branch creation/deletion, protected branch policies, commit history, blame, and statuses |
| 10 | Active | Project details, member listing, group iterations, namespace verification |
| 7 | Active | File reading, directory trees, single-file edits, and atomic multi-file commits |
| 7 | Active | User details, profile lookup ( |
| 5 | Active | Project and group label inspection and creation |
| 4 | Active |
|
| 1 | Active | Group and subgroup creation with namespace hierarchy |
| 19 | Opt-in | Pipeline triggers, status checks, job logs/traces, manual job plays, cancellations, and artifacts |
| 18 | Opt-in | GitLab Work Items, hierarchy, custom field definitions, and timeline events |
| 17 | Opt-in | Milestone tracking, burndown events, group and project associations |
| 10 | Opt-in | Project and group wiki documentation pages CRUD |
| 10 | Opt-in | CI/CD project and group variables with environment scope isolation |
| 7 | Opt-in | Release management, evidence collection, and release asset downloads |
| 6 | Opt-in | CI/CD runner management: list, inspect, pause, resume, delete, and job auditing |
| 5 | Opt-in | Tag management, release tagging, and X.509 signature verification |
| 4 | Opt-in | Docker Hub proxy cache settings, cached blob listings, and cache purge |
| 3 | Opt-in | Project and group webhook inspection, event history, and delivery payloads |
| 3 | Opt-in | Global, group, and project code search (Zoekt / Advanced Search) |
(Plus 2 standalone meta tools: discover_tools and execute_graphql.)
Spotlight: CI/CD Runner Management
Standard GitLab MCP servers only support pipelines and jobs, leaving the underlying runner infrastructure inaccessible. I designed and implemented the runners toolset to bridge this gap.
The 6 Custom Runner Tools
list_runnersList GitLab CI/CD runners across instance, group, or project levels.
Filters:
type:instance_type(shared runners),group_type, orproject_typestatus:online,offline,stale,never_contacted,active,pausedtag_list: Filter by tags (e.g.["docker", "gpu", "linux"])project_id/group_id: Scope results to a specific project or group
get_runnerRetrieve deep runner specifications:
Platform, architecture, software version, IP address, tag list, active status, maximum timeout, and timestamp of last contact.
pause_runnerTemporarily disable a runner from picking up new CI/CD jobs. The runner remains registered but inactive, perfect for maintenance or host patching.
resume_runnerRe-enable a paused runner so it immediately resumes job consumption from the queue.
delete_runner(destructive)Permanently remove a decommissioned runner from the GitLab instance.
list_runner_jobsAudit all jobs executed by a specific runner.
Filter by status (
running,success,failed,canceled) to quickly diagnose runner-specific failures.
Practical Scenarios
# Scenario 1: Triage offline or stale runners
list_runners(status: "stale") # Find runners that missed heartbeat
get_runner(runner_id: "53980205") # Inspect IP, OS, and tags
list_runner_jobs(runner_id: "53980205", status: "failed") # Check failed builds
# Scenario 2: Host maintenance workflow
pause_runner(runner_id: "53980205") # Safely drain runner
# ... apply updates or reboot host machine ...
resume_runner(runner_id: "53980205") # Put runner back in rotationQuick Start & Client Configurations
Google Antigravity IDE & CLI
My primary environment is Google Antigravity. To configure this MCP in Antigravity:
Edit your MCP configuration file:
Antigravity IDE:
~/.gemini/antigravity/mcp_config.jsonAntigravity CLI:
~/.gemini/antigravity-cli/mcp_config.json
{
"mcpServers": {
"gitlab-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "GITLAB_PERSONAL_ACCESS_TOKEN=your_personal_access_token",
"-e", "GITLAB_API_URL=https://gitlab.com/api/v4",
"-e", "GITLAB_TOOLSETS=all",
"custom-gitlab-mcp:latest"
]
}
}
}Docker Setup (Recommended)
Running inside Docker ensures all Node.js and TypeScript dependencies are isolated.
# 1. Clone this repository
git clone https://github.com/aryannverse/Custom-GitLab-MCP.git
cd Custom-GitLab-MCP
# 2. Build the Docker image
docker build -t custom-gitlab-mcp:latest .
# 3. Test running the image
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"whoami","arguments":{}}}' | \
docker run -i --rm \
-e GITLAB_PERSONAL_ACCESS_TOKEN="your_gitlab_token" \
-e GITLAB_API_URL="https://gitlab.com/api/v4" \
-e GITLAB_TOOLSETS="all" \
custom-gitlab-mcp:latestClaude Code & Claude Desktop
In claude_desktop_config.json:
{
"mcpServers": {
"gitlab": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "GITLAB_PERSONAL_ACCESS_TOKEN=your_token_here",
"-e", "GITLAB_API_URL=https://gitlab.com/api/v4",
"-e", "GITLAB_TOOLSETS=all",
"custom-gitlab-mcp:latest"
]
}
}
}Cursor IDE
In Cursor Settings > Features > MCP:
Name:
GitLabType:
commandCommand:
docker run -i --rm -e GITLAB_PERSONAL_ACCESS_TOKEN=your_token -e GITLAB_API_URL=https://gitlab.com/api/v4 -e GITLAB_TOOLSETS=all custom-gitlab-mcp:latest
VS Code / GitHub Copilot
In .vscode/mcp.json:
{
"servers": {
"gitlab": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "GITLAB_PERSONAL_ACCESS_TOKEN=your_token",
"-e", "GITLAB_API_URL=https://gitlab.com/api/v4",
"-e", "GITLAB_TOOLSETS=all",
"custom-gitlab-mcp:latest"
]
}
}
}Authentication Methods
The server supports 4 authentication mechanisms:
Personal Access Token (PAT) (Recommended)
Simplest configuration. Create a PAT in GitLab under User Settings > Access Tokens with scope
api(orread_apifor read-only setups).Set via
GITLAB_PERSONAL_ACCESS_TOKEN=glpat-...
Local OAuth 2.0 PKCE Browser Flow
Recommended when you do not wish to store long-lived tokens on disk.
Set
GITLAB_USE_OAUTH=true,GITLAB_OAUTH_CLIENT_ID, andGITLAB_OAUTH_REDIRECT_URI.On first request, automatically launches your default browser for user authentication.
Remote MCP OAuth Proxy
For remote web clients like Claude.ai. Unauthenticated calls receive
401 + WWW-Authenticate, initiating standard OAuth 2.0 discovery.Set
GITLAB_MCP_OAUTH=trueandSTREAMABLE_HTTP=true.
Remote Multi-User Authorization
For shared multi-user server instances.
Set
REMOTE_AUTHORIZATION=trueandSTREAMABLE_HTTP=true. Callers pass their token per HTTP session viaAuthorization: Bearer <token>orPrivate-Token: <token>.
Security & Permission Modes
To safeguard repositories against accidental destruction by autonomous agents, configure the permission mode:
# Full access — allows all operations (default)
GITLAB_PERMISSION_MODE=full
# Modify mode — allows reads, creates, and updates, but strictly blocks all 28 permanent delete tools
GITLAB_PERMISSION_MODE=modify
# Read-only mode — allows only the 117 query tools, rejecting all modifications
GITLAB_PERMISSION_MODE=readonlyTool Filtering Controls
GITLAB_TOOLSETS: Comma-separated list of toolsets to enable (e.g.runners,pipelines,merge_requests) orall.GITLAB_TOOLS: Comma-separated list of individual tools to allow (e.g.list_runners,get_runner).GITLAB_DENIED_TOOLS_REGEX: Regular expression pattern to deny specific tools (e.g.^delete_.*).
Environment Variables Reference
Variable | Default | Description |
| - | GitLab personal access token |
|
| Base GitLab API URL (supports self-hosted endpoints) |
| 9 default toolsets | Comma-separated list of toolset IDs or |
| - | Comma-separated list of specific tools to whitelist |
| - | Regex pattern of tools to block |
|
| Permission tier: |
|
| Set to |
|
| Server listening IP address ( |
|
| Server listening port |
|
| Suppress new version notices on stderr |
Tools by Category
merge_requests (43 tools) — Default: Active
merge_merge_request(destructive) — Merge a merge requestapprove_merge_request— Approve a merge requestunapprove_merge_request— Unapprove a merge requestget_merge_request_approval_state(read-only) — Get merge request approval details including approversget_branch(read-only) — Get branch details (commit, protection status)list_branches(read-only) — List branches in project with search filterget_merge_request_conflicts(read-only) — Get the conflicts of a merge requestlist_merge_request_pipelines(read-only) — List pipelines for a merge request with paginationget_merge_request(read-only) — Get details of a merge request (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summariesget_merge_request_diffs(read-only) — Get the changes/diffs of a merge request (mergeRequestIid or branchName required)list_merge_request_changed_files(read-only) — List changed file paths in a merge request without diff content (mergeRequestIid or branchName required)list_merge_request_diffs(read-only) — List merge request diffs with pagination (mergeRequestIid or branchName required)get_merge_request_file_diff(read-only) — Get diffs for specific files from a merge request (mergeRequestIid or branchName required)list_merge_request_versions(read-only) — List all versions of a merge requestget_merge_request_version(read-only) — Get a specific version of a merge requestupdate_merge_request— Update a merge request (mergeRequestIid or branchName required)create_merge_request— Create a new merge requestlist_merge_requests(read-only) — List merge requests (without project_id: user's MRs; with project_id: project MRs)get_branch_diffs(read-only) — Get diffs between two branches or commitsmr_discussions(read-only) — List discussion items for a merge requestcreate_merge_request_note— Add a new note to a merge requestupdate_merge_request_note— Modify an existing merge request notedelete_merge_request_note(destructive) — Delete an existing merge request noteget_merge_request_note(read-only) — Get a specific note for a merge requestget_merge_request_notes(read-only) — List notes for a merge requestdelete_merge_request_discussion_note(destructive) — Delete a discussion note on a merge requestupdate_merge_request_discussion_note— Update a discussion note on a merge requestcreate_merge_request_discussion_note— Add a new discussion note to an existing merge request threadget_draft_note(read-only) — Get a single draft note from a merge requestlist_draft_notes(read-only) — List draft notes for a merge requestcreate_draft_note— Create a draft note for a merge requestupdate_draft_note— Update an existing draft notedelete_draft_note(destructive) — Delete a draft notepublish_draft_note— Publish a single draft notebulk_publish_draft_notes— Publish all draft notes for a merge requestcreate_merge_request_thread— Create a new thread on a merge requestresolve_merge_request_thread— Resolve a thread on a merge requestlist_merge_request_emoji_reactions(read-only) — List all emoji reactions on a merge requestlist_merge_request_note_emoji_reactions(read-only) — List all emoji reactions on a merge request note. Pass discussion_id for discussion thread replies.create_merge_request_emoji_reaction— Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes)delete_merge_request_emoji_reaction(destructive) — Remove an emoji reaction from a merge requestcreate_merge_request_note_emoji_reaction— Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies.delete_merge_request_note_emoji_reaction(destructive) — Remove an emoji reaction from a merge request note. Pass discussion_id for discussion thread replies.
issues (24 tools) — Default: Active
create_issue— Create a new issuelist_issues(read-only) — List issues (default: created by current user; use scope='all' for all)my_issues(read-only) — List issues assigned to the authenticated userget_issue(read-only) — Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone objectupdate_issue— Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue objectupdate_issue_description_patch— Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates.delete_issue(destructive) — Delete an issuelist_todos(read-only) — List GitLab to-do items for the current usermark_todo_done— Mark a GitLab to-do item as donemark_all_todos_done— Mark all pending GitLab to-do items as done for the current usercreate_issue_note— Add a note to an issue, optionally replying to a discussion threadupdate_issue_note— Modify an existing issue thread notelist_issue_links(read-only) — List all issue links for a specific issuelist_issue_discussions(read-only) — List discussions for an issueget_issue_link(read-only) — Get a specific issue linkcreate_issue_link— Create an issue link between two issuesdelete_issue_link(destructive) — Delete an issue linkcreate_note— Create a new note (comment) to an issue or merge requestlist_issue_emoji_reactions(read-only) — List all emoji reactions on an issuelist_issue_note_emoji_reactions(read-only) — List all emoji reactions on an issue note. Pass discussion_id for discussion thread replies.create_issue_emoji_reaction— Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes)delete_issue_emoji_reaction(destructive) — Remove an emoji reaction from an issuecreate_issue_note_emoji_reaction— Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies.delete_issue_note_emoji_reaction(destructive) — Remove an emoji reaction from an issue note. Pass discussion_id for discussion thread replies.
repositories (7 tools) — Default: Active
search_repositories(read-only) — Search for GitLab projectscreate_repository— Create a new GitLab projectget_file_contents(read-only) — Get contents of a file or directory from a GitLab projectpush_files(destructive) — Push multiple files in a single commitcreate_or_update_file— Create or update a file in a GitLab projectfork_repository— Fork a project to your account or specified namespaceget_repository_tree(read-only) — List files and directories in a repository
branches (15 tools) — Default: Active
create_branch— Create a new branchget_branch(read-only) — Get branch details (commit, protection status)list_branches(read-only) — List branches in project with search filterdelete_branch(destructive) — Delete branch from projectlist_protected_branches(read-only) — List protected branches in a project, supports search filterget_protected_branch(read-only) — Get details of a single protected branch (access levels, force push settings)protect_branch(destructive) — Protect a repository branch (set push/merge/unprotect access levels)unprotect_branch(destructive) — Remove protection from a previously protected branchupdate_default_branch(destructive) — Change the default branch of a projectlist_commits(read-only) — List repository commits with filtering optionsget_commit(read-only) — Get details of a specific commitget_commit_diff(read-only) — Get changes/diffs of a specific commitget_file_blame(read-only) — Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.list_commit_statuses(read-only) — List statuses for a commitcreate_commit_status— Create or update the status of a commit
projects (10 tools) — Default: Active
get_project(read-only) — Get details of a specific projectlist_projects(read-only) — List projects accessible by the current userupdate_project— Update project settings such as description, visibility, default branch, and feature access levelslist_project_members(read-only) — List members of a GitLab projectlist_namespaces(read-only) — List all namespaces (users and groups) available to the current user. Filter by kind='group' for groups only.get_namespace(read-only) — Get details of a namespace (user or group) by ID or path. Groups are namespaces with kind='group'.verify_namespace(read-only) — Verify if a namespace path exists. Use parent_id to scope the check to a specific parent namespace — required for nested namespaces where the same path may exist under different parents.list_group_projects(read-only) — List projects in a grouplist_group_iterations(read-only) — List group iterations with filtering optionshealth_check(read-only) — Verify server status and authentication
labels (5 tools) — Default: Active
list_labels(read-only) — List labels for a projectget_label(read-only) — Get a single label from a projectcreate_label— Create a new label in a projectupdate_label— Update an existing label in a projectdelete_label(destructive) — Delete a label from a project
ci (4 tools) — Default: Active
validate_ci_lint(read-only) — Validate provided GitLab CI/CD YAML content for a projectvalidate_project_ci_lint(read-only) — Validate an existing .gitlab-ci.yml configuration for a projectlist_ci_catalog_resources(read-only) — List GitLab CI/CD Catalog resources/components visible to the userget_ci_catalog_resource(read-only) — Get details for a GitLab CI/CD Catalog resource, including versions and components
groups (1 tools) — Default: Active
create_group— Create new group or subgroup
pipelines (19 tools) — Opt-in (GITLAB_TOOLSETS=pipelines)
list_pipelines(read-only) — List pipelines with filtering optionsget_pipeline(read-only) — Get details of a specific pipelinelist_deployments(read-only) — List deployments with filtering optionsget_deployment(read-only) — Get details of a specific deploymentlist_environments(read-only) — List environments in a projectget_environment(read-only) — Get details of a specific environmentlist_pipeline_jobs(read-only) — List all jobs in a specific pipelinelist_pipeline_trigger_jobs(read-only) — List trigger jobs (bridges) in a pipelineget_pipeline_job(read-only) — Get details of a GitLab pipeline job numberget_pipeline_job_output(read-only) — Get the output/trace of a pipeline job with optional paginationcreate_pipeline— Create a new pipeline for a branch or tagretry_pipeline— Retry a failed or canceled pipelinecancel_pipeline— Cancel a running pipelineplay_pipeline_job— Run a manual pipeline jobretry_pipeline_job— Retry a failed or canceled pipeline jobcancel_pipeline_job— Cancel a running pipeline joblist_job_artifacts(read-only) — List artifact files in a job's archivedownload_job_artifacts(read-only) — Download job artifact archive (zip) and save to a local pathget_job_artifact_file(read-only) — Get content of a single file from a job's artifacts
milestones (17 tools) — Opt-in (GITLAB_TOOLSETS=milestones)
list_milestones(read-only) — List milestones with filtering optionsget_milestone(read-only) — Get details of a specific milestonecreate_milestone— Create a new milestoneedit_milestone— Edit an existing milestonedelete_milestone(destructive) — Delete a milestoneget_milestone_issue(read-only) — Get issues associated with a specific milestoneget_milestone_merge_requests(read-only) — Get merge requests associated with a specific milestonepromote_milestone— Promote a milestone to the next stageget_milestone_burndown_events(read-only) — Get burndown events for a specific milestonelist_group_milestones(read-only) — List group milestones with filtering optionsget_group_milestone(read-only) — Get details of a specific group milestonecreate_group_milestone— Create a new group milestoneedit_group_milestone— Edit an existing group milestonedelete_group_milestone(destructive) — Delete a group milestoneget_group_milestone_issue(read-only) — Get issues associated with a specific group milestoneget_group_milestone_merge_requests(read-only) — Get merge requests associated with a specific group milestoneget_group_milestone_burndown_events(read-only) — Get burndown events for a specific group milestone
wiki (10 tools) — Opt-in (GITLAB_TOOLSETS=wiki)
list_wiki_pages(read-only) — List wiki pages in a projectget_wiki_page(read-only) — Get details of a specific wiki pagecreate_wiki_page— Create a wiki page in a projectupdate_wiki_page— Update a wiki page in a projectdelete_wiki_page(destructive) — Delete a wiki page from a projectlist_group_wiki_pages(read-only) — List wiki pages in a groupget_group_wiki_page(read-only) — Get details of a specific group wiki pagecreate_group_wiki_page— Create a wiki page in a groupupdate_group_wiki_page— Update a wiki page in a groupdelete_group_wiki_page(destructive) — Delete a wiki page from a group
releases (7 tools) — Opt-in (GITLAB_TOOLSETS=releases)
list_releases(read-only) — List all releases for a projectget_release(read-only) — Get a release by tag namecreate_release— Create a new releaseupdate_release— Update an existing releasedelete_release(destructive) — Delete a release (does not delete the tag)create_release_evidence— Create release evidence (Premium/Ultimate)download_release_asset(read-only) — Download a release asset file by direct asset path
tags (5 tools) — Opt-in (GITLAB_TOOLSETS=tags)
list_tags(read-only) — List repository tags for a projectget_tag(read-only) — Get a repository tag by namecreate_tag— Create a new repository tagdelete_tag(destructive) — Delete a repository tagget_tag_signature(read-only) — Get the X.509 signature of a signed tag (404 if unsigned)
users (7 tools) — Default: Active
get_users(read-only) — Get GitLab user details by usernamesget_user(read-only) — Get user details by IDwhoami(read-only) — Get current authenticated user detailslist_events(read-only) — List events for the authenticated user (before/after: YYYY-MM-DD)get_project_events(read-only) — List events for a project (before/after: YYYY-MM-DD)upload_markdown— Upload a file for use in markdown contentdownload_attachment(read-only) — Download an uploaded file from a project (images returned as base64; use local_path to save to disk)
workitems (18 tools) — Opt-in (GITLAB_TOOLSETS=workitems)
get_work_item(read-only) — Get a work item with full details including status, hierarchy, type, and widgetslist_work_items(read-only) — List work items with filters (type, state, search, assignees, labels)create_work_item— Create a work item (issue, task, incident, epic, etc.) with full field supportupdate_work_item— Update a work item (title, description, labels, assignees, state, parent, custom fields, etc.)convert_work_item_type— Convert a work item to a different typelist_work_item_statuses(read-only) — List available statuses for a work item type (Premium/Ultimate)list_custom_field_definitions(read-only) — List custom field definitions for a work item typemove_work_item— Move a work item to a different projectlist_work_item_notes(read-only) — List notes and discussions on a work itemcreate_work_item_note— Add a note to a work item (supports Markdown, internal notes, threads)list_work_item_emoji_reactions(read-only) — List all emoji reactions on a work itemlist_work_item_note_emoji_reactions(read-only) — List all emoji reactions on a work item note (comment, thread, or thread reply)create_work_item_emoji_reaction— Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)delete_work_item_emoji_reaction(destructive) — Remove an emoji reaction from a work itemcreate_work_item_note_emoji_reaction— Add an emoji reaction to a work item note (comment, thread, or thread reply)delete_work_item_note_emoji_reaction(destructive) — Remove an emoji reaction from a work item note (comment, thread, or thread reply)get_timeline_events(read-only) — List timeline events for an incidentcreate_timeline_event— Create a timeline event on an incident
webhooks (3 tools) — Opt-in (GITLAB_TOOLSETS=webhooks)
list_webhooks(read-only) — List webhooks for a project or grouplist_webhook_events(read-only) — List recent webhook events (past 7 days)get_webhook_event(read-only) — Get full details of a specific webhook event
search (3 tools) — Opt-in (GITLAB_TOOLSETS=search)
search_code(read-only) — Search for code across all projects (requires advanced search or Zoekt)search_project_code(read-only) — Search for code within a specific project (requires advanced search or Zoekt)search_group_code(read-only) — Search for code within a specific group (requires advanced search or Zoekt)
variables (10 tools) — Opt-in (GITLAB_TOOLSETS=variables)
list_project_variables(read-only) — List CI/CD variables for a projectget_project_variable(read-only) — Get a single CI/CD variable from a projectcreate_project_variable— Create a CI/CD variable for a projectupdate_project_variable— Update an existing CI/CD variable in a projectdelete_project_variable(destructive) — Delete a CI/CD variable from a projectlist_group_variables(read-only) — List CI/CD variables for a groupget_group_variable(read-only) — Get a single CI/CD variable from a groupcreate_group_variable— Create a CI/CD variable for a groupupdate_group_variable— Update an existing CI/CD variable in a groupdelete_group_variable(destructive) — Delete a CI/CD variable from a group
dependency_proxy (4 tools) — Opt-in (GITLAB_TOOLSETS=dependency_proxy)
get_dependency_proxy_settings(read-only) — Get dependency proxy settings for a groupupdate_dependency_proxy_settings— Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)list_dependency_proxy_blobs(read-only) — List cached dependency proxy blobs for a grouppurge_dependency_proxy_cache(destructive) — Schedule purge of all cached dependency proxy blobs for a group
runners (6 tools) — Opt-in (GITLAB_TOOLSETS=runners)
list_runners(read-only) — List GitLab CI/CD runners. Can be scoped to all runners, a specific project, or a specific group. Supports filtering by type, status, and tags.get_runner(read-only) — Get detailed information about a specific GitLab CI/CD runner including platform, architecture, tags, version, IP address, and last contact time.pause_runner— Pause (disable) a GitLab CI/CD runner so it will not pick up new jobs. The runner remains registered but inactive.resume_runner— Resume (re-enable) a previously paused GitLab CI/CD runner so it can start picking up jobs again.delete_runner(destructive) — Permanently delete a GitLab CI/CD runner. This action is irreversible — the runner must be re-registered to be used again.list_runner_jobs(read-only) — List jobs that have been executed by a specific GitLab CI/CD runner. Useful for auditing runner activity and debugging job failures.
meta (2 tools) — Default: Active
discover_tools(read-only) — Discover and activate additional tool categories at runtime for the current session.execute_graphql(read-only / mutation) — Execute custom GraphQL queries and mutations against GitLab.
Complete Tool Inventory (218 Tools)
merge_merge_request(destructive) - Merge a merge requestapprove_merge_request- Approve a merge requestunapprove_merge_request- Unapprove a merge requestget_merge_request_approval_state(read-only) - Get merge request approval details including approversget_merge_request_conflicts(read-only) - Get the conflicts of a merge requestlist_merge_request_pipelines(read-only) - List pipelines for a merge request with paginationexecute_graphql(read-only) - Execute a GitLab GraphQL querycreate_or_update_file- Create or update a file in a GitLab projectsearch_repositories(read-only) - Search for GitLab projectscreate_repository- Create a new GitLab projectcreate_group- Create new group or subgroupget_file_contents(read-only) - Get contents of a file or directory from a GitLab projectpush_files(destructive) - Push multiple files in a single commitcreate_issue- Create a new issuecreate_merge_request- Create a new merge requestfork_repository- Fork a project to your account or specified namespacecreate_branch- Create a new branchget_branch(read-only) - Get branch details (commit, protection status)list_branches(read-only) - List branches in project with search filterdelete_branch(destructive) - Delete branch from projectlist_protected_branches(read-only) - List protected branches in a project, supports search filterget_protected_branch(read-only) - Get details of a single protected branch (access levels, force push settings)protect_branch(destructive) - Protect a repository branch (set push/merge/unprotect access levels)unprotect_branch(destructive) - Remove protection from a previously protected branchupdate_default_branch(destructive) - Change the default branch of a projectget_merge_request(read-only) - Get details of a merge request (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summariesget_merge_request_diffs(read-only) - Get the changes/diffs of a merge request (mergeRequestIid or branchName required)list_merge_request_changed_files(read-only) - List changed file paths in a merge request without diff content (mergeRequestIid or branchName required)list_merge_request_diffs(read-only) - List merge request diffs with pagination (mergeRequestIid or branchName required)get_merge_request_file_diff(read-only) - Get diffs for specific files from a merge request (mergeRequestIid or branchName required)list_merge_request_versions(read-only) - List all versions of a merge requestget_merge_request_version(read-only) - Get a specific version of a merge requestget_branch_diffs(read-only) - Get diffs between two branches or commitsupdate_merge_request- Update a merge request (mergeRequestIid or branchName required)create_note- Create a new note (comment) to an issue or merge requestcreate_merge_request_thread- Create a new thread on a merge requestresolve_merge_request_thread- Resolve a thread on a merge requestmr_discussions(read-only) - List discussion items for a merge requestdelete_merge_request_discussion_note(destructive) - Delete a discussion note on a merge requestupdate_merge_request_discussion_note- Update a discussion note on a merge requestcreate_merge_request_discussion_note- Add a new discussion note to an existing merge request threadcreate_merge_request_note- Add a new note to a merge requestdelete_merge_request_note(destructive) - Delete an existing merge request noteget_merge_request_note(read-only) - Get a specific note for a merge requestget_merge_request_notes(read-only) - List notes for a merge requestupdate_merge_request_note- Modify an existing merge request noteget_draft_note(read-only) - Get a single draft note from a merge requestlist_draft_notes(read-only) - List draft notes for a merge requestcreate_draft_note- Create a draft note for a merge requestupdate_draft_note- Update an existing draft notedelete_draft_note(destructive) - Delete a draft notepublish_draft_note- Publish a single draft notebulk_publish_draft_notes- Publish all draft notes for a merge requestlist_merge_request_emoji_reactions(read-only) - List all emoji reactions on a merge requestlist_merge_request_note_emoji_reactions(read-only) - List all emoji reactions on a merge request note. Pass discussion_id for discussion thread replies.create_merge_request_emoji_reaction- Add an emoji reaction to a merge request (e.g. thumbsup, rocket, eyes)delete_merge_request_emoji_reaction(destructive) - Remove an emoji reaction from a merge requestcreate_merge_request_note_emoji_reaction- Add an emoji reaction to a merge request note. Pass discussion_id for discussion thread replies.delete_merge_request_note_emoji_reaction(destructive) - Remove an emoji reaction from a merge request note. Pass discussion_id for discussion thread replies.update_issue_note- Modify an existing issue thread notecreate_issue_note- Add a note to an issue, optionally replying to a discussion threadlist_issue_emoji_reactions(read-only) - List all emoji reactions on an issuelist_issue_note_emoji_reactions(read-only) - List all emoji reactions on an issue note. Pass discussion_id for discussion thread replies.create_issue_emoji_reaction- Add an emoji reaction to an issue (e.g. thumbsup, rocket, eyes)delete_issue_emoji_reaction(destructive) - Remove an emoji reaction from an issuecreate_issue_note_emoji_reaction- Add an emoji reaction to an issue note. Pass discussion_id for discussion thread replies.delete_issue_note_emoji_reaction(destructive) - Remove an emoji reaction from an issue note. Pass discussion_id for discussion thread replies.list_issues(read-only) - List issues (default: created by current user; use scope='all' for all)my_issues(read-only) - List issues assigned to the authenticated userget_issue(read-only) - Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone objectupdate_issue- Update an issue. Returns a slim confirmation by default; set full_response=true for the complete updated issue objectupdate_issue_description_patch- Apply a patch (search/replace or unified diff) to an issue description. Reduces token usage by allowing small changes without sending the full description. Supports dry_run to preview changes and create_note to summarize updates.delete_issue(destructive) - Delete an issuelist_todos(read-only) - List GitLab to-do items for the current usermark_todo_done- Mark a GitLab to-do item as donemark_all_todos_done- Mark all pending GitLab to-do items as done for the current userlist_issue_links(read-only) - List all issue links for a specific issuelist_issue_discussions(read-only) - List discussions for an issueget_issue_link(read-only) - Get a specific issue linkcreate_issue_link- Create an issue link between two issuesdelete_issue_link(destructive) - Delete an issue linklist_namespaces(read-only) - List all namespaces (users and groups) available to the current user. Filter by kind='group' for groups only.get_namespace(read-only) - Get details of a namespace (user or group) by ID or path. Groups are namespaces with kind='group'.verify_namespace(read-only) - Verify if a namespace path exists. Use parent_id to scope the check to a specific parent namespace — required for nested namespaces where the same path may exist under different parents.get_project(read-only) - Get details of a specific projectlist_projects(read-only) - List projects accessible by the current userupdate_project- Update project settings such as description, visibility, default branch, and feature access levelslist_project_members(read-only) - List members of a GitLab projectlist_labels(read-only) - List labels for a projectget_label(read-only) - Get a single label from a projectcreate_label- Create a new label in a projectupdate_label- Update an existing label in a projectdelete_label(destructive) - Delete a label from a projectlist_group_projects(read-only) - List projects in a grouplist_wiki_pages(read-only) - List wiki pages in a projectget_wiki_page(read-only) - Get details of a specific wiki pagecreate_wiki_page- Create a wiki page in a projectupdate_wiki_page- Update a wiki page in a projectdelete_wiki_page(destructive) - Delete a wiki page from a projectlist_group_wiki_pages(read-only) - List wiki pages in a groupget_group_wiki_page(read-only) - Get details of a specific group wiki pagecreate_group_wiki_page- Create a wiki page in a groupupdate_group_wiki_page- Update a wiki page in a groupdelete_group_wiki_page(destructive) - Delete a wiki page from a groupget_repository_tree(read-only) - List files and directories in a repositorylist_pipelines(read-only) - List pipelines with filtering optionsget_pipeline(read-only) - Get details of a specific pipelinelist_deployments(read-only) - List deployments with filtering optionsget_deployment(read-only) - Get details of a specific deploymentlist_environments(read-only) - List environments in a projectget_environment(read-only) - Get details of a specific environmentlist_pipeline_jobs(read-only) - List all jobs in a specific pipelinelist_pipeline_trigger_jobs(read-only) - List trigger jobs (bridges) in a pipelineget_pipeline_job(read-only) - Get details of a GitLab pipeline job numberget_pipeline_job_output(read-only) - Get the output/trace of a pipeline job with optional paginationvalidate_ci_lint(read-only) - Validate provided GitLab CI/CD YAML content for a projectvalidate_project_ci_lint(read-only) - Validate an existing .gitlab-ci.yml configuration for a projectlist_ci_catalog_resources(read-only) - List GitLab CI/CD Catalog resources/components visible to the userget_ci_catalog_resource(read-only) - Get details for a GitLab CI/CD Catalog resource, including versions and componentscreate_pipeline- Create a new pipeline for a branch or tagretry_pipeline- Retry a failed or canceled pipelinecancel_pipeline- Cancel a running pipelineplay_pipeline_job- Run a manual pipeline jobretry_pipeline_job- Retry a failed or canceled pipeline jobcancel_pipeline_job- Cancel a running pipeline joblist_job_artifacts(read-only) - List artifact files in a job's archivedownload_job_artifacts(read-only) - Download job artifact archive (zip) and save to a local pathget_job_artifact_file(read-only) - Get content of a single file from a job's artifactslist_merge_requests(read-only) - List merge requests (without project_id: user's MRs; with project_id: project MRs)list_milestones(read-only) - List milestones with filtering optionsget_milestone(read-only) - Get details of a specific milestonecreate_milestone- Create a new milestoneedit_milestone- Edit an existing milestonedelete_milestone(destructive) - Delete a milestoneget_milestone_issue(read-only) - Get issues associated with a specific milestoneget_milestone_merge_requests(read-only) - Get merge requests associated with a specific milestonepromote_milestone- Promote a milestone to the next stageget_milestone_burndown_events(read-only) - Get burndown events for a specific milestonelist_group_milestones(read-only) - List group milestones with filtering optionsget_group_milestone(read-only) - Get details of a specific group milestonecreate_group_milestone- Create a new group milestoneedit_group_milestone- Edit an existing group milestonedelete_group_milestone(destructive) - Delete a group milestoneget_group_milestone_issue(read-only) - Get issues associated with a specific group milestoneget_group_milestone_merge_requests(read-only) - Get merge requests associated with a specific group milestoneget_group_milestone_burndown_events(read-only) - Get burndown events for a specific group milestoneget_users(read-only) - Get GitLab user details by usernamesget_user(read-only) - Get user details by IDwhoami(read-only) - Get current authenticated user detailslist_commits(read-only) - List repository commits with filtering optionsget_commit(read-only) - Get details of a specific commitget_commit_diff(read-only) - Get changes/diffs of a specific commitget_file_blame(read-only) - Get git blame for a file at a given ref. Each entry maps a contiguous range of source lines to the commit that last changed them (id, author, authored_date, message). Use range_start/range_end to limit blame to specific lines.list_commit_statuses(read-only) - List statuses for a commitcreate_commit_status- Create or update the status of a commitlist_group_iterations(read-only) - List group iterations with filtering optionsupload_markdown- Upload a file for use in markdown contentdownload_attachment(read-only) - Download an uploaded file from a project (images returned as base64; use local_path to save to disk)health_check(read-only) - Verify server status and authenticationlist_events(read-only) - List events for the authenticated user (before/after: YYYY-MM-DD)get_project_events(read-only) - List events for a project (before/after: YYYY-MM-DD)list_releases(read-only) - List all releases for a projectget_release(read-only) - Get a release by tag namecreate_release- Create a new releaseupdate_release- Update an existing releasedelete_release(destructive) - Delete a release (does not delete the tag)create_release_evidence- Create release evidence (Premium/Ultimate)download_release_asset(read-only) - Download a release asset file by direct asset pathlist_tags(read-only) - List repository tags for a projectget_tag(read-only) - Get a repository tag by namecreate_tag- Create a new repository tagdelete_tag(destructive) - Delete a repository tagget_tag_signature(read-only) - Get the X.509 signature of a signed tag (404 if unsigned)get_work_item(read-only) - Get a work item with full details including status, hierarchy, type, and widgetslist_work_items(read-only) - List work items with filters (type, state, search, assignees, labels)create_work_item- Create a work item (issue, task, incident, epic, etc.) with full field supportupdate_work_item- Update a work item (title, description, labels, assignees, state, parent, custom fields, etc.)convert_work_item_type- Convert a work item to a different typelist_work_item_statuses(read-only) - List available statuses for a work item type (Premium/Ultimate)list_custom_field_definitions(read-only) - List custom field definitions for a work item typemove_work_item- Move a work item to a different projectlist_work_item_notes(read-only) - List notes and discussions on a work itemcreate_work_item_note- Add a note to a work item (supports Markdown, internal notes, threads)list_work_item_emoji_reactions(read-only) - List all emoji reactions on a work itemlist_work_item_note_emoji_reactions(read-only) - List all emoji reactions on a work item note (comment, thread, or thread reply)create_work_item_emoji_reaction- Add an emoji reaction to a work item (e.g. thumbsup, rocket, eyes)delete_work_item_emoji_reaction(destructive) - Remove an emoji reaction from a work itemcreate_work_item_note_emoji_reaction- Add an emoji reaction to a work item note (comment, thread, or thread reply)delete_work_item_note_emoji_reaction(destructive) - Remove an emoji reaction from a work item note (comment, thread, or thread reply)get_timeline_events(read-only) - List timeline events for an incidentcreate_timeline_event- Create a timeline event on an incidentlist_webhooks(read-only) - List webhooks for a project or grouplist_webhook_events(read-only) - List recent webhook events (past 7 days)get_webhook_event(read-only) - Get full details of a specific webhook eventsearch_code(read-only) - Search for code across all projects (requires advanced search or Zoekt)search_project_code(read-only) - Search for code within a specific project (requires advanced search or Zoekt)search_group_code(read-only) - Search for code within a specific group (requires advanced search or Zoekt)list_project_variables(read-only) - List CI/CD variables for a projectget_project_variable(read-only) - Get a single CI/CD variable from a projectcreate_project_variable- Create a CI/CD variable for a projectupdate_project_variable- Update an existing CI/CD variable in a projectdelete_project_variable(destructive) - Delete a CI/CD variable from a projectlist_group_variables(read-only) - List CI/CD variables for a groupget_group_variable(read-only) - Get a single CI/CD variable from a groupcreate_group_variable- Create a CI/CD variable for a groupupdate_group_variable- Update an existing CI/CD variable in a groupdelete_group_variable(destructive) - Delete a CI/CD variable from a groupget_dependency_proxy_settings(read-only) - Get dependency proxy settings for a groupupdate_dependency_proxy_settings- Update dependency proxy settings for a group (enable/disable, credentials for authenticated Docker Hub pulls)list_dependency_proxy_blobs(read-only) - List cached dependency proxy blobs for a grouppurge_dependency_proxy_cache(destructive) - Schedule purge of all cached dependency proxy blobs for a grouplist_runners(read-only) - List GitLab CI/CD runners. Can be scoped to all runners, a specific project, or a specific group. Supports filtering by type, status, and tags.get_runner(read-only) - Get detailed information about a specific GitLab CI/CD runner including platform, architecture, tags, version, IP address, and last contact time.pause_runner- Pause (disable) a GitLab CI/CD runner so it will not pick up new jobs. The runner remains registered but inactive.resume_runner- Resume (re-enable) a previously paused GitLab CI/CD runner so it can start picking up jobs again.delete_runner(destructive) - Permanently delete a GitLab CI/CD runner. This action is irreversible — the runner must be re-registered to be used again.list_runner_jobs(read-only) - List jobs that have been executed by a specific GitLab CI/CD runner. Useful for auditing runner activity and debugging job failures.discover_tools(read-only) - Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, runners. Already-active categories are listed in the response.
How Custom Tools Are Built
This server is designed to be easily extensible. Every tool follows a strict 4-file pipeline:
1. schemas.ts Define input parameters using Zod (descriptions guide the LLM)
│
▼
2. tools/registry.ts Register tool in allTools, assign toolset, and categorize permissions
│
▼
3. index.ts Implement GitLab API fetch logic and route in handleToolCall()
│
▼
4. scripts/generate-tool-docs.ts Add toolset metadata for documentation generation & type checkingVerification Checklist
When implementing or modifying tools:
Run
npm run buildto verify TypeScript compilation.Run
npm run test:schemato validate input parsing.Run
npm run check:skill-syncto ensure agent skill definitions matchtools/registry.ts.
Development & Verification
# Install local dependencies
npm install
# Compile TypeScript
npm run build
# Run schema and validation tests
npm run test:schema
# Verify skill definitions stay synchronized with the registry
npm run check:skill-sync
# Verify runtime dependencies
npm run check:runtime-deps
# Run full test suite
npm testAuthor & Acknowledgments
Maintained by: aryannverse (@aryannverse)
Based on:
@zereight/mcp-gitlabLicense: MIT License
This server cannot be deployed
Maintenance
Related MCP Connectors
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Git-backed platform for skills, tools, and context for AI agents
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with GitLab repositories, manage merge requests, review code diffs, post comments, and handle issues directly through natural language.32 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with GitLab for managing projects, branches, issues, and merge requests. It provides tools for searching code and performing file operations like reading and writing directly within repositories.12 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact seamlessly with self-hosted GitLab instances, supporting repository operations, issue management, merge requests, CI/CD pipelines, and more.166 PyPI5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to automate the full GitLab DevOps lifecycle including repos, pipelines, CI generation, security scans, runners, tokens, and merge requests.MIT