Skip to main content
Glama
mikedotJS
by mikedotJS
README.md
# @weirdscience/mcp-gitlab

A Model Context Protocol (MCP) server that provides GitLab integration tools using the `glab` CLI. This server enables AI assistants to interact with GitLab repositories, issues, merge requests, and pipelines through a standardized MCP interface.

## Features

- **Issue Management**: List, create, and manage GitLab issues
- **Merge Requests**: List and create merge requests
- **Pipeline Monitoring**: View project pipelines and their status
- **Raw API Access**: Direct access to GitLab REST API endpoints
- **Multi-Instance Support**: Works with gitlab.com and self-hosted GitLab instances
- **Pagination Support**: Automatic handling of large result sets

## Prerequisites

- Node.js 18+ 
- `glab` CLI tool installed and configured
- GitLab personal access token

## Installation

### Global Installation

```bash
npm install -g @weirdscience/mcp-gitlab
```

### Local Installation

```bash
npm install @weirdscience/mcp-gitlab
```

## Setup

### 1. Install glab CLI

First, install the `glab` CLI tool:

```bash
# macOS
brew install glab

# Linux
sudo apt install glab

# Windows
winget install GitLab.GLab
```

### 2. Configure glab

Authenticate with your GitLab instance:

```bash
# For gitlab.com
glab auth login

# For self-hosted GitLab
glab auth login --hostname gitlab.your-instance.com
```

### 3. Configure MCP

Add the server to your MCP configuration file (`~/.config/mcp.json` or similar):

```json
{
  "mcpServers": {
    "gitlab-glab": {
      "command": "mcp-gitlab",
      "env": {
        "GITLAB_HOST": "gitlab.com",
        "GITLAB_TOKEN": "your-gitlab-token"
      }
    }
  }
}
```

## Cursor Configuration

To use this MCP server with Cursor, you need to configure it in Cursor's settings:

### Method 1: Global Configuration

1. Open Cursor's Command Palette (`Cmd/Ctrl + Shift + P`)
2. Search for "MCP" and select "MCP: Configure Servers"
3. Add a new server configuration:

```json
{
  "name": "gitlab-glab",
  "command": "mcp-gitlab",
  "env": {
    "GITLAB_HOST": "gitlab.com",
    "GITLAB_TOKEN": "your-gitlab-token"
  }
}
```

### Method 2: Workspace Configuration

Create a `.cursorrules` file in your project root:

```json
{
  "mcpServers": {
    "gitlab-glab": {
      "command": "mcp-gitlab",
      "env": {
        "GITLAB_HOST": "gitlab.com",
        "GITLAB_TOKEN": "your-gitlab-token"
      }
    }
  }
}
```

### Method 3: Settings UI

1. Open Cursor Settings (`Cmd/Ctrl + ,`)
2. Search for "MCP"
3. Add the server configuration in the MCP settings section

### Verification

After configuration, you can verify the server is working by:

1. Opening Cursor's Command Palette
2. Running "MCP: List Available Tools"
3. You should see tools like `gitlab_issues_list`, `gitlab_mrs_list`, etc.

### Usage in Cursor

Once configured, you can use GitLab tools directly in Cursor:

- Ask Cursor to "list open issues in my project"
- Request "create a merge request for the current branch"
- Ask "show me the latest pipeline status"

Cursor will automatically use the appropriate MCP tools to fulfill these requests.

### Environment Variables

| Variable | Description | Example |
|----------|-------------|---------|
| `GITLAB_HOST` | GitLab instance hostname | `gitlab.com` or `gitlab.your-company.com` |
| `GITLAB_TOKEN` | GitLab personal access token | `glpat-xxxxxxxxxxxxxxxxxxxx` |
| `GITLAB_URI` | Full GitLab instance URI | `https://gitlab.your-company.com` |

## Available Tools

### `gitlab_issues_list`
List issues for a project.

**Parameters:**
- `project` (string): Project path or numeric ID (e.g., `'gitlab-org/cli'`)
- `state` (optional): Issue state (`'opened'`, `'closed'`, `'all'`) - default: `'opened'`
- `labels` (optional): Comma-separated label names
- `assignee` (optional): Assignee username

### `gitlab_mrs_list`
List merge requests for a project.

