NewAgent Observability — find failures before customers do.
Back to directory
GitLab logo

GitLab MCP server: 56 tools, no read-only mode

What the native endpoint exposes, why one tool deletes a pipeline when you leave a parameter out, and why teams in GitLab's own feedback issue run a community server instead.

Connector
Official, and built into GitLab itself
Coverage
Merge requests, issues, work items, pipelines, jobs, search
Tools
56 documented, 47 listed, 15 write
Biggest risk for an agent
No read-only mode, and one tool deletes by omission

Checked 25 August 2026 · from docs.gitlab.com, the live endpoint and feedback issue 561564

One of 91 guides to monitoring and developer tools. Each covers what an AI coding agent can get out of the tool through MCP, the protocol that lets the agent query the tool directly.

Summary

The GitLab MCP server is not a package. It is the GitLab API, reachable at https://<instance>/api/v4/mcp once three settings are on. There is nothing to install and nothing to keep updated separately.

The tool reference documents 56 tools as of 6 October 2026. Forty-seven appear in tools/list. Nine superseded tools are unlisted and stay callable while callers migrate.

Fifteen listed tools write. They commit files, open and merge merge requests, and post review comments. Others fork projects, run and delete pipelines, update work items and vulnerabilities, and start GitLab Duo sessions.

There is no read-only mode. GitLab 19.5 adds headers that narrow the list by toolset or by tool name, and naming only read tools is the closest route. GitLab's own docs place the responsibility on you: You're responsible for guarding against prompt injection when you use these tools.

The status is beta, and the tool list has moved during it. gitlab_search became search in 18.8, get_job_log became get_job in 19.3, and semantic_code_search became semantic_search in 19.4. manage_pipeline lost four of its actions to two new tools in 19.3.

What is the GitLab MCP server?

GitLab holds the repository, the merge requests, the issues, the work items and the CI pipelines. An MCP server over it lets an agent read a diff, look at why a job failed and comment on a review without a browser.

GitLab built the endpoint into the product rather than shipping a package. It arrived as an experiment in 18.3 behind two feature flags. Those flags were removed in 18.6, when it became beta. It gained the 2025-03-26 and 2025-06-18 protocol specifications in 18.7. It moved from Premium to Free in 19.2.

Authentication is OAuth 2.0 Dynamic Client Registration only. The client registers itself, a browser opens, you approve, and a token comes back. Personal access tokens are not accepted, which is the single most requested change in the feedback issue.

GitLab covers code review and CI outright, and reaches agent observability in a way almost no other connector does. It carries no production telemetry and no spend data.

Part of the workWhat GitLab has hereCan an agent reach it
Code, tests & reviewMerge requests, diffs, commits, notes, reviews and code searchYes. Full. Diffs, discussion threads, diff-line comments and a submit-review call are all reachable
CI & releasePipelines, jobs and job logsYes. Full, including running, retrying and cancelling. Job logs come back in windows of bytes rather than being cut off, and the response says where the next window starts
Production observabilityNoneNo metrics, logs or traces from running services
Agent observability & evalsDuo Agent Platform sessionsPartial, and unusual. Five Duo Agent Platform tools list flows, start sessions, read session status and answer approval prompts. They cover GitLab's own agent runs only. Agents you build leave no record here
AI cost managementNoneNo spend data of any kind

For an agent, that means GitLab answers the whole path from a diff to the pipeline that tested it, and nothing about what happened after deploy. The Duo tools are a genuine oddity: a connector that can start, watch and steer agent runs, provided the agent is GitLab's own.

What can an AI agent do with GitLab?

56 documented. 47 listed in tools/list, 32 that read and 15 that write. 9 unlisted and still callable.

