GitLab MCP Server
Provides tools for interacting with GitLab, including managing merge requests, pipelines, jobs, commits, and job artifacts.
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 Serverlist open merge requests in project my-group/my-repo"
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 Model Context Protocol (MCP) server for GitLab integration, written in TypeScript. This server allows you to interact with GitLab merge requests, commits, pipelines, and jobs through MCP tools.
Features
π Get merge request details (title, description, metadata)
π Create merge requests in GitLab projects
π Retrieve merge request diffs
π List merge requests for a project
π Get pipelines for a merge request
π§° Get jobs for a pipeline
π¨ Get failed jobs by pipeline or merge request
π Retrieve job logs (trace)
π¦ Retrieve job artifacts metadata and download links
π Supports self-hosted GitLab instances
π Token-based authentication via environment variables
Related MCP server: mcp-gitlab-jira
Installation
Clone or download this repository
Install dependencies:
npm installBuild the project:
npm run build
Configuration
Set the following environment variables:
Required
GITLAB_HOST: Your GitLab instance URL (e.g.,https://gitlab.example.comorhttps://gitlab.com)GITLAB_API_TOKEN: Your GitLab access token
Optional (for multiple instances)
MCP_INSTANCE_ID: Unique identifier for the server instance (useful for logging and identification)
You can copy .env.example to .env and fill in your values:
cp .env.example .env
# Edit .env with your GitLab configurationGetting a GitLab Access Token
Go to your GitLab instance
Navigate to User Settings β Access Tokens
Create a new token with
apiscopeCopy the token and set it as
GITLAB_API_TOKEN
Usage
Running the Server
Single Instance
# Development mode
npm run dev
# Production mode
npm run build && npm startMultiple Instances
Each instance runs as a separate process with its own configuration:
# Build first
npm run build
# Instance 1 (in terminal 1)
GITLAB_HOST=https://gitlab.example.com GITLAB_API_TOKEN=token1 MCP_INSTANCE_ID=instance1 npm start
# Instance 2 (in terminal 2)
GITLAB_HOST=https://gitlab.com GITLAB_API_TOKEN=token2 MCP_INSTANCE_ID=instance2 npm start
# Instance 3 (in terminal 3)
GITLAB_HOST=https://gitlab.internal.com GITLAB_API_TOKEN=token3 MCP_INSTANCE_ID=instance3 npm startEach instance can connect to different GitLab hosts with different tokens, allowing multiple tools to work with different GitLab environments simultaneously.
Available Tools
get_merge_request
Get detailed information about a specific merge request, optionally including the diff/changes.
Parameters:
projectId(string): GitLab project ID or path (e.g., "group/project" or "123")mergeRequestIid(number): Merge request internal ID (IID)includeDiff(optional boolean): Whether to include the diff/changes in the response (default: false)
The response includes automation-friendly metadata such as id, iid, draft, source_project_id, target_project_id, labels, assignees, reviewers, diff_refs, and sha. When includeDiff is enabled, the response also includes diff_overflow.
create_merge_request
Create a merge request in a GitLab project.
Parameters:
projectId(string): GitLab project ID or pathsourceBranch(string): Source branch nametargetBranch(string): Target branch nametitle(string): Merge request titledescription(optional string): Merge request descriptionlabels(optional string[]): Labels to applyassigneeId/assigneeIds(optional number / number[]): Assignee user IDsreviewerId/reviewerIds(optional number / number[]): Reviewer user IDsremoveSourceBranch(optional boolean): Remove the source branch on mergeallowCollaboration(optional boolean): Allow upstream members to pushallowMaintainerToPush(optional boolean): Allow maintainers to pushsquash(optional boolean): Suggest squashing commits on mergetargetProjectId(optional number): Target project ID for cross-project MRsdraft(optional boolean): Prefix the title withDraft:
list_merge_requests
List merge requests for a project.
Parameters:
projectId(string): GitLab project ID or pathstate(optional string): Filter by state ("opened", "closed", "merged", "all"). Default: "opened"
get_commit_diff
Get commit details and diff using a full GitLab commit URL.
Parameters:
commitUrl(string): Full GitLab commit URL
get_merge_request_pipelines
Get pipelines for a merge request.
Parameters:
projectId(string): GitLab project ID or pathmergeRequestIid(number): Merge request internal ID (IID)
get_pipeline_jobs
Get jobs for a pipeline.
Parameters:
projectId(string): GitLab project ID or pathpipelineId(number): Pipeline ID
get_failed_jobs
Get failed jobs either directly by pipeline ID or from the latest pipeline of a merge request.
Parameters:
projectId(string): GitLab project ID or pathpipelineId(optional number): Pipeline IDmergeRequestIid(optional number): Merge request internal ID (IID)
Provide either pipelineId or mergeRequestIid.
get_job_log
Get job log (trace) for a job.
Parameters:
projectId(string): GitLab project ID or pathjobId(number): Job ID
get_job_artifacts
Get job artifacts metadata and download links for a job.
Parameters:
projectId(string): GitLab project ID or pathjobId(number): Job ID
Example Usage with MCP Client
// Get merge request details only
await callTool("get_merge_request", {
projectId: "mygroup/myproject",
mergeRequestIid: 42
});
// Get merge request details with diff
await callTool("get_merge_request", {
projectId: "123",
mergeRequestIid: 42,
includeDiff: true
});
// Create a merge request
await callTool("create_merge_request", {
projectId: "mygroup/myproject",
sourceBranch: "feature/new-e2e-test",
targetBranch: "main",
title: "Add login dashboard E2E coverage",
description: "## Summary\n- add a generated Playwright test\n- validate the scenario locally",
labels: ["qa", "e2e"],
removeSourceBranch: true
});
// List open merge requests
await callTool("list_merge_requests", {
projectId: "mygroup/myproject",
state: "opened"
});
// List pipelines for an MR
await callTool("get_merge_request_pipelines", {
projectId: "mygroup/myproject",
mergeRequestIid: 42
});
// Get jobs from pipeline
await callTool("get_pipeline_jobs", {
projectId: "mygroup/myproject",
pipelineId: 123456
});
// Get failed jobs from latest MR pipeline
await callTool("get_failed_jobs", {
projectId: "mygroup/myproject",
mergeRequestIid: 42
});
// Get raw CI job log
await callTool("get_job_log", {
projectId: "mygroup/myproject",
jobId: 987654
});
// Get artifact metadata and links
await callTool("get_job_artifacts", {
projectId: "mygroup/myproject",
jobId: 987654
});Multiple Instance Setup
When running multiple instances, each tool/client can connect to a different instance:
MCP Client Configuration Example
{
"mcpServers": {
"gitlab-company": {
"command": "node",
"args": ["path/to/gitlab-mcp/dist/index.js"],
"env": {
"GITLAB_HOST": "https://gitlab.example.com",
"GITLAB_API_TOKEN": "company_token",
"MCP_INSTANCE_ID": "company"
}
},
"gitlab-personal": {
"command": "node",
"args": ["path/to/gitlab-mcp/dist/index.js"],
"env": {
"GITLAB_HOST": "https://gitlab.com",
"GITLAB_API_TOKEN": "personal_token",
"MCP_INSTANCE_ID": "personal"
}
},
"gitlab-internal": {
"command": "node",
"args": ["path/to/gitlab-mcp/dist/index.js"],
"env": {
"GITLAB_HOST": "https://gitlab.internal.company.com",
"GITLAB_API_TOKEN": "internal_token",
"MCP_INSTANCE_ID": "internal"
}
}
}
}This allows different tools to connect to different GitLab instances simultaneously, each with their own authentication and configuration.
Development
The project uses TypeScript and the MCP SDK. Key files:
src/index.ts: Main MCP server implementationsrc/gitlab-client.ts: GitLab API client wrapperpackage.json: Dependencies and scriptstsconfig.json: TypeScript configuration
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personalβ¦
Go MCP server for GitLab: 2 dynamic tools reach 1000+ REST/GraphQL actions. Free/CE, no paid tier.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoβ¦
Related MCP Servers
- AlicenseBqualityDmaintenanceA TypeScript MCP server that provides integration with GitLab's REST API, allowing users to interact with GitLab projects, issues, merge requests, pipelines, and more through natural language.50115 npm10MIT
- AlicenseBqualityCmaintenanceA Model Context Protocol (MCP) server for GitLab and Jira integration. This server allows AI agents like gemini-cli to interact with your GitLab and Jira instances.327 npm11MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with GitLab API, supporting both self-hosted instances and gitlab.com. Provides tools for managing issues, merge requests, code review, pipelines, milestones, releases, search, and file access.414 npmMIT
- AlicenseNot gradedqualityCmaintenanceA TypeScript-based MCP server that enables code search, file reading, and project management via the GitLab API.5 npm1ISC