Provides tools for interacting with GitLab to manage projects, branches, issues, and merge requests, as well as reading, writing, and searching repository files.
Click on "Install 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 my open merge requests in the web-app project"
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 with Claude Code and AI assistants.
Features
Projects: List and get project details
Branches: List and create branches
Issues: Create and list issues
Merge Requests: Create and list MRs
Files: Read and write repository files
Search: Search code in repositories
Requirements
Installation
The server is published on npm and can be run directly:
# Using Bun (recommended)
bunx @carmeloricarte/gitlab-mcp-server
# Using Node.js
npx @carmeloricarte/gitlab-mcp-serverNo need to clone the repository or install dependencies manually.
Configuration
Set the following environment variables:
Variable | Required | Default | Description |
| Yes | - | GitLab Personal Access Token |
| No |
| GitLab instance URL |
For self-hosted GitLab with self-signed certificates:
export NODE_TLS_REJECT_UNAUTHORIZED=0Environment Variables Setup
There are two approaches to configure credentials:
Option A: Variables in MCP Config (Simplest)
Pass all variables directly in the MCP configuration. Easiest for quick setup on new machines.
β οΈ Note: Token is stored in the config file (local, private). Acceptable for personal use.
Option B: System Environment Variables (More Secure)
Keep sensitive tokens at system/user level, only pass non-sensitive values in MCP config.
# Set permanently for current user
[Environment]::SetEnvironmentVariable("GITLAB_TOKEN", "glpat-your-token", "User")
[Environment]::SetEnvironmentVariable("GITLAB_HOST", "https://your-gitlab.com", "User")
# Verify
[Environment]::GetEnvironmentVariable("GITLAB_TOKEN", "User")Restart your terminal/IDE after setting variables.
# Add to ~/.zshrc (macOS) or ~/.bashrc (Linux)
echo 'export GITLAB_TOKEN="glpat-your-token"' >> ~/.zshrc
echo 'export GITLAB_HOST="https://your-gitlab.com"' >> ~/.zshrc
# Reload
source ~/.zshrc
# Verify
echo $GITLAB_TOKENIDE / Tool Configuration
π‘ Tip: Use
bunxif you have Bun installed, ornpxfor Node.js. Both work identically.
β οΈ Important:
${VARIABLE}syntax does NOT work in most MCP configs - values are treated as literal strings, not resolved. Use Option A (hardcoded values) or Option B (system variables that the server reads fromprocess.env).
β οΈ Windows Configuration
On Windows, you must wrap npx or bunx commands with cmd /c. Use this format:
{
"command": "cmd",
"args": ["/c", "npx", "-y", "@carmeloricarte/gitlab-mcp-server"]
}Or with Bun:
{
"command": "cmd",
"args": ["/c", "bunx", "@carmeloricarte/gitlab-mcp-server"]
}Important: The package name must always be the last argument in the args array.
Claude Code CLI
claude mcp add-json GitLab '{
"type": "stdio",
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}'Set GITLAB_TOKEN as system variable (see above), then:
claude mcp add-json GitLab '{
"type": "stdio",
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}'Verify:
claude mcp list
# Expected: GitLab: bunx ... - β ConnectedVS Code (with MCP extension)
Edit ~/.vscode/mcp.json or .vscode/mcp.json in your project:
{
"servers": {
"GitLab": {
"type": "stdio",
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}Cursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"GitLab": {
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}Zed
Edit ~/.config/zed/settings.json (macOS/Linux) or %APPDATA%\Zed\settings.json (Windows):
{
"context_servers": {
"GitLab": {
"command": {
"path": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}
}OpenCode
Edit ~/.config/opencode/config.json:
{
"mcp": {
"servers": {
"GitLab": {
"type": "stdio",
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}
}Codex (OpenAI CLI)
Edit ~/.codex/config.json:
{
"mcpServers": {
"GitLab": {
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}Windsurf
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"GitLab": {
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}Claude Desktop
Edit the Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"GitLab": {
"command": "bunx",
"args": ["@carmeloricarte/gitlab-mcp-server"],
"env": {
"GITLAB_HOST": "https://your-gitlab.com",
"GITLAB_TOKEN": "glpat-your-token",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}Available Tools
Projects
list_projects- List accessible GitLab projectsget_project- Get details of a specific project
Branches
list_branches- List branches in a projectcreate_branch- Create a new branch
Issues
create_issue- Create a new issuelist_issues- List issues in a project
Merge Requests
create_merge_request- Create a merge requestlist_merge_requests- List merge requests
Files
get_file- Get file contents from repositorycreate_or_update_file- Create or update a file
Search
search_code- Search for code in a project
Development
If you want to contribute or run the server locally for development:
Clone and Install
git clone https://github.com/CarmeloRicarte/gitlab-mcp-server.git
cd gitlab-mcp-server
bun installProject Structure
src/
βββ index.ts # Entry point
βββ server.ts # MCP server setup
βββ config.ts # Environment configuration
βββ client/
β βββ gitlab-client.ts # GitLab API client
βββ tools/
β βββ index.ts # Tool registration
β βββ projects.ts
β βββ branches.ts
β βββ issues.ts
β βββ merge-requests.ts
β βββ files.ts
β βββ search.ts
βββ types/
βββ gitlab.ts # TypeScript types
scripts/
βββ add-shebang.js # Adds Node shebang to compiled output
tests/
βββ setup.ts # Test utilities & mocks
βββ client/
β βββ gitlab-client.test.ts
βββ tools/
βββ *.test.tsRun Server
bun run start
# or with hot reload
bun run devRun Tests
# Run all tests
bun test
# Run with watch mode
bun test:watch
# Run with coverage
bun test:coverageType Check
bun run typecheckBuild
# Build for production (compiles to dist/index.js with Node.js compatibility)
bun run build
# Add shebang to compiled output (done automatically on publish)
bun run add-shebangPublish
Publishing to npm is automated via prepublishOnly:
npm version patch # or minor/major
npm publishThis automatically:
Compiles TypeScript to JavaScript (
bun run build)Adds
#!/usr/bin/env nodeshebang (bun run add-shebang)
Architecture
The server uses dependency injection for the GitLab client, making it easy to mock in tests:
import { GitLabClient } from "./src/client/gitlab-client";
import { createServer } from "./src/server";
// For testing with a mock client
const mockClient = new GitLabClient({
apiBase: "https://mock.gitlab.com/api/v4",
token: "test-token",
});
const server = createServer(mockClient);Contributing
Contributions are welcome! Feel free to open issues and pull requests.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'feat: add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
Please make sure to:
Follow the existing code style
Add tests for new features
Update documentation as needed
License
MIT
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.