bitbucket-mcp
by matt-nann
README.md
# bitbucket-mcp
A [Model Context Protocol](https://modelcontextprotocol.io) server for
**Bitbucket Cloud**. Review, manage, and merge pull requests, assign reviewers
_by name_, read files at a ref, and inspect pipeline status — from any MCP
client (Claude Desktop, Cursor, Claude Code) or a hosted HTTP endpoint.
It talks to the [Bitbucket Cloud REST API v2.0](https://developer.atlassian.com/cloud/bitbucket/rest/)
with a single access token. All read paths are paginated and capped; write
tools (create/merge PR, comments, reviewers) are explicit.
## Tools
All tools are prefixed `bb_`.
| Tool | What it does |
| --- | --- |
| `bb_list_pull_requests` | List PRs in a repo, filtered by state |
| `bb_get_pull_request` | Full detail for one PR |
| `bb_get_pull_request_diff` | Unified diff for a PR |
| `bb_get_pull_request_comments` | All comments on a PR (inline + general) |
| `bb_get_pull_request_status` | Aggregated build/status checks for a PR |
| `bb_get_pipeline_status` | Commit statuses for an arbitrary ref |
| `bb_create_pull_request` | Open a PR (optionally with reviewers) |
| `bb_merge_pull_request` | Merge a PR (merge_commit / squash / fast_forward) |
| `bb_create_pull_request_comment` | Add a comment (optionally inline on a file/line) |
| `bb_edit_pull_request_comment` | Edit one of your comments |
| `bb_delete_pull_request_comment` | Delete one of your comments |
| `bb_add_pull_request_reviewers` | Assign reviewers **by name** or UUID |
| `bb_list_workspace_members` | Inspect the local known-members directory |
| `bb_get_file` | Read a file's contents at a branch/commit |
### Assigning reviewers by name
Bitbucket's `/workspaces/{workspace}/members` endpoint requires the `account`
scope (which PR tokens don't carry), so you can't resolve a person's name to
their account UUID over the API. This server keeps a small **local directory**
of known members so `bb_add_pull_request_reviewers` accepts a plain name (e.g.
`"Jane Doe"`) and resolves it offline. Raw account UUIDs always work too.
Seed people in either place (both use the same JSON shape; the env var merges on
top of the file):
- `tools/bitbucket/directory.json` — copy [`directory.example.json`](tools/bitbucket/directory.example.json) and fill it in. **This file is git-ignored** so real account UUIDs never get committed.
- `BITBUCKET_KNOWN_MEMBERS` env var — handy for hosted deploys.
```json
{
"your-workspace-slug": [
{ "uuid": "{00000000-0000-0000-0000-000000000000}", "display_name": "Jane Doe", "nickname": "Jane" }
]
}
```
## Configuration
Set via environment variables (see [`.env.example`](.env.example)). Prefix `BITBUCKET_`.
| Variable | Required | Description |
| --- | --- | --- |
| `BITBUCKET_API_KEY` | ✅ | Access token (Bearer) or app password |
| `BITBUCKET_USERNAME` | — | Set **only** when using an app password (switches to Basic auth) |
| `BITBUCKET_WORKSPACE` | — | Default workspace slug, so tools don't need it each call |
| `BITBUCKET_DEFAULT_REPO` | — | Default repo slug |
| `BITBUCKET_KNOWN_MEMBERS` | — | JSON of extra known members (merged over `directory.json`) |
| `BITBUCKET_MAX_PAGES` | — | Pagination cap (default `10`) |
| `BITBUCKET_TIMEOUT` | — | HTTP timeout in seconds (default `30`) |
Tools are always listed but return a clear "not configured" error if
`BITBUCKET_API_KEY` is missing, so the server starts cleanly without secrets.
## Quick start (local, stdio)
Requires Python 3.11+.
```bash
git clone https://github.com/matt-nann/bitbucket-mcp.git
cd bitbucket-mcp
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export BITBUCKET_API_KEY=your-token
python server.py # stdio (default)
```
### Wire it into an MCP client
**Claude Desktop** (`claude_desktop_config.json`) / **Cursor** (`~/.cursor/mcp.json`):
```json
{
"mcpServers": {
"bitbucket": {
"command": "python",
"args": ["/absolute/path/to/bitbucket-mcp/server.py"],
"env": {
"BITBUCKET_API_KEY": "your-token",
"BITBUCKET_WORKSPACE": "your-workspace-slug"
}
}
}
}
```
**Claude Code:**
```bash
claude mcp add bitbucket \
--env BITBUCKET_API_KEY=your-token \
--env BITBUCKET_WORKSPACE=your-workspace-slug \
-- python /absolute/path/to/bitbucket-mcp/server.py
```
## Hosting (HTTP)
The same server runs over streamable HTTP for a shared/hosted deployment. It
binds **dual-stack IPv6** and honors `$PORT`, so it works on Railway (and
Fly/Heroku/Docker) out of the box:
```bash
MCP_TRANSPORT=http PORT=8000 python server.py --http
# MCP endpoint: http://localhost:8000/mcp health: /health
```
⚠️ **HTTP mode has no built-in authentication** and every request uses the one
`BITBUCKET_API_KEY` identity. Don't expose it publicly without an auth proxy in
front. See **[HOSTING.md](HOSTING.md)** for the full Railway walkthrough,
Docker instructions, and the security model.
## Provenance
Extracted from a larger internal multi-tool MCP server into a standalone,
self-contained package. No internal identifiers or shared auth layers are
included; the member directory ships only as a placeholder example.
## License
[MIT](LICENSE)
TDQS
A3.9/5.0
Scored across 9 tools
Disambiguation5/5
Each tool targets a distinct action on pull requests or workspace members. No two tools overlap in purpose; create, get, diff, status, and comment operations are clearly separated.
Naming Consistency5/5
All tools follow a consistent 'bb_verb_noun' pattern (e.g., bb_create_pull_request, bb_get_pull_request_comments). The naming is uniform and predictable across the entire set.
Tool Count5/5
With 9 tools, the server is well-scoped for Bitbucket pull request management. It covers core operations without being overly broad or too sparse.
Completeness3/5
While comment CRUD is fully covered, missing operations like listing, updating, merging, or declining pull requests create gaps for a complete PR workflow. The workspace members list is a helpful auxiliary tool.
Maintenance
ActivitySlowing
ResponsivenessNo issues