GitHub has gh. GitLab has glab. Bitbucket Cloud has..??
It's called bb.
The obvious surface, done properly:
bb pr list # open PRs, most recent first
bb pr view 42 # details, reviewers, status — no browser
bb pr diff 42 # raw diff, pipeable into less / delta / anything
bb pr merge 42 # merge, squash, or fast-forward
bb pipeline wait # blocks until the current build finishes
When I started, the plan was: CLI first, then wrap it in an MCP server so Claude Code and Cursor could call it. MCP is the fashionable way to give an agent tools right now. Every devtool company is shipping one.
Then I tried the lazy version first — just let the agent shell out to bb directly — and never went back.
Here's why I think CLIs are actually the better interface for AI agents, and MCP is solving a problem most tools don't have.
1. Tool schemas burn context on every turn. An MCP server advertises its tools as JSON schemas that get injected into the model's context every message. Twelve tools, twelve schemas, every turn. A CLI adverti
ses itself once, through --help, and the agent remembers the shape. You pay the tokens once, not forever.
2. Shell is the universal tool protocol. Every agent framework — Claude Code, Cursor, Aider, Codex, the next one — already knows how to run bash. bb pr view 42 works the day you install it, in every tool, with zero integration code. MCP needs a client that speaks MCP. That's a non-trivial coupling for something that was always going to be a subprocess under the hood.
3. Composition is free. This is the big one:
bb pr list --output-style ai | grep OPEN | head -5
bb pipeline latest --output-style ai | jq -r .status
bb pr diff 42 | wc -l
An agent can pipe, filter, count, and chain — all using primitives it already knows. An MCP tool is a sealed function call. You can't grep an MCP response. You can't pipe it into jq. Every slice and dice has to be a new tool or a new argument.
4. You can debug it. When the agent does something weird, I run the exact command it ran and see the exact output it saw. With MCP, the agent sees a structured payload the server built, and I'm reading logs trying to reconstruct what happened.
5. Distribution is solved. npm install -g and you're done. No config file, no server process, no "restart your editor so the tool picks up." The agent inherits the tool the moment the shell does.
The one thing CLIs owe to agents
There is one place existing CLIs fall short for agents, and it's fixable: default output. Box-drawing characters and ANSI colours are hostile to a model. So every bb command has a third mode next to the defau
lt and --json:
bb pr list --output-style ai
42 OPEN Fix auth token refresh hugo
41 MERGED Add env variable endpoint sara
Tab-separated. No colour. No borders. Set it as the default with bb option --output-style ai and an agent reads the output in one pass.
That's it. That's the whole adaptation. No server, no schema, no protocol — just an output mode. You get 95% of what an MCP server gives you, with none of the integration tax.
Try it
npm install -g @hugo-hebert/bbucket-cli
bb auth
bb pr list

Top comments (0)