Merge requests2
get_merge_requestlist_merge_requests
Merge request writes3
save_merge_requestsave_merge_request_reviewaccept_merge_request
Comment writes1
save_note
Work items4
get_work_itemlist_work_itemsget_saved_view_work_itemsget_work_item_types
Work item writes2
save_work_itemlink_work_items
CI and pipelines4
get_pipelinelist_pipelinesget_jobget_artifact_file
CI writes2
save_pipelinemanage_pipeline
Repository7
get_repository_filelist_repository_treeget_commitlist_commitslist_brancheslist_releaseslist_tags
Repository writes3
add_commitadd_branchfork_repository
Projects, groups and people5
get_projectlist_projectslist_groupslist_project_membersget_user
Search and wikis4
searchsearch_labelssemantic_searchlist_wiki_pages
Security2
list_vulnerabilitiesget_vulnerability
Security writes2
save_vulnerabilityattach_scan_profile
Duo Agent Platform3
list_duo_agents_and_flowslist_duo_sessionsget_duo_session
Duo Agent Platform writes2
start_duo_sessionsend_duo_session_input
Platform1
get_mcp_server_version
Unlisted, still callable9
create_issueget_issueget_workitem_notesget_merge_request_commitsget_merge_request_diffsget_merge_request_pipelinesget_merge_request_conflictsget_merge_request_notesget_pipeline_jobs

Counted from the documented tool reference on 6 October 2026, which includes tools marked for GitLab 19.5. semantic_search needs a GitLab Duo Core, Pro or Enterprise add-on. The three vulnerability tools need Ultimate. semantic_search also answers to semantic_code_search, add_branch to create_branch, and get_job to get_job_log. Among the unlisted tools, create_issue writes.

What the tool definitions cost in context

A client that loads every tool definition at the start of a session spends this much context before the first question. Claude Code defers definitions by default through tool search, and loads a tool's definition when the agent needs it. The method below gives the version and date measured.

A context window is the amount of text a model can hold at once. On 25 August 2026 the 34 documented tools cost 2,750 to 3,301 tokens on Claude. The reference now lists 47 tools, so the current figure is higher.

From GitLab 19.5, toolset and tool headers can shrink the list. One choice of headers sets both the context cost and the write exposure.

Tool setToolsTokens (GPT-5.6, GPT-5.5)Tokens (GPT-4, GPT-3.5)Tokens (Claude Haiku 4.5 to Opus 5)Share of a 200,000-token window
Every tool documented, 25 August 2026341,255 to 1,5691,254 to 1,5682,750 to 3,3010.6% to 1.7%

Encodings: GPT-5.6, GPT-5.5 o200k_base; GPT-4, GPT-3.5 cl100k_base; Claude Haiku 4.5 to Opus 5 count_tokens. Counted on 25 August 2026 from the 34 tool entries the vendor's documentation listed then. That documentation is the only public inventory.

The server could not be run for a live tools/list. So no input schemas are available, and these figures cover each tool's name and description only. They are a floor, not the figure.

The Claude columns are measured through the API's count_tokens endpoint with an empty schema per tool. So they cover the same content as the GPT columns. The range there is two tokenizer generations. Haiku 4.5 and Opus 4.6 are at the low end. Opus 5 and Sonnet 5 are at the high end. The gap between them is about a fifth.

Can GitLab watch your own AI agents?

Five Duo Agent Platform tools reach agent activity, and they reach GitLab’s agents rather than yours. Read from GitLab’s MCP documentation on 6 October 2026.

SignalCoveredNotes
Trace and session trackingPartiallist_duo_sessions returns status, goal preview and flow definition for Duo Agent Platform runs. get_duo_session adds the latest answer and what the session created. list_duo_agents_and_flows, start_duo_session and send_duo_session_input find, start and steer runs. Agents you build yourself leave no record here
Eval scores on recorded trafficNoThe documented 56 include no evaluation tool
Prompt version trackingNoDuo’s prompts are GitLab’s own and are not exposed for reading
Offline experimentsNoThe documented 56 include no dataset or experiment tool
Token and cost trackingNoNo tool returns a token count or a cost figure for a Duo session

