GitLab
About
Manage GitLab projects, repositories, issues, files, and milestones using the GitLab API.
Details
- Author
- therealchristhomas
- Categories
- Developer Tools, Other, Project Management, Infrastructure
Jump to
Setup
Install GitLab in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/therealchristhomas/gitlab-mcp-server
Follow the installation instructions in the repository README, then restart your MCP client.
MCP Server for the GitLab API, enabling project management, file operations, and more. Forked fromhttps://github.com/modelcontextprotocol
- NPX (Recommended)
- Global Installation
- List Group Milestones
- Create Group Milestone
- Advanced Group Milestone Search
- 1. Search for Groups
- 2. List Existing Group Milestones
- 3. Create a Group Milestone
- File Operations
- Repository Management
- Issue Management
- Merge Request Management
- Label Management
- Milestone Management
- Group Operations
- Personal Access Token
- Usage with Claude Desktop
- Usage with Cursor/VSCode/Winsurf
npx @therealchristhomas/gitlab-mcp-server
npm install -g @therealchristhomas/gitlab-mcp-server gitlab-mcp
- Automatic Branch Creation: When creating/updating files or pushing changes, branches are automatically created if they don't exist
- Comprehensive Error Handling: Clear error messages for common issues
- Git History Preservation: Operations maintain proper Git history without force pushing
- Batch Operations: Support for both single-file and multi-file operations
- Project Workflow Management: Label and milestone management for better project organization
- Repository Management: Search, create, and fork GitLab projects
- File Operations: Create, update, and retrieve file contents
- Branch Management: Create branches and manage repository structure
- Issue Management: Create, list, update, search, and comment on issues
- Merge Request Management: List, update, merge, and comment on merge requests
- Label Management: Create, update, and delete project labels
- Project Milestones: Create, update, and delete project-level milestones
- Group Milestones: Create, update, and delete group-level milestones that span multiple projects
This server supports bothproject milestonesandgroup milestones:
- Scoped to a single project
- Use tools:list_milestones,create_milestone,update_milestone,delete_milestone
- Example: Track features formy-webappproject
- Span multiple projects within a group
- Use tools:list_group_milestones,create_group_milestone,update_group_milestone,delete_group_milestone
- Support advanced filtering withinclude_ancestors,include_descendants
- Example: Track a release acrossmy-webapp,my-api, andmy-admin
{ "group_id": "my-organization", "state": "active", "include_descendants": true }
{ "group_id": "my-organization", "title": "Q1 2025 Release", "description": "Major feature release including new tools and performance improvements", "due_date": "2025-03-31", "start_date": "2025-01-01" }
{ "group_id": "my-organization/core", "search": "release", "include_ancestors": true, "updated_after": "2024-01-01T00:00:00Z" }
Practical Workflow: Finding Groups and Creating Milestones
Here's a typical workflow for working with group milestones:
First, find the group you want to work with:
{ "search": "my-organization", "owned": true }
{ "group_id": "my-organization", "state": "active" }
Create a milestone that spans multiple projects:
{ "group_id": "my-organization", "title": "Q1 2025 Release", "description": "Cross-project release including webapp, API, and admin features", "due_date": "2025-03-31" }
This workflow is especially useful for large organizations with multiple related projects under the same group.
- Create or update a single file in a project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- file_path(string): Path where to create/update the file
- content(string): Content of the file
- commit_message(string): Commit message
- branch(string): Branch to create/update the file in
- previous_path(optional string): Path of the file to move/rename
- Push multiple files in a single commit
- Inputs:
- project_id(string): Project ID or URL-encoded path
- branch(string): Branch to push to
- files(array): Files to push, each withfile_pathandcontent
- commit_message(string): Commit message
- Get contents of a file or directory
- Inputs:
- project_id(string): Project ID or URL-encoded path
- file_path(string): Path to file/directory
- ref(optional string): Branch/tag/commit to get contents from
- Search for GitLab projects
- Inputs:
- search(string): Search query
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Create a new GitLab project
- Inputs:
- name(string): Project name
- description(optional string): Project description
- visibility(optional string): 'private', 'internal', or 'public'
- initialize_with_readme(optional boolean): Initialize with README
- Fork a project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- namespace(optional string): Namespace to fork to
- Create a new branch
- Inputs:
- project_id(string): Project ID or URL-encoded path
- branch(string): Name for new branch
- ref(optional string): Source branch/commit for new branch
- Search for GitLab groups
- Inputs:
- search(string): Search query for groups
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- owned(optional boolean): Limit by groups owned by the current user
- min_access_level(optional number): Minimum access level (10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner)
- Create a new issue
- Inputs:
- project_id(string): Project ID or URL-encoded path
- title(string): Issue title
- description(optional string): Issue description
- assignee_ids(optional number[]): User IDs to assign
- labels(optional string[]): Labels to add
- milestone_id(optional number): Milestone ID
- List all issues in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- state(optional string): 'opened', 'closed', or 'all'
- labels(optional string): Comma-separated list of label names
- milestone(optional string): Milestone title
- assignee_id(optional number): User ID of assignee
- author_id(optional number): User ID of author
- search(optional string): Search against title and description
- created_after(optional string): Return issues created after date (ISO 8601)
- created_before(optional string): Return issues created before date (ISO 8601)
- updated_after(optional string): Return issues updated after date (ISO 8601)
- updated_before(optional string): Return issues updated before date (ISO 8601)
- sort(optional string): Sort issues by various criteria
- order_by(optional string): 'asc' or 'desc'
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- with_labels_details(optional boolean): If true, returns more details for each label. Default is false.
- Update an existing issue in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- issue_iid(number): Issue internal ID
- title(optional string): New issue title
- description(optional string): New issue description
- state_event(optional string): 'close' or 'reopen'
- labels(optional string[]): Array of label names
- assignee_ids(optional number[]): Array of user IDs to assign
- milestone_id(optional number): Milestone ID to assign
- Search for issues in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- search(string): Search term for title and description
- state(optional string): 'opened', 'closed', or 'all'
- labels(optional string): Comma-separated list of label names
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Add a comment to an issue in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- issue_iid(number): Issue internal ID
- body(string): Content of the comment
- Create a new merge request
- Inputs:
- project_id(string): Project ID or URL-encoded path
- title(string): MR title
- description(optional string): MR description
- source_branch(string): Branch containing changes
- target_branch(string): Branch to merge into
- draft(optional boolean): Create as draft MR
- allow_collaboration(optional boolean): Allow commits from upstream members
- List all merge requests in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- state(optional string): 'opened', 'closed', 'locked', 'merged', or 'all'
- target_branch(optional string): Filter by target branch
- source_branch(optional string): Filter by source branch
- labels(optional string): Comma-separated list of label names
- milestone(optional string): Milestone title
- assignee_id(optional number): User ID of assignee
- author_id(optional number): User ID of author
- search(optional string): Search against title and description
- created_after(optional string): Return MRs created after date (ISO 8601)
- created_before(optional string): Return MRs created before date (ISO 8601)
- updated_after(optional string): Return MRs updated after date (ISO 8601)
- updated_before(optional string): Return MRs updated before date (ISO 8601)
- sort(optional string): Sort merge requests
- order_by(optional string): 'asc' or 'desc'
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Update an existing merge request in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- merge_request_iid(number): Merge request internal ID
- title(optional string): New merge request title
- description(optional string): New merge request description
- state_event(optional string): 'close' or 'reopen'
- target_branch(optional string): New target branch
- labels(optional string[]): Array of label names
- assignee_ids(optional number[]): Array of user IDs to assign
- milestone_id(optional number): Milestone ID to assign
- remove_source_branch(optional boolean): Remove source branch when merged
- Merge a merge request in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- merge_request_iid(number): Merge request internal ID
- merge_commit_message(optional string): Custom merge commit message
- should_remove_source_branch(optional boolean): Remove source branch after merge
- merge_when_pipeline_succeeds(optional boolean): Merge when pipeline succeeds
- sha(optional string): SHA that must match the source branch HEAD
- Add a comment to a merge request in a GitLab project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- merge_request_iid(number): Merge request internal ID
- body(string): Content of the comment
- List all labels in a project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Create a new label
- Inputs:
- project_id(string): Project ID or URL-encoded path
- name(string): Label name
- color(string): Label color (hex code)
- description(optional string): Label description
- priority(optional number): Label priority
- Update an existing label
- Inputs:
- project_id(string): Project ID or URL-encoded path
- name(string): Current label name
- new_name(optional string): New label name
- color(optional string): New label color
- description(optional string): New label description
- priority(optional number): New label priority
- Delete a label
- Inputs:
- project_id(string): Project ID or URL-encoded path
- name(string): Label name to delete
- List all milestones in a project
- Inputs:
- project_id(string): Project ID or URL-encoded path
- state(optional string): 'active' or 'closed'
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Create a new milestone
- Inputs:
- project_id(string): Project ID or URL-encoded path
- title(string): Milestone title
- description(optional string): Milestone description
- due_date(optional string): Due date (YYYY-MM-DD)
- start_date(optional string): Start date (YYYY-MM-DD)
- Update an existing milestone
- Inputs:
- project_id(string): Project ID or URL-encoded path
- milestone_id(number): Milestone ID
- title(optional string): New title
- description(optional string): New description
- due_date(optional string): New due date
- start_date(optional string): New start date
- state_event(optional string): 'close' or 'activate'
- Delete a milestone
- Inputs:
- project_id(string): Project ID or URL-encoded path
- milestone_id(number): Milestone ID to delete
- List all milestones in a GitLab group
- Inputs:
- group_id(string): Group ID or URL-encoded path
- state(optional string): 'active' or 'closed'
- title(optional string): Filter by milestone title (case-sensitive)
- search(optional string): Search in title or description
- search_title(optional string): Search in title only
- include_ancestors(optional boolean): Include parent group milestones
- include_descendants(optional boolean): Include subgroup milestones
- updated_before(optional string): Filter by update date (ISO 8601)
- updated_after(optional string): Filter by update date (ISO 8601)
- containing_date(optional string): Milestones containing given date
- start_date(optional string): Filter where due_date >= start_date
- end_date(optional string): Filter where start_date <= end_date
- page(optional number): Page number for pagination
- per_page(optional number): Results per page (default 20)
- Create a new milestone in a GitLab group
- Inputs:
- group_id(string): Group ID or URL-encoded path
- title(string): Milestone title
- description(optional string): Milestone description
- due_date(optional string): Due date (YYYY-MM-DD)
- start_date(optional string): Start date (YYYY-MM-DD)
- Update an existing milestone in a GitLab group
- Inputs:
- group_id(string): Group ID or URL-encoded path
- milestone_id(number): Milestone ID
- title(optional string): New title
- description(optional string): New description
- due_date(optional string): New due date
- start_date(optional string): New start date
- state_event(optional string): 'close' or 'activate'
- Delete a milestone from a GitLab group
- Inputs:
- group_id(string): Group ID or URL-encoded path
- milestone_id(number): Milestone ID to delete
Create a GitLab Personal Access Tokenwith appropriate permissions:
- Go to User Settings > Access Tokens in GitLab
- Select the required scopes:
- apifor full API access
- read_apifor read-only access
- read_repositoryandwrite_repositoryfor repository operations
Add the following to yourclaude_desktop_config.json:
{ "mcpServers": { "gitlab": { "command": "npx", "args": ["-y", "@therealchristhomas/gitlab-mcp-server"], "env": { "GITLAB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>", "GITLAB_API_URL": "https://gitlab.com/api/v4" } } } }
Add the following to your MCP configuration:
{ "mcpServers": { "gitlab": { "command": "npx", "args": ["-y", "@therealchristhomas/gitlab-mcp-server"], "env": { "GITLAB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>", "GITLAB_API_URL": "https://gitlab.com/api/v4" } } } }
Note: Replace<YOUR_TOKEN>with your actual GitLab Personal Access Token. Also, replace with your Gitlab API URL if you're not using gitlab.com
- GITLAB_PERSONAL_ACCESS_TOKEN: Your GitLab personal access token (required)
- GITLAB_API_URL: Base URL for GitLab API (optional, defaults tohttps://gitlab.com/api/v4)
For self-hosted GitLab instances, update theGITLAB_API_URLto point to your instance:
"GITLAB_API_URL": "https://your-gitlab-instance.com/api/v4"
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
An improved GitLab MCP server with bug fixes, providing access to GitLab projects, issues, and merge requests.
An improved GitLab MCP server with bug fixes and enhancements for accessing GitLab resources.
A custom GitLab server for interacting with repositories, issues, and merge requests. Requires a GitLab Personal Access Token.
Integrates with the GitLab REST API to manage repositories, issues, and merge requests.
A GitLab integration server providing access to GitLab's RESTful API tools, built on the fastmcp framework.
Interact with Atlassian Bitbucket Cloud to manage repositories, pull requests, workspaces, and code.
Manage pull requests on Bitbucket Server.
Integrate with the GitHub Enterprise API to access repositories, issues, pull requests, and workflows.
Interact with GitLab repositories, issues, and merge requests through an MCP-compliant server.
Seamlessly integrate AI assistants with GitLab using the glab CLI tool.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





