Skip to main content
Glama
elisjetmax

gitlab-mcp-server

by elisjetmax
README.md
# gitlab-mcp-server

An MCP (Model Context Protocol) server for a **self-hosted GitLab** instance, focused on browsing **projects and repositories**. It exposes read-only tools so an MCP client (Claude desktop, Claude Code, etc.) can list projects, inspect branches and commits, browse the file tree, and read file contents.

## Tools

| Tool | Purpose |
|------|---------|
| `gitlab_list_projects` | List / search projects, filter by owned or membership |
| `gitlab_get_project` | Detailed info for one project (default branch, clone URLs, etc.) |
| `gitlab_list_branches` | List repository branches with their tip commit |
| `gitlab_list_commits` | List commits, filter by ref / path / date range |
| `gitlab_get_commit` | Full details and line-change stats for one commit |
| `gitlab_list_repository_tree` | Browse files & directories at a path (optionally recursive) |
| `gitlab_get_file` | Read decoded contents of a single file |

All tools are read-only and support pagination (`page`, `per_page`) and a `response_format` of `markdown` (default) or `json`.

## Requirements

- Node.js 18+
- A GitLab Personal Access Token (PAT)

## Setup

```bash
npm install
npm run build
```

### Create a Personal Access Token

In GitLab: **User Settings → Access Tokens**. Create a token with these scopes:

- `read_api` — required for listing projects, branches and commits
- `read_repository` — required for the repository tree and file contents

Keep the token secret. It is read from an environment variable, never stored in code.

### Configuration

| Variable | Required | Description |
|----------|----------|-------------|
| `GITLAB_BASE_URL` | yes | Base URL of your instance, e.g. `https://gitlab.example.com` (no `/api/v4` suffix needed) |
| `GITLAB_TOKEN` | yes | Your Personal Access Token |
| `TRANSPORT` | no | `stdio` (default) or `http` |
| `PORT` | no | Port for `http` transport (default `3000`) |

## Running

```bash
# stdio (default — for local MCP clients)
GITLAB_BASE_URL=https://gitlab.example.com GITLAB_TOKEN=glpat-xxxx npm start

# HTTP transport (binds to 127.0.0.1)
TRANSPORT=http PORT=3000 GITLAB_BASE_URL=https://gitlab.example.com GITLAB_TOKEN=glpat-xxxx npm start
```

## Connecting to an MCP client

Most desktop clients use a JSON config block. Point it at the built entry point and supply the environment variables:

```json
{
  "mcpServers": {
    "gitlab": {
      "command": "node",
      "args": ["/absolute/path/to/gitlab-mcp-server/dist/index.js"],
      "env": {
        "GITLAB_BASE_URL": "https://gitlab.example.com",
        "GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}
```

Replace the path with the absolute path to `dist/index.js` on your machine, and fill in your instance URL and token. Restart the client to pick up the new server.

## Project structure

```
gitlab-mcp-server/
├── package.json
├── tsconfig.json
├── README.md
└── src/
    ├── index.ts            # Entry point, transport selection, env validation
    ├── constants.ts        # Config readers and limits
    ├── types.ts            # GitLab resource interfaces
    ├── schemas/common.ts   # Shared Zod schema fragments
    ├── services/client.ts  # Authenticated API client, pagination, errors
    └── tools/projects.ts   # Tool definitions and registration
```

## Identifying projects

Wherever a `project_id` is required, you can pass either:

- the numeric project ID, e.g. `42`, or
- the namespace path, e.g. `mygroup/myrepo` (the server URL-encodes it for you).

## Notes

- This server only performs **read** operations. It never creates, edits, or deletes anything in GitLab.
- Large file or list responses are truncated at 25,000 characters; use pagination or narrower filters to retrieve more.
- For development with auto-reload: `npm run dev`.