GitLab MCP server limits: where answers come back incomplete

One tool deletes a pipeline when a parameter is left out. Read that limit before the rest.

One tool deletes a pipeline when you leave a parameter out.

manage_pipeline takes id, pipeline_id and an optional name. The documentation states that if only pipeline_id is set, the call deletes the pipeline and all related data.

The destructive path is therefore the shorter call. A model that omits name, whether by choice or by dropping it, deletes rather than renames.

Guard: Do not expose manage_pipeline to an unattended agent. The disclosure block above names this case explicitly for that reason.

There is no read-only mode, and engineers keep asking for one.

All 47 listed tools arrive together unless a GitLab 19.5 header narrows them. Fifteen of them write, and their names sit beside the read names in the same list the model chooses from.

In the feedback issue on 21 June 2026, an engineer asked GitLab to expose read-only against mutating, required token scopes and whether an action is safe to retry, as tool-level metadata rather than documentation.

Guard: Approve writes at the client. On GitLab 19.5, name only read tools in the X-Gitlab-Enabled-Mcp-Server-Tools header. Several teams instead run a community server that offers separate read-only endpoints.

The agent says: “Let me look at the work items.” It got there, after several wrong tools.

Every listed description arrives on every turn, and several read paths overlap. On 15 June 2026 an engineer described the agent trying work item tools, then curl, then the merge request itself, before settling on search.

Guard: Name the tool in the prompt when the task is known. get_merge_request with include: ["notes"] is the direct route to review comments.

The agent says: “I will authenticate with the token in the environment.” The server rejects it.

Only OAuth-granted tokens are accepted. A GitLab engineer confirmed on 22 August 2025 that personal access tokens are not supported, and the endpoint answers a PAT with 403.

Guard: Plan for a browser step. Unattended or machine-to-machine use has no supported path on the native endpoint.

The agent says: “Scan profile attached.” To every project in the group.

attach_scan_profile takes project_ids or group_ids, and the documented example attaches a profile to all projects under one group.

Guard: Never pass group_ids from an agent. Enumerate the projects you meant.

How to configure GitLab MCP for agents

  1. 1

    Turn on three settings, not one

    Duo availability must be Always on or On by default, beta and experimental features must be on, and access to the MCP server must be allowed. All three sit at the top-level group on GitLab.com, or the instance elsewhere.

  2. 2

    Choose HTTP transport

    GitLab recommends it and it needs no Node.js. The stdio route runs npx mcp-remote and requires Node 20 or later.

  3. 3

    Prefix the tool names if you run more than one GitLab

    The X-Gitlab-Mcp-Server-Tool-Name-Prefix header, added in 18.11, renames every tool for that connection. It truncates at 32 characters.

  4. 4

    Decide what the OAuth identity may do before connecting

    The token carries your own permissions. Narrowing the tool list limits what the agent can call, and the token keeps its full reach.

  5. 5

    Budget for tool descriptions in every request

    Every listed tool description arrives at connection unless you narrow the list. GitLab 19.5 adds X-Gitlab-Enabled-Mcp-Server-Toolsets to pick toolsets and X-Gitlab-Enabled-Mcp-Server-Tools to pick tools by name. An engineer in the feedback issue reports the agent trying several wrong tools before finding the right one.

Paste this into your agent’s instructions

Fifteen of the 47 listed tools write, and the write and read names look alike. The block forces the agent to say which side of that line it crossed.

Terminal
When you answer using GitLab MCP tools, state:
- Which tool you called and the project it acted on.
- Whether the call was a read or a write. Fifteen of the 47
  listed tools write. Ask before you call one.
- That manage_pipeline deletes a pipeline and all related
  data when pipeline_id is the only parameter set.
Do not call attach_scan_profile with group_ids. It applies to
every project under the group.
Do not state that data does not exist. State which tool you
called and what it returned.
Write your answer in ASD-STE100 Simplified Technical
English. Use short sentences with one idea in each.

