<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hugo Hebert</title>
    <description>The latest articles on DEV Community by Hugo Hebert (@hugohbrt).</description>
    <link>https://dev.to/hugohbrt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3677565%2F5066b679-e90a-4103-bace-d29da8c53911.png</url>
      <title>DEV Community: Hugo Hebert</title>
      <link>https://dev.to/hugohbrt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hugohbrt"/>
    <language>en</language>
    <item>
      <title>I built a Bitbucket CLI — and it convinced me CLIs beat MCP servers for AI agents</title>
      <dc:creator>Hugo Hebert</dc:creator>
      <pubDate>Fri, 17 Apr 2026 00:49:20 +0000</pubDate>
      <link>https://dev.to/hugohbrt/i-built-a-bitbucket-cli-and-it-convinced-me-clis-beat-mcp-servers-for-ai-agents-3emm</link>
      <guid>https://dev.to/hugohbrt/i-built-a-bitbucket-cli-and-it-convinced-me-clis-beat-mcp-servers-for-ai-agents-3emm</guid>
      <description>&lt;p&gt;GitHub has &lt;code&gt;gh&lt;/code&gt;. GitLab has &lt;code&gt;glab&lt;/code&gt;. Bitbucket Cloud has..??&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;&lt;code&gt;bb&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The obvious surface, done properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bb &lt;span class="nb"&gt;pr &lt;/span&gt;list                 &lt;span class="c"&gt;# open PRs, most recent first&lt;/span&gt;
bb &lt;span class="nb"&gt;pr &lt;/span&gt;view 42              &lt;span class="c"&gt;# details, reviewers, status — no browser&lt;/span&gt;
bb &lt;span class="nb"&gt;pr &lt;/span&gt;diff 42              &lt;span class="c"&gt;# raw diff, pipeable into less / delta / anything&lt;/span&gt;
bb &lt;span class="nb"&gt;pr &lt;/span&gt;merge 42             &lt;span class="c"&gt;# merge, squash, or fast-forward&lt;/span&gt;
bb pipeline &lt;span class="nb"&gt;wait&lt;/span&gt;           &lt;span class="c"&gt;# blocks until the current build finishes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Then I tried the lazy version first — just let the agent shell out to &lt;code&gt;bb&lt;/code&gt; directly — and never went back.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tool schemas burn context on every turn.&lt;/strong&gt; 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&lt;br&gt;
ses itself once, through &lt;code&gt;--help&lt;/code&gt;, and the agent remembers the shape. You pay the tokens once, not forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Shell is the universal tool protocol.&lt;/strong&gt; Every agent framework — Claude Code, Cursor, Aider, Codex, the next one — already knows how to run bash. &lt;code&gt;bb pr view 42&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Composition is free.&lt;/strong&gt; This is the big one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bb &lt;span class="nb"&gt;pr &lt;/span&gt;list &lt;span class="nt"&gt;--output-style&lt;/span&gt; ai | &lt;span class="nb"&gt;grep &lt;/span&gt;OPEN | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
bb pipeline latest &lt;span class="nt"&gt;--output-style&lt;/span&gt; ai | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .status
bb &lt;span class="nb"&gt;pr &lt;/span&gt;diff 42 | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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 &lt;code&gt;grep&lt;/code&gt; an MCP response. You can't pipe it into &lt;code&gt;jq&lt;/code&gt;. Every slice and dice has to be a new tool or a new argument.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. You can debug it.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Distribution is solved.&lt;/strong&gt; &lt;code&gt;npm install -g&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one thing CLIs owe to agents
&lt;/h2&gt;

&lt;p&gt;There is &lt;em&gt;one&lt;/em&gt; 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 &lt;code&gt;bb&lt;/code&gt; command has a third mode next to the defau&lt;br&gt;
lt and &lt;code&gt;--json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bb &lt;span class="nb"&gt;pr &lt;/span&gt;list &lt;span class="nt"&gt;--output-style&lt;/span&gt; ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;42  OPEN    Fix auth token refresh       hugo
41  MERGED  Add env variable endpoint    sara
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tab-separated. No colour. No borders. Set it as the default with &lt;code&gt;bb option --output-style ai&lt;/code&gt; and an agent reads the output in one pass.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @hugo-hebert/bbucket-cli
bb auth
bb &lt;span class="nb"&gt;pr &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/Hugo-Hbrt/bbucket-cli" rel="noopener noreferrer"&gt;https://github.com/Hugo-Hbrt/bbucket-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://hugo-hbrt.github.io/bbucket-cli/" rel="noopener noreferrer"&gt;https://hugo-hbrt.github.io/bbucket-cli/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dwx0mugu6eat6z8almr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dwx0mugu6eat6z8almr.gif" alt="Demo" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>bitbucket</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>I Built a VS Code Extension to Visualize JSON as Tree Diagrams</title>
      <dc:creator>Hugo Hebert</dc:creator>
      <pubDate>Thu, 25 Dec 2025 01:05:08 +0000</pubDate>
      <link>https://dev.to/hugohbrt/i-built-a-vs-code-extension-to-visualize-json-as-tree-diagrams-5g7b</link>
      <guid>https://dev.to/hugohbrt/i-built-a-vs-code-extension-to-visualize-json-as-tree-diagrams-5g7b</guid>
      <description>&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;We've all been there. You're debugging an API response, staring at a 500-line JSON file, hunting for that one nested field buried three levels deep. You're mentally matching brackets, losing your place, scrolling up and down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"profile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"notifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"frequency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"weekly"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;thing?!&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I got tired of this. So I built &lt;strong&gt;JSON Diagram Viewer&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Solution
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2c592e2wohlumspr79x4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2c592e2wohlumspr79x4.gif" alt="JSON Diagram Viewer Demo" width="600" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One click transforms your JSON into an interactive, collapsible tree diagram right inside VS Code. No more bracket matching. No more getting lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Sync&lt;/strong&gt; - Edit your JSON, watch the diagram update in real-time. No refresh needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Color-Coded Cards&lt;/strong&gt; - Objects, arrays, and primitives each have distinct colors so you can scan the structure at a glance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collapsible Nodes&lt;/strong&gt; - Click to expand/collapse any section. Focus on what matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy Path &amp;amp; Values&lt;/strong&gt; - Right-click any node to copy its JSON path (&lt;code&gt;users[0].profile.settings&lt;/code&gt;) or value.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install from the &lt;a href="https://marketplace.visualstudio.com/items?itemName=Hugo-Hbrt.json-diagram-viewer" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open any &lt;code&gt;.json&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Right-click → &lt;strong&gt;View as Diagram&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The diagram opens side-by-side with your editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Development&lt;/strong&gt; - Visualize responses from REST/GraphQL endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config Files&lt;/strong&gt; - Navigate package.json, tsconfig.json, or any complex config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Analysis&lt;/strong&gt; - Explore JSON datasets before processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt; - Understand nested state objects in React/Vue devtools exports&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;VS Code Webview API&lt;/li&gt;
&lt;li&gt;React for the rendering, bundled with Vite.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=Hugo-Hbrt.json-diagram-viewer" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Hugo-Hbrt/json-diagram-viewer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; (MIT licensed, contributions welcome!)&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What JSON visualization pain points do you have? Let me know in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>json</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
