GitLab MCP server
- Tier: Premium, Ultimate
- Add-on: GitLab Duo Core, Pro, or Enterprise
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
- Status: Experiment
To provide feedback on this feature, leave a comment on issue 561564.
With the GitLab Model Context Protocol (MCP) server, you can securely connect AI tools and applications to your GitLab instance. AI assistants like Claude Desktop, Claude Code, Cursor, and other MCP-compatible tools can then access your GitLab data and perform actions on your behalf.
The MCP server provides a standardized way for AI tools to:
- Access GitLab project information.
- Retrieve issue and merge request data.
- Interact with GitLab APIs securely.
- Perform GitLab-specific operations through AI assistants.
The GitLab MCP server supports OAuth 2.0 Dynamic Client Registration, which enables AI tools to register themselves with your GitLab instance. When an AI tool connects to your GitLab MCP server for the first time, it:
- Registers itself as an OAuth application.
- Requests authorization to access your GitLab data.
- Receives an access token for secure API access.
For a click-through demo, see Duo Agent Platform - MCP server.
Prerequisites
To use the MCP server:
Connect Cursor to a GitLab MCP server
You can configure the GitLab MCP server in Cursor by using:
- HTTP transport (recommended): Direct connection without additional dependencies.
- stdio transport with
mcp-remote: Connection through a proxy (requires Node.js).
HTTP transport (recommended)
To configure the GitLab MCP server in Cursor by using HTTP transport:
In Cursor, go to Settings > Cursor Settings > Tools & MCP.
Under Installed MCP Servers, select New MCP Server.
Add this definition to the
mcpServerskey in the openedmcp.jsonfile:- Replace
<gitlab.example.com>with:- On GitLab Self-Managed, your GitLab instance URL.
- On GitLab.com,
gitlab.com.
{ "mcpServers": { "GitLab": { "type": "http", "url": "https://<gitlab.example.com>/api/v4/mcp" } } }- Replace
Save the file and restart Cursor.
In Cursor, go to Settings > Cursor Settings > Tools & MCP.
Under Installed MCP Servers, find your GitLab server and select Connect.
In your browser, review and approve the authorization request.
You can now start a new chat and ask a question depending on the available tools.
stdio transport with mcp-remote
Prerequisites:
- Install Node.js version 20 or later.
To configure the GitLab MCP server in Cursor by using stdio transport:
In Cursor, go to Settings > Cursor Settings > Tools & MCP.
Under Installed MCP Servers, select New MCP Server.
Add this definition to the
mcpServerskey in the openedmcp.jsonfile:- For the
"command":parameter, ifnpxis installed locally instead of globally, provide the full path tonpx. - Replace
<gitlab.example.com>with:- On GitLab Self-Managed, your GitLab instance URL.
- On GitLab.com,
gitlab.com.
{ "mcpServers": { "GitLab": { "command": "npx", "args": [ "mcp-remote", "https://<gitlab.example.com>/api/v4/mcp" ] } } }- The
--static-oauth-client-metadataparameter is optional for themcp-remotemodule to explicitly set the OAuth scope tomcp. If omitted, GitLab defaults to themcpscope for dynamic applications.
{ "mcpServers": { "GitLab": { "command": "npx", "args": [ "mcp-remote", "https://<gitlab.example.com>/api/v4/mcp", "--static-oauth-client-metadata", "{\"scope\": \"mcp\"}" ] } } }- For the
Save the file, and wait for your browser to open the OAuth authorization page.
If this does not happen, close and restart Cursor.
In your browser, review and approve the authorization request.
You can now start a new chat and ask a question depending on the available tools.
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.
Connect Claude Code to a GitLab MCP server
Claude Code uses HTTP transport for direct connection without additional dependencies. To configure the GitLab MCP server in Claude Code:
In your terminal, add the MCP server with the CLI:
- Replace
<gitlab.example.com>with:- On GitLab Self-Managed, your GitLab instance URL.
- On GitLab.com,
gitlab.com.
claude mcp add --transport http GitLab https://<gitlab.example.com>/api/v4/mcp- Replace
Start Claude Code:
claudeAuthenticate with the MCP server:
- In the chat, type
/mcp. - From the list, select your GitLab server.
- In your browser, review and approve the authorization request.
- In the chat, type
Optional. To verify the connection, type
/mcpagain. Your GitLab server should appear as connected.
You can now start a new chat and ask a question depending on the available tools.
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.
Connect Claude Desktop to a GitLab MCP server
Prerequisites:
- Install Node.js version 20 or later.
- Ensure Node.js is available globally in the
PATHenvironment variable (which -a node).
To configure the GitLab MCP server in Claude Desktop:
Open Claude Desktop.
Edit the configuration file. You can do either of the following:
- In Claude Desktop, go to Settings > Developer > Edit Config.
- On macOS, open the
~/Library/Application Support/Claude/claude_desktop_config.jsonfile.
Add this entry for the
GitLabMCP server, editing as needed:- For the
"command":parameter, ifnpxis installed locally instead of globally, provide the full path tonpx. - Replace
<gitlab.example.com>with:- On GitLab Self-Managed, your GitLab instance URL.
- On GitLab.com,
GitLab.com.
{ "mcpServers": { "GitLab": { "command": "npx", "args": [ "-y", "mcp-remote", "https://<gitlab.example.com>/api/v4/mcp" ] } } }- The
--static-oauth-client-metadataparameter is optional for themcp-remotemodule to explicitly set the OAuth scope tomcp. If omitted, GitLab defaults to themcpscope for dynamic applications.
{ "mcpServers": { "GitLab": { "command": "npx", "args": [ "-y", "mcp-remote", "https://<gitlab.example.com>/api/v4/mcp", "--static-oauth-client-metadata", "{\"scope\": \"mcp\"}" ] } } }- For the
Save the configuration and restart Claude Desktop.
On first connect, Claude Desktop opens a browser window for OAuth. Review and approve the request.
Go to Settings > Developer and verify the new GitLab MCP configuration.
Go to Settings > Connectors and inspect the connected GitLab MCP Server.
You can now start a new chat and ask a question depending on the available tools.
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.
Available tools
The GitLab MCP server provides the following tools.
get_mcp_server_version
Returns the current version of the GitLab MCP server.
Example:
What version of the GitLab MCP server am I connected to?create_issue
Creates a new issue in a GitLab project.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
title | string | Yes | Title of the issue. |
description | string | No | Description of the issue. |
assignee_ids | array of integers | No | Array of IDs of assigned users. |
milestone_id | integer | No | ID of the milestone. |
labels | array of strings | No | Array of label names. |
confidential | boolean | No | Sets the issue to confidential. Default is false. |
epic_id | integer | No | ID of the linked epic. |
Example:
Create a new issue titled "Fix login bug" in project 123 with description
"Users cannot log in with special characters in password"get_issue
Retrieves detailed information about a specific GitLab issue.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
issue_iid | integer | Yes | Internal ID of the issue. |
Example:
Get details for issue 42 in project 123create_merge_request
Creates a merge request in a project.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
title | string | Yes | Title of the merge request. |
source_branch | string | Yes | Name of the source branch. |
target_branch | string | Yes | Name of the target branch. |
target_project_id | integer | No | ID of the target project. |
Example:
Create a merge request in project gitlab-org/gitlab titled "Bug fix broken specs"
from branch "fix/specs-broken" into "master" and enable squashget_merge_request
Retrieves detailed information about a specific GitLab merge request.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
merge_request_iid | integer | Yes | Internal ID of the merge request. |
Example:
Get details for merge request 15 in project gitlab-org/gitlabget_merge_request_commits
Retrieves the list of commits in a specific merge request.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
merge_request_iid | integer | Yes | Internal ID of the merge request. |
per_page | integer | No | Number of commits per page. |
page | integer | No | Current page number. |
Example:
Show me all commits in merge request 42 from project 123get_merge_request_diffs
Retrieves the diffs for a specific merge request.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
merge_request_iid | integer | Yes | Internal ID of the merge request. |
per_page | integer | No | Number of diffs per page. |
page | integer | No | Current page number. |
Example:
What files were changed in merge request 25 in the gitlab project?get_merge_request_pipelines
Retrieves the pipelines for a specific merge request.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
merge_request_iid | integer | Yes | Internal ID of the merge request. |
Example:
Show me all pipelines for merge request 42 in project gitlab-org/gitlabget_pipeline_jobs
Retrieves the jobs for a specific CI/CD pipeline.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ID or URL-encoded path of the project. |
pipeline_id | integer | Yes | ID of the pipeline. |
per_page | integer | No | Number of jobs per page. |
page | integer | No | Current page number. |
Example:
Show me all jobs in pipeline 12345 for project gitlab-org/gitlabgitlab_search
Searches for a term across the entire GitLab instance with the search API. This tool is available for global, group, and project search. Available scopes depend on the search type.
| Parameter | Type | Required | Description |
|---|---|---|---|
scope | string | Yes | Search scope (for example, issues, merge_requests, or projects). |
search | string | Yes | Search term. |
group_id | string | No | ID or URL-encoded path of the group you want to search. |
project_id | string | No | ID or URL-encoded path of the project you want to search. |
state | string | No | State of search results (for issues and merge_requests). |
confidential | boolean | No | Filters results by confidentiality (for issues). Default is false. |
fields | array of strings | No | Array of fields you want to search (for issues and merge_requests). |
order_by | string | No | Attribute to order results by. Default is created_at for basic search and relevance for advanced search. |
sort | string | No | Sort direction for results. Default is desc. |
per_page | integer | No | Number of results per page. Default is 20. |
page | integer | No | Current page number. Default is 1. |
Example:
Search issues for "flaky test" across GitLabsemantic_code_search
- Offering: GitLab.com
The availability of this feature is controlled by a feature flag. For more information, see the history. This feature is available for testing, but not ready for production use.
Searches for relevant code snippets in a project.
This tool is available only for projects with GitLab Duo turned on. Project files must be indexed into vector embeddings.
If this tool is invoked for a project without vector embeddings, indexing is triggered ad-hoc and the agent uses a different tool. This tool then becomes available after a few minutes.
| Parameter | Type | Required | Description |
|---|---|---|---|
semantic_query | string | Yes | Search query for the code. |
project_id | string | Yes | ID or path of the project. |
directory_path | string | No | Path of the directory (for example, app/services/). |
knn | integer | No | Number of nearest neighbors used to find similar code snippets. Default is 64. |
limit | integer | No | Maximum number of results to return. Default is 20. |
Example:
How are authorizations managed in this project?