Do you need the MCP server at all?

Not for unattended work. glab, GitLab's own CLI, is the alternative teams actually reach for. On 18 March 2026 an engineer reported more success with it than with the MCP server or third-party wrappers, and fewer tokens spent.

Community servers are the other route, and the feedback issue documents real migrations to them. They trade official support for fine-grained tokens, selectable toolsets and separate read-only endpoints.

The v4 REST API remains the direct path for anything scheduled. The MCP endpoint is that same API with tool descriptions attached.

For the code review itself, SonarQube, Semgrep and CodeRabbit answer questions about the diff that GitLab's own tools do not.

With MCP, one connection reaches the diff, the pipeline that tested it and the discussion about it, with no token to place in a config file.

Use the native endpoint for interactive work. Use glab or the REST API for anything that runs unattended.

GitLab MCP server setup

Nothing is installed. The endpoint is https://<gitlab.example.com>/api/v4/mcp, and on GitLab.com that host is gitlab.com.

No configuration block below holds a credential. Authentication is OAuth 2.0 Dynamic Client Registration: the client registers itself on first connect, a browser opens the authorize page, and you approve it there.

Before any of it works, three settings must be on: Duo availability set to Always on or On by default, beta and experimental features enabled, and access to the MCP server allowed. On GitLab.com they live on the top-level group; on Self-Managed and Dedicated they live on the instance.

Claude Code

GitLab documents the CLI form. After it is added, run /mcp, pick the GitLab server and approve the request in the browser that opens.

Terminal
claude mcp add --transport http GitLab https://gitlab.com/api/v4/mcp

Cursor

Settings, Cursor Settings, Tools and MCP, then New MCP Server. Saving the file should open the browser authorize page. If it does not, close and restart Cursor.

Terminal
{"mcpServers":{"GitLab":{"type":"http",
  "url":"https://gitlab.com/api/v4/mcp"}}}

Codex CLI

Codex reads TOML, so the JSON blocks will not transfer. One engineer in the feedback issue reported the direct remote route failing to initialize after OAuth completed, and fell back to the mcp-remote proxy below.

Terminal
[features]
rmcp_client = true

[mcp_servers.GitLab]
url = "https://gitlab.com/api/v4/mcp"

Two GitLab instances at once

Tool names collide when two GitLab connections are configured. The prefix header, added in 18.11, renames every tool on that connection and truncates past 32 characters.

Terminal
{"mcpServers":{"GitLab":{"type":"http",
  "url":"https://gitlab.example.com/api/v4/mcp",
  "headers":{
    "X-Gitlab-Mcp-Server-Tool-Name-Prefix":"gitlab_"}}}}

Every other client

Each block below is the configuration for one client, with the file path and the key that client expects.

Claude Desktop

macOS ~/Library/Application Support/Claude/claude_desktop_config.json. Windows %APPDATA%\Claude\claude_desktop_config.json. There is no CLI. Edit through Settings, Developer, Edit Config.

Quit and restart fully for changes to load. Node.js 20 or later must be on the global PATH, because this route proxies through mcp-remote. On first connect a browser opens for the OAuth approval.

Terminal
{"mcpServers":{"GitLab":{"command":"npx",
  "args":["-y","mcp-remote",
    "https://gitlab.com/api/v4/mcp"]}}}

mcp-remote caches its OAuth state in ~/.mcp-auth. An engineer in the feedback issue clears it on a nightly cron to work around expired grants, and warns that doing so signs you out of every other MCP server using that path.

Gemini CLI

~/.gemini/settings.json globally, or .gemini/settings.json per project. GitLab documents the httpUrl key here rather than url. Run /mcp auth GitLab to open the authorize page.

Terminal
{"mcpServers":{"GitLab":{
  "httpUrl":"https://gitlab.com/api/v4/mcp"}}}
VS Code Copilot

