Skip to main content
Glama
mdanelutti

bitbucket-mcp-server

by mdanelutti
README.md
# Bitbucket MCP Server

Servidor MCP (Model Context Protocol) para Bitbucket Cloud que expone operaciones de Pull Requests como herramientas para Claude y otros clientes MCP.

## Requisitos previos

- Node.js >= 18
- Una cuenta de Bitbucket Cloud
- Un **API Token** de Bitbucket con permisos de lectura/escritura en Pull Requests

### Crear un API Token

> **Nota:** Los App Passwords de Bitbucket estan deprecados. Desde septiembre 2025 no se pueden crear nuevos y en junio 2026 dejaran de funcionar. Usar API Tokens en su lugar.

1. Ir a [Atlassian API Tokens](https://id.atlassian.com/manage-profile/security/api-tokens)
2. Click en **Create token**
3. Asignar permisos: **Pull requests: Read & Write**, **Repositories: Read**
4. Copiar el token generado

## Instalacion

```bash
git clone <repo-url>
cd bitbucket-mcp-server
npm install
npm run build
```

## Configuracion

Copiar el archivo de ejemplo y completar con tus credenciales:

```bash
cp .env.example .env
```

```env
BITBUCKET_USERNAME=tu-email@ejemplo.com
BITBUCKET_API_TOKEN=tu-api-token
BITBUCKET_WORKSPACE=tu-workspace
```

### Variables de entorno

| Variable | Requerida | Default | Descripcion |
|---|---|---|---|
| `BITBUCKET_USERNAME` | Si | - | Email o username de Bitbucket |
| `BITBUCKET_API_TOKEN` | Si | - | API Token de Bitbucket |
| `BITBUCKET_WORKSPACE` | No | - | Workspace por defecto (evita pasarlo en cada llamada) |
| `BITBUCKET_ENABLE_DANGEROUS` | No | `false` | Habilita operaciones destructivas (merge, decline) |
| `TRANSPORT` | No | `stdio` | Modo de transporte: `stdio` o `http` |
| `PORT` | No | `3000` | Puerto HTTP (solo si `TRANSPORT=http`) |

## Uso como MCP local

### Importante: `node` vs `nvm`

Los clientes MCP lanzan el servidor como un proceso hijo usando el `command` configurado. Esto significa que el binario de `node` debe ser accesible desde la ruta indicada.

- **Si instalaste Node.js directamente** (instalador, Homebrew, etc.), `node` esta disponible globalmente y podes usarlo directamente como command.
- **Si usas `nvm`**, el binario de `node` no esta en una ruta fija global sino dentro de `~/.nvm/versions/node/vXX.X.X/bin/node`. Algunos clientes MCP (como Claude Desktop) no cargan el perfil de tu shell, por lo que `node` no se encuentra.

**Solucion para usuarios de nvm:** usar la ruta absoluta al binario de node. Para obtenerla:

```bash
# Ver la ruta al node activo
which node
# Ejemplo de salida: /Users/tu-usuario/.nvm/versions/node/v22.0.0/bin/node
```

Y usar esa ruta completa en el campo `command` de la configuracion:

```json
{
  "command": "/Users/tu-usuario/.nvm/versions/node/v22.0.0/bin/node"
}
```

> **Nota:** Si actualizas la version de Node con nvm, vas a tener que actualizar esta ruta tambien.

---

### Claude Code

Claude Code soporta tres scopes al registrar un MCP server con `claude mcp add`:

| Scope | Flag | Donde se guarda | Disponibilidad |
|---|---|---|---|
| `local` | (default) | Config interna del proyecto actual (`~/.claude.json` -> `projects.<path>.mcpServers`) | Solo para vos, en el proyecto actual |
| `project` | `-s project` | `.mcp.json` en la raiz del repo | Compartido con el equipo via control de versiones |
| `user` | `-s user` | `~/.claude.json` (clave `mcpServers` a nivel raiz) | Para tu usuario, en **todos** los proyectos de tu maquina |

> **Importante:** los MCP servers **no** se configuran en `~/.claude/settings.json` ni en `.claude/settings.json`. Esos archivos son para configuracion general (modelo, hooks, permisos). Las versiones actuales de Claude Code leen MCP servers solo desde `~/.claude.json` (scopes `local` y `user`) y `.mcp.json` (scope `project`).

#### Instalacion global (recomendado)

Para que el MCP este disponible en todos tus proyectos, usar el scope `user`:

```bash
claude mcp add bitbucket -s user -- node /ruta/absoluta/a/bitbucket-mcp-server/dist/index.js
```

Tambien podes pasar las variables de entorno en el mismo comando:

```bash
claude mcp add bitbucket -s user \
  -e BITBUCKET_USERNAME=tu-email@ejemplo.com \
  -e BITBUCKET_API_TOKEN=tu-api-token \
  -e BITBUCKET_WORKSPACE=tu-workspace \
  -- node /ruta/absoluta/a/bitbucket-mcp-server/dist/index.js
```

Verificar que quedo registrado:

```bash
claude mcp list
```

Para removerlo en el futuro:

```bash
claude mcp remove bitbucket -s user
```

#### Instalacion por proyecto

Si solo lo queres para el proyecto actual, omitir `-s user` (scope `local` por defecto) o usar `-s project` para compartirlo con el equipo via `.mcp.json`:

```bash
# Solo para vos en este proyecto
claude mcp add bitbucket -- node /ruta/absoluta/a/bitbucket-mcp-server/dist/index.js

# Compartido con el equipo (genera .mcp.json en la raiz del repo)
claude mcp add bitbucket -s project -- node /ruta/absoluta/a/bitbucket-mcp-server/dist/index.js
```

#### Configuracion manual

Tambien podes editar directamente el archivo correspondiente al scope deseado:

- **Scope `user` (global):** `~/.claude.json` — agregar el server dentro de la clave `mcpServers` a nivel raiz del JSON.
- **Scope `project`:** `.mcp.json` en la raiz del repo (commiteable).

Estructura del bloque a agregar en cualquiera de los dos casos:

```json
{
  "mcpServers": {
    "bitbucket": {
      "command": "node",
      "args": ["/ruta/absoluta/a/bitbucket-mcp-server/dist/index.js"],
      "env": {
        "BITBUCKET_USERNAME": "tu-email@ejemplo.com",
        "BITBUCKET_API_TOKEN": "tu-api-token",
        "BITBUCKET_WORKSPACE": "tu-workspace"
      }
    }
  }
}
```

> Si usas nvm, reemplazar `"node"` por la ruta absoluta (ver seccion anterior).

### Claude Desktop

Agregar en `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) o `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "bitbucket": {
      "command": "node",
      "args": ["/ruta/absoluta/a/bitbucket-mcp-server/dist/index.js"],
      "env": {
        "BITBUCKET_USERNAME": "tu-email@ejemplo.com",
        "BITBUCKET_API_TOKEN": "tu-api-token",
        "BITBUCKET_WORKSPACE": "tu-workspace"
      }
    }
  }
}
```

> Si usas nvm, reemplazar `"node"` por la ruta absoluta (ver seccion "node vs nvm"). Claude Desktop **no** carga el perfil de shell, por lo que `nvm` no estara disponible.

### Cursor / Windsurf / otros editores

La configuracion es similar. Buscar la seccion de MCP servers en la configuracion del editor y agregar:

- **Command:** `node` (o ruta absoluta si usas nvm)
- **Args:** `["/ruta/absoluta/a/bitbucket-mcp-server/dist/index.js"]`
- **Env:** las variables de entorno listadas arriba

### Modo HTTP (alternativo)

Si se necesita un servidor HTTP en lugar de stdio:

```bash
TRANSPORT=http PORT=3000 npm start
```

Endpoints disponibles:
- `POST /mcp` - Recibe requests MCP
- `GET /health` - Health check

## Herramientas disponibles

### Lectura

| Herramienta | Descripcion |
|---|---|
| `list_pull_requests` | Lista PRs de un repositorio (filtrar por estado: OPEN, MERGED, DECLINED, SUPERSEDED) |
| `get_pull_request` | Detalle completo de un PR |
| `get_pull_request_diff` | Diff en formato unificado |
| `get_pull_request_comments` | Comentarios del PR (generales e inline) |
| `get_pull_request_activity` | Log de actividad (cambios de estado, aprobaciones, comentarios) |

### Escritura

| Herramienta | Descripcion |
|---|---|
| `create_pull_request` | Crear un nuevo PR |
| `update_pull_request` | Actualizar titulo, descripcion o reviewers |
| `approve_pull_request` | Aprobar un PR |
| `unapprove_pull_request` | Quitar aprobacion |
| `request_changes` | Solicitar cambios |
| `add_pull_request_comment` | Agregar comentarios (generales, inline en lineas, o respuestas) |

### Operaciones peligrosas (requieren `BITBUCKET_ENABLE_DANGEROUS=true`)

| Herramienta | Descripcion |
|---|---|
| `merge_pull_request` | Mergear un PR (estrategias: merge_commit, squash, fast_forward) |
| `decline_pull_request` | Rechazar un PR |

## Desarrollo

```bash
# Compilar en modo watch
npm run dev

# En otra terminal, probar el servidor
npm start
```

TDQS

B3.3/5.0

Scored across 14 tools

Disambiguation4/5

Read tools (list, get, diff, comments, activity) and write tools (create, update, approve, unapprove, request_changes, comment, merge, decline) each target a distinct action on a pull request. Slight potential for confusion between get_pull_request_activity and get_pull_request_comments (activity logs often include comments), and between approve_pull_request and request_changes, but descriptions clarify the boundaries.

Naming Consistency5/5

Every tool follows a consistent snake_case verb_noun pattern (list_pull_requests, get_pull_request_diff, add_pull_request_comment, merge_pull_request). Even the odd-one-out search_workspace_members fits the same convention.

Tool Count5/5

14 tools is well within the ideal range and each maps to a meaningful step in the PR review/merge workflow. No redundant or filler tools are present.

Completeness4/5

The pull request lifecycle is thoroughly covered: discovery, inspection, creation, updates, review states (approve/unapprove/request changes), commenting, and merge/decline. Minor gaps remain around repository/branch discovery (no list_repositories or branch tools), which an agent may need to locate a repo before working with its PRs.

Maintenance

ActivityInactive
ResponsivenessNo issues