Hooks into the GitLab REST API v4 and GraphQL to expose 1000+ operations as MCP tools, from merge request creation and pipeline inspection to wiki edits and container registry management. Ships as a single static binary with three transport modes: stdio for local Claude Desktop, streamable HTTP for remote setups, and a dynamic find/execute surface that keeps token overhead under 21k while maintaining full API reach. Built with security scanning on SonarCloud and supports self-hosted GitLab instances with TLS verification. Includes 11 sampling actions for LLM-assisted code review and pipeline failure diagnosis, plus 46 resources for read-only access to projects, issues, and commits. Reach for this when you need programmatic GitLab control from an AI assistant without clicking through the web UI.
Public tool metadata for what this MCP can expose to an agent.
GITLAB_ARCHIVE_PROJECTTool to archive a project. Use when you need to mark a project read-only after finishing active development. Call after confirming no further changes are required.1 paramsTool to archive a project. Use when you need to mark a project read-only after finishing active development. Call after confirming no further changes are required.
idintegerGITLAB_CREATE_GROUPTool to create a new group in GitLab. Use when you need to establish a new group for projects or collaboration.26 paramsTool to create a new group in GitLab. Use when you need to establish a new group for projects or collaboration.
namestringpathstringavatarstringparent_idintegervisibilitystringprivate · internal · publicdescriptionstringlfs_enabledbooleandefault_branchstringemails_enabledbooleanmembership_lockbooleanorganization_idintegerduo_availabilitystringdefault_on · default_off · never_onmentions_disabledbooleanwiki_access_levelstringdisabled · private · enabledauto_devops_enabledbooleanshare_with_group_lockbooleanproject_creation_levelstringadministrator · noone · maintainer · developerrequest_access_enabledbooleansubgroup_creation_levelstringowner · maintainertwo_factor_grace_periodintegerenabled_git_access_protocolstringssh · http · allexperiment_features_enabledbooleanshared_runners_minutes_limitintegerrequire_two_factor_authenticationbooleandefault_branch_protection_defaultsobjectextra_shared_runners_minutes_limitintegerGITLAB_CREATE_PROJECTTool to create a new project in GitLab. Implements POST /projects endpoint.12 paramsTool to create a new project in GitLab. Implements POST /projects endpoint.
namestringpathstringvisibilitystringprivate · internal · publicdescriptionstringnamespace_idintegerwiki_enabledbooleandefault_branchstringissues_enabledbooleansnippets_enabledbooleanbuild_git_strategystringmerge_requests_enabledbooleancontainer_registry_enabledbooleanGITLAB_CREATE_PROJECT_ISSUETool to create a new issue in a GitLab project. Use when you need to report a bug, request a feature, or track a task within a specific project.17 paramsTool to create a new issue in a GitLab project. Use when you need to report a bug, request a feature, or track a task within a specific project.
idstringiidintegertitlestringlabelsstringweightintegerepic_idintegerdue_datestringepic_iidintegercreated_atstringissue_typestringissue · incident · test_case · taskdefault: issueassignee_idintegerdescriptionstringassignee_idsarrayconfidentialbooleanmilestone_idintegerdiscussion_to_resolvestringmerge_request_to_resolve_discussions_ofintegerGITLAB_CREATE_REPOSITORY_BRANCHTool to create a new branch in a project. Use when you need to create a new branch from an existing branch or a specific commit in a GitLab project.3 paramsTool to create a new branch in a project. Use when you need to create a new branch from an existing branch or a specific commit in a GitLab project.
refstringproject_idintegerbranch_namestringGITLAB_DELETE_PROJECTTool to delete a GitLab project by its ID. Use when you need to remove a project, either by marking it for later deletion or deleting it immediately.3 paramsTool to delete a GitLab project by its ID. Use when you need to remove a project, either by marking it for later deletion or deleting it immediately.
idintegerfull_pathstringpermanently_removebooleanGITLAB_DOWNLOAD_PROJECT_AVATARTool to download a project’s avatar image. Use when you need the raw avatar bytes after confirming the project exists.1 paramsTool to download a project’s avatar image. Use when you need the raw avatar bytes after confirming the project exists.
idstringGITLAB_ERASE_JOBTool to erase the content of a specified job within a project. Use when you need to remove job artifacts and logs.2 paramsTool to erase the content of a specified job within a project. Use when you need to remove job artifacts and logs.
job_idintegerproject_idintegerGITLAB_GET_COMMIT_REFSTool to get all references (branches or tags) a commit is pushed to. Use when you need to find out which branches or tags a specific commit belongs to in a GitLab project.3 paramsTool to get all references (branches or tags) a commit is pushed to. Use when you need to find out which branches or tags a specific commit belongs to in a GitLab project.
shastringref_typestringbranch · tag · alldefault: allproject_idintegerGITLAB_GET_COMMIT_SEQUENCETool to get the sequence number of a commit in a project by following parent links from the given commit. Use when you need to determine the order of a commit in the project's history.3 paramsTool to get the sequence number of a commit in a project by following parent links from the given commit. Use when you need to determine the order of a commit in the project's history.
shastringproject_idintegerfirst_parentbooleanGITLAB_GET_GROUPTool to retrieve information about a specific group by its ID. Use when you need to get details of a GitLab group.3 paramsTool to retrieve information about a specific group by its ID. Use when you need to get details of a GitLab group.
idintegerwith_projectsbooleanwith_custom_attributesbooleanGITLAB_GET_GROUP_MEMBERTool to retrieve details for a specific group member. Use when you need to fetch membership information for a user in a group after you know both group ID and user ID.2 paramsTool to retrieve details for a specific group member. Use when you need to fetch membership information for a user in a group after you know both group ID and user ID.
idintegeruser_idintegerGITLAB_GET_GROUPSGet Groups13 paramsGet Groups
pageintegersortstringasc · descownedbooleansearchstringorder_bystringid · name · path · created_at · updated_atper_pageintegerstatisticsbooleanall_availablebooleanskip_groups[]arraywith_projectsbooleanwith_two_factorbooleanmin_access_levelintegerwith_custom_attributesbooleanGITLAB_GET_JOB_DETAILSTool to retrieve details of a single job by its ID within a specified project. Use this when you need to fetch specific information about a particular CI/CD job.2 paramsTool to retrieve details of a single job by its ID within a specified project. Use this when you need to fetch specific information about a particular CI/CD job.
job_idintegerproject_idintegerGITLAB_GET_MERGE_REQUEST_NOTESTool to fetch comments on a merge request. Use when you need to retrieve all notes for a specific merge request.4 paramsTool to fetch comments on a merge request. Use when you need to retrieve all notes for a specific merge request.
idintegerpageintegerper_pageintegermerge_request_iidintegerGITLAB_GET_PROJECTTool to get a single project by ID or URL-encoded path.1 paramsTool to get a single project by ID or URL-encoded path.
idintegerGITLAB_GET_PROJECT_LANGUAGESTool to list programming languages used in a project with percentages. Use when you need the project language breakdown.1 paramsTool to list programming languages used in a project with percentages. Use when you need the project language breakdown.
idintegerGITLAB_GET_PROJECT_MEMBERTool to retrieve details for a specific project member. Use after confirming project and user IDs to fetch membership information for a project member.2 paramsTool to retrieve details for a specific project member. Use after confirming project and user IDs to fetch membership information for a project member.
idintegeruser_idintegerGITLAB_GET_PROJECT_MEMBER_ALLTool to retrieve details for a specific project member (including inherited and invited members). Use when you need the effective membership info (including invitations and inheritance).2 paramsTool to retrieve details for a specific project member (including inherited and invited members). Use when you need the effective membership info (including invitations and inheritance).
idintegeruser_idintegerGITLAB_GET_PROJECT_MERGE_REQUEST_COMMITSTool to get commits of a merge request. Use when you need to retrieve all commits associated with a specific merge request.2 paramsTool to get commits of a merge request. Use when you need to retrieve all commits associated with a specific merge request.
idintegermerge_request_iidintegerGITLAB_GET_PROJECT_MERGE_REQUESTSTool to retrieve a list of merge requests for a specific project. Use when you need to get all merge requests associated with a project, with options to filter by state, labels, milestones, and other attributes.36 paramsTool to retrieve a list of merge requests for a specific project. Use when you need to get all merge requests associated with a project, with options to filter by state, labels, milestones, and other attributes.
idintegerwipstringpageintegersortstringviewstringscopestringstatestringiids[]arraylabelsstringsearchstringapprovedstringorder_bystringper_pageintegerauthor_idintegermilestonestringnot_filterobjectassignee_idintegerenvironmentstringreviewer_idintegerapprover_idsarraycreated_afterstringmerge_user_idintegersource_branchstringtarget_branchstringupdated_afterstringcreated_beforestringdeployed_afterstringupdated_beforestringapproved_by_idsarrayauthor_usernamestringdeployed_beforestringmy_reaction_emojistringreviewer_usernamestringmerge_user_usernamestringwith_labels_detailsbooleanwith_merge_status_recheckbooleanGITLAB_GET_PROJECTSTool to list all projects accessible to the authenticated user. Supports filtering.19 paramsTool to list all projects accessible to the authenticated user. Supports filtering.
pageintegersortstringasc · descownedbooleansearchstringsimplebooleanstarredbooleanarchivedbooleanid_afterintegerorder_bystringid · name · path · created_at · updated_at · star_countper_pageintegerid_beforeintegermembershipbooleanstatisticsbooleanvisibilitystringprivate · internal · publicmin_access_levelintegerwith_issues_enabledbooleanwith_custom_attributesbooleanwith_programming_languagestringwith_merge_requests_enabledbooleanGITLAB_GET_PROJECTS_ID_MERGE_REQUESTS_IID_DIFFSTool to list all diff versions of a merge request. Use when you need to inspect changes across different diff versions after creating or updating a merge request.2 paramsTool to list all diff versions of a merge request. Use when you need to inspect changes across different diff versions after creating or updating a merge request.
idintegermerge_request_iidintegerGITLAB_GET_REPOSITORY_BRANCHTool to retrieve information about a specific branch in a project. Use when you need to get details for a single branch.2 paramsTool to retrieve information about a specific branch in a project. Use when you need to get details for a single branch.
project_idintegerbranch_namestringGITLAB_GET_REPOSITORY_BRANCHESRetrieves a list of repository branches for a project. Use this when you need to get all branches or search for specific branches within a GitLab project.3 paramsRetrieves a list of repository branches for a project. Use this when you need to get all branches or search for specific branches within a GitLab project.
regexstringsearchstringproject_idintegerGITLAB_GET_SINGLE_COMMITTool to get a specific commit identified by the commit hash or name of a branch or tag. Use this when you need to retrieve detailed information about a single commit in a GitLab project repository.3 paramsTool to get a specific commit identified by the commit hash or name of a branch or tag. Use this when you need to retrieve detailed information about a single commit in a GitLab project repository.
idintegershastringstatsbooleanGITLAB_GET_SINGLE_PIPELINETool to retrieve details of a single pipeline by its ID within a specified project. Use when you need to get information about a specific CI/CD pipeline.2 paramsTool to retrieve details of a single pipeline by its ID within a specified project. Use when you need to get information about a specific CI/CD pipeline.
project_idintegerpipeline_idintegerGITLAB_GET_USERTool to retrieve information about a specific user by their ID. Use when you need to fetch details for a single GitLab user.1 paramsTool to retrieve information about a specific user by their ID. Use when you need to fetch details for a single GitLab user.
idintegerGITLAB_GET_USER_PREFERENCESTool to get the current user's preferences. Use when you need to retrieve the user's diff display and CI identity JWT settings after authentication.Tool to get the current user's preferences. Use when you need to retrieve the user's diff display and CI identity JWT settings after authentication.
No parameter schema in public metadata yet.
GITLAB_GET_USERSTool to retrieve a list of users from GitLab. Use this when you need to find user information, search for specific users, or filter users based on various criteria like activity status or creation date.24 paramsTool to retrieve a list of users from GitLab. Use this when you need to find user information, search for specific users, or filter users based on various criteria like activity status or creation date.
pageintegersortstringasc · descactivebooleanadminsbooleanhumansbooleansearchstringblockedbooleanauditorsbooleanexternalbooleanorder_bystringid · name · username · created_at · updated_atper_pageintegerproviderstringusernamestringskip_ldapbooleanextern_uidstringtwo_factorstringenabled · disabledcreated_afterstringcreated_beforestringexclude_activebooleanexclude_humansbooleanexclude_externalbooleanexclude_internalbooleanwithout_projectsbooleanwithout_project_botsbooleanGITLAB_GET_USERS_ID_STATUSTool to get a user's status by ID. Use when you need to retrieve a GitLab user's current status message, emoji, and availability after identifying their user ID.1 paramsTool to get a user's status by ID. Use when you need to retrieve a GitLab user's current status message, emoji, and availability after identifying their user ID.
user_idintegerGITLAB_GET_USER_STATUSTool to get the current user's status. Use when displaying or verifying the authenticated user's GitLab status after login.Tool to get the current user's status. Use when displaying or verifying the authenticated user's GitLab status after login.
No parameter schema in public metadata yet.
GITLAB_GET_USER_SUPPORT_PINTool to get details of the current user's Support PIN. Use when you need to retrieve the active support PIN and its expiration for the authenticated user.Tool to get details of the current user's Support PIN. Use when you need to retrieve the active support PIN and its expiration for the authenticated user.
No parameter schema in public metadata yet.
GITLAB_IMPORT_PROJECT_MEMBERSTool to import members from one project to another. Use when migrating members between projects.2 paramsTool to import members from one project to another. Use when migrating members between projects.
idstringproject_idstringGITLAB_LIST_ALL_GROUP_MEMBERSTool to list all members of a group including direct, inherited, and invited members. Use when you need a comprehensive membership list beyond direct members.3 paramsTool to list all members of a group including direct, inherited, and invited members. Use when you need a comprehensive membership list beyond direct members.
idintegerpageintegerper_pageintegerGITLAB_LIST_ALL_PROJECT_MEMBERSTool to list all members of a project (direct, inherited, invited). Use when you need the effective membership list including inherited and invited members.7 paramsTool to list all members of a project (direct, inherited, invited). Use when you need the effective membership list including inherited and invited members.
idintegerpageintegerquerystringstatestringawaiting · activeper_pageintegeruser_idsarrayshow_seat_infobooleanGITLAB_LIST_BILLABLE_GROUP_MEMBERSTool to list billable members of a top-level group (including its subgroups and projects). Use when generating billing reports; requires Owner role on the group.5 paramsTool to list billable members of a top-level group (including its subgroups and projects). Use when generating billing reports; requires Owner role on the group.
idintegerpageintegersortstringaccess_level_asc · access_level_desc · last_joined · name_asc · name_desc · oldest_joinedsearchstringper_pageintegerGITLAB_LIST_GROUP_MEMBERSTool to list direct members of a group. Use when you need to retrieve or filter a group's direct membership.10 paramsTool to list direct members of a group. Use when you need to retrieve or filter a group's direct membership.
idintegerpageintegersortstringaccess_level_asc · access_level_descquerystringactivebooleanper_pageintegerrelationsarrayskip_usersarraytwo_factorstringenabled · disabledinclude_inheritedbooleanGITLAB_LIST_PENDING_GROUP_MEMBERSTool to list pending members of a group and its subgroups and projects. Use when you need to review users awaiting approval or invited without an account. Call after confirming the top-level group ID.3 paramsTool to list pending members of a group and its subgroups and projects. Use when you need to review users awaiting approval or invited without an account. Call after confirming the top-level group ID.
idintegerpageintegerper_pageintegerGITLAB_LIST_PIPELINE_JOBSTool to retrieve a list of jobs for a specified pipeline within a project. Use this when you need to inspect the status or details of jobs associated with a particular CI/CD pipeline.4 paramsTool to retrieve a list of jobs for a specified pipeline within a project. Use this when you need to inspect the status or details of jobs associated with a particular CI/CD pipeline.
idintegerscopestringcanceled · canceling · created · failed · manual · pendingpipeline_idintegerinclude_retriedbooleanGITLAB_LIST_PROJECT_GROUPSTool to list ancestor groups of a project. Use when you need to retrieve all groups a project belongs to or is shared with.8 paramsTool to list ancestor groups of a project. Use when you need to retrieve all groups a project belongs to or is shared with.
idintegerpageintegersearchstringper_pageintegerskip_groupsarraywith_sharedbooleanshared_visible_onlybooleanshared_min_access_levelintegerGITLAB_LIST_PROJECT_INVITED_GROUPSTool to list groups invited to a project. Use when auditing which groups have access to a project.3 paramsTool to list groups invited to a project. Use when auditing which groups have access to a project.
idintegerpageintegerper_pageintegerGITLAB_LIST_PROJECT_PIPELINESTool to retrieve a list of pipelines for a specified project. Use when you need to get information about CI/CD pipelines, such as their status, source, or creation/update times.17 paramsTool to retrieve a list of pipelines for a specified project. Use when you need to get information about CI/CD pipelines, such as their status, source, or creation/update times.
idintegerrefstringshastringnamestringpageintegersortstringasc · descdefault: descscopestringrunning · pending · finished · branches · tagssourcestringstatusstringcreated · waiting_for_resource · preparing · pending · running · successorder_bystringid · status · ref · updated_at · user_iddefault: idper_pageintegerusernamestringyaml_errorsbooleancreated_afterstringupdated_afterstringcreated_beforestringupdated_beforestringGITLAB_LIST_PROJECT_SHAREABLE_GROUPSTool to list groups that can be shared with a project. Use before sharing a project to fetch eligible groups.5 paramsTool to list groups that can be shared with a project. Use before sharing a project to fetch eligible groups.
idintegerpageintegersearchstringper_pageintegerskip_groupsarrayGITLAB_LIST_PROJECT_TAGSTool to retrieve a list of repository tags for a specified project. Use when you need to get all tags associated with a project in GitLab.6 paramsTool to retrieve a list of repository tags for a specified project. Use when you need to get all tags associated with a project in GitLab.
idintegerpageintegersortstringsearchstringorder_bystringper_pageintegerGITLAB_LIST_PROJECT_TRANSFER_LOCATIONSTool to list namespaces available for project transfer. Use when you need to determine which groups a project can be transferred into.2 paramsTool to list namespaces available for project transfer. Use when you need to determine which groups a project can be transferred into.
idintegersearchstringGITLAB_LIST_PROJECT_USERSTool to list users of a project. Use after you have a project ID and want to retrieve its users.3 paramsTool to list users of a project. Use after you have a project ID and want to retrieve its users.
idstringsearchstringskip_usersarrayGITLAB_LIST_REPOSITORY_COMMITSTool to get a list of repository commits in a project. Use when you need to retrieve commit history for a specific project, branch, or time range.11 paramsTool to get a list of repository commits in a project. Use when you need to retrieve commit history for a specific project, branch, or time range.
allbooleanpathstringorderstringdefault · toposincestringuntilstringauthorstringref_namestringtrailersbooleanproject_idintegerwith_statsbooleanfirst_parentbooleanGITLAB_LIST_USER_PROJECTSTool to list projects owned by a specific user. Use after obtaining target user identity to fetch owned projects.22 paramsTool to list projects owned by a specific user. Use after obtaining target user identity to fetch owned projects.
idintegerpageintegersortstringasc · descownedbooleansearchstringsimplebooleanstarredbooleanarchivedbooleanid_afterintegerorder_bystringid · name · path · created_at · updated_at · star_countper_pageintegerid_beforeintegermembershipbooleanstatisticsbooleanvisibilitystringprivate · internal · publicupdated_afterstringupdated_beforestringmin_access_levelintegerwith_issues_enabledbooleanwith_custom_attributesbooleanwith_programming_languagestringwith_merge_requests_enabledbooleanGITLAB_POST_USER_SUPPORT_PINTool to create a support PIN for your authenticated user. Use when GitLab Support requests a PIN to verify your identity.Tool to create a support PIN for your authenticated user. Use when GitLab Support requests a PIN to verify your identity.
No parameter schema in public metadata yet.
GITLAB_PUT_USER_PREFERENCESTool to update the current user's preferences. Use when adjusting default diff viewing and CI identity settings.3 paramsTool to update the current user's preferences. Use when adjusting default diff viewing and CI identity settings.
view_diffs_file_by_filebooleanshow_whitespace_in_diffsbooleanpass_user_identities_to_ci_jwtbooleanGITLAB_SET_USER_STATUSTool to set the current user's status. Use when you need to update availability or convey current mood on GitLab.3 paramsTool to set the current user's status. Use when you need to update availability or convey current mood on GitLab.
emojistringmessagestringclear_status_afterstring30_minutes · 3_hours · 8_hours · 1_day · 3_days · 7_daysGITLAB_SHARE_PROJECT_WITH_GROUPTool to share a project with a group. Use when you need to grant a group specific access level to a project.4 paramsTool to share a project with a group. Use when you need to grant a group specific access level to a project.
idintegergroup_idintegerexpires_atstringgroup_accessintegerGITLAB_START_PROJECT_HOUSEKEEPINGTool to start the housekeeping task for a project. Use when you need to trigger manual maintenance or pruning on a repository.2 paramsTool to start the housekeeping task for a project. Use when you need to trigger manual maintenance or pruning on a repository.
idintegertaskstringprune · eager
A Model Context Protocol (MCP) server that exposes the entire GitLab API as MCP tools, resources, and prompts for AI assistants. Single static binary — zero dependencies.
Security first: Continuously monitored on SonarCloud with quality gates, coverage, and security scanning. Supports read-only mode, safe mode (dry-run preview), and self-hosted GitLab with TLS verification.
Repository mirror: GitHub is the canonical repository. A read-only mirror of the code and releases is available on GitLab.com for discoverability; please open code contributions on GitHub.
Measured with go run ./cmd/gen_readme/ against the current base catalog. Totals estimate startup context visible to an MCP client: visible tool schemas plus shared resources and prompts, using the same byte/4 token heuristic as cmd/audit_tokens.
Default configuration: with TOOL_SURFACE unset or TOOL_SURFACE=dynamic, CAPABILITY_SURFACE=full, META_TOOLS unset, META_PARAM_SCHEMA=opaque, and GITLAB_ENTERPRISE unset or false, the server uses the dynamic find/execute surface. Use TOOL_SURFACE=meta only when you explicitly want domain meta-tools; use TOOL_SURFACE=individual only when your client can handle the full tool catalog.
Configuration (TOOL_SURFACE / CAPABILITY_SURFACE) | Visible tools | Reachable actions | META_PARAM_SCHEMA | Tool schema tokens | Shared tokens | Total tokens |
|---|---|---|---|---|---|---|
dynamic / full (default) | 2 | 870 | n/a | 2,204 | 18,100 | 20,304 |
dynamic / minimal | 2 | 870 | n/a | 2,204 | 555 | 2,759 |
meta / full | 33 | 870 | opaque | 86,389 | 18,100 | 104,489 |
meta / minimal | 33 | 870 | opaque | 86,389 | 555 | 86,944 |
individual / full | 866 | 866 | n/a | 478,914 | 18,100 | 497,014 |
Rows use the base Community Edition catalog (GITLAB_ENTERPRISE=false). META_PARAM_SCHEMA=opaque affects only visible meta-tool input schemas; dynamic mode gets exact action schemas from gitlab_find_action, and every surface advertises gitlab://tools plus gitlab://tools/{id} for on-demand action browsing and input schemas. Individual mode already exposes one schema per tool.
internal/tools: projects, branches, tags, releases, merge requests, issues, pipelines, jobs, groups, users, wikis, environments, deployments, packages, container registry, runners, feature flags, CI/CD variables, security attributes, security categories, templates, admin settings, access tokens, deploy keys, Orbit, and moregitlab_find_action and gitlab_execute_action while keeping the same canonical GitLab action catalog. Optional domain meta-tools remain available with TOOL_SURFACE=meta: 32 base, 48 on self-managed Enterprise/Premium, or 49 on GitLab.com Enterprise/Premiumgitlab://tools manifest and gitlab://tools/{id} detail template, and 5 workflow best-practice guidesSizes: ["any"]) on all tools, resources, and prompts for visual identification in MCP clientsOnce connected, just talk to your AI assistant in natural language:
"List my GitLab projects" "Show me open merge requests in my-app" "Create a merge request from feature-login to main" "Review merge request !15 — is it safe to merge?" "List open issues assigned to me" "What's the pipeline status for project 42?" "Why did the last pipeline fail?" "Generate release notes from v1.0 to v2.0"
The server handles the translation from natural language to GitLab API calls. You do not need to know project IDs, API endpoints, or JSON syntax — the AI assistant figures that out for you. See Usage Examples for more scenarios.
Download the latest binary for your platform from GitHub Releases and make it executable:
chmod +x gitlab-mcp-server-* # Linux/macOS only
Or pull the published container image:
docker pull ghcr.io/jmrplens/gitlab-mcp-server:latest
Recommended: Run the built-in setup wizard — it configures your GitLab connection and MCP client in one step:
./gitlab-mcp-server --setup
Tip: The wizard supports three user interfaces and selects the best one automatically (Web UI → TUI → CLI). Force a specific mode with
--setup-mode web|tui|cli. The Web UI ships with inline help tooltips on every advanced option. On Windows, double-click the.exeto launch the wizard automatically.
The wizard configures stdio MCP clients (VS Code, Claude Desktop, Cursor, etc.). It is not used for the long-running HTTP server mode — see HTTP Server Mode for that. If ~/.gitlab-mcp-server.env already exists, the wizard pre-loads its values so you can re-run it to change just one or two fields without re-typing the rest. Leave the token field blank to keep the stored token.
Manual setup only needs a GitLab Personal Access Token with api scope:
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
GITLAB_URL defaults to https://gitlab.com; add it only when you connect to a self-managed GitLab instance.
GITLAB_URL=https://gitlab.example.com
Most desktop clients use stdio: the client starts one local MCP server process and talks to it over stdin/stdout. Choose one of these runtime patterns.
VS Code and Cursor-style MCP configuration:
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"gitlab": {
"type": "stdio",
"command": "/path/to/gitlab-mcp-server",
"env": {
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
Claude Desktop uses the same server command under mcpServers:
{
"mcpServers": {
"gitlab": {
"command": "/path/to/gitlab-mcp-server",
"env": {
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
For client-specific paths, secure token prompts, HTTP OAuth, and extra IDEs, see IDE Configuration.
If an IDE starts Docker as the MCP server process, keep docker run -i and pass --http=false after the image name. Do not publish port 8080 in this mode.
{
"servers": {
"gitlab": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITLAB_TOKEN",
"-e",
"GITLAB_URL",
"-e",
"GITLAB_SKIP_TLS_VERIFY",
"ghcr.io/jmrplens/gitlab-mcp-server:latest",
"--http=false"
],
"env": {
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx",
"GITLAB_URL": "https://gitlab.com",
"GITLAB_SKIP_TLS_VERIFY": "false"
}
}
}
}
Use HTTP mode for shared, remote, or multi-user deployments. The Docker image
starts in HTTP mode by default, but the flags are shown explicitly here for
clarity. These examples publish the container port on host loopback only;
--http-addr=0.0.0.0:8080 binds inside the container.
# Fixed GitLab instance for all clients
docker run -d --name gitlab-mcp-server -p 127.0.0.1:8080:8080 \
ghcr.io/jmrplens/gitlab-mcp-server:latest \
--http \
--http-addr=0.0.0.0:8080 \
--gitlab-url=https://gitlab.com
# Multi-instance mode: clients send GITLAB-URL per request
docker run -d --name gitlab-mcp-server -p 127.0.0.1:8080:8080 \
ghcr.io/jmrplens/gitlab-mcp-server:latest \
--http \
--http-addr=0.0.0.0:8080
HTTP clients authenticate each request with PRIVATE-TOKEN or Authorization: Bearer:
{
"servers": {
"gitlab": {
"type": "http",
"url": "http://localhost:8080/mcp",
"headers": {
"PRIVATE-TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
In multi-instance mode, clients must also send GITLAB-URL. See HTTP Server Mode for OAuth, reverse proxy, rate limit, and server-pool details.
Open your AI client and try:
"List my GitLab projects"
See the Getting Started guide for detailed setup instructions.
Three registration modes, controlled by TOOL_SURFACE:
| Mode | Tools | Description |
|---|---|---|
| Dynamic Toolset (default) | 2 visible tools | Low-token find/execute surface over the canonical action catalog. |
| Meta-Tools | 32 base GitLab/interactive tools; gitlab_server is a separate maintenance helper | Domain-grouped dispatchers with action parameter. Enable with TOOL_SURFACE=meta; see the full 32/48/49 catalog in Meta-Tools Reference. |
| Individual | 866 CE / 1028 self-managed enterprise / 1034 GitLab.com Enterprise | Every GitLab operation as a separate MCP tool. |
For dynamic experiments where resources and prompts dominate initial context, set CAPABILITY_SURFACE=minimal (stdio) or --capability-surface=minimal (HTTP). Minimal keeps the surface-aware gitlab://tools manifest so dynamic, meta, and individual deployments can still read accepted call shapes. The default remains full.
Dynamic mode is now the default low-token find/execute surface; see Dynamic Toolset for the field-aware ranking model, fuzzy fallback, response shapes, workflow diagrams, and migration guidance. Set TOOL_SURFACE=meta to use the consolidated domain meta-tool catalog.
The detailed meta-tool catalog now lives in Meta-Tools Reference, including action counts, Enterprise/Premium markers, and examples.
| MCP Capability | Support |
|---|---|
| Tools | Up to 1034 individual / 32–49 meta |
| Resources | 45 (static + templates) |
| Prompts | 37 templates |
| Completions | Project, user, group, branch, tag |
| Logging | Structured (text/JSON) to stderr |
| Progress | Tool execution progress reporting |
| Elicitation | 4 interactive creation wizards |
Tested with: VS Code + GitHub Copilot, Claude Desktop, Claude Code, Cursor, Windsurf, JetBrains IDEs, Zed, Kiro, Cline, Roo Code.
See the full Compatibility Matrix for detailed client support.
The project includes an automated evaluator for model-facing MCP quality. It can run schema-only checks against the tool catalog or execute validated model tool calls through MCP against Docker GitLab CE or licensed Enterprise instances populated with fixtures. The evaluator measures whether each model chooses the correct meta-tool and action, sends valid parameters, recovers from actionable GitLab errors, and respects destructive-action safeguards.
Current published result: Docker CE-on-Enterprise meta 20260527.
| Provider | Model | Compatibility | Tool accuracy | Recovery | Docker live status |
|---|---|---|---|---|---|
| Anthropic | claude-haiku-4-5-20251001 | OK | 100.0% | No repairs | 100.0% final across 274 ops |
gemini-flash-latest | Review | 74.3% | 100.0% (36/36) | 100.0% final across 274 ops | |
| OpenAI | gpt-5.4-nano | Review | 99.3% | 100.0% (6/6) | 100.0% final across 274 ops |
| Qwen | qwen3.6-flash | OK | 100.0% | 100.0% (5/5) | 100.0% final across 274 ops |
The published model-evaluation set covers 560 task attempts and 1096 expected MCP operations. Across the selected reports, models emitted 1109 tool calls over 1145 model requests, with 100.0% aggregate final success. See AI Model Evaluation Results for the detailed current matrix.
Current published result: Docker CE dynamic 20260606.
| Provider | Model | Compatibility | Tool accuracy | Recovery | Docker live status |
|---|---|---|---|---|---|
| Anthropic | claude-haiku-4-5-20251001 | OK | 100.0% | 100.0% (6/6) | 100.0% final across 573 ops |
gemini-flash-latest | Review | 100.0% | 80.0% (4/5) | 99.3% final across 573 ops | |
| OpenAI | gpt-5.4-nano | Review | 99.4% | 95.8% (23/24) | 97.4% final across 573 ops |
| Qwen | qwen3.6-flash | Review | 100.0% | 90.9% (10/11) | 99.3% final across 573 ops |
The published model-evaluation set covers 620 task attempts and 2292 expected MCP operations. Across the selected reports, models emitted 2367 tool calls over 2369 model requests, with 99.0% aggregate final success. See AI Model Evaluation Results for the detailed current matrix.
Current published result: Docker Enterprise meta 20260527.
| Provider | Model | Compatibility | Tool accuracy | Recovery | Docker live status |
|---|---|---|---|---|---|
| Anthropic | claude-haiku-4-5-20251001 | OK | 100.0% | 100.0% (1/1) | 100.0% final across 84 ops |
gemini-flash-latest | Review | 78.2% | 100.0% (7/7) | 100.0% final across 84 ops | |
| OpenAI | gpt-5.4-nano | Review | 100.0% | 100.0% (4/4) | 100.0% final across 84 ops |
| Qwen | qwen3.6-flash | OK | 100.0% | 100.0% (1/1) | 100.0% final across 84 ops |
The published model-evaluation set covers 92 task attempts and 336 expected MCP operations. Across the selected reports, models emitted 345 tool calls over 350 model requests, with 100.0% aggregate final success. See AI Model Evaluation Results for the detailed current matrix.
Current published result: Docker Enterprise dynamic 20260605 (Enterprise).
| Provider | Model | Compatibility | Tool accuracy | Recovery | Docker live status |
|---|---|---|---|---|---|
| Anthropic | claude-haiku-4-5-20251001 | OK | 100.0% | No repairs | 100.0% final across 202 ops |
gemini-flash-latest | OK | 100.0% | No repairs | 100.0% final across 202 ops | |
| OpenAI | gpt-5.4-nano | OK | 100.0% | 100.0% (3/3) | 100.0% final across 202 ops |
| Qwen | qwen3.6-flash | OK | 100.0% | No repairs | 100.0% final across 202 ops |
The published model-evaluation set covers 124 task attempts and 808 expected MCP operations. Across the selected reports, models emitted 817 tool calls over 817 model requests, with 100.0% aggregate final success. See AI Model Evaluation Results for the detailed current matrix.
Full documentation is available at jmrplens.github.io/gitlab-mcp-server. Use this map when you need the source-of-truth reference for a specific area:
| Document | Description |
|---|---|
| Getting Started | Download, setup wizard, per-client configuration |
| IDE Configuration | Per-client stdio, HTTP legacy, and HTTP OAuth examples |
| Configuration | Environment variables, transport modes, TLS |
| Environment Variables | Exhaustive environment variable table with defaults and examples |
| CLI Reference | All command-line flags, exit codes, and runtime examples |
| HTTP Server Mode | Shared HTTP deployments, authentication, server pool isolation |
| Tools Reference | All individual tools with input/output schemas, including GitLab.com-only Orbit |
| Meta-Tools | 32/48/49 domain meta-tools with action dispatching |
| Dynamic Toolset | 2-tool low-token mode with canonical action catalog, safety model, and examples |
| Resources | All 45 resources with URI templates |
| Prompts | All 37 prompts with arguments and output format |
| Auto-Update | Self-update mechanism, modes, and release format |
| Testing | Unit, E2E, schema model evaluation, Docker model evaluation, and curated model results |
| Security | Security model, token scopes, input validation |
| Architecture | System architecture, component design, data flow |
| Development Guide | Building, testing, CI/CD, contributing |
| Troubleshooting | Common startup, token, TLS, transport, and tool-discovery issues |
| Component | Technology |
|---|---|
| Language | Go 1.26+ |
| MCP SDK | github.com/modelcontextprotocol/go-sdk v1.6.1 |
| GitLab Client | gitlab.com/gitlab-org/api/client-go/v2 v2.42.0 |
| Transport | stdio (default), HTTP (Streamable HTTP) |
git clone https://github.com/jmrplens/gitlab-mcp-server.git
cd gitlab-mcp-server
make build
See the Development Guide for cross-compilation and contributing guidelines.
The published image is ghcr.io/jmrplens/gitlab-mcp-server:latest. Runtime examples live in Quick Start next to MCP client configuration, and Docker Compose/source-build details live in the Development Guide.
Yes. Set GITLAB_URL to your instance URL. When GITLAB_URL is omitted, stdio mode uses https://gitlab.com. Self-signed TLS certificates are supported via GITLAB_SKIP_TLS_VERIFY=true.
The server runs locally on your machine (stdio mode) or on your own infrastructure (HTTP mode). No data is sent to third parties — all API calls go directly to your GitLab instance. See SECURITY.md for details.
Yes. Set GITLAB_READ_ONLY=true to disable all mutating tools (create, update, delete). Only read operations will be available.
Alternatively, set GITLAB_SAFE_MODE=true for a dry-run mode: mutating tools remain visible but return a structured JSON preview instead of executing. Useful for auditing, training, or reviewing what an AI assistant would do.
Both Community Edition (CE) and Enterprise Edition (EE). Set GITLAB_ENTERPRISE=true in stdio mode to enable additional tools for Premium/Ultimate features (DORA metrics, vulnerabilities, compliance, etc.). In HTTP mode, --enterprise can force the Enterprise/Premium catalog, otherwise CE/EE is detected per token+URL pool entry when GitLab reports edition.
The server includes retry logic with backoff for GitLab API rate limits. Errors are classified as transient (retryable) or permanent, with actionable hints in error messages.
Any MCP-compatible client: VS Code + GitHub Copilot, Claude Desktop, Cursor, Claude Code, Windsurf, JetBrains IDEs, Zed, Kiro, and others. The built-in setup wizard can auto-configure most clients.
See CONTRIBUTING.md for development guidelines, branch naming, commit conventions, and pull request process.
See SECURITY.md for the security policy and vulnerability reporting.
See CODE_OF_CONDUCT.md. This project follows the Contributor Covenant v2.1.
Numbers nobody asked for, but here they are anyway.
| Category | Files | Lines |
|---|---|---|
Source (.go, non-test) | 892 | 155,328 |
Unit tests (_test.go) | 479 | 264,631 |
| End-to-end tests | 141 | 34,966 |
| Total | 1,512 | 454,925 |
| Category | Count |
|---|---|
| Source functions | 6,421 |
| — exported (public) | 2,411 |
| — unexported (private) | 4,010 |
Unit test functions (TestXxx) | 10,426 |
Subtests (t.Run(...)) | 2,577 |
| End-to-end test functions | 286 |
| Observation | Value |
|---|---|
| Test lines vs source lines | 1.70× more tests than code |
| Average source file length | ~174 lines |
| Average test file length | ~552 lines |
| Comment lines in source | 14,560 (~9.4% of source) |
| Test functions per source function | 1.6× |
| Pattern | Count |
|---|---|
if err != nil checks | 6,027 |
defer statements | 690 |
struct types defined | 2,302 |
//nolint suppressions | 91 |
TODO / FIXME / HACK comments | 2 |
| Metric | Value |
|---|---|
| Go packages | 216 |
Direct dependencies (go.mod) | 11 |
| Indirect dependencies | 49 |
| Git commits | 211 |
| Unique contributors | 3 |
| Record | File |
|---|---|
| Longest source file | internal/tools/dynamic/register.go — 3,629 lines |
| Longest test file | internal/tools/projects/projects_test.go — 7,155 lines |
| Fact | Value |
|---|---|
| Source code printed at 55 lines/page | ~2,824 pages of A4 |
Source lines mentioning "gitlab" | 9,869 (impossible to avoid) |
| Longest function name in source | assertDynamicCompatibilityPolicyOwnedByActionCompat (51 chars) |
| Longest test function name | TestRequiredMissingAndUnknownParamNames_SchemaValidation_ReturnsSortedMissingAndUnknown (87 chars) |
GITLAB_URLdefault: https://gitlab.comGitLab instance URL (default: https://gitlab.com; set for self-managed instances)
GITLAB_TOKEN*secretGitLab Personal Access Token (glpat-...)
GITLAB_SKIP_TLS_VERIFYdefault: falseSkip TLS certificate verification for self-signed certs (default: false)
TOOL_SURFACEdefault: dynamicTool catalog selector: dynamic, meta, or individual (default: dynamic)
CAPABILITY_SURFACEdefault: fullResource and prompt catalog selector: full or minimal (default: full)
META_PARAM_SCHEMAdefault: opaqueMeta-tool input schema detail: opaque, compact, or full (default: opaque)
GITLAB_ENTERPRISEdefault: falseEnable GitLab Premium/Ultimate tools; GitLab.com Enterprise/Premium also exposes Orbit Knowledge Graph tools (default: false)
GITLAB_READ_ONLYdefault: falseRead-only mode: disables all mutating tools (default: false)
GITLAB_SAFE_MODEdefault: falseSafe mode: intercepts mutating tools and returns a JSON preview instead of executing (default: false)
EMBEDDED_RESOURCESdefault: trueAppend EmbeddedResource content blocks (clickable links to MCP resources) to get_* tool results (default: true)
EXCLUDE_TOOLSComma-separated tool names to exclude from registration (e.g. gitlab_admin,gitlab_runner)
GITLAB_IGNORE_SCOPESdefault: falseSkip Personal Access Token scope detection and register all tools regardless of token permissions (default: false)
UPLOAD_MAX_FILE_SIZEdefault: 2147483648Maximum attachment upload size in bytes or human-readable (e.g. 2GB). Default: 2147483648 (2 GB)
GITLAB_MCP_ALLOWED_IMPORT_DIRSExtra OS path-list-separated directories allowed for local GitLab import archives
RATE_LIMIT_RPSdefault: 0Per-server tools/call rate limit in requests per second; 0 disables it (default: 0)
RATE_LIMIT_BURSTdefault: 40Token-bucket burst size when RATE_LIMIT_RPS is greater than 0 (default: 40)
LOG_LEVELdefault: infoLogging verbosity (default: info)
AUTO_UPDATEdefault: trueAuto-update mode: true (auto-apply), check (log-only), false (disabled). Default: true
AUTO_UPDATE_REPOdefault: jmrplens/gitlab-mcp-serverGitHub repository slug for release assets (default: jmrplens/gitlab-mcp-server)
AUTO_UPDATE_INTERVALdefault: 1hPeriodic update check interval in HTTP mode (default: 1h)
AUTO_UPDATE_TIMEOUTdefault: 60sStartup/background update timeout, range 5s-10m (default: 60s)
ray0907/git-mcp-server
cyanheads/git-mcp-server
io.github.b1ff/atlassian-dc-mcp-bitbucket
io.github.b1ff/atlassian-dc-mcp-jira
com.mcparmory/atlassian-jira
sirlordt/vscode-terminal-mcp