.vscode/mcp.json per workspace, or your user profile. GitLab documents the Command Palette route: MCP: Add Server, choose HTTP, enter the URL, then approve in the browser.

Terminal
{"servers":{"GitLab":{"type":"http",
  "url":"https://gitlab.com/api/v4/mcp"}}}

The key depends on the file. .vscode/mcp.json uses servers. The portable .mcp.json at the project root and ~/.copilot/mcp-config.json use mcpServers. VS Code's docs recommend the portable files for new servers.

Windsurf

~/.codeium/windsurf/mcp_config.json, which is the path Windsurf documents. Key mcpServers, the same shape as Cursor, and the same browser approval on first connect.

Terminal
{"mcpServers":{"GitLab":{"serverUrl":
  "https://gitlab.com/api/v4/mcp"}}}
Zed

~/.config/zed/settings.json, under context_servers. OAuth runs in the browser as elsewhere.

Terminal
{"context_servers":{"GitLab":{
  "url":"https://gitlab.com/api/v4/mcp"}}}
Google Antigravity

~/.gemini/config/mcp_config.json globally, or .agents/mcp_config.json per project. Key mcpServers. There is no CLI. Use the /mcp overlay. Streamable HTTP is supported directly, so no proxy is needed.

No credentials appear in the block. The browser opens the GitLab authorize page on first connect.

Terminal
{"mcpServers":{"GitLab":{"type":"http",
  "url":"https://gitlab.com/api/v4/mcp"}}}
Amp (Sourcegraph)

~/.config/amp/settings.json or .amp/settings.json. The amp mcp CLI covers approve, doctor and oauth. Approval happens in the browser.

Terminal
{"amp.mcpServers":{"GitLab":{
  "url":"https://gitlab.com/api/v4/mcp"}}}
Cline

~/.cline/mcp.json per the docs. The source also reads ~/.cline/data/settings/cline_mcp_settings.json. Key mcpServers. Streamable HTTP is supported, so the proxy is optional.

No credentials appear in the block. OAuth runs in the browser on first connect.

Terminal
{"mcpServers":{"GitLab":{"type":"streamableHttp",
  "url":"https://gitlab.com/api/v4/mcp"}}}
Goose (Block)

~/.config/goose/config.yaml. The streamable_http type avoids the Node proxy; authorization is still a browser approval.

Terminal
extensions:
  gitlab:
    type: streamable_http
    uri: https://gitlab.com/api/v4/mcp
Kiro (AWS)

.kiro/settings/mcp.json per workspace, or ~/.kiro/settings/mcp.json globally. Key mcpServers. Kiro runs stdio servers, so this route proxies through mcp-remote and needs Node 20 or later.

No credentials appear in the block. The proxy opens the browser authorize page on first connect.

Terminal
{"mcpServers":{"GitLab":{"command":"npx",
  "args":["-y","mcp-remote",
    "https://gitlab.com/api/v4/mcp"]}}}
Warp

~/.warp/.mcp.json or .warp/.mcp.json. Key mcpServers. Also addable through the /agent-add-mcp skill. No credential is stored; approval is in the browser.

Terminal
{"mcpServers":{"GitLab":{
  "url":"https://gitlab.com/api/v4/mcp"}}}
JetBrains Junie

.junie/mcp/mcp.json per project, or ~/.junie/mcp/mcp.json. Key mcpServers. Use /mcp in the CLI to manage the browser authorization.

Terminal
{"mcpServers":{"GitLab":{"type":"http",
  "url":"https://gitlab.com/api/v4/mcp"}}}
Roo Code

.roo/mcp.json per project. The global file is mcp_settings.json, opened from the Roo Code MCP settings view with Edit Global MCP. Key mcpServers, with OAuth in the browser.

Terminal
{"mcpServers":{"GitLab":{"type":"streamable-http",
  "url":"https://gitlab.com/api/v4/mcp"}}}
