bbkt
A MCP server for Bitbucket Cloud that provides comprehensive tools to manage workspaces, repositories, pull requests, pipelines, issues, source code, commits, and branches/tags. It also operates as a standalone CLI and supports AI agent integration via MCP (Stdio and HTTP Streamable transports).
Workspaces: List or get workspace details.
Repositories: List, get, create, or delete repositories, with filtering by role, sort, and query.
Branches & Tags: List, create, or delete branches and tags.
Commits: List commits, get commit details, and compare diffs/diffstats.
Source Code: Read files, list directories, view file history, search, write, or delete files.
Pull Requests: List, get, create, update, merge, approve, unapprove, decline; retrieve diffs, diffstats, and commits.
Pull Request Comments: List, create, update, delete, resolve, or unresolve inline or top-level comments.
Pipelines: List, get, trigger, or stop pipelines; list steps and retrieve step logs.
Issues: List, get, create, or update issues with filtering by state, kind, priority, and assignee.
Authentication: Supports Atlassian API tokens, OAuth 2.0 with auto token refresh, multi-profile management, and environment variable overrides.
Git Integration: Automatically infers the current Bitbucket workspace and repository from
.git/config.Scope-aware Tools: Dynamically adjusts available MCP tools based on the authenticated user's token scopes.
Integrates with Atlassian's Bitbucket platform to manage workspaces, repositories, pipelines, and development workflows through the Bitbucket API.
Provides programmatic integration with Bitbucket workspaces and repositories, allowing for the management of repositories, pull requests, pipelines, issues, and source code operations.
bbkt (Bitbucket CLI & MCP Server)
A complete command-line interface and Model Context Protocol (MCP) server written in Go that provides programmatic integration with Bitbucket Cloud workspaces and repositories.
Features
Dual mode — Use as an interactive CLI for daily work, or launch as an MCP server (
bbkt mcp) for AI agents (Claude Desktop, Cursor, etc.).Git-aware — Most commands auto-detect the current workspace and repo from
.git/config, sobbkt prs listJust Works inside a Bitbucket repo.Multi-profile — Switch between personal and work Atlassian accounts with
--profileorBBKT_PROFILE; auto-selects the right profile based on your git config email.Two auth modes — Atlassian API tokens (Basic auth) or interactive OAuth 2.0 with automatic token refresh.
Scope-aware MCP — At startup the MCP server introspects your token's granted scopes and silently hides tools the token can't use, preventing the AI from hallucinating successful writes it doesn't have permission for.
Read and write — Repositories, workspaces, pipelines, issues, pull requests, comments, and source code (read/write/delete) — all via the API.
Related MCP server: obx
Installation
Recommended — curl | bash
Installs the latest release binary for your OS/arch from GitHub Releases.
# System-wide (uses sudo if /usr/local/bin isn't writable)
curl -sSL https://raw.githubusercontent.com/zach-snell/bbkt/main/install.sh | bash
# User-local, no sudo (~/.local/bin)
curl -sSL https://raw.githubusercontent.com/zach-snell/bbkt/main/install.sh | bash -s -- --userFish users on --user: run fish_add_path ~/.local/bin once if it isn't already on $PATH.
From GitHub Releases
Download a prebuilt binary for your OS/arch directly from the Releases page (Linux/macOS/Windows, amd64 + arm64).
From source
git clone https://github.com/zach-snell/bbkt.git
cd bbkt
go build -o bbkt ./cmd/bbktRequires Go 1.26+.
Quickstart
# 1. Authenticate (interactive — prompts for email + Atlassian API token)
bbkt auth
# 2. Verify
bbkt status
# 3. Use it. Inside a Bitbucket repo, workspace/repo are inferred from git.
bbkt prs list
bbkt pipelines trigger --ref-name main
bbkt source read README.mdFor OAuth instead of an API token:
export BITBUCKET_OAUTH_CLIENT_ID=<consumer-key>
export BITBUCKET_OAUTH_CLIENT_SECRET=<consumer-secret>
bbkt auth --oauthAuthentication
bbkt stores credentials at ~/.config/bbkt/credentials.json and supports multiple profiles.
Atlassian API tokens (default)
bbkt auth # save to "default" profile
bbkt auth --profile work # save to a named profileImportant: Bitbucket Cloud REST API requires scoped API tokens since the September 2025 phase-2 of app-password deprecation. At id.atlassian.com/manage-profile/security/api-tokens, use the "Create API token with scopes" button — not plain "Create API token". Unscoped tokens authenticate to Atlassian but Bitbucket rejects them; bbkt will detect this and point you here.
Recommended scope set for full read/write:
read:account
read:user:bitbucket read:workspace:bitbucket
read:repository:bitbucket write:repository:bitbucket
read:pullrequest:bitbucket write:pullrequest:bitbucket
read:pipeline:bitbucket write:pipeline:bitbucketOAuth 2.0 (browser flow)
Register an OAuth consumer in your Bitbucket workspace settings, then:
export BITBUCKET_OAUTH_CLIENT_ID=<consumer-key>
export BITBUCKET_OAUTH_CLIENT_SECRET=<consumer-secret>
bbkt auth --oauthbbkt opens a browser, captures the callback on http://localhost:8976, exchanges the code for tokens, and stores them. Access tokens auto-refresh on expiry. To override the callback port (must match your registered redirect_uri):
export BBKT_OAUTH_CALLBACK_PORT=9876Multi-profile switching
bbkt profile # list profiles, mark active
bbkt profile use work # set active profile
bbkt profile refresh # refresh cached workspace list per profile
BBKT_PROFILE=work bbkt prs list # one-shot profile overrideWhen BBKT_PROFILE is unset, bbkt tries to auto-select a profile whose accessible workspaces match your git config email; otherwise it falls back to active_profile.
One-shot env-var auth (CI, scripts)
Setting any of these env vars bypasses the stored profile entirely:
# API token
export BITBUCKET_USERNAME=you@example.com # despite the name, this is your Atlassian email
export BITBUCKET_API_TOKEN=ATATT3xFf...
# OAuth bearer
export BITBUCKET_ACCESS_TOKEN=<oauth-access-token>CLI Usage
Global flags (all commands): --json raw JSON output, --profile <name> profile override.
# Auth & profiles
bbkt auth [--oauth] [--profile <name>] # set up credentials
bbkt status # show active profile + token health
bbkt logout # remove stored credentials
bbkt profile [use <name> | refresh] # manage profiles
# Workspaces / repos
bbkt workspaces [list | get <workspace>]
bbkt repos [list | get | create | delete]
[--query <q>] [--role <owner|admin|contributor|member>]
# Pull requests (workspace/repo inferred from git)
bbkt prs list # --state OPEN|MERGED|SUPERSEDED|DECLINED
bbkt prs get <pr-id>
bbkt prs create --title <t> --source <branch> [--destination <branch>]
bbkt prs merge <pr-id> [--strategy merge_commit|squash|fast_forward]
bbkt prs approve <pr-id>
bbkt prs decline <pr-id>
bbkt prs comments [list | add | resolve] # --content, --parent, --file, --to, --from
# Pipelines
bbkt pipelines list # --status SUCCESSFUL|FAILED|INPROGRESS
bbkt pipelines get <pipeline-uuid>
bbkt pipelines trigger --ref-name <branch> [--ref-type branch|tag|bookmark]
bbkt pipelines stop <pipeline-uuid>
bbkt pipelines steps <pipeline-uuid>
bbkt pipelines log <pipeline-uuid> <step-uuid>
# Issues
bbkt issues [list | get | create | update]
[--state] [--kind bug|enhancement|proposal|task] [--priority ...]
# Source code
bbkt source read <path> [--ref <ref>]
bbkt source tree [<path>] [--max-depth <n>]
bbkt source search <query>
bbkt source history <path>
bbkt source write <path> --content <text> [--message <m>] [--branch <b>]
bbkt source delete <path> [--message <m>]Most commands prompt interactively (via huh) when required arguments are missing. Run bbkt <command> --help for full flag details.
MCP Server
bbkt mcp launches a Model Context Protocol server for AI agents. Two transports:
Stdio (default — for Claude Desktop, Cursor, etc.)
Add to your MCP client config:
{
"mcpServers": {
"bitbucket": {
"command": "/absolute/path/to/bbkt",
"args": ["mcp"]
}
}
}By default the server reads credentials from ~/.config/bbkt/credentials.json (the profile set up via bbkt auth). To override per-client:
{
"mcpServers": {
"bitbucket": {
"command": "/absolute/path/to/bbkt",
"args": ["mcp"],
"env": {
"BBKT_PROFILE": "work"
}
}
}
}HTTP Streamable (for remote / network clients)
bbkt mcp --port 8080This serves the MCP Streamable Transport (SSE-based) on the given port.
Scope-gated tools
The MCP server calls Bitbucket's /user endpoint at startup to introspect your token's granted scopes, then silently drops any tool whose required scope is missing. This prevents the AI from confidently calling, say, manage_pipelines (pipeline scope) on a read-only token and getting a 403 it can't recover from.
To explicitly deny tools even when scopes allow them:
export BITBUCKET_DISABLED_TOOLS="manage_repositories,manage_pipelines"To skip credential loading entirely (tools will return auth-required errors when invoked — useful for testing the transport):
bbkt mcp --no-authEnvironment Variables
Variable | Purpose | Required |
| Atlassian email (despite the legacy name) — used with | Only for env-var API-token auth |
| Atlassian scoped API token | Only for env-var API-token auth |
| OAuth 2.0 bearer token (overrides stored profile) | Only for env-var OAuth |
| OAuth consumer Key | Only for |
| OAuth consumer Secret | Only for |
| Profile name override (one-shot) | No |
| Local callback port for OAuth flow (default 8976) | No |
| Comma-separated MCP tools to disable | No |
When BITBUCKET_ACCESS_TOKEN or (BITBUCKET_USERNAME + BITBUCKET_API_TOKEN) is set, the stored profile is bypassed entirely.
Tools Provided (MCP)
Tool | Operations | Required Scope |
| list, get | — |
| list, get, create, delete |
|
| list, create, delete branches and tags |
|
| list, get, diff, diffstat |
|
| read, list_directory, get_history, search, write, delete |
|
| list, get, create, update, merge, approve, unapprove, decline, diff, diffstat, commits |
|
| list, create, update, delete, resolve, unresolve |
|
| list, get, trigger, stop, list-steps, get-step-log |
|
| list, get, create, update |
|
Scopes shown are the OAuth-style names. For Atlassian API tokens, the equivalent granular scopes are read:<scope>:bitbucket / write:<scope>:bitbucket.
Development
Requires Go 1.26+.
go test ./... # unit tests
go test -tags=live ./... # live integration tests (requires BBKT_LIVE_* secrets)
golangci-lint run ./...The repo also has a docs site (Astro) under docs/ deployed to https://zach-snell.github.io/bbkt/.
License
Apache 2.0 — see LICENSE.
Available Tools
10 toolsbitbucket_apiA
Authenticated passthrough to ANY Bitbucket Cloud REST API v2 endpoint not covered by the manage_* tools above (e.g. pipelines-config/OIDC, webhooks, branch restrictions). Prefer a typed manage_* tool when one fits; use this for the long tail instead of calling the API yourself. Reads (GET/HEAD) work by default; write methods are rejected unless BBKT_API_ALLOW_WRITE is set on the server. Supports pagination and returns the raw HTTP status + JSON body.
Inputs: path (required), body, method, paginate, +1 more.
manage_commitsC
Unified tool for listing and getting commits, diffs, and diffstats
Inputs: action (required), repo_slug (required), workspace (required), page, +7 more.
manage_issuesC
Unified tool for managing repository issues (list, get, create, update)
Inputs: action (required), repo_slug (required), workspace (required), kind, +9 more.
manage_pipelinesC
Unified tool for managing Bitbucket Pipelines (list, get, trigger, stop, list-steps, get-step-log)
Inputs: action (required), repo_slug (required), workspace (required), page, +8 more.
manage_pr_commentsC
Unified tool for managing pull request comments (list, create, update, delete, resolve, unresolve)
Inputs: pr_id (required), action (required), repo_slug (required), workspace (required), +8 more.
manage_pull_requestsB
Unified tool covering all pull request operations (list, get, create, update, merge, approve, unapprove, decline, diff, diffstat, commits)
Inputs: action (required), repo_slug (required), workspace (required), page, +12 more.
manage_refsC
Unified tool for listing, creating, and deleting branches and tags
Inputs: action (required), repo_slug (required), workspace (required), name, +5 more.
manage_repositoriesC
Unified tool for listing, getting, creating, and deleting repositories
Inputs: action (required), workspace (required), page, role, +8 more.
manage_sourceC
Unified tool for source code operations (read, list_directory, get_history, search, write, delete)
Inputs: action (required), repo_slug (required), workspace (required), ref, +9 more.
manage_workspacesC
Unified tool for getting and listing Bitbucket workspaces
Inputs: action (required), page, pagelen, workspace.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each manage_* tool targets a distinct Bitbucket resource (commits, issues, pipelines, etc.) with clear operation lists, and the catch-all bitbucket_api handles everything else, ensuring no overlap.
All manage_* tools follow a consistent verb_noun pattern, but the bitbucket_api tool breaks that pattern, causing a minor inconsistency.
With 10 tools covering workspaces, repos, issues, PRs, comments, commits, pipelines, source, and refs, the count is well-scoped for a Bitbucket integration server.
The tool set provides CRUD or lifecycle operations for all major Bitbucket resources, and the bitbucket_api tool covers any remaining endpoints, leaving no obvious gaps.
Maintenance
Related MCP Connectors
Go MCP server for GitLab: 2 dynamic tools reach 1000+ REST/GraphQL actions. Free/CE, no paid tier.
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for siGit (sigit.si): browse repos, search code, manage PRs/issues, web search.
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceAccess all major Bitbucket Cloud features—repositories, pull requests, issues, branches, pipelines, deployments, and more—using a modern Rust codebase. Expose Bitbucket as Model Context Protocol (MCP) tools, ideal for bots, CI/CD, and workflow automation.-
- AlicenseAqualityDmaintenanceA fast, lightweight MCP server and CLI for Obsidian vaults built in Go. 16 multiplexed tools covering 72 actions for notes, search, templates, tasks, links, frontmatter, and vault analysis. Single binary, no plugins required.154Apache 2.0
- AlicenseBqualityCmaintenanceJira CLI & MCP Server — dual-mode Go binary for Jira Cloud with 9 tools, 4 prompts, permission introspection, and dev-status API.101Apache 2.0
- AlicenseBqualityDmaintenanceConfluence CLI & MCP Server — dual-mode Go binary for Confluence Cloud with 7 tools, folder CRUD, page diff, and write gating.81Apache 2.0