DEV Community

Cover image for I built a Bitbucket CLI — and it convinced me CLIs beat MCP servers for AI agents
Hugo Hebert
Hugo Hebert

Posted on

I built a Bitbucket CLI — and it convinced me CLIs beat MCP servers for AI agents

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode
42  OPEN    Fix auth token refresh       hugo
41  MERGED  Add env variable endpoint    sara
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Demo

Top comments (0)