Continue

.continue/mcpServers/*.yaml, one file per server. No credentials appear in the file; the browser handles authorization.

Terminal
name: GitLab
version: 0.0.1
schema: v1
mcpServers:
  - name: GitLab
    type: streamable-http
    url: https://gitlab.com/api/v4/mcp
Trae

.trae/mcp.json per project, or paste into the UI under Raw Config (JSON). Key mcpServers, standard shape, browser authorization on connect.

Terminal
{"mcpServers":{"GitLab":{
  "url":"https://gitlab.com/api/v4/mcp"}}}
Devin

Devin has no config file to edit. Servers are added through a web form in the settings UI, and Devin's documentation states you do not need to write or paste JSON. The block below is the shape those fields describe, shown for reference. Either route completes authorization in the browser.

Terminal
{"mcpServers":{"GitLab":{"type":"http",
  "url":"https://gitlab.com/api/v4/mcp"}}}
Self-managed and Dedicated

Replace gitlab.com with your instance host in any block above. The three prerequisite settings live on the instance rather than on a top-level group. Authorization is the same browser OAuth flow, against your own instance.

Air-gapped instances are a known gap. An engineer in the feedback issue reports that GitLab Duo cannot be enabled on an offline license, and the MCP server depends on it.

Terminal
claude mcp add --transport http GitLab \
  https://gitlab.example.com/api/v4/mcp

Read-only access, permissions and security

  • GitLab puts prompt injection on you, in writing

    The documentation repeats, once per client: You're responsible for guarding against prompt injection when you use these tools. Exercise extreme caution or use MCP tools only on GitLab objects you trust. An issue description is untrusted text that reaches the model.

  • There is no read-only mode

    Fifteen listed tools write. From GitLab 19.5, the X-Gitlab-Enabled-Mcp-Server-Tools header can name read tools alone. The comparison teams keep drawing in the feedback issue is GitHub's separate read-only endpoint.

  • manage_pipeline deletes by omission

    Per the documentation, if pipeline_id is the only parameter set, the call deletes the pipeline and all related data. Adding a name makes the same call a rename.

  • attach_scan_profile accepts group IDs

    One call attaches a security scan profile to every project under a group, so a single mistake reaches a whole namespace rather than one repository.

  • The token is you

    OAuth grants the connection your own permissions across every project you can reach, and there is no narrower scope to hand it.

  • Personal access tokens are refused

    That removes a class of leaked-secret risk and rules out machine-to-machine use, which is why several teams in the feedback issue run a community server with fine-grained tokens instead.

Troubleshooting

403 when authenticating with a personal access token
Expected. A GitLab engineer confirmed in the feedback issue that the server supports OAuth-granted tokens only, and that PATs are not supported.
The server does not appear at all
Check all three prerequisites, not just one: Duo availability, beta and experimental features, and MCP server access. Missing any leaves the endpoint invisible.
`InvalidGrantError` or an expired authorization grant
The mcp-remote proxy caches OAuth state in ~/.mcp-auth. Clearing it forces a fresh authorization, and also signs out every other MCP server that uses that directory.
`Server's protocol version is not supported`
Reported against Claude Desktop 0.13.91 in the feedback issue. GitLab added the 2025-03-26 and 2025-06-18 protocol specifications in 18.7, so an older instance will not negotiate with a newer client.
A tool name from an older guide no longer exists
Names moved during beta. gitlab_search became search in 18.8, get_job_log became get_job in 19.3 and is kept as an alias, and manage_pipeline lost list, create, retry and cancel to list_pipelines and save_pipeline in 19.3.
semantic_code_search became semantic_search in 19.4 and is kept as an alias. Nine superseded tools are unlisted in 19.4 and 19.5, and stay callable while callers migrate.
The job log is cut off
It is a window, not a truncation. get_job returns at most byte_limit bytes, default and maximum 512000, and the response reports the total size and the byte_offset for the next window.

GitLab MCP server: Reference

ItemValue
Endpointhttps://<instance>/api/v4/mcp
Live checkHTTP 401 to unauthenticated JSON-RPC on 25 August 2026
InstallNone. Upgrading GitLab is the install
StatusBeta. Experiment 18.3, beta 18.6, Free tier 19.2
TiersFree, Premium and Ultimate
OfferingsGitLab.com, Self-Managed and Dedicated
Tools56 documented · 47 listed · 32 read · 15 write
License-gated toolssemantic_search needs Duo Core, Pro or Enterprise · vulnerability tools need Ultimate
AuthOAuth 2.0 Dynamic Client Registration. No personal access tokens
TransportsHTTP, recommended · stdio through mcp-remote, needs Node 20+
Tool prefixingX-Gitlab-Mcp-Server-Tool-Name-Prefix, added 18.11, 32 characters
Protocol specs2025-03-26 and 2025-06-18, added in 18.7
Job log windowbyte_limit default and maximum 512000
Read-only modeNone documented
Feedback issue561564, closed 22 September 2026 · now 630189
Inventory sourceDocumented tool reference, read 6 October 2026
Tool selectionX-Gitlab-Enabled-Mcp-Server-Toolsets and X-Gitlab-Enabled-Mcp-Server-Tools, added 19.5

What engineers report

GitLab ran a public feedback issue for this server. Issue 561564 closed on 22 September 2026 with 407 comments and 12 upvotes. That makes it one of the few connectors in this directory with genuine public discussion. GitLab's documentation now points feedback to issue 630189, opened 21 September 2026.

What was checkedWhat it shows
Feedback issue561564, opened 14 August 2025
Comments407
StateClosed, 22 September 2026
Current feedback issue630189, opened 21 September 2026
Documented tools56, as of 6 October 2026
Listed write tools15

“Currently the MCP server only supports OAuth-granted tokens. PATs are not supported.”

mwoolf, GitLab, GitLab issue 561564, 22 August 2025 · A GitLab engineer answering the first report of a 403 on personal access token auth. It remains the position.

“I've found that tools like claude code often work better with a CLI. I've experienced a lot more success using the GitLab CLI with claude code than with the MCP (even 3rd party MCPs that wrap the GitLab API). It not only accomplish tasks a lot easier, it also uses less tokens.”

tleish, GitLab issue 561564, 18 March 2026 · A direct comparison against `glab`, GitLab's own command line client.

“I talked about the vague / broad permissions here. I've resorted to using a community MCP w/ fine-grained tokens. It also seems more stable, and can just add tools / features as needed easily.”

rsaxena_f, GitLab issue 561564, 13 May 2026 · Permission granularity on the native endpoint, where the OAuth grant carries your own access.

“When using the community server to get a discussion note (comment on MR), the agent does it straightforward. When using this official MCP, it explores unrelated tools like workitem, then it tries curl. Finally after many tokens burned, it uses search which sounds pretty suboptimal.”

piotr.pabis, GitLab issue 561564, 15 June 2026 · Tool selection across many overlapping descriptions. The direct route for this task is `get_merge_request` with the notes facet.

“For each GitLab MCP tool, I would want to see: read-only vs mutating, required token scopes, whether it can affect CI/CD, issues, merge requests, repository content, or settings. This matters because agents often choose tools from names/descriptions, not from full docs.”

tangweigang, GitLab issue 561564, 21 June 2026 · A request for tool-level safety metadata, which the server does not currently expose.

Comments were read from the public discussion on issue 561564 on 25 August 2026. Its state and comment count were read from the GitLab API on 6 October 2026. Author names and dates are as recorded on each comment. Quotes are trimmed for length and links inside them are described rather than reproduced.

Should you connect an agent to GitLab?

Yes. Best for interactive review and CI triage, with writes approved at the client.

Strongest fit
Teams already on GitLab who want an agent reading merge requests and pipeline failures without installing or maintaining anything.
Main advantage
There is no package, no token in a config file and no separate update path. Upgrading GitLab is the whole install.
Main weakness
No read-only mode, no personal access tokens, and a tool list that renamed and removed tools during beta.
Operational risk
manage_pipeline deletes a pipeline and all related data when pipeline_id is its only parameter.

From Oodle

One platform for agent traces and infrastructure

Agent traces usually sit in a different product from the rest of your telemetry, so when a slow database makes an agent slow the symptom is in one tool and the cause is in another. Oodle keeps both in one query surface.

See agent observability

Frequently asked questions

Does GitLab have an official MCP server?

Yes, and it is part of GitLab itself. Every instance serves it at /api/v4/mcp once three settings are enabled. It is beta, and available on Free, Premium and Ultimate.

How many tools does it expose?

Fifty-six are documented as of 6 October 2026. Forty-seven appear in tools/list, and 15 of those write. semantic_search needs a GitLab Duo add-on, and the three vulnerability tools need Ultimate.

Can I use a personal access token?

No. A GitLab engineer confirmed in the feedback issue that only OAuth-granted tokens work, and a PAT returns 403. That rules out unattended machine-to-machine use.

Is there a read-only mode?

GitLab documents no read-only mode. From GitLab 19.5, headers can limit the list to named toolsets or named tools. Engineers in the feedback issue have asked for read-only against mutating to be visible at the tool level.

Which tool is the most dangerous?

manage_pipeline. The documentation states it deletes the pipeline and all related data when pipeline_id is the only parameter set, so the destructive path is the shorter call.

Why do the tool names in older articles not match?

The surface moved during beta. gitlab_search became search in 18.8, and get_job_log became get_job in 19.3. manage_pipeline lost four actions to list_pipelines and save_pipeline in 19.3. semantic_code_search became semantic_search in 19.4.

Changelog

  • GitLab 19.5. Toolset selection added through the X-Gitlab-Enabled-Mcp-Server-Toolsets header. list_duo_agents_and_flows, start_duo_session, send_duo_session_input and get_artifact_file added. Six merge request and pipeline tools unlisted in favor of facets on get_merge_request and get_pipeline.
  • GitLab 19.4. save_merge_request_review, get_work_item, save_work_item and list_work_items added. Project, group, member, user, commit, branch, tree, release, tag, fork, merge and vulnerability tools added, with get_duo_session. semantic_code_search renamed to semantic_search. create_issue, get_issue and get_workitem_notes unlisted.
  • GitLab 19.3. Nine tools added. manage_pipeline loses list, create, retry and cancel to list_pipelines and save_pipeline. get_job_log becomes get_job.
  • GitLab 19.2. Moved from Premium to Free, and made a setting of its own. create_merge_request_note and attach_scan_profile added. The note tool is now documented as save_note.
  • GitLab 18.11. Tool name prefixing added, through the X-Gitlab-Mcp-Server-Tool-Name-Prefix header.
  • GitLab 18.8. gitlab_search renamed to search.
  • GitLab 18.7. Support added for the 2025-03-26 and 2025-06-18 protocol specifications.
  • GitLab 18.6. Changed from experiment to beta. Both feature flags removed. HTTP transport introduced.
  • GitLab 18.3. Introduced as an experiment behind the mcp_server and oauth_dynamic_client_registration flags, disabled by default.

Sources

Every number on the page traces to one of these

  1. GitLab MCP server documentation · docs.gitlab.com, read 25 August 2026
  2. GitLab MCP server tools reference · the 56 tool entries, read 6 October 2026
  3. Live check · POST https://gitlab.com/api/v4/mcp returned HTTP 401, 25 August 2026
  4. Public feedback issue 561564 · comments, authors and dates read 25 August 2026; state and comment count read 6 October 2026

GitLab’s own MCP documentation

The other side of the diff:

Also CI and release: