Skip to main content
Glama
jestays

@jestay/bitbucket-mcp

by jestays
README.md
# @jestay/bitbucket-mcp

MCP server for code review of Bitbucket Cloud pull requests: list PRs, read
diffs, file contents and comments, post review comments (general, inline on
specific lines, or replies), resolve comment threads and update the PR
title/description.

## Tools

| Tool | Description |
| --- | --- |
| `list_pull_requests` | List PRs of a repo, filtered by state (default OPEN) |
| `get_pull_request` | Full PR metadata: branches, commits, reviewers, approval status |
| `get_pull_request_diff` | Unified diff of the PR (plain text) |
| `get_file_content` | Raw file content at a branch/tag/commit |
| `list_pull_request_comments` | Existing PR comments (general and inline), with resolution status |
| `create_pull_request_comment` | Post a comment: general, inline (`file_path` + `line`) or reply (`parent_id`) |
| `resolve_pull_request_comment` | Resolve (or reopen with `action: "reopen"`) a top-level comment thread |
| `update_pull_request` | Update the `title` and/or `description` of an open PR |

Bitbucket Cloud allows resolving any top-level comment, general or inline;
replies cannot be resolved, so pass the id of the comment that opens the
thread. Liking a comment is not exposed by the public REST API 2.0, so it is
not available here.

Bitbucket's `PUT /pullrequests/{id}` is a full replace: any field omitted from
the body is dropped (reviewers included). `update_pull_request` therefore reads
the PR first and sends reviewers, `close_source_branch` and `draft` back
unchanged, so only the title/description you pass actually change.

## Review workflow

By default the server ships MCP instructions telling the connected agent to
review first and comment later: read the diff, consolidate all findings,
present them to the user, and post only the comments the user explicitly
approved. `create_pull_request_comment` carries the same warning in its
description, and the other mutating tools (`resolve_pull_request_comment`,
`update_pull_request`) ask the agent to act only on an explicit user request.

For unattended use (automation/CI), set `BITBUCKET_YOLO=true` to remove the
approval gate and let the agent comment autonomously.

## Requirements

- Node.js 20.6+
- An Atlassian API token (see below)

## Creating the API token

Create an **API token with scopes** at
https://id.atlassian.com/manage-profile/security/api-tokens, select
**Bitbucket** as the app, and grant these scopes:

| Scope | Used for |
| --- | --- |
| `read:user:bitbucket` | Authentication / identifying the token's user |
| `read:workspace:bitbucket` | Resolving the workspace in API routes |
| `read:repository:bitbucket` | Reading repository file contents (`get_file_content`) |
| `read:pullrequest:bitbucket` | Listing and reading PRs, diffs and comments |
| `write:pullrequest:bitbucket` | Posting review comments, resolving threads, updating the PR |

No other scopes are needed — in particular, `write:repository:bitbucket` is
NOT required (this server never pushes code).

> Note: Atlassian App Passwords are deprecated — use API tokens.

## Usage (npx)

No installation needed — any machine with Node 20.6+ can run it via `npx`.

`.mcp.json` (Claude Code) or `claude_desktop_config.json` (Claude Desktop):

```json
{
  "mcpServers": {
    "bitbucket": {
      "command": "npx",
      "args": ["-y", "@jestay/bitbucket-mcp"],
      "env": {
        "BITBUCKET_EMAIL": "you@company.com",
        "BITBUCKET_API_TOKEN": "your_token_here",
        "BITBUCKET_WORKSPACE": "your-workspace"
      }
    }
  }
}
```

Or with the Claude Code CLI:

```bash
claude mcp add bitbucket \
  -e BITBUCKET_EMAIL=you@company.com \
  -e BITBUCKET_API_TOKEN=your_token_here \
  -e BITBUCKET_WORKSPACE=your-workspace \
  -- npx -y @jestay/bitbucket-mcp
```

### Environment variables

| Variable | Required | Description |
| --- | --- | --- |
| `BITBUCKET_EMAIL` | Yes | Atlassian account email |
| `BITBUCKET_API_TOKEN` | Yes | Atlassian API token (scopes above) |
| `BITBUCKET_WORKSPACE` | No | Default workspace so tools don't need it per call |
| `BITBUCKET_YOLO` | No | Set to `true`/`1` to disable the ask-before-commenting guidance (automation/CI) |

## Local development

```bash
pnpm install
pnpm build
cp .env.example .env   # then fill in the values
pnpm dev               # run from source (tsx)
pnpm start             # run the compiled build
```

`pnpm dev` and `pnpm start` load environment variables from a `.env` file in
the project root. When registering the server in an MCP client, environment
variables come from the client's own config instead and no `.env` file is
needed. To register a local build, use
`node /absolute/path/to/bitbucket-mcp/dist/index.js` as the command.

## Project layout

```
src/
├── index.ts     # entry point
├── config.ts    # env-var configuration
├── client.ts    # HTTP client for the Bitbucket Cloud API 2.0 (auth lives here)
└── server.ts    # McpServer + tool registration
```

TDQS

A4.3/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing PRs, getting PR metadata, getting the diff, reading file content, listing comments, and posting comments. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case, such as list_pull_requests, get_pull_request_diff, and create_pull_request_comment. The naming is uniform and predictable.

Tool Count5/5

With exactly 6 tools, the server is well-scoped for a pull request review workflow. Each tool serves a necessary function without redundancy or bloat.

Completeness5/5

The tool set covers the full review loop: discover PRs, inspect details and diffs, view file contents for context, check existing comments, and post new feedback. No critical gaps are apparent for the intended purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues