Skip to main content
Glama
README.md
# Space MCP

MCP server and CLI for [JetBrains Space](https://www.jetbrains.com/space/) merge requests and [Patronus](https://patronus.labs.jb.gg) CI dry runs.

## Installation

Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:

```sh
uv tool install git+https://github.com/bindreams/space-mcp.git
```

This installs two entry points:

| Command     | Purpose                                   |
| ----------- | ----------------------------------------- |
| `space`     | CLI for merge requests, CI runs, and auth |
| `space-mcp` | MCP server (stdio transport)              |

## Authentication

A JetBrains Space personal token is required.
Generate one at [Personal Tokens](https://jetbrains.team/m/me/authentication?tab=PermanentTokens).

Token is resolved in order:

1. `SPACE_TOKEN` environment variable
1. OS keyring (stored via `space auth login`)
1. `~/.config/space/credentials.json` (plaintext fallback)

```sh
space auth login              # store token in keyring (prompted)
space auth login --token PAT  # non-interactive
space auth status             # show token source and detected context
space auth logout             # remove stored credentials
```

During login you will also be offered to authenticate Docker with `registry.jetbrains.team`.

## MCP Tools

| Tool                         | Description                                           | Parameters                                                                         |
| ---------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `get_merge_request`          | Get MR details (title, state, author, reviewers)      | `project`, `repository`, `review_id`                                               |
| `get_merge_requests`         | List MRs for a repository                             | `project`, `repository`, `branch?`, `state?`, `limit?`                             |
| `get_merge_request_timeline` | Full MR timeline: comments, reviews, dry run results  | `project`, `repository`, `review_id`                                               |
| `put_merge_request`          | Create a new merge request                            | `project`, `repository`, `source_branch`, `target_branch`, `title`, `description?` |
| `post_close_merge_request`   | Close a merge request                                 | `project`, `review_id`                                                             |
| `post_reopen_merge_request`  | Reopen a closed merge request                         | `project`, `review_id`                                                             |
| `get_attachment`             | Download a file attachment from MR discussion         | `attachment_id`                                                                    |
| `get_patronus_runs`          | List Patronus runs (dry runs / safe merges) for an MR | `project`, `review_id`                                                             |
| `get_patronus_run`           | Run details with TeamCity checks and problems         | `run_id`                                                                           |
| `put_patronus_dry_run`       | Start a CI dry run for an MR                          | `project`, `review_id`                                                             |
| `post_cancel_patronus_run`   | Cancel a running Patronus run                         | `run_id`                                                                           |

Most tools return YAML; timeline returns Markdown. Parameters marked with `?` are optional.

### MCP server configuration

First, authenticate via the CLI — the MCP server picks up stored credentials automatically:

```sh
space auth login
```

Then add to `.mcp.json` (project) or `~/.claude.json` (global):

```json
{
  "mcpServers": {
    "space": {
      "command": "space-mcp"
    }
  }
}
```

## CLI

Global options: `-P/--project`, `-R/--repo`, `--json`, `--no-color`.
Project and repo are auto-detected from the git remote when inside a Space repository.

### `space mr` — Merge requests

```
space mr view [REF]        # MR details (number, URL, branch, or current branch)
space mr list              # list MRs (-s open|closed|merged|all, -A author, -H branch)
space mr create BRANCH     # create MR from branch (-t title, -b base, -d description)
space mr close [REF]       # close an MR
space mr reopen [REF]      # reopen a closed MR
space mr timeline [REF]    # full timeline with discussions and dry run results
space mr checks [REF]      # Patronus CI check status (--watch to poll)
space mr diff [REF]        # diff between target and source (--stat, --name-only)
space mr checkout [REF]    # fetch and checkout the MR branch
space mr merge [REF]       # safe merge via Patronus (--rebase, --squash, --dry-run)
space mr download ID       # download attachment by ID (-o output path)
```

### `space run` — Patronus CI runs

```
space run list            # list runs for current branch (-b branch, -B base)
space run view RUN        # run details with TeamCity checks (UUID or URL)
space run start [REF]     # start dry run (--merge, --rebase, --squash, --watch)
space run cancel RUN      # cancel a running Patronus run
space run watch RUN       # live progress with terminal animation
```

### `space auth` — Authentication

```
space auth login          # store token (--token, --insecure-storage)
space auth logout         # remove credentials
space auth status         # show token source and context
```

### `space api` — Raw API access

```
space api /api/http/...                   # authenticated GET to Space
space api /app/rest/... --patronus        # authenticated GET to Patronus
space api /api/http/... -X POST -f key=val  # POST with JSON body
```

### `space status` — Dashboard

```
space status              # MR and latest CI run for current branch
```

## Development

See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and testing.

## License

Copyright 2026, Anna Zhukova

This project is licensed under MPL-2.0. The license text can be found at [LICENSE.md](/LICENSE.md).

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation5/5

Each tool targets a distinct resource and action: read/list/create/edit/close/reopen/delete MRs, timeline, comments vs inline discussions, and Patronus run queries/actions. Singular/plural and general/inline comment distinctions are clear.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern using HTTP verbs (get, put, patch, post) with clear resource nouns. Even action-oriented names like post_close_merge_request and post_reply_to_code_discussion maintain a predictable structure.

Tool Count4/5

At 16 tools, the set is slightly above the typical well-scoped range (3-15) but is justified by covering both merge request lifecycle and Patronus dry run/safe merge operations. Each tool has a clear purpose, so the count feels appropriate for the domain.

Completeness4/5

The tool surface covers full MR lifecycle (create, read, list, edit, close, reopen, delete), commenting (general and inline), replies, attachments, and Patronus run inspection/start/cancel. A minor gap is the lack of a tool to initiate a 'safe merge', though this might be intentionally excluded.