**Parameters:**
- `project` (string): Project path or numeric ID
- `state` (optional): MR state (`'opened'`, `'merged'`, `'closed'`, `'all'`) - default: `'opened'`
- `labels` (optional): Comma-separated label names
- `draft` (optional): Filter for draft MRs (boolean)

### `gitlab_mr_create`
Create a new merge request.

**Parameters:**
- `project` (string): Project path or numeric ID
- `sourceBranch` (string): Source branch name
- `targetBranch` (string): Target branch name
- `title` (string): MR title
- `description` (optional): MR description - default: `''`
- `draft` (optional): Create as draft MR (boolean) - default: `false`
- `labels` (optional): Comma-separated labels
- `assignees` (optional): Comma-separated assignee usernames

### `gitlab_pipelines_list`
List pipelines for a project.

**Parameters:**
- `project` (string): Project path or numeric ID
- `page` (optional): Page number (default: 1)
- `perPage` (optional): Items per page (default: 50, max: 100)
- `status` (optional): Pipeline status filter

### `gitlab_api`
Low-level access to GitLab REST API.

**Parameters:**
- `method` (optional): HTTP method (`'GET'`, `'POST'`, `'PUT'`, `'PATCH'`, `'DELETE'`) - default: `'GET'`
- `path` (string): API path below `/api/v4`
- `fields` (optional): Request body fields (object)
- `headers` (optional): Custom headers (object)

### `glab_version`
Get the installed `glab` CLI version.

## Usage Examples

### List Open Issues
```json
{
  "tool": "gitlab_issues_list",
  "arguments": {
    "project": "gitlab-org/cli",
    "state": "opened"
  }
}
```

### Create Merge Request
```json
{
  "tool": "gitlab_mr_create",
  "arguments": {
    "project": "my-group/my-project",
    "sourceBranch": "feature/new-feature",
    "targetBranch": "main",
    "title": "Add new feature",
    "description": "This PR adds a new feature to improve user experience.",
    "labels": "enhancement,frontend"
  }
}
```

### Get Project Pipelines
```json
{
  "tool": "gitlab_pipelines_list",
  "arguments": {
    "project": "my-group/my-project",
    "perPage": 10,
    "status": "success"
  }
}
```

## Development

### Prerequisites
- Node.js 18+
- npm or yarn

### Setup
```bash
git clone https://github.com/weirdscience/mcp-gitlab.git
cd mcp-gitlab
npm install
```

### Build
```bash
npm run build
```

### Development Mode
```bash
npm run dev
```

### Testing
```bash
npm run check
```

### Linting
```bash
npm run lint
npm run lint:fix
```

### Formatting
```bash
npm run format
```

## Contributing

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Acknowledgments

- [Model Context Protocol](https://modelcontextprotocol.io/) for the MCP specification
- [glab CLI](https://gitlab.com/gitlab-org/cli) for GitLab command-line interface
- [GitLab](https://gitlab.com/) for the GitLab platform

## Support

If you encounter any issues or have questions:

1. Check the [GitHub Issues](https://github.com/weirdscience/mcp-gitlab/issues)
2. Review the [glab CLI documentation](https://gitlab.com/gitlab-org/cli/-/blob/main/docs/source/index.md)
3. Consult the [MCP documentation](https://modelcontextprotocol.io/)

## Changelog

### 0.1.0
- Initial release
- Basic GitLab integration via glab CLI
- Support for issues, merge requests, and pipelines
- Raw API access capability

TDQS

B3/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: generic API call, list issues, create MR, list MRs, list pipelines, and version check. No ambiguity between them.

Naming Consistency3/5

Most tools follow a 'gitlab_<resource>_<action>' pattern, but 'gitlab_api' and 'glab_version' deviate in prefix and structure, creating inconsistency.

Tool Count4/5

Six tools is reasonable for a GitLab server covering basic operations, though it could benefit from a few more like issue creation or MR merge.

Completeness3/5

The toolset covers listing issues, MRs, and pipelines, and creating MRs, but lacks full CRUD for issues and MRs. The generic gitlab_api partially fills gaps, but agents need endpoint knowledge.

Maintenance

ActivityMaintained
ResponsivenessNo issues