GitLab MCP Server
🦊 GitLab MCP Server
🚀 MCP Server for the GitLab API, enabling project management, file operations, and more.
✨ Features
🌿 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
🔧 Tools
create_or_update_fileCreate or update a single file in a project
Inputs:
project_id(string): Project ID or URL-encoded pathfile_path(string): Path where to create/update the filecontent(string): Content of the filecommit_message(string): Commit messagebranch(string): Branch to create/update the file inprevious_path(optional string): Path of the file to move/rename
Returns: File content and commit details
push_filesPush multiple files in a single commit
Inputs:
project_id(string): Project ID or URL-encoded pathbranch(string): Branch to push tofiles(array): Files to push, each withfile_pathandcontentcommit_message(string): Commit message
Returns: Updated branch reference
search_repositoriesSearch for GitLab projects
Inputs:
search(string): Search querypage(optional number): Page number for paginationper_page(optional number): Results per page (default 20)
Returns: Project search results
create_repositoryCreate a new GitLab project
Inputs:
name(string): Project namedescription(optional string): Project descriptionvisibility(optional string): 'private', 'internal', or 'public'initialize_with_readme(optional boolean): Initialize with README
Returns: Created project details
get_file_contentsGet contents of a file or directory
Inputs:
project_id(string): Project ID or URL-encoded pathfile_path(string): Path to file/directoryref(optional string): Branch/tag/commit to get contents from
Returns: File/directory contents
create_issueCreate a new issue
Inputs:
project_id(string): Project ID or URL-encoded pathtitle(string): Issue titledescription(optional string): Issue descriptionassignee_ids(optional number[]): User IDs to assignlabels(optional string[]): Labels to addmilestone_id(optional number): Milestone ID
Returns: Created issue details
create_merge_requestCreate a new merge request
Inputs:
project_id(string): Project ID or URL-encoded pathtitle(string): MR titledescription(optional string): MR descriptionsource_branch(string): Branch containing changestarget_branch(string): Branch to merge intodraft(optional boolean): Create as draft MRallow_collaboration(optional boolean): Allow commits from upstream members
Returns: Created merge request details
get_merge_request_raw_diffGet a merge request information of the difference in a raw format
Inputs:
project_id(string): Project ID or URL-encoded pathmerge_request_id(string): ID of the merge request
Returns: The difference of the merge request in a raw format
fork_repositoryFork a project
Inputs:
project_id(string): Project ID or URL-encoded pathnamespace(optional string): Namespace to fork to
Returns: Forked project details
create_branch
Create a new branch
Inputs:
project_id(string): Project ID or URL-encoded pathbranch(string): Name for new branchref(optional string): Source branch/commit for new branch
Returns: Created branch reference
get_job_logs
Retrieve the logs from a job
Inputs:
project_id(string): Project ID or URL-encoded pathjob_id(string): ID of the job
Returns: The logs of the job
⚙️ Setup
🔑 Personal Access Token
Create a GitLab Personal Access Token with appropriate permissions:
Go to User Settings > Access Tokens in GitLab
Select the required scopes:
apifor full API accessread_apifor read-only accessread_repositoryandwrite_repositoryfor repository operations
Create the token and save it securely
💻 Usage with Claude Desktop
Add the following to your claude_desktop_config.json:
🐳 Docker
{
"mcpServers": {
"gitlab": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"GITLAB_PERSONAL_ACCESS_TOKEN",
"-e",
"GITLAB_API_URL",
"mcp/gitlab"
],
"env": {
"GITLAB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>",
"GITLAB_API_URL": "https://gitlab.com/api/v4" // Optional, for self-hosted instances
}
}
}
}📦 NPX
{
"mcpServers": {
"gitlab": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-gitlab"],
"env": {
"GITLAB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>",
"GITLAB_API_URL": "https://gitlab.com/api/v4" // Optional, for self-hosted instances
}
}
}
}🏗️ Build
Docker build:
docker build -t vonwig/gitlab:mcp -f src/gitlab/Dockerfile .🌍 Environment Variables
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)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/martijndormans/mcp-gitlab'
If you have feedback or need assistance with the MCP directory API, please join our Discord server