<?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: Composio</title>
    <description>The latest articles on DEV Community by Composio (composiodev).</description>
    <link>https://dev.to/composiodev</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.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9157%2Fdf89ab52-2d48-474b-a971-087232b09f19.png</url>
      <title>DEV Community: Composio</title>
      <link>https://dev.to/composiodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/composiodev"/>
    <language>en</language>
    <item>
      <title>DeepSeek Harness (DSH) vs Pi Agent: Everything you need to know</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Wed, 09 Sep 2026 12:45:00 +0000</pubDate>
      <link>https://dev.to/composiodev/deepseek-harness-dsh-vs-pi-agent-everything-you-need-to-know-5bci</link>
      <guid>https://dev.to/composiodev/deepseek-harness-dsh-vs-pi-agent-everything-you-need-to-know-5bci</guid>
      <description>&lt;p&gt;DeepSeek released its own agent harness this August.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94hlogr3p76zinppkpo6.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94hlogr3p76zinppkpo6.png" alt="deepseek harness launch tweet" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It crossed &lt;strong&gt;66k stars in about a day (yes, sir!)&lt;/strong&gt; and went over 200k by early September. That is already pretty crazy for something that is still a developer preview.&lt;/p&gt;

&lt;p&gt;But while researching this post, I found something much more interesting. DeepSeek Harness actually uses Pi's model layer to connect to models outside DeepSeek. Yep.&lt;/p&gt;

&lt;p&gt;The new agent runtime from DeepSeek uses Pi under the hood for part of its model support. And &lt;a href="https://github.com/tianyicui" rel="noopener noreferrer"&gt;Tianyi Cui&lt;/a&gt;, who leads the Harness project, has publicly said Pi is a favourite daily driver for many people at DeepSeek. Lol.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flr8ymp1ljxib8xmw8r6x.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flr8ymp1ljxib8xmw8r6x.png" alt="dsh praise" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That makes this comparison way more fun because they agree on quite a lot. Both think the harness matters, both are open source, both let you change a lot of the runtime, and both try to avoid locking you into one model.&lt;/p&gt;

&lt;p&gt;But they take the idea in very different directions. Pi gives you a tiny coding agent with four tools and lets you build from there. DeepSeek Harness gives you a full agent runtime where even the agent loop itself can be swapped.&lt;/p&gt;

&lt;p&gt;This is going to be an interesting one. Stick to it!&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Pi&lt;/th&gt;
&lt;th&gt;DeepSeek Harness&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real tool use in our eval&lt;/td&gt;
&lt;td&gt;21/30 passed&lt;/td&gt;
&lt;td&gt;20/30 passed&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per shared success&lt;/td&gt;
&lt;td&gt;$0.031&lt;/td&gt;
&lt;td&gt;$0.028&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median time per task&lt;/td&gt;
&lt;td&gt;362.9s&lt;/td&gt;
&lt;td&gt;252.1s&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg runtime tokens in our run&lt;/td&gt;
&lt;td&gt;924,990&lt;/td&gt;
&lt;td&gt;88,562, with a catch&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity&lt;/td&gt;
&lt;td&gt;Four main tools and a tiny prompt&lt;/td&gt;
&lt;td&gt;Much larger runtime with 53 built in tools&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep runtime control&lt;/td&gt;
&lt;td&gt;Powerful TypeScript extensions around a small core&lt;/td&gt;
&lt;td&gt;Even the agent loop can be replaced&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model support&lt;/td&gt;
&lt;td&gt;25+ providers and very easy switching&lt;/td&gt;
&lt;td&gt;Broad support, partly through Pi's model layer&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local models&lt;/td&gt;
&lt;td&gt;Ollama, vLLM, and custom providers are well supported&lt;/td&gt;
&lt;td&gt;Possible, but needs more setup&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox&lt;/td&gt;
&lt;td&gt;None in the core&lt;/td&gt;
&lt;td&gt;Three built in sandbox modes&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session inspection&lt;/td&gt;
&lt;td&gt;Very readable session tree&lt;/td&gt;
&lt;td&gt;Full append only trajectory and replay&lt;/td&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily use&lt;/td&gt;
&lt;td&gt;Very small and easy to run&lt;/td&gt;
&lt;td&gt;Web UI and more setup&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maturity&lt;/td&gt;
&lt;td&gt;Mature enough for normal daily work&lt;/td&gt;
&lt;td&gt;Still a developer preview&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  In summary
&lt;/h3&gt;

&lt;p&gt;Scorecard: Pi 6, DeepSeek Harness 6. Dead tie.&lt;/p&gt;

&lt;p&gt;And the benchmark is basically a tie too. Pi passed 21 of 30 tasks and DeepSeek Harness passed 20. DeepSeek Harness was cheaper on the shared successful tasks and also finished tasks faster.&lt;/p&gt;

&lt;p&gt;But there is an important catch. DeepSeek Harness ran through DeepSeek's own endpoint. Pi ran through OpenRouter. So I would trust the pass rate and cost comparison more than I would trust a clean 10x token claim.&lt;/p&gt;

&lt;p&gt;Still, the overall result is pretty clear. Pi is the better choice if you want a coding agent you can install, understand, modify, and use every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is DeepSeek Harness?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ DeepSeek's open source agent runtime where almost every part of the agent can be replaced as a plugin.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw3ps28nmlzhfw9e277o.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw3ps28nmlzhfw9e277o.jpg" alt="dsh" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness" rel="noopener noreferrer"&gt;DeepSeek Harness&lt;/a&gt;, or &lt;code&gt;dsh&lt;/code&gt;, is DeepSeek's official agent harness. DeepSeek released it on August 13, 2026 alongside DeepSeek V4 Pro.&lt;/p&gt;

&lt;p&gt;And the basic idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent = Model + Harness&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model does the thinking. The harness handles everything around it. It gives the model tools, builds the prompt, runs shell commands, manages files, stores sessions, handles context, runs the loop, and decides how all these pieces connect.&lt;/p&gt;

&lt;p&gt;That part is normal. Claude Code, Codex, Pi, OpenCode, and basically every coding agent already has some version of this.&lt;/p&gt;

&lt;p&gt;DeepSeek did something different with how it built the runtime. It uses a plugin system called Cordis, and almost everything runs as a plugin. The model adapter is a plugin, the tools are plugins, the sandbox is a plugin, the session system uses plugins, and even the main agent loop can be replaced.&lt;/p&gt;

&lt;p&gt;Cordis also gives plugins a proper lifecycle. You can mount them from config, reload them, and clean them up when they are removed. So this is much closer to building an agent runtime from replaceable parts than adding a few extensions to a coding CLI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 DeepSeek's own docs basically say there is no special core that you need to patch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also ships several different modes. Standard gives you the full agent setup. Code mode, also called PTC, gives the model a generated TypeScript SDK for its tools. So instead of making lots of separate tool calls, the model can write one small program that calls those tools and handles the intermediate data itself.&lt;/p&gt;

&lt;p&gt;Minimal gives it basically shell plus a file editor. Creator lets the &lt;strong&gt;agent inspect and modify parts of its own runtime. 🤯&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Yes, that last one is as weird as it sounds. It is very different from most coding agents.&lt;/p&gt;

&lt;p&gt;It also comes with 53 built in tools, MCP support, subagents, LSP, web search, scheduling, sandboxing, and a local browser UI. So despite the plugin first design, this is not a tiny framework with nothing included.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Pi?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A minimal terminal coding agent that gives the model a few tools and expects you to build whatever else you want.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4w4vw92ejusbx5wh4esp.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4w4vw92ejusbx5wh4esp.jpg" alt="Pi agent" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You probably know Pi by now if you have read the other posts in this series. Mario Zechner built it after getting tired of how much stuff Claude Code kept adding.&lt;/p&gt;

&lt;p&gt;Pi goes almost completely in the other direction. The model gets &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, and &lt;code&gt;bash&lt;/code&gt;. The system prompt stays under roughly 1,000 tokens. And that is most of the product.&lt;/p&gt;

&lt;p&gt;Need grep? Use bash. Need Git? Use bash. Need another tool? Write a TypeScript extension. Need a whole new workflow? Ask Pi to build the extension for you.&lt;/p&gt;

&lt;p&gt;The project now lives under &lt;a href="https://github.com/earendil-works/pi" rel="noopener noreferrer"&gt;Earendil&lt;/a&gt;, has around 100k GitHub stars, and is still open source and MIT licensed.&lt;/p&gt;

&lt;p&gt;The interesting part is that Pi is not small because nobody built more features yet. It is small because that is the actual design. Every extra tool schema and every extra instruction costs tokens on future model calls, so Pi tries to keep the default harness small.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness "kinda" agrees with some of this, but there's a whole lot to it.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://composio.dev/content/pi-agent-vs-claude-code" rel="noopener noreferrer"&gt;Pi vs Claude Code&lt;/a&gt;, &lt;a href="https://composio.dev/content/pi-vs-opencode" rel="noopener noreferrer"&gt;Pi vs OpenCode&lt;/a&gt;, &lt;a href="https://composio.dev/content/pi-vs-omp" rel="noopener noreferrer"&gt;Pi vs OMP&lt;/a&gt;, &lt;a href="https://composio.dev/content/pi-agent-vs-codex" rel="noopener noreferrer"&gt;Pi vs Codex&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Philosophy: Pi vs DeepSeek Harness
&lt;/h2&gt;

&lt;p&gt;This is probably the most interesting part of the whole comparison because at first they look very similar. Both are open source, both are written mostly in TypeScript, both have the concept of extensions, and both want the model layer to stay flexible.&lt;/p&gt;

&lt;p&gt;And DeepSeek Harness literally uses Pi's model layer for its broad provider support.&lt;/p&gt;

&lt;p&gt;But they disagree on what the starting point should look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi starts tiny
&lt;/h3&gt;

&lt;p&gt;Pi has a small core agent loop. That loop stays pretty simple and extensions can change almost everything around it.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2f2uskxptl9oy67s6l7.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2f2uskxptl9oy67s6l7.png" alt="pi core" width="800" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea is that the model already knows how to code. So give it file access, shell access, editing, and enough freedom to work. Then stop adding stuff unless the user actually needs it.&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepSeek Harness starts from replaceable parts
&lt;/h3&gt;

&lt;p&gt;It splits the runtime into parts and lets you swap those parts through Cordis. Pi gives you a small core and says, build around this. DeepSeek Harness gives you a way to replace its parts too.&lt;/p&gt;

&lt;p&gt;Even the actual loop works differently from an extension point of view. DeepSeek Harness fires events through each turn, such as &lt;code&gt;turn/start&lt;/code&gt;, &lt;code&gt;system-prompt/assemble&lt;/code&gt;, &lt;code&gt;tools/pre-execute&lt;/code&gt;, and &lt;code&gt;turn/end&lt;/code&gt;. A plugin can hook into these points, change messages, add behaviour, or stop a tool before it runs.&lt;/p&gt;

&lt;p&gt;That is a lot deeper than adding another command or tool.&lt;/p&gt;

&lt;p&gt;That sounds like a small difference. It is actually the whole comparison.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Pi is easier to understand. DeepSeek Harness gives you deeper control (&lt;strong&gt;Deep&lt;/strong&gt;Seek gives you &lt;strong&gt;deep&lt;/strong&gt;er control, what a nice rhyme to the name itself 🫡).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is another interesting part here. DeepSeek used its own Minimal mode for its public V4 coding benchmarks. Minimal mode is basically shell, a file editor, and a tiny system prompt.&lt;/p&gt;

&lt;p&gt;So even DeepSeek's own benchmark setup gets pretty close to the same minimal idea Pi has been pushing from the start.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Architecture: four tools vs basically the whole runtime
&lt;/h2&gt;

&lt;p&gt;Underneath, both still do the normal agent thing. You send a task, the model responds, it calls tools, the harness runs them, the results go back to the model, and this repeats until the model finishes.&lt;/p&gt;

&lt;p&gt;The difference is everything around that loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi Agent
&lt;/h3&gt;

&lt;p&gt;Pi runs as one small process. It has the model layer, the agent loop, the terminal UI, session handling, and the extension system.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69ohu7sng0ofdzyix116.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69ohu7sng0ofdzyix116.png" alt="Pi agent architecture" width="800" height="933"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Its session format is also pretty neat. Messages form a tree (&lt;code&gt;/tree&lt;/code&gt; slash command), so you can jump back to an old point and continue in another direction without throwing away the old path. And because the core is small, you can actually open the source and follow what is happening.&lt;/p&gt;

&lt;p&gt;It is one of Pi's best features, at least for me.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftztrgewzifvzrjj3cpl5.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftztrgewzifvzrjj3cpl5.png" alt="pi /tree praise" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pi extensions are also just TypeScript files. You can put them inside &lt;code&gt;~/.pi/agent/extensions/&lt;/code&gt; and use them to add tools, block calls, change context, replace compaction behaviour, or add your own TUI stuff.&lt;/p&gt;

&lt;p&gt;That is a very simple way to extend a coding agent because you do not need to understand a big plugin runtime first.&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepSeek Harness
&lt;/h3&gt;

&lt;p&gt;DeepSeek Harness is much bigger, and it does much more. It has a full plugin graph, sandboxing, subagents, MCP, scheduling, compaction, a browser UI, an append only session log, replay, and much more.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9ypg2bufdwscf8ujg08.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9ypg2bufdwscf8ujg08.png" alt="dsh architecture" width="800" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The session system is probably my favourite part. Every model visible event gets logged. So if the model saw something, there should be a record of it. You can inspect the trajectory later and see what happened, or replay and fork sessions from the stored events.&lt;/p&gt;

&lt;p&gt;There is a technical reason for doing this too. DeepSeek Harness does not go back and rewrite old session history. It keeps appending new events instead.&lt;/p&gt;

&lt;p&gt;That makes it easier to keep the beginning of the model context stable, which is useful for DeepSeek's prefix caching.&lt;/p&gt;

&lt;p&gt;That is very useful if you are building agent infrastructure.&lt;/p&gt;

&lt;p&gt;I would take Pi for understanding my own coding session. I would take DeepSeek Harness if I were building a system that runs thousands of agent sessions and I needed to inspect exactly what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The benchmark: same model, different harness
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjiaz0mg0ntpt7ur2ojc5.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjiaz0mg0ntpt7ur2ojc5.png" alt="bench summary" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the part I was most curious about. We ran 30 hard agent tool use tasks across the harnesses.&lt;/p&gt;

&lt;p&gt;The agent has to work with real apps and real data through tools, and then our verifier checks whether it actually completed the job. Each task had a 900 second cap.&lt;/p&gt;

&lt;p&gt;For this run, we used DeepSeek V4 Pro.&lt;/p&gt;

&lt;p&gt;Here is what happened:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;Tasks passed&lt;/th&gt;
&lt;th&gt;Median time&lt;/th&gt;
&lt;th&gt;Avg runtime tokens&lt;/th&gt;
&lt;th&gt;Cost per shared success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;td&gt;21/30&lt;/td&gt;
&lt;td&gt;362.9s&lt;/td&gt;
&lt;td&gt;924,990&lt;/td&gt;
&lt;td&gt;$0.031&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;td&gt;20/30&lt;/td&gt;
&lt;td&gt;252.1s&lt;/td&gt;
&lt;td&gt;88,562&lt;/td&gt;
&lt;td&gt;$0.028&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pi won by one task. That is basically a tie on quality. Pi passed &lt;strong&gt;21/30 tasks&lt;/strong&gt;, while DeepSeek Harness passed &lt;strong&gt;20/30&lt;/strong&gt;.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepei1dnqdka0hcl5ymdr.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepei1dnqdka0hcl5ymdr.jpg" alt="pass rate of harnesses" width="679" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that matters because DeepSeek built Harness around its own model. You might expect the first party harness to have some huge advantage. It did not. Pi actually finished one more task.&lt;/p&gt;

&lt;p&gt;But pass rate is only one part of the story.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness also came out slightly cheaper. It cost around &lt;strong&gt;$0.028 per shared success&lt;/strong&gt;, compared to &lt;strong&gt;$0.031 for Pi&lt;/strong&gt;. OpenCode was very close at $0.032, while Claude Code came out much higher at $0.074.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknkuee7x7c3ylkhqmsq4.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknkuee7x7c3ylkhqmsq4.jpg" alt="cost per success comparison of all harnesses" width="679" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference gets more interesting when you look at speed.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness had a median time of &lt;strong&gt;252.1 seconds per task&lt;/strong&gt;, while Pi took &lt;strong&gt;362.9 seconds&lt;/strong&gt;. Claude Code was the fastest at 181.8 seconds, but it also cost much more per successful task.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2iytmz1dkiszqypp1hh.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2iytmz1dkiszqypp1hh.jpg" alt="median time of harnesses" width="680" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So DSH did not beat Pi on task success, but it was faster and slightly cheaper in this run.&lt;/p&gt;

&lt;p&gt;Then look at the runtime token column. That number is wild.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness recorded about &lt;strong&gt;88k runtime tokens per task&lt;/strong&gt;. Pi recorded about &lt;strong&gt;925k&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Again, there is a provider routing catch here, and I will get into it in a second. But DSH clearly ran DeepSeek V4 Pro very efficiently on its native route.&lt;/p&gt;

&lt;h3&gt;
  
  
  The task split is also interesting
&lt;/h3&gt;

&lt;p&gt;Most of the tasks ended the same way for Pi and DSH. Pi and DeepSeek Harness agreed on 27 of the 30 outcomes. The entire 21 vs 20 difference came down to three tasks.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folx429e1ly2j464nzrwg.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folx429e1ly2j464nzrwg.jpg" alt="task split" width="680" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pi passed the CRM migration archive task while DeepSeek Harness failed it. Pi also passed the handover audit while DeepSeek Harness failed that one. DeepSeek Harness got the Sheets to Airtable tracker right while Pi failed it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Pi&lt;/th&gt;
&lt;th&gt;DeepSeek Harness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRM migration archive&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handover audit&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sheets to Airtable tracker&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bigger chart is useful because it shows that this did not only happen between Pi and DSH. The same DeepSeek model changed behaviour when we moved it between Claude Code, OpenCode, Hermes, Pi, and DeepSeek Harness.&lt;/p&gt;

&lt;p&gt;For example, Claude Code cleared every check on the renewal screen task while Pi and DSH only cleared 5 of 11. On Slack action items, Pi, DSH, Claude Code, and Hermes all passed, while OpenCode only cleared 2 of 5 checks.&lt;/p&gt;

&lt;p&gt;So we did not see one harness destroying the others across every kind of work. The same model behaved differently depending on the harness around it.&lt;/p&gt;

&lt;p&gt;And I think that is the important result. The harness changed efficiency a lot. It changed speed. It changed cost. And on some tasks, it changed whether the model actually finished the job.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Same model. Almost the same pass rate. Very different runtime behaviour.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  So did DeepSeek Harness really use 10x fewer tokens?
&lt;/h3&gt;

&lt;p&gt;The raw table makes it look like Pi is eating up tokens, but that is not really the full story.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness used DeepSeek's official endpoint, while Pi used OpenRouter. That changes how caching and token usage get reported.&lt;/p&gt;

&lt;p&gt;Pi also has a much smaller base prompt. One separate comparison measured around &lt;strong&gt;4.5k uncached input for Pi&lt;/strong&gt; against &lt;strong&gt;47.6k for DSH&lt;/strong&gt; on the first turn. Pi keeps the prefix tiny, while DSH keeps a much larger prefix stable and gets strong cache reuse from it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 They are solving the same token problem in different ways.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And once you look at actual cost per success, the gap is tiny: &lt;strong&gt;$0.028 for DSH vs $0.031 for Pi&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So DSH was very efficient in our run, but I would not treat the 88k vs 925k token number as a clean 10x win.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. DeepSeek Harness uses Pi
&lt;/h2&gt;

&lt;p&gt;This still makes me laugh. 🥴&lt;/p&gt;

&lt;p&gt;For DeepSeek models, DSH has its own model adapter. Makes sense. That adapter understands things like DeepSeek reasoning levels and cache usage.&lt;/p&gt;

&lt;p&gt;But when it needs other model support, it can use an adapter built on Pi's &lt;code&gt;pi-ai&lt;/code&gt; layer.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftaj3ow1vffc4ieewemhl.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftaj3ow1vffc4ieewemhl.png" alt="dsh uses pi under the hood" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So DSH can connect to Anthropic, OpenAI, Gemini, Bedrock, Vertex, Azure, Codex, and other providers through the model work Pi already did.&lt;/p&gt;

&lt;p&gt;That tells you quite a lot about Pi. It looks like a tiny terminal coding agent from the outside, but its model layer has become super useful infrastructure on its own.&lt;/p&gt;

&lt;p&gt;DeepSeek could have written another provider abstraction. It reused Pi's.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 I would probably do the same thing. Why not?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Pi still wins on model flexibility
&lt;/h3&gt;

&lt;p&gt;Pi has had much more time to build this part out. It works with 25 plus providers, local models, OpenRouter, Ollama, vLLM, cloud providers, and custom compatible endpoints. You can also switch models during a session.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness can work with many of the same providers, but the whole product still feels very "DeepSeek first." And that is fine.&lt;/p&gt;

&lt;p&gt;If you mainly use V4 Pro or V4 Flash, DSH has a real advantage because its native DeepSeek adapter understands the provider directly.&lt;/p&gt;

&lt;p&gt;If you change models often, run local models, or use different cloud providers, Pi is easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Extensibility
&lt;/h2&gt;

&lt;p&gt;Pi is one of the most hackable coding agents I have used. Its extensions run in TypeScript inside the same process. They can change tools, add UI, inject context, block tool calls, store custom state, and so much more...&lt;/p&gt;

&lt;p&gt;And because the codebase is small, Pi can often write its own extension when you ask it to. That is still very cool.&lt;/p&gt;

&lt;p&gt;A basic Pi extension can just live in &lt;code&gt;~/.pi/agent/extensions/&lt;/code&gt;. You do not need to learn a separate framework before adding one tool or one hook.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qhcjpt5xrz9ids0jvo8.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qhcjpt5xrz9ids0jvo8.png" alt="dsh plugins" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But DeepSeek Harness goes further. With DSH, the loop itself can be a plugin. So can the sandbox, model handling, context management, and a lot of the runtime around them.&lt;/p&gt;

&lt;p&gt;A Cordis plugin can join the runtime's dependency graph, expose a service, listen to agent events, and clean itself up when it gets removed. That is more work for a simple extension, but it gives you much deeper control.&lt;/p&gt;

&lt;p&gt;The agent can even inspect its own plugin tree and, in Creator mode, experiment with runtime changes. That is more control. It is also more stuff to understand and tbh, most of it is something I don't know at all.&lt;/p&gt;

&lt;p&gt;If you are researching agent loops, building your own agent product, testing new context systems, or replacing parts of the runtime itself, DSH gives you way more room.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Pi is a lot easier to extend. DSH is the deeper thing to change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Safety and Security
&lt;/h2&gt;

&lt;p&gt;Pi is chill about permissions. The agent gets your user permissions and can run commands. There is no big built in approval system protecting you from every shell command.&lt;/p&gt;

&lt;p&gt;You can add safety through extensions or run Pi inside a container or VM, but the core itself does not try to do much here.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness comes with actual sandbox modes. It can run read only, it can allow writes inside the workspace, or you can give it full access.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04z7366ipo5zbsesh5sb.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04z7366ipo5zbsesh5sb.png" alt="dsh vs pi safety and security" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is not just a UI permission setting. On Linux, DSH can use &lt;code&gt;bwrap&lt;/code&gt; and Landlock. On macOS, it uses Seatbelt. Windows uses a restricted token model.&lt;/p&gt;

&lt;p&gt;The sandbox also tries to fail closed. If DSH expects a sandbox and cannot create one, it should not silently continue with full access.&lt;/p&gt;

&lt;p&gt;That is a real DSH win.&lt;/p&gt;

&lt;p&gt;There are two catches though.&lt;/p&gt;

&lt;p&gt;The sandbox controls tool execution, but plugins themselves run inside the harness process. So if you install a random third party plugin, you are still trusting that code with serious access to your machine.&lt;/p&gt;

&lt;p&gt;And DeepSeek itself says the sandbox has not been security audited yet.&lt;/p&gt;

&lt;p&gt;So I would still be careful with unattended runs, but DSH gives you much stronger safety defaults than Pi.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The biggest DSH problem right now is maturity
&lt;/h2&gt;

&lt;p&gt;This is where the comparison stops being close for me.&lt;/p&gt;

&lt;p&gt;Pi has been around for more than a year. People use it every day. OpenClaw runs on it. And the core is stable enough that people build real workflows around it.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness launched in August. It is still a developer preview and warns that &lt;strong&gt;compatibility breaking changes will happen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And those changes are actually happening. The project pushed several alpha versions within days, and community reports have already found plugin breaks and many more issues.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakos03znakshv0b7k4jc.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakos03znakshv0b7k4jc.png" alt="dsh issues in the production build" width="799" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also one governance thing worth knowing. GitHub Issues are disabled right now, and DeepSeek is not accepting outside pull requests yet. Feedback mainly goes through Discussions and Discord.&lt;/p&gt;

&lt;p&gt;That does not make the project bad, especially this early. But if I am deciding which open source agent I want to build on today, that matters.&lt;/p&gt;

&lt;p&gt;This is normal for a project this new, but it changes who I would recommend it to.&lt;/p&gt;

&lt;p&gt;I would happily use DSH to experiment with agent architecture today. I would not build an important production workflow around a runtime that is still telling me its interfaces can break.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Daily use
&lt;/h2&gt;

&lt;p&gt;This one is pretty simple.&lt;/p&gt;

&lt;p&gt;Pi is a pretty regular agent that opens in the terminal. You pick a model and start working. The whole thing feels small because &lt;strong&gt;it is small&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DeepSeek Harness starts a local web app by default. You run it and open the UI in your browser. The official command is basically one &lt;code&gt;npx&lt;/code&gt; call, so installation itself is not hard.&lt;/p&gt;

&lt;p&gt;But once you start changing profiles, plugins, providers, Cordis config, sandbox settings, and runtime parts, there is much more to learn.&lt;/p&gt;

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

&lt;p&gt;Pi can get you to a useful coding task in a few minutes. DSH needs more setup and its docs make much more sense once you already understand agent infrastructure.&lt;/p&gt;

&lt;p&gt;That is also why I do not really see DSH replacing Pi for normal users right now. It solves a bigger problem, and bigger does not automatically mean better. 🤷‍♂️&lt;/p&gt;




&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;p&gt;Pick Pi if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You mainly want a coding agent&lt;/li&gt;
&lt;li&gt;You want something small enough to understand&lt;/li&gt;
&lt;li&gt;You use many different model providers&lt;/li&gt;
&lt;li&gt;You run local models&lt;/li&gt;
&lt;li&gt;You care about keeping the fixed prompt tiny&lt;/li&gt;
&lt;li&gt;You want a clean TypeScript extension system&lt;/li&gt;
&lt;li&gt;You want something mature enough to use every day&lt;/li&gt;
&lt;li&gt;You would rather add the few features you need than start with 50 tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick DeepSeek Harness if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building agent infrastructure&lt;/li&gt;
&lt;li&gt;You want to replace the agent loop itself&lt;/li&gt;
&lt;li&gt;You need strong session traces and replay&lt;/li&gt;
&lt;li&gt;You want a built in sandbox&lt;/li&gt;
&lt;li&gt;You want MCP, subagents, LSP, and more tooling out of the box&lt;/li&gt;
&lt;li&gt;You mainly use DeepSeek models and want the native integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you can obviously run both. They are free and open source. They even share some code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The scorecard says 6 to 6. Our benchmark says Pi 21, DeepSeek Harness 20. That is as close as it gets.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2odm54lgfcbl5zb8ouvg.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2odm54lgfcbl5zb8ouvg.png" alt="dsh vs pi summary" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I do not think these two are actually fighting for the same user yet.&lt;/p&gt;

&lt;p&gt;Pi feels like a coding agent made by someone who wanted the tool to stay out of his way. DeepSeek Harness feels like something built by people who want to inspect and change every part of how an agent works. Both are right. It depends on your preference. 💁&lt;/p&gt;

&lt;p&gt;For normal coding, I would pick Pi today. It is smaller, easier to understand, and works with basically anything. It actually passed one more task in our run.&lt;/p&gt;

&lt;p&gt;For agent infrastructure work, DSH is way more interesting. Being able to swap the loop, sandbox, model layer, and other runtime parts without rebuilding the whole agent is genuinely useful.&lt;/p&gt;

&lt;p&gt;And DSH is still very new. It shipped all of this in a developer preview. If DeepSeek can make the runtime stable without losing the parts that make it interesting, I think it is going to be worth watching.&lt;/p&gt;

&lt;p&gt;For now, I just would not treat it like a daily driver yet. DeepSeek itself tells you it is a developer preview.&lt;/p&gt;

&lt;p&gt;So yeah. If I just want to code, I am still picking Pi. ✌️&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;SDE • GOLD @Microsoft Student Ambassador • Prev Lead Collab and Dev-Team Lead @oppiaorg • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>A Beginners Guide to Grok Bot: From Theory to Building Agent Swarms</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Sun, 23 Aug 2026 05:08:50 +0000</pubDate>
      <link>https://dev.to/composiodev/a-beginners-guide-to-grok-bot-from-theory-to-building-agent-swarms-4k59</link>
      <guid>https://dev.to/composiodev/a-beginners-guide-to-grok-bot-from-theory-to-building-agent-swarms-4k59</guid>
      <description>&lt;p&gt;Grok Bot launched on August 11, 2026, and it caught my attention for one simple reason. You can create persistent AI teammates, give them access to a cloud computer, and let them continue working after you close your laptop.&lt;/p&gt;

&lt;p&gt;I wanted to understand how far that idea could go. A research Bot is useful, but what happens when four Bots have separate roles, share context, use the same external tools, and pass work between themselves?&lt;/p&gt;

&lt;p&gt;So I started from the basics. I wanted to understand what Grok Bot actually does, how the system works, and what changes when you give these Bots access to real tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Grok Bot?
&lt;/h2&gt;

&lt;p&gt;Grok Bot is SpaceXAI's early-beta product for persistent AI agents. It launched on August 11, 2026, after starting as an internal prototype that SpaceXAI teams used for sales, marketing, operations, and engineering work.&lt;/p&gt;

&lt;p&gt;A Bot is a persistent, named agent. You message it from the Grok Bot app, give it a job and access to the required tools, and it can continue working on a cloud computer while your own computer is offline.&lt;/p&gt;

&lt;p&gt;This release also has some useful history:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SpaceXAI added scheduled Automations to Grok in July,&lt;/li&gt;
&lt;li&gt;Then added large parallel workflows to Grok Build.&lt;/li&gt;
&lt;li&gt;Finally, Grok Bot brings several related ideas into a teammate-style interface where persistent agents can coordinate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok Bot currently works on macOS, Windows, and iPhone. Initial access includes SuperGrok Heavy, Cursor Ultra, and eligible Cursor team plans, while enterprise availability is still rolling out. Linux desktop, Android, and iPad were not supported at the initial launch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Grok Bot features
&lt;/h2&gt;

&lt;p&gt;The interesting part is how these pieces work together, because Grok Bot combines persistent execution, computer use, tools, and multiple Bots inside one product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistent cloud computer:&lt;/strong&gt; Your Bots work on a cloud computer with browser access, files, and command-line tools. Work can continue after you close your laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared workspace:&lt;/strong&gt; All Bots on your account share the same cloud computer, files, browser sessions, and command-line credentials. Each Bot has a separate screen for parallel computer work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer use:&lt;/strong&gt; Bots can work through websites when a connector or clean API is unavailable. Some sites can still block automation or require a CAPTCHA or human confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins and MCP:&lt;/strong&gt; Grok Bot can use connectors, plugins, and MCP servers for structured tool access. xAI recommends a connector when one is available because it can give the Bot a more reliable integration path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Bot collaboration:&lt;/strong&gt; You can put two to six Bots into a group chat. They can message each other, pass ownership, and continue work without you manually moving information between chats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills:&lt;/strong&gt; A successful process can become a reusable skill with steps, decision rules, output requirements, and approval boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routines:&lt;/strong&gt; A Bot can run workflows on a schedule or, where supported, after an event.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teach a task:&lt;/strong&gt; Where the feature is enabled, you can perform a browser workflow once while the Bot watches. Grok Bot then creates a draft skill that you can review and test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approvals:&lt;/strong&gt; You can require approval for actions such as sending messages, publishing content, deleting data, purchasing, or changing production systems. Passwords, 2FA codes, CAPTCHAs, and similar steps stay with the human through computer takeover.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives us the product surface. The next question is what actually happens underneath when you send one of these Bots a task.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Grok Bot works
&lt;/h2&gt;

&lt;p&gt;SpaceXAI has documented Grok Bot's public execution model, but it has not published the complete internal orchestration code. &lt;/p&gt;

&lt;p&gt;So the diagram below is a &lt;strong&gt;conceptual architecture&lt;/strong&gt; based on documented Grok Bot behaviour, arranged in layers similar to an OpenManus-style agent architecture, that I tried.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn3rbx7ka7kw8m8mtcbsq.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn3rbx7ka7kw8m8mtcbsq.png" alt="Architecture" width="800" height="1955"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main detail to remember is the shared computer. Your Bots can have separate roles and screens, but files, browser sessions, and command-line credentials on that cloud machine can be available to all of them.&lt;/p&gt;

&lt;p&gt;xAI also says not to treat separate Bots as separate security boundaries.&lt;/p&gt;




&lt;h3&gt;
  
  
  Shared context vs individual Bot memory
&lt;/h3&gt;

&lt;p&gt;One thing I didn't realise at first is that sharing one computer doesn't mean every Bot has the same memory.&lt;/p&gt;

&lt;p&gt;Each Bot can keep its own role, stable preferences, and summaries from earlier work. Its conversation and learned context stay separate, while shared files, browser sessions, group messages, and direct handoffs can move context between Bots.&lt;/p&gt;

&lt;p&gt;This becomes useful when you start building a swarm. In my company simulation, each agent keeps its own role and persona while shared work still moves between them.&lt;/p&gt;

&lt;p&gt;I later saw Nate Herk use a similar approach. He separates information that should be available to the wider agent setup from context that should stay with one Bot. &lt;/p&gt;

&lt;p&gt;For important or changing facts, xAI also recommends checking the current source rather than relying only on Bot memory.&lt;/p&gt;

&lt;p&gt;That architecture also explains why setup is fairly short. Next, let's look at how to set up Grok Bot.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to set up Grok Bot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Check access
&lt;/h3&gt;

&lt;p&gt;You need an eligible Grok Bot account. Current documented options include SuperGrok Heavy, Cursor Ultra, eligible team access, and some trial access.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfwt26u367mzsqk65ae2.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfwt26u367mzsqk65ae2.png" alt="Step 1" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Install Grok Bot
&lt;/h3&gt;

&lt;p&gt;Download the Grok Bot desktop app for macOS or Windows and sign in with your Cursor account.&lt;/p&gt;

&lt;p&gt;On iPhone, you can use the Grok Bot companion app. The same Bots and conversations sync between supported signed-in devices.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fez1srcwpij0bxjzpgbz3.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fez1srcwpij0bxjzpgbz3.png" alt="Step 2" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create your first Bot
&lt;/h3&gt;

&lt;p&gt;Select a suggested role or create your own.&lt;/p&gt;

&lt;p&gt;Give it a short name, one main job, and a clear description of how it should work. xAI recommends focused Bots because a focused role gives the Bot more useful context over time.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name: Researcher

Job: Competitive research

Description:
Research AI agent products using public sources.
Keep direct source links for every important claim.
Separate verified facts from assumptions.
Do not publish or send anything externally.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be your 1st prompt; it sets the persona, goals, tasks, and role. See the title changed to Name: Researcher&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg9ufws41459bhphkwrxg.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg9ufws41459bhphkwrxg.png" alt="Step 3" width="799" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Give it a real task
&lt;/h3&gt;

&lt;p&gt;A useful first prompt should tell the Bot the result you want, the sources it can use, its limits, the output format, and when you want to review its work.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find the five most important AI agent platform announcements
from the last seven days.

Use public sources only.

Return:
1. Product
2. Announcement
3. Date
4. Source
5. Why it matters

Do not publish or send anything.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is enough for basic research. But things become less convenient when one workflow needs several external tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Add Composio when your Bot requires secure access to apps you use
&lt;/h3&gt;

&lt;p&gt;Grok Bot can sign into websites through its browser, and it can also use connectors and plugins. Browser access is flexible, but xAI recommends using a connector when one exists because structured integrations are more reliable.&lt;/p&gt;

&lt;p&gt;If you only need one website, signing in directly can be fine. If your workflow moves between GitHub, Slack, Gmail, Linear, Salesforce, Notion, and other services, managing every connection separately becomes more work.&lt;/p&gt;

&lt;p&gt;This is where I added Composio.&lt;/p&gt;

&lt;p&gt;Composio is available as a Grok Bot plugin, and Composio currently exposes tool discovery and execution across more than 1,000 apps. Its authentication layer supports user-scoped OAuth connections and automatic token refresh for supported services.&lt;/p&gt;

&lt;p&gt;Install the Composio plugin&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Settings → Plugins → Marketplace&lt;/code&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpyc1hf7r8wed2x7hess.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpyc1hf7r8wed2x7hess.png" alt="Image 4-1" width="799" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search for Composio and install it.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwl5j3yodmnd2yv9qauti.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwl5j3yodmnd2yv9qauti.png" alt="Step 4-2" width="799" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grok Bot's plugin settings are the place where supported connectors and packaged skills are discovered and managed. The same applies to other supported tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Connect tools only when you need them
&lt;/h3&gt;

&lt;p&gt;Most people ask, why do I connect to Composio when I can connect with their own provided connector? The answer is simple: safety, context, security, efficiency and usability.&lt;/p&gt;

&lt;p&gt;You don't need to connect every app before you start.&lt;/p&gt;

&lt;p&gt;With Composio, the agent can discover tools when a task needs them. When an app requires authentication, the connection flow can ask you to approve the account in your browser and then reuse that connection later.&lt;/p&gt;

&lt;p&gt;For public research, there is also a useful option. Composio Search is a no-auth toolkit for web, news, location, financial, and other public search data.&lt;/p&gt;

&lt;p&gt;This keeps the Grok Bot setup fairly simple even when a workflow needs more than one external service.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-world Grok Bot use cases with Composio
&lt;/h2&gt;

&lt;p&gt;I was so into testing and pushing the limits that I planned to simulate an entire company.&lt;/p&gt;

&lt;p&gt;The idea was to fetch a company's top individuals, analyse their personas and simulate decision-making within the organisation. Something many CTOs, CXOs, and CEOs often do in silos. &lt;/p&gt;

&lt;p&gt;So if you are one, this might help.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Finding personas
&lt;/h3&gt;

&lt;p&gt;I went to Reddit and X, looked at people's past tweets and company registration docs, and also the company website itself; based on all that, I generated a persona for each. Prompt I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Give me a list of all the top members at &amp;lt;company&amp;gt; and their roles as well - fetch from X, Reddit, the company Teams page and the company registration. Output (bullet point):
&amp;nbsp;
Name - job role and one-liner description
&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;Ok, based on people's bios, tweets, Reddit posts, replies, and content-posting behaviours, create a persona for each one. I want it to closely match their online and offline presence.
&amp;nbsp;
Output: name as section title. Person: 3-5-liner short sentences.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Creating Swarm Agent Prompt&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, I used the generated persona to create a prompt that generates a swarm of agents in Grok Bot. This is the prompt I used. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: To keep things specific and simple, I have used the composio connector keyword. This will make the agent swarm aware of the plugin&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cool, now I am giving you a prompt; you need to modify it and include the persona of core members, and while building the agents for them, the core goal is to simulate &amp;lt;company&amp;gt;. Also, use Composio as the connector for outside apps when needed; if it is not connected, prompt the user to connect it.
&amp;nbsp;
The aim here is to replicate the entire company so that I can talk to any of the people (agent with that person's persona) and then finalise the decisions/task that need to be performed (routes to the right agent personas/role - can be multiple as well). I want to simulate the entire &amp;lt;company&amp;gt; inside Grok bot.

//// Prompt to modify: 

Create an entire company inside Grok Bot with CEO, Manager, Researcher, Engineer, Marketing specialist, Worker 1, Worker 2. Give everyone their own role, duties and responsibilities.” Output: Agents interact, coordinate, and improve skills autonomously (video demo of behaviour).
&amp;nbsp;
Original: https://x.com/Debuggerdam/status/2087304735535554808 \   

///Important (Output Format)

Output the entire updated prompt, without placeholders, that I can put in Grok Bot to create the agent and do this simulation thing. Format it into multiple paragraphs, and for names, use the same role
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates a prompt that one can put in Grok Bot.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Creating the Swarm&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: The swarm creation is a heavy token usage process, so best be on the max / super grok plan and take time to optimize, remove all the unnecessary personas and workflow, as grok now went into weekly limit mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now I added the generated prompt and let it execute in auto mode. In a few minutes, the entire agent swarm was ready.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fubd8yaym093y36dok4b7.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fubd8yaym093y36dok4b7.png" alt="Swarm Agent" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates a swarm activated by the prompting in the current chat/ to an individual agent. &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test Time!
&lt;/h3&gt;

&lt;p&gt;I added the task next: A New Eval Launch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Hey team, I need help with this:

We’re launching a new public eval report next week comparing the top 5 coding agents (Claude Code, Cursor, Codex, OpenCode, and our own setup) on real multi-app workflows (GitHub + Linear + Slack + Gmail).

I want:

1. **Alice and Bob** to decide the positioning and what message we should own.
2. **Charlie** to design the exact eval criteria and failure modes we should measure.
3. **Delta** to prototype a small internal agent that can run parts of the eval using **&amp;lt; company&amp;gt;**.
4. **Echo and Bravo** to draft the narrative + the first blog post / announcement.
5. Anyone who needs external tools (GitHub, Linear, etc.) should use **&amp;lt; company&amp;gt;**. If something isn’t connected, just tell me what to connect.

Can you align on the plan, assign owners, and come back with a clear and clean output?

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the prompt went in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent analysed the steps required,&lt;/li&gt;
&lt;li&gt;Distributed them according to its role and persona.&lt;/li&gt;
&lt;li&gt;Communicate with others while keeping its specific task running in parallel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it hits a roadblock: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wait for the previous task to finish, then start executing it, and&lt;/li&gt;
&lt;li&gt;finally provide the result along with the summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the worst happens: the weekly limit is exceeded, and the agent gets stuck mid-task (same goes for Hermes and Codex). This is the drawback I mentioned at the start of this section. &lt;/p&gt;

&lt;p&gt;However, this is how it looked mid-task.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fch88sjsszv1a8wsekvwg.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fch88sjsszv1a8wsekvwg.png" alt="Test GrokBot" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we explicitly mentioned composio, the agent checked the pre-blocker - Slack and Linear were not connected, so it asked to connect them with a one-click connect option while other agents were working in parallel.&lt;/p&gt;

&lt;p&gt;I was truly amazed by what I could do with simple English instructions.  The only bottleneck is the weekly limit, which hits fast for swarm agentic flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus Tasks (Use Cases)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I have not personally run or verified the tasks below end to end. Treat these as inspiration / ideas for what you can build, not as guaranteed implementations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are a few more ways you could push Grok Bots beyond simple single-agent workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Competitive intelligence swarm:&lt;/strong&gt; Use four specialised bots to research AI agent platforms, collect pricing and feature data, rank competitors, and produce an executive brief.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source project audit:&lt;/strong&gt; Give one bot a public GitHub repository and have it analyse recent commits, active issues, risks, and remediation priorities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market trend synthesis:&lt;/strong&gt; Research recent AI agent announcements and discussions, structure the findings into a dataset, identify market segments, and forecast emerging trends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent research pipeline:&lt;/strong&gt; Have separate bots discover sources, verify claims, score evidence quality, and combine everything into a timeline and gap analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous code generation:&lt;/strong&gt; Ask a bot to research a problem, build a complete Python utility, generate tests, and validate the expected behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fact-verification engine:&lt;/strong&gt; Give a bot a public claim and have it gather supporting and contradicting evidence before producing a scored verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel scenario planning:&lt;/strong&gt; Run optimistic, base-case, and pessimistic research agents in parallel, then use another bot to combine their findings into a decision matrix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok Bot is especially useful for work involving &lt;strong&gt;parallel agents, handoffs, specialised roles, shared context, tool use, and multi-step coordination&lt;/strong&gt; within a single workflow.&lt;/p&gt;




&lt;h3&gt;
  
  
  Keep track of what every Grok Bot is doing
&lt;/h3&gt;

&lt;p&gt;Once several Bots start working in parallel, another problem appears: tracking who owns what, what is running, and where the work is blocked.&lt;/p&gt;

&lt;p&gt;One setup I found interesting was Nate Herk's approach of making his Bots log their work to ClickUp. He uses it to see what each agent is doing, who it handed work to, and where a task is stuck.&lt;/p&gt;

&lt;p&gt;You can use the same idea with any task tracker your Bots can access. For my company swarm, I would use it to keep the task, owner, status, and handoffs visible while the agents work in parallel.&lt;/p&gt;

&lt;p&gt;It fits naturally with how Grok Bot already works. &lt;/p&gt;

&lt;p&gt;Bots can coordinate in parallel, pass context through direct messages and group chats, and hand work to each other, while the tracker gives you one place to follow the workflow.&lt;/p&gt;

&lt;p&gt;However, like everything else, this also comes with a caution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security and governance for Grok Bot
&lt;/h2&gt;

&lt;p&gt;One thing to keep in mind before connecting Grok Bot to sensitive systems:&lt;/p&gt;

&lt;p&gt;All Bots for one user share the same cloud computer. That means files, browser sessions, and command-line credentials on the machine can be accessible across your Bot roster. Therefore, don't use separate Bots as separate security boundaries.&lt;/p&gt;

&lt;p&gt;For consequential actions, keep explicit approval rules in the prompt and in Grok Bot's Auto Review controls where available. &lt;/p&gt;

&lt;p&gt;Specifically, sending, publishing, purchases, deletion, permission changes, and production changes are actions where approval boundaries are most useful.&lt;/p&gt;

&lt;p&gt;And prefer a structured connector when it exists. Browser control gives Grok Bot broad coverage, but websites can change, reject automation, present CAPTCHAs, or require human confirmation. Even XAI warns about the same.&lt;/p&gt;

&lt;p&gt;This becomes more important when you start adding several MCP servers. Integrating &amp;amp; Managing them securely and efficiently becomes a production bottleneck.&lt;/p&gt;

&lt;p&gt;That’s why Composio's MCP Gateway sits between the agent and those servers, and gives users one place to manage access, credentials, and tool activity instead of handling each MCP connection separately.&lt;/p&gt;

&lt;p&gt;They can also limit access by organisation, team, user, or individual action, and record the user, tool, action, and outcome for calls that pass through the gateway. &lt;/p&gt;

&lt;p&gt;For teams &amp;amp; business, this means Grok Bot can keep approval around sensitive work, while the MCP Gateway adds another governance layer around which MCP actions the Bot can access in the first place.&lt;/p&gt;

&lt;p&gt;Personally, I use it for my projects for the same reasons, and it really helps me ease my mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Grok Bot is one of the more interesting agent products I have looked at recently because several useful ideas now sit in the same interface.&lt;/p&gt;

&lt;p&gt;You get persistent named Bots, a cloud computer, browser and terminal access, plugins and MCP, group chats, agent-to-agent handoffs, skills, routines, and human approvals. The work can also continue while your own device is closed.&lt;/p&gt;

&lt;p&gt;The multi-Bot part is what I find most interesting. You can assign one Bot to research, another to verify, another to analyse, and another to produce the final deliverable. &lt;/p&gt;

&lt;p&gt;Grok Bot handles its own communication, while a tool layer such as Composio can give it structured access to public search or connected apps.&lt;/p&gt;

&lt;p&gt;There are still clear boundaries. Grok Bot is in early beta, browser automation can still hit website restrictions, and all Bots under one user share the same computer security boundary. Those details matter once you move from experiments to real company systems.&lt;/p&gt;

&lt;p&gt;It will be interesting to see how performant the Grok bot is in those settings.&lt;/p&gt;





&lt;p&gt;&lt;/p&gt;&lt;br&gt;
  Sources&lt;br&gt;
  &lt;ul&gt;

&lt;li&gt;

&lt;a href="https://x.ai/news/introducing-grok-bot" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.ai/news/introducing-grok-bot" rel="noopener noreferrer"&gt;https://x.ai/news/introducing-grok-bot&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;
&lt;a href="https://x.ai/bot" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.ai/bot" rel="noopener noreferrer"&gt;https://x.ai/bot&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.x.ai/grok-bot/overview" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/overview" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/overview&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://docs.x.ai/grok-bot/get-started" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/get-started" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/get-started&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.x.ai/grok-bot/chat-and-collaboration" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/chat-and-collaboration" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/chat-and-collaboration&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.x.ai/grok-bot/computer-and-apps" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/computer-and-apps" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/computer-and-apps&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.x.ai/grok-bot/skills-routines-and-automations" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/skills-routines-and-automations" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/skills-routines-and-automations&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.x.ai/grok-bot/approvals-security-and-privacy" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/grok-bot/approvals-security-and-privacy" rel="noopener noreferrer"&gt;https://docs.x.ai/grok-bot/approvals-security-and-privacy&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.composio.dev/docs" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.composio.dev/docs" rel="noopener noreferrer"&gt;https://docs.composio.dev/docs&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://docs.composio.dev/docs/composio-connect" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.composio.dev/docs/composio-connect" rel="noopener noreferrer"&gt;https://docs.composio.dev/docs/composio-connect&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://composio.dev/toolkits/composio_search" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://composio.dev/toolkits/composio_search" rel="noopener noreferrer"&gt;https://composio.dev/toolkits/composio_search&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://x.com/composio/status/2087565326221259156" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.com/composio/status/2087565326221259156" rel="noopener noreferrer"&gt;https://x.com/composio/status/2087565326221259156&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://github.com/henryalps/OpenManus" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/henryalps/OpenManus" rel="noopener noreferrer"&gt;https://github.com/henryalps/OpenManus&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://x.com/milesdeutscher/status/2087754775496699923" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.com/milesdeutscher/status/2087754775496699923" rel="noopener noreferrer"&gt;https://x.com/milesdeutscher/status/2087754775496699923&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;a href="https://x.com/bot/status/2087224798078517251" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.com/bot/status/2087224798078517251" rel="noopener noreferrer"&gt;https://x.com/bot/status/2087224798078517251&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://composio.dev/mcp-gateway" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://composio.dev/mcp-gateway" rel="noopener noreferrer"&gt;https://composio.dev/mcp-gateway&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>agents</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Pi Agent vs OpenCode after 100+ Hours of Real Use ✌️</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Fri, 21 Aug 2026 13:31:28 +0000</pubDate>
      <link>https://dev.to/composiodev/pi-agent-vs-opencode-after-100-hours-of-real-use-1mh7</link>
      <guid>https://dev.to/composiodev/pi-agent-vs-opencode-after-100-hours-of-real-use-1mh7</guid>
      <description>&lt;p&gt;Open-source coding agents had a weird start to 2026.&lt;/p&gt;

&lt;p&gt;In January, Anthropic suddenly blocked third-party tools from using Claude subscriptions. Overnight, with no warning.&lt;/p&gt;

&lt;p&gt;OpenCode got hit the hardest. The team had to remove Claude login support after legal pressure. The commit message was literally just: “anthropic legal requests.”&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jimv4abmhdeojze1lw5.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jimv4abmhdeojze1lw5.png" alt="OpenCode PR removing anthropic oauth" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PI never really cared. It was never built around one provider anyway.&lt;/p&gt;

&lt;p&gt;And that kinda brings us to the obvious question. If you’re using your own API keys anyway, which open-source agent do you actually pick?&lt;/p&gt;

&lt;p&gt;OpenCode is sitting at &lt;strong&gt;199K stars&lt;/strong&gt;, probably past 200K by the time you read this, with around 8 million monthly devs.&lt;/p&gt;

&lt;p&gt;Then there’s Pi. Bare minimum by design. Four tools. A system prompt under 1,000 tokens. And somehow, top of our benchmark. Again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ We recently covered &lt;a href="https://composio.dev/content/pi-agent-vs-claude-code" rel="noopener noreferrer"&gt;Pi Agent vs. Claude Code&lt;/a&gt;. Check that out if you're not sure whether Anthropic or Pi suits you better&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The easiest way I’d frame it is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 OpenCode is VS Code (bit bloaty). Pi is NeoVim (bare minimum).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So which one do you go for? Let's get into the difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Pi&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real tool use (our eval)&lt;/td&gt;
&lt;td&gt;21/30 tasks passed, $0.078 per success&lt;/td&gt;
&lt;td&gt;19/30 tasks passed, $0.119 per success&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total eval spend&lt;/td&gt;
&lt;td&gt;$1.64 for all 30 tasks&lt;/td&gt;
&lt;td&gt;$2.25 for all 30 tasks&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;362.9s median per task, slowest of the bunch&lt;/td&gt;
&lt;td&gt;280.6s median per task&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context overhead&lt;/td&gt;
&lt;td&gt;Under 1,000 tokens, prompt + tool defs&lt;/td&gt;
&lt;td&gt;~6,900 tokens per request&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out-of-the-box features&lt;/td&gt;
&lt;td&gt;Four tools&lt;/td&gt;
&lt;td&gt;Plan mode, MCP, LSP diagnostics, undo/redo, permissions, subagents, and a lot more&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model support&lt;/td&gt;
&lt;td&gt;20+ providers, 300+ models, mid-session switching&lt;/td&gt;
&lt;td&gt;75+ providers via AI SDK and &lt;code&gt;models.dev&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheap model access&lt;/td&gt;
&lt;td&gt;BYOK or local, that's it&lt;/td&gt;
&lt;td&gt;Zen gateway at cost, plus Go at $10/month&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility&lt;/td&gt;
&lt;td&gt;TypeScript extensions running inside the agent process&lt;/td&gt;
&lt;td&gt;Plugins, custom agents, skills, mostly config-driven&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions&lt;/td&gt;
&lt;td&gt;Branchable session trees with fork and rewind&lt;/td&gt;
&lt;td&gt;Linear log with undo/redo, but survives disconnects&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surfaces&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;TUI, desktop app, web UI, IDEs via ACP, GitHub and GitLab CI&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Nothing. Full system access from prompt one, which isn't really my preferred style&lt;/td&gt;
&lt;td&gt;allow/ask/deny per tool with glob patterns&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource footprint&lt;/td&gt;
&lt;td&gt;Lightweight, single process&lt;/td&gt;
&lt;td&gt;1GB+ RAM for a TUI is kinda crazy&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  In summary
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scorecard: Pi 6, OpenCode 6. Dead tie.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And honestly, that feels right. These two are built for pretty different kinds of people anyway.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember the VS Code vs. Neovim thing I said earlier?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pi is more like a platform you program. You get a tiny core and build your own harness around it in TypeScript.&lt;/p&gt;

&lt;p&gt;OpenCode is more like a product you configure. You get something much closer to a full Claude Code replacement on day one, then tweak it through config.&lt;/p&gt;

&lt;p&gt;Pi wins on efficiency, hackability, and, at least in our eval, raw results.&lt;/p&gt;

&lt;p&gt;OpenCode wins on features, provider support, surfaces, and the simple fact that a normal person can pick it up and start using it without building half the setup themselves.&lt;/p&gt;

&lt;p&gt;So yeah, the real tiebreaker is basically what kind of person you are. Keep reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Pi?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A minimal terminal coding agent that ships four tools and expects you to build the rest yourself.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hsa836yiuj6i335nnhm.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hsa836yiuj6i335nnhm.png" alt="pi agent" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick recap if you missed our &lt;a href="https://composio.dev/blog/pi-agent-vs-claude-code" rel="noopener noreferrer"&gt;Pi vs Claude Code&lt;/a&gt; post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pi.dev/" rel="noopener noreferrer"&gt;Pi&lt;/a&gt; is Mario Zechner's answer to harness bloat. He got tired of Claude Code changing under him, so he built an agent where the model gets &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, and &lt;code&gt;bash&lt;/code&gt;, a system prompt of a few hundred tokens, and nothing else. No MCP. No permissions. No plan mode. No subagents. All on purpose.&lt;/p&gt;

&lt;p&gt;It now lives under &lt;a href="https://github.com/earendil-works/pi" rel="noopener noreferrer"&gt;Earendil&lt;/a&gt; after his April blog post "I've sold out," and the core stays open-source.&lt;/p&gt;

&lt;p&gt;The real product is the extension system. TypeScript files run inside the same process as the agent loop, and Pi can read its own source code. So when you need a missing feature, you literally ask Pi to build it.&lt;/p&gt;

&lt;p&gt;That design is also why Peter Steinberger picked Pi as the engine for OpenClaw.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 &lt;strong&gt;Fun Fact:&lt;/strong&gt; Pi has "only" 94k stars, but the npm package pulls around 1.3 million downloads a week. Growing crazy fast among developers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not everyone is fond of VS Code. 🤷‍♂️&lt;/p&gt;




&lt;h2&gt;
  
  
  What is OpenCode?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ The most starred open source coding agent in the world, and the closest thing to an open, model agnostic Claude Code.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0pkn6lanxysm87cxsm0z.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0pkn6lanxysm87cxsm0z.png" alt="opencode" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; is basically an open-source, model-agnostic coding agent that tries to give you the full Claude Code experience without locking you to Anthropic&lt;/p&gt;

&lt;p&gt;It is built by the team behind SST, which rebranded to Anomaly in 2026 and moved the repo to &lt;code&gt;anomalyco/opencode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The numbers are crazy for a free tool. Around &lt;strong&gt;199k stars&lt;/strong&gt;. Roughly 8 million monthly active developers. Cloudflare publishes official OpenCode setup docs for its own engineers.&lt;/p&gt;

&lt;p&gt;Can you believe this free thing is doing over $25M ARR? It's just the tool that's free, there's subscription plans they've introduced from where they make tons of money.&lt;/p&gt;

&lt;p&gt;The origin story is crazier than Pi's. The original agent, called TermAI, was created by Kujtim Hoxha back in 2024. &lt;a href="https://x.com/thdxr" rel="noopener noreferrer"&gt;Dax Raad&lt;/a&gt; and Adam Elmore did the OpenCode rebrand and made it popular. Then Charm hired Hoxha and pulled the repo into its own org. That causes rewritten git history, banned contributors, the whole drama. After the backlash, Charm renamed its fork &lt;strong&gt;Crush&lt;/strong&gt;, and the Dax and Adam project kept the OpenCode name as a from scratch rewrite.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsp1sf9ncds2glip7s2gb.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsp1sf9ncds2glip7s2gb.png" alt="opencode origin" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not anything interesting if you don't care about "history". Lol.&lt;/p&gt;

&lt;p&gt;So when anyone says OpenCode in 2026, they mean the Anomaly one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 &lt;strong&gt;Fun fact:&lt;/strong&gt; For the 1.0 release, the team threw out their entire Go based TUI and wrote a new framework called OpenTUI in Zig and SolidJS, because the old one "had performance and capability issues." Can't believe Golang had performance issues at that scale.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A coding agent team writing their own Zig rendering engine for the terminal is the most 2026 thing I can think of. Crazy stuff.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Philosophy: Pi vs OpenCode
&lt;/h2&gt;

&lt;p&gt;Our earlier comparisons were open vs closed. This one is open vs open.&lt;/p&gt;

&lt;p&gt;Both teams agree on the big stuff. The harness should be MIT licensed. You should bring your own model. Nobody should be vendor-locked in.&lt;/p&gt;

&lt;p&gt;They completely disagree on how much harness should exist.&lt;/p&gt;

&lt;p&gt;OpenCode's philosophy is that the harness is a real product. Ship plan mode, permissions, LSP integration, MCP, a desktop app, a web UI, IDE support, GitHub actions. Give people everything Claude Code has, minus the lock in.&lt;/p&gt;

&lt;p&gt;Pi's bet is that most of that is overhead (not a feature, what OpenCode believes). Frontier models have been RL trained so hard on coding that they already know what a coding agent is. Every tool schema and every injected instruction is context you pay for on every request. So the harness should be close to zero, and you add back only what you personally need.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/disler/pi-vs-claude-code/blob/main/PI_VS_OPEN_CODE.md" rel="noopener noreferrer"&gt;disler comparison&lt;/a&gt; has the cleanest one liner on this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Pi gives you control at the runtime level. OpenCode gives you control at the configuration level."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And yes, there is real beef here. Zechner has publicly called out OpenCode's compaction for pruning tool results and breaking prompt caching.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhm8s27cqzhdwh4m2r63d.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhm8s27cqzhdwh4m2r63d.png" alt="zechner called out opencode compaction" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He is not a fan of their Vercel AI SDK dependency either. More on that below.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2ty3niibtgm8d4gd8bq.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2ty3niibtgm8d4gd8bq.png" alt="zechner not a fan of vercel ai sdk" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Agent Architecture: Pi vs OpenCode
&lt;/h2&gt;

&lt;p&gt;Underneath, both use the same basic loop: read the task, call the model, run tools, feed results back, repeat.&lt;/p&gt;

&lt;p&gt;The architecture around that loop is where they differ.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv09kkh6jojfuvzgrzb0c.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv09kkh6jojfuvzgrzb0c.png" alt="agent architecture difference pi vs opencode" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenCode: client + server
&lt;/h3&gt;

&lt;p&gt;OpenCode splits into a persistent local server and separate clients.&lt;/p&gt;

&lt;p&gt;The server handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agent logic&lt;/li&gt;
&lt;li&gt;LLM calls&lt;/li&gt;
&lt;li&gt;tool execution&lt;/li&gt;
&lt;li&gt;SQLite session storage&lt;/li&gt;
&lt;li&gt;MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The TUI, desktop app, web UI, and IDE integrations all talk to that same server.&lt;/p&gt;

&lt;p&gt;This makes sessions more safe to terminal crashes or SSH drops, and the same server can also run headlessly in CI. The downside is a heavier footprint, with people reporting &lt;strong&gt;1GB+ RAM usage&lt;/strong&gt; for the TUI setup.&lt;/p&gt;

&lt;p&gt;You read it right. Read more about it here: &lt;a href="https://news.ycombinator.com/item?id=47465584" rel="noopener noreferrer"&gt;OpenCode is pretty resource inefficient&lt;/a&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F20ol6v5g70zqk4jmoqjq.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F20ol6v5g70zqk4jmoqjq.png" alt="Opencode 1gb+ ram tui usage" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi: single process
&lt;/h3&gt;

&lt;p&gt;Pi keeps everything in one process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;provider layer&lt;/li&gt;
&lt;li&gt;agent loop&lt;/li&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is all TypeScript and small enough to understand without going through a huge codebase.&lt;/p&gt;

&lt;p&gt;Pi supports four run modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive TUI&lt;/li&gt;
&lt;li&gt;print mode for scripts&lt;/li&gt;
&lt;li&gt;RPC over stdin/stdout&lt;/li&gt;
&lt;li&gt;SDK mode for embedding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That SDK is also how OpenClaw embeds Pi.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenCode's way of LSP
&lt;/h3&gt;

&lt;p&gt;I'd call it a star feature of OpenCode, the way it handles LSP (Language Server Protocol).&lt;/p&gt;

&lt;p&gt;OpenCode can run real language servers such as &lt;code&gt;gopls&lt;/code&gt; and &lt;code&gt;typescript-language-server&lt;/code&gt; and feed diagnostics back into the agent after edits.&lt;/p&gt;

&lt;p&gt;So the flow looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;model edits code → LSP reports an error → model sees it → model fixes it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives OpenCode fast compiler and type feedback without needing to run the full test every time.&lt;/p&gt;

&lt;p&gt;Pi does not have this out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi's Session trees
&lt;/h3&gt;

&lt;p&gt;Pi way of handling sessions is kinda interesting.&lt;/p&gt;

&lt;p&gt;Pi stores sessions as &lt;code&gt;JSONL&lt;/code&gt;, with every entry pointing to a parent. That means the session history is a tree instead of one linear log.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A → B → C
     ↘ D → E
     ↘ F → G
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use &lt;code&gt;/tree&lt;/code&gt; to jump back to an earlier point&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;/fork&lt;/code&gt; to branch from any past message&lt;/li&gt;
&lt;li&gt;keep multiple debugging paths from the same point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenCode uses a linear history with &lt;code&gt;/undo&lt;/code&gt; and &lt;code&gt;/redo&lt;/code&gt;, which is simpler but less flexible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context compaction
&lt;/h3&gt;

&lt;p&gt;OpenCode uses a hidden system agent to summarize the conversation when context gets tight, then hides older messages from the active context.&lt;/p&gt;

&lt;p&gt;The criticism is that this can remove useful tool outputs and hurt prompt caching.&lt;/p&gt;

&lt;p&gt;Pi also supports compaction, but the implementation is replaceable through extensions, which fits its more hackable architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The benchmark. Same model, different harness
&lt;/h2&gt;

&lt;p&gt;Now for the part I was most curious about.&lt;/p&gt;

&lt;p&gt;We ran &lt;strong&gt;30 hard agentic tool-use tasks&lt;/strong&gt; against real apps. Every harness used the same model, &lt;strong&gt;DeepSeek V4 Pro (0813)&lt;/strong&gt; at max reasoning, through our hosted MCP router.&lt;/p&gt;

&lt;p&gt;Same model. Same tasks. Same tools. Same verifier checks.&lt;/p&gt;

&lt;p&gt;So whatever gap shows up here is mostly the harness.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzcxk81pd9nlfx0ftssdv.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzcxk81pd9nlfx0ftssdv.png" alt="benchmark eval of opencode vs pi agent" width="799" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the full result.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness (DeepSeek V4 Pro, hard 30 set)&lt;/th&gt;
&lt;th&gt;Tasks passed&lt;/th&gt;
&lt;th&gt;Cost per success&lt;/th&gt;
&lt;th&gt;Cost per shared success&lt;/th&gt;
&lt;th&gt;Avg tokens per task&lt;/th&gt;
&lt;th&gt;Avg turns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21/30 (70%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.078&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.031&lt;/td&gt;
&lt;td&gt;924,990&lt;/td&gt;
&lt;td&gt;16.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;20/30 (66.7%)&lt;/td&gt;
&lt;td&gt;n/a*&lt;/td&gt;
&lt;td&gt;$0.031&lt;/td&gt;
&lt;td&gt;383,722&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek Harness&lt;/td&gt;
&lt;td&gt;20/30 (66.7%)&lt;/td&gt;
&lt;td&gt;$0.076&lt;/td&gt;
&lt;td&gt;$0.028&lt;/td&gt;
&lt;td&gt;88,562&lt;/td&gt;
&lt;td&gt;0.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenCode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;19/30 (63.3%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.119&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.032&lt;/td&gt;
&lt;td&gt;710,140&lt;/td&gt;
&lt;td&gt;13.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;19/30 (63.3%)&lt;/td&gt;
&lt;td&gt;n/a*&lt;/td&gt;
&lt;td&gt;$0.074&lt;/td&gt;
&lt;td&gt;649,900&lt;/td&gt;
&lt;td&gt;12.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hermes Agent&lt;/td&gt;
&lt;td&gt;18/30 (60%)&lt;/td&gt;
&lt;td&gt;n/a*&lt;/td&gt;
&lt;td&gt;$0.037&lt;/td&gt;
&lt;td&gt;113,894&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ *Not comparable because cost measure was incomplete for some cells. Shared success only counts tasks every harness passed.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs67o45spge4sqmtrv2lb.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs67o45spge4sqmtrv2lb.png" alt="eval report" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi actually topped the board
&lt;/h3&gt;

&lt;p&gt;Pi finished first with &lt;strong&gt;21/30 tasks passed&lt;/strong&gt;, while OpenCode landed at &lt;strong&gt;19/30&lt;/strong&gt;.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8p1e2vviblg8vkreyzku.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8p1e2vviblg8vkreyzku.jpg" alt="agent leaderboard" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was also cheaper across the full run.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pi&lt;/strong&gt; spent $1.64&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode&lt;/strong&gt; spent $2.25&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pi cost per success&lt;/strong&gt; was $0.078&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode cost per success&lt;/strong&gt; was $0.119&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last number looks rough for OpenCode, but there is a catch.&lt;/p&gt;

&lt;p&gt;On tasks both harnesses actually passed, they were basically tied. Pi came in at &lt;strong&gt;$0.031 per shared success&lt;/strong&gt;, while OpenCode was &lt;strong&gt;$0.032&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So OpenCode was not really more expensive when it worked. It just failed more tasks, and &lt;strong&gt;failed runs still burn tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi was also painfully slow
&lt;/h3&gt;

&lt;p&gt;Pi had the best pass rate, but it was also the &lt;strong&gt;slowest harness in the entire run&lt;/strong&gt;.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fekaax7isq4u9zfbsy07i.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fekaax7isq4u9zfbsy07i.jpg" alt="agent time eval comparison" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pi median time&lt;/strong&gt; was 362.9 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode median time&lt;/strong&gt; was 280.6 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code median time&lt;/strong&gt; was 181.8 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pi also averaged &lt;strong&gt;16.3 turns per task&lt;/strong&gt;, compared with OpenCode's &lt;strong&gt;13.1&lt;/strong&gt;, and pushed more raw tokens than anyone else.&lt;/p&gt;

&lt;p&gt;The difference is that its fixed overhead stays tiny.&lt;/p&gt;

&lt;p&gt;The system prompt plus tool definitions stay under 1,000 tokens, and the prefix barely changes between turns. That makes a lot of that repeated context land as cache hits.&lt;/p&gt;

&lt;h3&gt;
  
  
  The task-by-task split is more interesting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Pi&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRM migration archive&lt;/td&gt;
&lt;td&gt;✅ 10/10&lt;/td&gt;
&lt;td&gt;❌ 3/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack action items&lt;/td&gt;
&lt;td&gt;✅ 5/5&lt;/td&gt;
&lt;td&gt;❌ 2/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor directory&lt;/td&gt;
&lt;td&gt;✅ 11/13 checks&lt;/td&gt;
&lt;td&gt;❌ 7/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handover audit&lt;/td&gt;
&lt;td&gt;✅ 11/11&lt;/td&gt;
&lt;td&gt;❌ 10/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PagerDuty timeline audit&lt;/td&gt;
&lt;td&gt;✅ 10/10&lt;/td&gt;
&lt;td&gt;❌ 9/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renewal screen&lt;/td&gt;
&lt;td&gt;❌ 5/11&lt;/td&gt;
&lt;td&gt;✅ 11/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sponsorship screen&lt;/td&gt;
&lt;td&gt;❌ 4/11&lt;/td&gt;
&lt;td&gt;✅ 11/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sheets to Airtable tracker&lt;/td&gt;
&lt;td&gt;❌ 8/10&lt;/td&gt;
&lt;td&gt;✅ 10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5ccw21opj1h7il64v1r.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5ccw21opj1h7il64v1r.jpg" alt="task-by-task split of agent test" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pi did better on the &lt;strong&gt;audit and census-style tasks&lt;/strong&gt;, where patiently reading everything and checking every detail matters.&lt;/p&gt;

&lt;p&gt;OpenCode did better on the &lt;strong&gt;longer screening and multi-step workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which is kinda perfect.&lt;/p&gt;

&lt;p&gt;Pi wins by being small. OpenCode wins when the workflow benefits from more stuff around the model.&lt;/p&gt;

&lt;p&gt;After all this non-sense, the eval ended up being spot on for both of them. 🤧&lt;/p&gt;

&lt;p&gt;We did a complete breakdown in this tweet. You might want to &lt;a href="https://x.com/composio/status/2090069397050097864" rel="noopener noreferrer"&gt;check it out&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2090069397050097864-193" src="https://platform.twitter.com/embed/Tweet.html?id=2090069397050097864"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2090069397050097864-193');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2090069397050097864&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Token overhead
&lt;/h2&gt;

&lt;p&gt;This is basically the argument both tools were built around, so let's put some numbers next to it.&lt;/p&gt;

&lt;p&gt;The most cited comparison here is the &lt;a href="https://systima.ai/blog/claude-code-vs-opencode-token-overhead" rel="noopener noreferrer"&gt;Systima study&lt;/a&gt; from July, which also ended up doing &lt;a href="https://news.ycombinator.com/item?id=48883275" rel="noopener noreferrer"&gt;700+ points on Hacker News&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They put a logging proxy between the harness and the model, then measured how much context gets sent &lt;strong&gt;before the model even sees your prompt&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;Fixed overhead per request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code (measured by Systima)&lt;/td&gt;
&lt;td&gt;~32,800 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenCode (measured by Systima)&lt;/td&gt;
&lt;td&gt;~6,900 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;td&gt;Under 1,000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenCode already looks pretty good here. Around &lt;strong&gt;4.7x less overhead than Claude Code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then Pi shows up with &lt;strong&gt;under 1,000 tokens&lt;/strong&gt;, including the tool definitions.&lt;/p&gt;

&lt;p&gt;That makes it roughly &lt;strong&gt;7x leaner than OpenCode&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Everyone is somebody's bloatware. 🗿&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Matei Zaharia &lt;a href="https://x.com/matei_zaharia/status/2074943619610649059" rel="noopener noreferrer"&gt;said on X&lt;/a&gt; the reason was pretty simple. Pi had the same success rate with &lt;strong&gt;2x less cost.&lt;/strong&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyjhr0zfzfpglr03e4nkk.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyjhr0zfzfpglr03e4nkk.png" alt="pi success rate at 2x less cost compared to other agents" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our eval points in the same direction too. Pi had the best pass rate and the lowest total spend.&lt;/p&gt;

&lt;p&gt;But there is an important catch here.&lt;/p&gt;

&lt;p&gt;OpenCode has had some pretty ugly token cases too. There is a &lt;a href="https://github.com/anomalyco/opencode/issues/8234" rel="noopener noreferrer"&gt;GitHub issue&lt;/a&gt; where asking something as basic as "what's the tech stack in this project" burned &lt;strong&gt;13,088 tokens&lt;/strong&gt; on a fresh project.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fag06f0ra64r5zoyqw18j.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fag06f0ra64r5zoyqw18j.png" alt="excessive token usage of opencode" width="799" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And Pi is not crazy cheap in every sense either. In our eval, it actually pushed the &lt;strong&gt;highest raw token count of all six harnesses&lt;/strong&gt;, mostly because it took more turns to finish tasks.&lt;/p&gt;

&lt;p&gt;So yeah, tiny fixed overhead helps a lot. But &lt;strong&gt;lean overhead does not always mean lean sessions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Worth keeping that distinction in mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Pricing and the ban
&lt;/h2&gt;

&lt;p&gt;Both tools are free and MIT licensed. Fork them, modify them, ship them.&lt;/p&gt;

&lt;p&gt;The difference starts after install.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;BYOK for pretty much any provider&lt;/li&gt;
&lt;li&gt;local models through Ollama, vLLM, or llama.cpp&lt;/li&gt;
&lt;li&gt;OAuth login where providers still allow it&lt;/li&gt;
&lt;li&gt;no paid CLI tier at all&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Pi is basically just the harness. You bring the model and pay whoever is serving it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  OpenCode
&lt;/h3&gt;

&lt;p&gt;OpenCode does the same BYOK thing, but it also has its own model options.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BYOK&lt;/strong&gt; where the provider bills you directly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zen&lt;/strong&gt; with curated models sold on a pay-as-you-go basis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt; with open coding models bundled into a cheap monthly plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go starts at &lt;strong&gt;$5 for the first month, then $10/month&lt;/strong&gt;, with models like GLM, Kimi K3, Qwen, MiniMax, and DeepSeek.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Double check the pricing. OpenCode changes this stuff pretty often.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And honestly, that Go plan is hard to ignore.&lt;/p&gt;

&lt;p&gt;For $10/month, it is probably one of the cheapest legit ways to run capable open models through a coding agent right now.&lt;/p&gt;

&lt;p&gt;Pi does not really have an equivalent. Its version of "cheap" is running local models, which is useful, but it is not the same thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then Anthropic happened
&lt;/h3&gt;

&lt;p&gt;In January 2026, Anthropic started rejecting Claude Pro and Max OAuth tokens when they were used outside Claude Code.&lt;/p&gt;

&lt;p&gt;The error was pretty clear. The credential was &lt;strong&gt;"only authorized for use with Claude Code."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenCode had been using those subscription tokens by mimicking the Claude Code client, so this hit them directly.&lt;/p&gt;

&lt;p&gt;Then came the legal requests, the Claude login code got removed, and we got the now-famous commit message from the intro.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpc88vg2fnh7c1erd5x1.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpc88vg2fnh7c1erd5x1.png" alt="george hotz calling out anthropic move of removing sub a huge mistake" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;George Hotz called the move &lt;strong&gt;"a huge mistake."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI reportedly went in the other direction and opened Codex subscription access to third-party harnesses, including OpenCode and Pi.&lt;/p&gt;

&lt;p&gt;Lol.&lt;/p&gt;

&lt;p&gt;The important part for this comparison is pretty simple now.&lt;/p&gt;

&lt;p&gt;If you want Claude in either Pi or OpenCode, you are basically paying API rates. OpenCode also gives you Zen as another route.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Extensibility
&lt;/h2&gt;

&lt;p&gt;Both are highly customizable, but the extension model is very different.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenCode
&lt;/h3&gt;

&lt;p&gt;OpenCode is mostly config driven through &lt;code&gt;opencode.json&lt;/code&gt;, plugins, agents, skills, and MCP.&lt;/p&gt;

&lt;p&gt;You can add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;custom agents with their own model, prompt, permissions, and step limits&lt;/li&gt;
&lt;li&gt;JS or TS plugins with lifecycle hooks like &lt;code&gt;tool.execute.before&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;custom tools&lt;/li&gt;
&lt;li&gt;local and remote MCP servers&lt;/li&gt;
&lt;li&gt;skills from &lt;code&gt;.opencode/skills&lt;/code&gt; and &lt;code&gt;.claude/skills&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&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;"permission"&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;"bash"&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;"git *"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rm *"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask"&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;h3&gt;
  
  
  Pi
&lt;/h3&gt;

&lt;p&gt;Pi extensions are TypeScript modules loaded directly into the single agent process.&lt;/p&gt;

&lt;p&gt;They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rewrite or block tool calls&lt;/li&gt;
&lt;li&gt;replace built-in tools&lt;/li&gt;
&lt;li&gt;filter history&lt;/li&gt;
&lt;li&gt;replace compaction&lt;/li&gt;
&lt;li&gt;persist custom session state&lt;/li&gt;
&lt;li&gt;add TUI components&lt;/li&gt;
&lt;li&gt;probably many more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives Pi much &lt;strong&gt;deeper runtime control&lt;/strong&gt; than OpenCode.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ OpenCode plugins extend the harness. Pi extensions can modify the harness itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The tradeoff is security. Pi extensions run in process with full system access, so they need more trust than OpenCode's plugin model.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Permissions and safety
&lt;/h2&gt;

&lt;p&gt;This is probably the biggest gap between the two.&lt;/p&gt;

&lt;p&gt;OpenCode has a proper permission system. Every tool can be set to &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;ask&lt;/code&gt;, or &lt;code&gt;deny&lt;/code&gt;, with glob patterns and per-agent overrides. The defaults are decent too. &lt;code&gt;.env&lt;/code&gt; reads are denied by default, and the Plan agent asks before edits or bash commands.&lt;/p&gt;

&lt;p&gt;What it does &lt;strong&gt;not&lt;/strong&gt; have is real sandboxing. There is no container or OS-level isolation built in.&lt;/p&gt;

&lt;p&gt;Pi goes the other way and basically ships no permission layer at all. From the first prompt, the agent runs with your full user privileges. 🥶&lt;/p&gt;

&lt;p&gt;That is intentional. Zechner's say is that once an agent can write files and execute code, permission prompts only get you so far. Pi instead expects you to isolate the whole process using Docker, a microVM like Gondolin, or a policy sandbox like OpenShell.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 There is also an optional &lt;code&gt;damage-control.ts&lt;/code&gt; extension that checks bash commands against YAML rules. Helps a bit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the actual difference is pretty simple.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ OpenCode gives you tool-level guardrails. Pi expects you to handle isolation outside the agent.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pick OpenCode if&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want something close to a full Claude Code replacement without building half the setup yourself&lt;/li&gt;
&lt;li&gt;You want plan mode, permissions, MCP, undo and redo, and LSP support out of the box&lt;/li&gt;
&lt;li&gt;You want the $10 Go plan for cheap access to capable open models&lt;/li&gt;
&lt;li&gt;You work in typed languages and want LSP diagnostics fed straight back into the agent&lt;/li&gt;
&lt;li&gt;You are setting this up for a team and actually need proper &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;ask&lt;/code&gt;, and &lt;code&gt;deny&lt;/code&gt; controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pick Pi if&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You care about token cost at scale. In our eval, the same model passed more tasks and cost less with Pi&lt;/li&gt;
&lt;li&gt;You want a harness small enough that you can actually read and understand the whole thing&lt;/li&gt;
&lt;li&gt;You like branching while debugging. Pi's session trees are really good for that&lt;/li&gt;
&lt;li&gt;You run local or smaller models where the difference between ~1,000 and ~6,900 tokens of fixed overhead actually matters&lt;/li&gt;
&lt;li&gt;You would rather change the harness in TypeScript than spend time configuring someone else's abstraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark kinda gives away the answer anyway.&lt;/p&gt;

&lt;p&gt;Pi did better on the careful audit-style tasks. OpenCode did better on longer, more structured workflows.&lt;/p&gt;

&lt;p&gt;So there probably isn't one winner for everything.&lt;/p&gt;

&lt;p&gt;Both are free. Try both and keep the one that fits how you work. ✌️&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftya4fg1aj5uz7ql0o8hu.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftya4fg1aj5uz7ql0o8hu.png" alt="Pi Agent vs. OpenCode test summary result" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After all that, I still don’t think there’s one obvious winner here. The scorecard ends &lt;strong&gt;6-6&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;OpenCode wins on adoption, features, and ease of use. Pi won our benchmark with &lt;strong&gt;21/30 tasks vs 19/30&lt;/strong&gt;, lower total spend, and way less fixed overhead.&lt;/p&gt;

&lt;p&gt;The bigger difference is still the same one we started with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;OpenCode gives you configuration control. Pi gives you runtime control.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you just want to install something and start working, pick &lt;strong&gt;OpenCode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you want to understand and modify the harness itself, pick &lt;strong&gt;Pi&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And if cost per successful task starts mattering at scale, keep an eye on Pi. 🤷‍♂️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Pi Agent vs Claude Code After 100 Hours of Real Use 🔥</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:36:48 +0000</pubDate>
      <link>https://dev.to/composiodev/pi-agent-vs-claude-code-after-100-hours-of-real-use-1dfp</link>
      <guid>https://dev.to/composiodev/pi-agent-vs-claude-code-after-100-hours-of-real-use-1dfp</guid>
      <description>&lt;p&gt;While researching for this post, I found out something funny. Pi, the most interesting coding agent of 2026, was built by a guy who got fed up with Claude Code. 🥶&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/badlogicgames" rel="noopener noreferrer"&gt;Mario Zechner&lt;/a&gt;, the creator of libGDX, was a hardcore Claude Code user. He built &lt;a href="https://mariozechner.at/posts/2025-08-03-cchistory/" rel="noopener noreferrer"&gt;cchistory&lt;/a&gt; just to track its system prompt changes, and even &lt;a href="https://mariozechner.at/posts/2025-08-06-cc-antidebug/" rel="noopener noreferrer"&gt;patched the binary&lt;/a&gt; to add features Anthropic had not shipped.&lt;/p&gt;

&lt;p&gt;Then he quit and wrote his own agent. Four tools, a tiny system prompt, no MCP, no permissions. He named it Pi so nobody could Google it. What a Chad! 🗿&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F18euu1imp5t223k454dv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F18euu1imp5t223k454dv.gif" alt="swag gif" width="500" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That small project now has 85k+ GitHub stars, powers OpenClaw, and outscored Claude Code on our own tool use benchmark at a fifth of the cost.&lt;/p&gt;

&lt;p&gt;So I put the two side by side. The default everyone uses, against the minimal harness built as a rejection of it.&lt;/p&gt;

&lt;p&gt;Let's go!&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Pi&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool price&lt;/td&gt;
&lt;td&gt;Needs a paid plan or API key&lt;/td&gt;
&lt;td&gt;Free, MIT licensed&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real tool use (our eval)&lt;/td&gt;
&lt;td&gt;16/30 tasks passed, $0.195 per success&lt;/td&gt;
&lt;td&gt;20/30 tasks passed, $0.028 per success&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Predictable billing&lt;/td&gt;
&lt;td&gt;$20/month flat on Pro&lt;/td&gt;
&lt;td&gt;Pay per token, bills can spike&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model support&lt;/td&gt;
&lt;td&gt;Claude models only but it’s built for it&lt;/td&gt;
&lt;td&gt;20+ providers, 300+ models, mid session switching&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of the box features&lt;/td&gt;
&lt;td&gt;Sub agents, teams, plan mode, MCP, skills, checkpoints&lt;/td&gt;
&lt;td&gt;Four tools and a text box&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context discipline&lt;/td&gt;
&lt;td&gt;Auto compaction, silent context management&lt;/td&gt;
&lt;td&gt;You see and control every token&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility depth&lt;/td&gt;
&lt;td&gt;Shell hooks, MCP, skills, plugins&lt;/td&gt;
&lt;td&gt;TypeScript extensions running inside the agent process&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi agent workflows&lt;/td&gt;
&lt;td&gt;Native sub agents and Agent Teams&lt;/td&gt;
&lt;td&gt;Spawn pi via bash, or install a community extension&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions and guardrails&lt;/td&gt;
&lt;td&gt;Deny by default, five modes, sandboxing&lt;/td&gt;
&lt;td&gt;Full system access from the first prompt&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surfaces&lt;/td&gt;
&lt;td&gt;Terminal, VS Code, JetBrains, desktop, web, mobile, Slack&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session model&lt;/td&gt;
&lt;td&gt;Linear conversation log&lt;/td&gt;
&lt;td&gt;Branchable session trees with fork and rewind&lt;/td&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  In Summary:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scorecard: Pi 6, Claude Code 5.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pi is the cheaper, more flexible, and more transparent harness, especially if you pay per token, switch models, or want full control. Claude Code remains the better daily driver for most people because it ships with stronger guardrails, predictable subscription pricing, and a polished feature set out of the box. The practical answer is to use Claude Code for everyday work and Pi for custom workflows, local models, and cost-sensitive tasks.&lt;/p&gt;

&lt;p&gt;And here is the twist. The scorecard says Pi, but almost everyone who reviews both, including the biggest Pi fans, still runs Claude Code as their daily driver. I will explain why is that in a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Pi?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A minimal, open source terminal coding agent that ships four tools and expects you to build the rest yourself.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa91gkp42cqdq38nenpqm.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa91gkp42cqdq38nenpqm.png" alt="Pi agent" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pi.dev/" rel="noopener noreferrer"&gt;Pi&lt;/a&gt; is the coding agent Mario Zechner released in late 2025, now maintained under &lt;a href="https://github.com/earendil-works/pi" rel="noopener noreferrer"&gt;Earendil&lt;/a&gt;. Zechner joined Earendil in April 2026 in a blog post he titled "I've sold out," and the core stayed MIT licensed.&lt;/p&gt;

&lt;p&gt;The whole product fits in literally one sentence. The model gets &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, and &lt;code&gt;bash&lt;/code&gt;, a system prompt of a few hundred tokens, and nothing else.&lt;/p&gt;

&lt;p&gt;His reasoning: frontier models have been RL trained so hard on coding agent behavior that they already know what a coding agent is. You do not need 10,000 tokens of instructions to remind them. Need ripgrep? The model runs &lt;code&gt;rg&lt;/code&gt; through bash. Need GitHub? It runs &lt;code&gt;gh&lt;/code&gt;. Need a browser? Ask Pi to write itself a browser tool.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 If you're on the same philosophy, this might be worth reading: &lt;a href="https://composio.dev/content/top-10-cli-tools-for-claude-code" rel="noopener noreferrer"&gt;Top 10 CLI Tools to Level-Up Claude Code&lt;/a&gt;. No MCPs, nothing. Plain raw Bash tools gets most of the work done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last part is the actual product. Pi extensions are TypeScript files that run inside the same process as the agent loop, and Pi can read its own source and docs, so the standard workflow when you need a missing feature is to ask Pi to build it.&lt;/p&gt;

&lt;p&gt;Everything Zechner refused to ship, the community shipped as extensions within weeks. Todo lists, plan mode, sub agents, permission gates, even an MCP adapter.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnbszl2dke891ql0slm3e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnbszl2dke891ql0slm3e.gif" alt="Laugh GIF" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Claude Code
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Anthropic's batteries included coding agent, and the default the entire agent category gets measured against&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foe7igo0vtukw40guj4zm.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foe7igo0vtukw40guj4zm.jpg" alt="Claude Code" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know this one. &lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; started as Boris Cherny's internal AppleScript toy at Anthropic in September 2024, hit research preview in February 2025, and became the fastest scaling developer product anyone has ever measured.&lt;/p&gt;

&lt;p&gt;It ships everything: 10+ built in tools, sub agents, Agent Teams, plan mode, MCP as both client and server, Agent Skills, plugins, hooks, checkpoints with rewind, a permission system with five modes, and it runs in the terminal, VS Code, JetBrains, a desktop app, the browser, and your phone.&lt;/p&gt;

&lt;p&gt;More than 80% of Anthropic's own engineers use it daily, and around "90% of Claude Code's code is now written by Claude Code". 🥴&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Philosophy: Pi vs Claude Code
&lt;/h2&gt;

&lt;p&gt;This comparison only makes sense once you understand that Pi exists because of Claude Code.&lt;/p&gt;

&lt;p&gt;Zechner was an early Claude Code user. His complaint was never that it was bad. His complaint was that it kept changing underneath him. The system prompt and tool definitions shifted on every release, which broke his workflows and changed model behavior.&lt;/p&gt;

&lt;p&gt;So the two tools represent opposite answers to the same question: how much harness does a frontier model actually need?&lt;/p&gt;

&lt;p&gt;Anthropic's answer is interesting because it is drifting toward Pi's. Boris Cherny's team deletes harness code every time a new model ships, and in July 2026 Anthropic removed over 80% of Claude Code's system prompt for the Claude 5 generation models with no measurable loss on their coding evals. The bet behind Claude Code is that Anthropic trains the model and the harness together, so scaffolding today can become model behavior tomorrow.&lt;/p&gt;

&lt;p&gt;Pi's answer is that the scaffolding was never load bearing in the first place.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Anthropic quietly deleting most of its own system prompt is about the strongest validation of Pi's thesis you could ask for. Zechner just got there a year early.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Agent Architecture: Claude Code vs Pi
&lt;/h2&gt;

&lt;p&gt;Both run the same loop underneath. Read the task, call the model, execute tool calls, feed results back, repeat until the model stops asking for tools.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcefop0itn8v17urai239.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcefop0itn8v17urai239.jpg" alt="agent loop" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference is everything wrapped around that loop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; gives the model Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, NotebookEdit, TodoWrite, there's a lot.... and the Task tool that spawns typed sub agents with their own isolated context windows. Plan mode forces a read only explore and plan phase before any file gets touched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pi&lt;/strong&gt; gives the model four tools, plus optional read only &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, and &lt;code&gt;ls&lt;/code&gt; behind a &lt;code&gt;-tools&lt;/code&gt; flag. There is no plan mode, but &lt;code&gt;pi --tools read,grep,find,ls&lt;/code&gt; gets you a read only session in one line. There are no sub agents, and they say that if you want one, tell Pi to run itself through bash, ideally in tmux so you can actually watch it work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system prompt gap is the main highlight:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;System prompt&lt;/th&gt;
&lt;th&gt;Built in tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code (pre Claude 5 era)&lt;/td&gt;
&lt;td&gt;~10,000 to 14,000 tokens by community measurement&lt;/td&gt;
&lt;td&gt;10+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code (current)&lt;/td&gt;
&lt;td&gt;Cut by over 80% for Claude 5 gen models&lt;/td&gt;
&lt;td&gt;10+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;td&gt;Under 1,000 tokens including tool definitions&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One less obvious architectural difference: Pi stores sessions as trees, not logs. Every message carries a parent id, so under the hood this is basically a linked list that learned to branch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A real use case for linked lists, in the wild. All that leetcode grind had something useful. 🤡&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So &lt;code&gt;/tree&lt;/code&gt; lets you jump back to any earlier point in the conversation and branch from there, and &lt;code&gt;/fork&lt;/code&gt; spins a new session off any past message. Claude Code got checkpoints and rewind in 2.0, which covers the common case, but Pi's tree model is the better design.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The benchmark: same model, different harness
&lt;/h2&gt;

&lt;p&gt;We ran 30 hard agentic tool use tasks against real apps, eight harnesses, every single one wired to the same model, DeepSeek V4 Flash, through our hosted MCP router, with a 900 second ceiling per task.&lt;/p&gt;

&lt;p&gt;Same model, same tasks, same tools. The only thing that changes is the harness, so whatever gap shows up is the wrapper, not the model.&lt;/p&gt;

&lt;p&gt;Here is how our two contenders did:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness (DeepSeek V4 Flash, hard 30 set)&lt;/th&gt;
&lt;th&gt;Tasks passed&lt;/th&gt;
&lt;th&gt;Median time&lt;/th&gt;
&lt;th&gt;Avg tokens per task&lt;/th&gt;
&lt;th&gt;Total cost&lt;/th&gt;
&lt;th&gt;Cost per success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;16/30 (53.3%)&lt;/td&gt;
&lt;td&gt;122.7s&lt;/td&gt;
&lt;td&gt;741,659&lt;/td&gt;
&lt;td&gt;$3.12&lt;/td&gt;
&lt;td&gt;$0.195&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pi&lt;/td&gt;
&lt;td&gt;20/30 (66.7%)&lt;/td&gt;
&lt;td&gt;132.2s&lt;/td&gt;
&lt;td&gt;558,885&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;td&gt;$0.028&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1g15qyiwhm1p1k1gs8pw.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1g15qyiwhm1p1k1gs8pw.png" alt="eight agent harnesses eval" width="799" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pi passed more tasks than any of the eight harnesses we tested, and did it at the lowest cost of the whole bunch. Cost per successful task is the brutal column: &lt;strong&gt;3 cents against 19&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code posted the fastest median time. It just burned 741,659 tokens per task getting there, against Pi's 558,885. The overhead is the story, again.&lt;/p&gt;

&lt;p&gt;And yes, that is Claude Code running DeepSeek. That is the whole point of the setup. Only the harness changes.&lt;/p&gt;

&lt;p&gt;For the curious, Codex ran the same and landed at 16/30 for $1.29 total. Right between the two.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zelou5gp9orqip73xjn.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zelou5gp9orqip73xjn.png" alt="agent harness report" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;NOTE:&lt;/strong&gt; Pi ran on high reasoning instead of max, and 24 of its 30 trials went through the official DeepSeek API instead of OpenRouter. Make sure to read the exact numbers with that in mind.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Pricing: Claude Code vs Pi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pro, $20/month or $17/month annually, includes Claude Code&lt;/li&gt;
&lt;li&gt;Max 5x at $100/month, Max 20x at $200/month&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Guys, make sure to double check the pricing. It changes frequently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Pi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The tool costs nothing. MIT license, fork it, ship it&lt;/li&gt;
&lt;li&gt;You bring your own API keys for any provider, or run local models for free through Ollama, vLLM, or llama.cpp&lt;/li&gt;
&lt;li&gt;OAuth login for subscriptions where providers allow it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On paper Pi wins on price and Claude Code wins on predictability. A $20 flat rate is genuinely hard to beat for a solo dev using Claude models all day, and per token bills on heavy Pi usage can hit hundreds of dollars a month. I usually prefer the subscription system.&lt;/p&gt;

&lt;p&gt;Anthropic locked its subscription OAuth tokens to Claude Code and &lt;a href="http://claude.ai/" rel="noopener noreferrer"&gt;Claude.ai&lt;/a&gt; only. Third party harnesses got cut off, starting with a silent server side block in January, formalized in the docs by February, fully enforced by April. OpenClaw, OpenCode, Cline, and yes, Pi, all lost the ability to run on your Claude Pro or Max subscription.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo2a55k881h4c2noc8c2q.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo2a55k881h4c2noc8c2q.webp" alt="anthropic locking subscription for third party providers" width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the practical situation today: running Claude models through Pi means API rates. Running them through Claude Code means your cheap subscription.&lt;/p&gt;

&lt;p&gt;DHH called the move "very customer hostile," Lol.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8w1n0o9c5089f3wal0m.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8w1n0o9c5089f3wal0m.png" alt="DHH calling anthropic move costomer hostile" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenAI's Codex team publicly went the opposite direction and encouraged third party harness usage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 If your workflow is Claude models all day every day, the subscription math alone mostly settles this comparison. Pi's cost advantage is real on API keys and irrelevant on a Max plan you already pay for.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Models: one provider vs all of them
&lt;/h2&gt;

&lt;p&gt;Claude Code runs Claude. Opus, Sonnet, and Haiku tiers, switchable with &lt;code&gt;/model&lt;/code&gt;, with thinking effort levels, tuned end to end because Anthropic controls the whole stack.&lt;/p&gt;

&lt;p&gt;That vertical integration is why the model feels so at home in the harness. It was trained in it.&lt;/p&gt;

&lt;p&gt;Pi runs everything. The &lt;code&gt;pi-ai&lt;/code&gt; layer normalizes four API shapes across 20+ providers, from Anthropic and OpenAI to Groq, Cerebras, Mistral, OpenRouter, and local models. Over 300 models total. You can switch models mid session with &lt;code&gt;Ctrl+P&lt;/code&gt;, and Pi converts thinking traces between providers.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9nk81lwqadsamqgaf7n2.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9nk81lwqadsamqgaf7n2.png" alt="multiple model providers in pi agent" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude Code's giant prompt overhead makes it a poor fit for small local models, which is exactly why Simon Willison flagged Pi as the lightweight option for that use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Extensibility
&lt;/h2&gt;

&lt;p&gt;Both tools are deeply customizable.&lt;/p&gt;

&lt;p&gt;Claude Code's model is external and config driven. Hooks are shell scripts that fire on 14 lifecycle events and talk JSON over stdin. MCP servers are separate processes speaking a protocol. Skills are markdown instruction packs with lazy loading. Plugins bundle all of it into installable packages with official and community marketplaces behind a single &lt;code&gt;/plugin&lt;/code&gt; command.&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;"permissions"&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;"allow"&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="s2"&gt;"Bash(npm run test *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git status *)"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&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="s2"&gt;"Read(./.env)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(curl *)"&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;Pi's model is internal. Extensions are TypeScript modules loaded into the same runtime as the agent loop, hooking 25 event types. They can block or rewrite tool calls before they run, override the built in tools entirely, inject context, replace the compaction logic, persist custom state into the session file, and draw their own TUI widgets. Claude Code's hooks can approve or reject what the agent does. Pi's extensions can change what the agent is.&lt;/p&gt;

&lt;p&gt;The tradeoff is trust. Claude Code's marketplace plugins go through some checks and run outside the core process. Pi packages run with full system access, and its own docs tell you to review them before installing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The sharpest criticism of Pi's ecosystem, from &lt;a href="https://www.thevinter.com/blog/bad-vibes-from-pi" rel="noopener noreferrer"&gt;thevinter's "Bad Vibes From Pi"&lt;/a&gt;, lands exactly here: a lot of those community extensions are themselves vibecoded, so that's something to watch-out for.&lt;/p&gt;
&lt;/blockquote&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8nbc83mudu2tor7799jt.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8nbc83mudu2tor7799jt.png" alt="Pi agent extensions probable harm talk" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  7. Permissions and safety
&lt;/h2&gt;

&lt;p&gt;This is the widest gap between the two tools, and neither side considers it a flaw.&lt;/p&gt;

&lt;p&gt;Claude Code is deny by default. Every risky action asks first, and you can loosen from there through five permission modes, allow and deny rules, and OS level sandboxing for bash.&lt;/p&gt;

&lt;p&gt;When Claude Code has security incidents, and it has had real ones with CVEs attached, they get found, patched, and written up because millions of people are using it.&lt;/p&gt;

&lt;p&gt;Pi has no permission system. First prompt, full user privileges, go.&lt;/p&gt;

&lt;p&gt;Zechner's argument is that agent security is mostly "theater" 🫩, because once a tool can write code and run code the game is already over. Pi's answer to safety is isolation instead of prompts: run it in Docker, in a micro VM, or behind a sandbox, and there is an opt in extension that checks bash commands against YAML rules if you want a middle ground.&lt;/p&gt;

&lt;p&gt;One of them requires you to have read the docs, and the other protects the "intern" who did not.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There isn't much to discuss here. You probably already know how things work by now...&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What the Internet thinks
&lt;/h2&gt;

&lt;p&gt;Maybe worth seeing what the internet thinks of Pi and Claude Code by now?&lt;/p&gt;

&lt;p&gt;It's more of what we are discussing so far. The famous endorsements is around Pi, the daily usage clusters around Claude Code, and both facts are true.&lt;/p&gt;

&lt;p&gt;Let me show you the Pi love first, because it is a lot.&lt;/p&gt;

&lt;p&gt;Peter Steinberger built OpenClaw on top of Pi and quote tweeted Zechner with "Mario is the real one we don't deserve." Armin Ronacher wrote that Pi is &lt;a href="https://lucumr.pocoo.org/2026/1/31/pi/" rel="noopener noreferrer"&gt;the coding agent he uses "almost exclusively"&lt;/a&gt;.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fai19ky33q5v99uvizdsp.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fai19ky33q5v99uvizdsp.png" alt="openclaw creator praising pi agent creator" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Theo from &lt;a href="http://t3.gg/" rel="noopener noreferrer"&gt;t3.gg&lt;/a&gt; did a whole episode about getting Pi pilled. His take was simple: "The more minimal, the better." Wes Bos and Scott Tolinski spent a Syntax episode arguing Claude Code is overkill for most work.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3DNkDIVKtK8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;My favorite line comes from &lt;a href="https://agenticengineer.com/the-only-claude-code-competitor" rel="noopener noreferrer"&gt;IndyDevDan&lt;/a&gt;, who calls Pi the only real Claude Code competitor: "Claude Code is the starter pack. Pi is the endgame."&lt;/p&gt;

&lt;p&gt;About 80% of his work still goes through Claude Code. Only 20% goes through Pi. The endgame guy is still playing the starter pack. The internet is wild!&lt;/p&gt;

&lt;p&gt;Claude Code does not need loud fans anyway. It has $2.5B in revenue (might increase, researched through Claude itself), 141k GitHub stars, most of the enterprise market, and Microsoft reportedly using it inside their own teams. The numbers are just enough, lol. 🤧&lt;/p&gt;


&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pick Claude Code if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want something that works at full power&lt;/li&gt;
&lt;li&gt;You live on Claude models, because the $20 to $200 subscriptions are the cheapest way to run them and Pi is locked out of that pricing&lt;/li&gt;
&lt;li&gt;You are deploying to a team and need permissions, SSO, spend caps, and audit trails&lt;/li&gt;
&lt;li&gt;You want sub agents, plan mode, and multi surface access without building anything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pick Pi if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You pay per token at scale, since less context per task is real money, a fifth of the cost in our eval&lt;/li&gt;
&lt;li&gt;You want to mix providers, run open models, or go fully local&lt;/li&gt;
&lt;li&gt;You want to read, own, and modify every part of your harness, MIT license and all&lt;/li&gt;
&lt;li&gt;You are the kind of engineer who would rather build the exact workflow you want than configure someone else's&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do what most reviewers actually do:&lt;/strong&gt; run both. Claude Code as the primary builder on your subscription, Pi as the cheap second opinion, the local model runner, and the place where your custom workflows live. The two tools are converging anyway.&lt;/p&gt;

&lt;p&gt;Claude Code keeps deleting scaffolding, and the Pi community keeps rebuilding Claude Code's features as extensions. 🤡&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd12fa7k79ota3dwk50uj.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd12fa7k79ota3dwk50uj.png" alt="pi agent vs claude code final score" width="799" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scorecard reads Pi 6, Claude Code 5. And honestly, Pi deserves those wins. It is cheaper per task, open source, works with any model. What more do you want?&lt;/p&gt;

&lt;p&gt;But here is the thing. When I sit down with a bug and just want it fixed, I open Claude Code. It works right away, the guardrails just works, the $20 plan keeps the bill consistent, and the model just feels at home in it.&lt;/p&gt;

&lt;p&gt;No thinking about the tool itself.&lt;/p&gt;

&lt;p&gt;That is the whole story really. Even the biggest Pi fans ship most of their work through Claude Code. It's a secret. 🤫&lt;/p&gt;

&lt;p&gt;Zechner was right that these agents need way less scaffolding than we thought. Anthropic deleting 80% of its own system prompt basically admitted it. But being right and being the tool everyone opens every day are two different things, and Claude Code still owns the second one for me.&lt;/p&gt;

&lt;p&gt;So use Claude Code for the day job. Keep Pi around for when you want to tinker, go local, or save some money. ✌️&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;SDE • GOLD @Microsoft Student Ambassador • Prev Lead Collab and Dev-Team Lead @oppiaorg • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to build and deploy an MCP server to production (2026-07-28 spec)</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Wed, 05 Aug 2026 12:13:02 +0000</pubDate>
      <link>https://dev.to/composiodev/how-to-build-and-deploy-an-mcp-server-to-production-2026-07-28-spec-50p3</link>
      <guid>https://dev.to/composiodev/how-to-build-and-deploy-an-mcp-server-to-production-2026-07-28-spec-50p3</guid>
      <description>&lt;p&gt;MCP just had its biggest release since launch.&lt;/p&gt;

&lt;p&gt;On July 28, the maintainers shipped the &lt;strong&gt;2026-07-28 spec&lt;/strong&gt;, and it changes how MCP servers work at a pretty fundamental level. The handshake is gone. Sessions are gone. Three long-standing features are deprecated.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsfvl2yvl7lis32ovbob.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsfvl2yvl7lis32ovbob.png" alt="tweet on mcp" width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The maintainers themselves called it the most substantial change since authorization was added. Their words, not mine.&lt;/p&gt;

&lt;p&gt;Sounds scary. But it actually makes MCP servers much easier to deploy. And what am I here for? I'm here to help you build and deploy one.&lt;/p&gt;

&lt;p&gt;Your MCP server is now just a regular stateless HTTP service. Round-robin load balancing, autoscaling, and caching all work. No sticky sessions or shared session state.&lt;/p&gt;

&lt;p&gt;In this guide, we'll build a small MCP server on the new spec, connect a client to it, see every headline feature actually running, and then deploy it to Cloudflare Workers. For free.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ All the code here uses the new &lt;strong&gt;TypeScript SDK v2&lt;/strong&gt;, released alongside the spec. If you're on the old &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; package, that's v1 now.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What's Covered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What actually changed in the 2026-07-28 spec in short&lt;/li&gt;
&lt;li&gt;Building an MCP server with the new SDK v2&lt;/li&gt;
&lt;li&gt;Stateless core in action&lt;/li&gt;
&lt;li&gt;MRTR: how a tool requests user confirmation without holding a stream open&lt;/li&gt;
&lt;li&gt;A graceful fallback for clients that don't speak MRTR yet (there are many)&lt;/li&gt;
&lt;li&gt;Cacheable tool lists with &lt;code&gt;ttlMs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Testing it with a client and raw curl&lt;/li&gt;
&lt;li&gt;Deploying it to Cloudflare Workers on the free plan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Changes in the new MCP Spec (2026-07-28)
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujro30vnaf3p3byd4d7y.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujro30vnaf3p3byd4d7y.webp" alt="mcp new workflow" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick rundown of what's new. If you want the full changelog, it's on the &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" rel="noopener noreferrer"&gt;official spec site&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The handshake is gone
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;initialize&lt;/code&gt; / &lt;code&gt;initialized&lt;/code&gt; exchange and the Mcp-Session-Id header are officially retired.&lt;/p&gt;

&lt;p&gt;Every request is now &lt;strong&gt;self-describing&lt;/strong&gt;. It carries its own protocol version, client identity, and capabilities in &lt;code&gt;_meta&lt;/code&gt;. Any request can land on any server instance behind a plain load balancer. Such a relief!!&lt;/p&gt;

&lt;p&gt;There's an optional &lt;code&gt;server/discover&lt;/code&gt; RPC if a client wants capabilities up front. But it's optional. One bare POST is a complete conversation now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi Round-Trip Requests (MRTR)
&lt;/h3&gt;

&lt;p&gt;This one is my favorite.&lt;/p&gt;

&lt;p&gt;Before, if a tool needed something from the user mid-call, such as confirmation or a missing parameter, the server had to push an &lt;code&gt;elicitation/create&lt;/code&gt; request back over a held-open stream. That meant you needed a held-open stream, which was bad for stateless deployments.&lt;/p&gt;

&lt;p&gt;MRTR flips it. The server returns &lt;code&gt;resultType: "input_required"&lt;/code&gt; with the questions it needs answered, and closes the connection. The client collects the answers and retries the original call with them attached, plus an opaque &lt;code&gt;requestState&lt;/code&gt; token so the server knows where it left off.&lt;/p&gt;

&lt;p&gt;No open streams. No sessions. Interactive tools on fully stateless infra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Header-based routing
&lt;/h3&gt;

&lt;p&gt;Requests now carry &lt;code&gt;Mcp-Method&lt;/code&gt; and &lt;code&gt;Mcp-Name&lt;/code&gt; HTTP headers. Your gateway, rate limiter, or WAF can route and meter on headers without parsing JSON bodies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cacheable list results
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;prompts/list&lt;/code&gt;, &lt;code&gt;resources/list&lt;/code&gt;, and &lt;code&gt;resources/read&lt;/code&gt; responses now carry &lt;code&gt;ttlMs&lt;/code&gt; and &lt;code&gt;cacheScope&lt;/code&gt; fields, modeled on HTTP's Cache-Control. Clients cache your tool catalog instead of re-fetching it every time they connect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensions framework + deprecations
&lt;/h3&gt;

&lt;p&gt;Tasks moved out of the experimental core into an official extension (&lt;code&gt;io.modelcontextprotocol/tasks&lt;/code&gt;). MCP Apps and Enterprise Managed Authorization live there too. You can build your own extensions as well.&lt;/p&gt;

&lt;p&gt;And the deprecations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roots, Sampling, and Logging&lt;/strong&gt; are deprecated. They keep working for at least 12 months, but new implementations shouldn't use them.&lt;/li&gt;
&lt;li&gt;The legacy &lt;strong&gt;HTTP+SSE transport&lt;/strong&gt; is deprecated with a year-long offramp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Client Registration&lt;/strong&gt; is deprecated in favor of Client ID Metadata Documents (CIMD).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a formal deprecation policy now: a 12-month minimum window for anything marked deprecated. So you get to plan upgrades, which is noicee!&lt;/p&gt;

&lt;h3&gt;
  
  
  The SDK Split
&lt;/h3&gt;

&lt;p&gt;One more thing before we build: the TypeScript SDK is no longer one package.&lt;/p&gt;

&lt;p&gt;v2 splits it into &lt;code&gt;@modelcontextprotocol/server&lt;/code&gt;, &lt;code&gt;@modelcontextprotocol/client&lt;/code&gt;, and thin framework adapters (&lt;code&gt;@modelcontextprotocol/hono&lt;/code&gt;, &lt;code&gt;express&lt;/code&gt;, &lt;code&gt;fastify&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Building an MCP Server
&lt;/h2&gt;

&lt;p&gt;Finally, we're onto the build. We will build a quick tiny deploy bot over MCP.&lt;/p&gt;

&lt;p&gt;It has three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deploy&lt;/code&gt; asks the user for confirmation before deploying (MRTR in action).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_deployments&lt;/code&gt; reads back the deployment history&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server_stats&lt;/code&gt; proves a fresh server instance handled every request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the trick that pays off at deploy time: all the MCP logic lives in &lt;strong&gt;one platform-neutral file&lt;/strong&gt; (&lt;code&gt;bot.ts&lt;/code&gt;), and each platform gets a tiny entry file. Node gets &lt;code&gt;server.ts&lt;/code&gt;. Cloudflare gets &lt;code&gt;worker.ts&lt;/code&gt;. Both are about ten lines. An MCP server on the new spec is just a fetch handler; the platform is a serving shim.&lt;/p&gt;

&lt;p&gt;You'll understand everything along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the SDK v2
&lt;/h3&gt;

&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;updated-mcp-spec-bot &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;updated-mcp-spec-bot
npm init &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm pkg &lt;span class="nb"&gt;set type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;module
npm &lt;span class="nb"&gt;install&lt;/span&gt; @modelcontextprotocol/server @modelcontextprotocol/client &lt;span class="se"&gt;\&lt;/span&gt;
  @modelcontextprotocol/hono @hono/node-server hono zod tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;ℹ️ On TypeScript 6+, add &lt;code&gt;"types": ["node"]&lt;/code&gt; to your tsconfig &lt;code&gt;compilerOptions&lt;/code&gt; after installing &lt;code&gt;@types/node&lt;/code&gt;. TS 6 no longer auto-includes &lt;code&gt;@types/*&lt;/code&gt;, and you'll get &lt;code&gt;Cannot find name 'process'&lt;/code&gt; errors without it. Ask me how I know. 😴&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Step 2: The server logic
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;bot.ts&lt;/code&gt;. This is the whole MCP server, with zero platform code in it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 bot.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;CallToolResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;InputRequiredResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;acceptedContent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CLIENT_CAPABILITIES_META_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createRequestStateCodec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;inputRequired&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod/v4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;requestsServed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;DeployState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// set STATE_KEY in production so all instances share the secret&lt;/span&gt;
&lt;span class="c1"&gt;// lazy init: Workers forbids generating random values at module scope&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;createRequestStateCodec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DeployState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;stateCodec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;STATE_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;codec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createRequestStateCodec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DeployState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRandomValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="na"&gt;ttlSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CONFIRM_SCHEMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;boolean&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// runs per request, keep it cheap&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildServer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;requestsServed&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;updated-mcp-spec-bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;cacheHints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tools/list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ttlMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cacheScope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;requestState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;stateCodec&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list_deployments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;List deployments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;List all deployments recorded by this server.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CallToolResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; @ &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No deployments yet.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_stats&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server stats&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;How many requests this process served, each on a fresh server instance.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CallToolResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`pid=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;edge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; requestsServed=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;requestsServed&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deploy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deploy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deploy to an environment. Requires confirmation: interactive clients get a prompt, others must pass confirm: true.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;staging&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Target environment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Set true to confirm, only after asking the user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;confirm&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CallToolResult&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;InputRequiredResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;caps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpReq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;envelope&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)?.[&lt;/span&gt;
          &lt;span class="nx"&gt;CLIENT_CAPABILITIES_META_KEY&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getClientCapabilities&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canElicit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;caps&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;elicitation&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;elicitation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canElicit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpReq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DeployState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;acceptedContent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpReq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputResponses&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;inputRequired&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;inputRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;inputRequired&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;elicit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Deploy to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;? This will go live.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;requestedSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CONFIRM_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="p"&gt;}),&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;requestState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;stateCodec&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Deployed to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// fallback for clients without elicitation support&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;confirm&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Deploy to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; needs confirmation. Ask the user, then call deploy again with confirm: true.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Deployed to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A few things worth explaining here:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;buildServer()&lt;/code&gt; runs on every single request. Not once at startup. Every request gets a brand-new &lt;code&gt;McpServer&lt;/code&gt; instance.&lt;/p&gt;

&lt;p&gt;If that surprises you, I get it. It surprised me too. But this is literally the canonical pattern from the SDK's own examples, and it's the whole point of the release.&lt;/p&gt;

&lt;p&gt;Construction is just object creation and a handler map, microseconds of work. There's no protocol state to preserve anymore, so there's nothing to keep alive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-request server construction, per-process resources&lt;/strong&gt;. App state (our deployments array, the state codec, your DB pool in real life) lives at module level. The server instance is disposable.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;deploy&lt;/code&gt; tool never blocks. When it needs confirmation, it returns &lt;code&gt;inputRequired(...)&lt;/code&gt; and the request is over. Done. Connection closed. The &lt;code&gt;requestState&lt;/code&gt; token is the only thing that survives between rounds, and it round-trips through the client.&lt;/p&gt;

&lt;p&gt;This means the client could tamper with it. That's why we seal it with &lt;code&gt;createRequestStateCodec&lt;/code&gt;, so tampered or expired state gets rejected with a wire-level error before our handler even runs.&lt;/p&gt;

&lt;p&gt;Notice the codec is &lt;strong&gt;lazily created&lt;/strong&gt; on first use instead of at module level. That looks like a pointless indirection on Node. It's not. Cloudflare Workers forbids generating random values in global scope, and this exact line is what lets the same file run on both platforms. Same story with the &lt;code&gt;globalThis.process?.&lt;/code&gt; guards: Workers has no &lt;code&gt;process&lt;/code&gt; global by default.&lt;/p&gt;

&lt;p&gt;So the tool reads the client's declared capabilities from the per-request envelope (that's the &lt;code&gt;CLIENT_CAPABILITIES_META_KEY&lt;/code&gt; lookup, with a legacy-connection fallback) and if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client supports elicitation then the full MRTR confirmation flow&lt;/li&gt;
&lt;li&gt;Client doesn't then the tool accepts an optional &lt;code&gt;confirm: true&lt;/code&gt; argument, and without it, it returns a plain instruction: "Ask the user, then call deploy again with confirm: true"&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 3: The Node entry
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;server.ts&lt;/code&gt;. This is everything Node-specific:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 server.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;serve&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hono/node-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createMcpHonoApp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/hono&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createMcpHandler&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;buildServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./bot.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMcpHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buildServer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// in production set ALLOWED_HOSTS to your public domain&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allowedHosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ALLOWED_HOSTS&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMcpHonoApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allowedHosts&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;allowedHosts&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/healthz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HOST&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`updated-mcp-spec-bot listening on &amp;lt;http://$&amp;gt;{hostname}:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcp`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. &lt;code&gt;createMcpHandler&lt;/code&gt; gives you a standard fetch-style handler, and Hono is just routing. &lt;code&gt;createMcpHonoApp()&lt;/code&gt; validates Host/Origin headers (DNS rebinding protection) and only allows localhost out of the box, so the &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt; env var is there for when this runs behind a real domain.&lt;/p&gt;

&lt;p&gt;Everything is env-driven (&lt;code&gt;PORT&lt;/code&gt;, &lt;code&gt;HOST&lt;/code&gt;, &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt;, &lt;code&gt;STATE_KEY&lt;/code&gt;) because that's what a VM or a PaaS like Railway wants. We won't use this file for the Cloudflare deploy, but it's your path if you'd rather run this on Node anywhere.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: The client
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;client.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 client.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;StreamableHTTPClientTransport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MCP_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;http://127.0.0.1:3000/mcp&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcp-demooo-client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;elicitation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;versionNegotiation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// use 2026-07-28 when the server does&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The elicitation handler: in a real app this renders a confirm dialog.&lt;/span&gt;
&lt;span class="c1"&gt;// Here we auto-accept and log what the server asked.&lt;/span&gt;
&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;elicitation/create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`\n[elicitation] server asks: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" -&amp;gt; answering yes`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StreamableHTTPClientTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`connected, negotiated protocol: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNegotiatedProtocolVersion&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ttlMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cacheScope&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ttlMs&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;cacheScope&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`tools/list: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`cache hints: ttlMs=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ttlMs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; cacheScope=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cacheScope&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;second listTools served from cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list_deployments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`list_deployments: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deploy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`deploy: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_stats&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`server_stats: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list_deployments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`list_deployments: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;⚠️ Don't miss &lt;code&gt;versionNegotiation: { mode: 'auto' }&lt;/code&gt;. Without it, the client negotiates the legacy 2025-11-25 protocol and the MRTR flow fails. This took me half an hour to debug.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice the elicitation handler is a completely normal &lt;code&gt;elicitation/create&lt;/code&gt; handler, the same one you'd write for the old flow. The SDK's auto-fulfillment engine routes the embedded MRTR request through it and retries the tool call for you. Your code doesn't even see the round trip.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Run it
&lt;/h3&gt;

&lt;p&gt;In two terminals (better with &lt;a href="https://github.com/tmux/tmux/wiki" rel="noopener noreferrer"&gt;tmux&lt;/a&gt;), run the following:&lt;/p&gt;

&lt;p&gt;In the first terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsx server.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And in the other:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsx client.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is the kinda output you'd get:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;connected, negotiated protocol: 2026-07-28

tools/list: list_deployments, server_stats, deploy
cache hints: ttlMs=30000 cacheScope=public

second listTools served from cache
list_deployments: No deployments yet.

[elicitation] server asks: "Deploy to prod? This will go live." -&amp;gt; answering yes
deploy: Deployed to prod at 2026-08-01T08:02:45.601Z

server_stats: pid=159984 requestsServed=6
list_deployments: prod @ 2026-08-01T08:02:45.601Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every line here demonstrates a spec feature, and I designed it that way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;2026-07-28&lt;/code&gt;: we're on the new protocol, not the legacy fallback&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ttlMs=30000&lt;/code&gt; + &lt;code&gt;served from cache&lt;/code&gt;: the second &lt;code&gt;listTools()&lt;/code&gt; never touched the network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The elicitation line, then the deploy&lt;/strong&gt;: that was two &lt;code&gt;tools/call&lt;/code&gt; POSTs. First one returned &lt;code&gt;input_required&lt;/code&gt; and closed. Second had the answer plus the sealed &lt;code&gt;requestState&lt;/code&gt;. No stream was ever held open.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requestsServed=6&lt;/code&gt;: six requests, six fresh server instances, one process. Under a load balancer, those six could've hit six different machines. How cool is that?&lt;/li&gt;
&lt;li&gt;The final &lt;code&gt;list_deployments&lt;/code&gt;: app state survived even though protocol state didn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the math is here: 4 tool calls, plus 2 &lt;code&gt;listTools()&lt;/code&gt; where only 1 hit the wire, plus 1 extra round for the MRTR retry = 6 server builds.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foopkg0th0lfdarmt41rx.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foopkg0th0lfdarmt41rx.png" alt="tool call output" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Look at the raw wire
&lt;/h3&gt;

&lt;p&gt;Let's see the "no handshake" thing. One bare curl, with no initialization:&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://127.0.0.1:3000/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json, text/event-stream"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"MCP-Protocol-Version: 2026-07-28"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Mcp-Method: tools/call"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Mcp-Name: list_deployments"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_deployments","arguments":{},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;btw, this curl command was suggested by Claude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the result you get back:&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;"result"&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;"content"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod @ 2026-08-01T08:02:45.601Z"&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;"resultType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"complete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"_meta"&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;"io.modelcontextprotocol/serverInfo"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"updated-mcp-spec-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&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="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;Two things worth noticing in that response.&lt;/p&gt;

&lt;p&gt;The result already shows the prod deployment, because I ran this curl against the same server process the client just deployed through.&lt;/p&gt;

&lt;p&gt;A totally separate client, no handshake, no session, and it reads the record the TypeScript client wrote. App state persists, protocol state doesn't.&lt;/p&gt;

&lt;p&gt;Look at those headers. &lt;code&gt;Mcp-Method&lt;/code&gt; and &lt;code&gt;Mcp-Name&lt;/code&gt; are right there for your gateway to route on. And the &lt;code&gt;_meta&lt;/code&gt; makes the request fully self-describing.&lt;/p&gt;

&lt;p&gt;The DX here is genuinely good.&lt;/p&gt;


&lt;h2&gt;
  
  
  Deploying to Cloudflare Workers
&lt;/h2&gt;

&lt;p&gt;We're deploying this to Cloudflare Workers, and it costs nothing: the free plan gives you 100,000 requests a day and a &lt;code&gt;*.workers.dev&lt;/code&gt; subdomain, no credit card needed.&lt;/p&gt;

&lt;p&gt;Why Workers? Because it's the natural way for a stateless MCP server. &lt;code&gt;createMcpHandler&lt;/code&gt; returns a fetch-style handler, and fetch handlers are literally what Workers runs. The entire platform difference fits in one tiny file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Cloudflare has quick-start MCP templates (&lt;code&gt;npm create cloudflare -- --template=cloudflare/ai/demos/remote-mcp-authless&lt;/code&gt;). As of writing, Cloudflare's own docs warn that these still scaffold the deprecated &lt;code&gt;McpAgent&lt;/code&gt; path and say, "Do not use that path for a new server." It's the old stateful world, and it doesn't speak 2026-07-28. Skip the template. &lt;code&gt;createMcpHandler&lt;/code&gt; is the recommended path, and it's what we're already using.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Step 1: The Worker entry
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;worker.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 worker.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hono&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hono&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createMcpHandler&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;buildServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./bot.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMcpHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buildServer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Hono&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/healthz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Eleven lines. Same &lt;code&gt;buildServer&lt;/code&gt;, same tools, same MRTR flow.&lt;/p&gt;

&lt;p&gt;Two deliberate differences from the Node entry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plain &lt;code&gt;new Hono()&lt;/code&gt; instead of &lt;code&gt;createMcpHonoApp()&lt;/code&gt;. The Host validation in &lt;code&gt;createMcpHonoApp&lt;/code&gt; is DNS rebinding protection &lt;em&gt;for&lt;/em&gt; localhost &lt;em&gt;servers&lt;/em&gt;. Behind Cloudflare's edge, it just gets in the way.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;serve(...)&lt;/code&gt;. Workers calls your exported fetch handler itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 2: The wrangler config
&lt;/h3&gt;

&lt;p&gt;Wrangler is Cloudflare's CLI for Workers. It bundles your TypeScript (no build step needed), runs it locally on the real production runtime, manages secrets, and deploys.&lt;br&gt;
&lt;/p&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;-D&lt;/span&gt; wrangler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create &lt;code&gt;wrangler.jsonc&lt;/code&gt;:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"updated-mcp-spec-bot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"worker.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compatibility_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compatibility_flags"&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="s2"&gt;"nodejs_compat"&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;The &lt;code&gt;nodejs_compat&lt;/code&gt; flag fills in Node-ish globals so npm packages behave.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Test on the real runtime, locally
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wrangler dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This runs &lt;code&gt;worker.ts&lt;/code&gt; on &lt;strong&gt;workerd&lt;/strong&gt;, the same engine that runs in Cloudflare production, at &lt;code&gt;http://localhost:8787&lt;/code&gt;. Point the client at it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MCP_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:8787/mcp npx tsx client.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Same full output as the Node run: &lt;code&gt;2026-07-28&lt;/code&gt; negotiated, cache hints, the MRTR deploy round-trip. Except one line:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;server_stats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pid=1 requestsServed=6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;pid=1&lt;/code&gt;. That's the edge runtime saying hello. 🫡&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Deploy it
&lt;/h3&gt;

&lt;p&gt;Create a free account at &lt;a href="https://dash.cloudflare.com/sign-up" rel="noopener noreferrer"&gt;dash.cloudflare.com/sign-up&lt;/a&gt; if you don't have one, then:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wrangler login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Set the production &lt;code&gt;requestState&lt;/code&gt; secret (this is the shared HMAC key, so every edge instance can verify tokens minted by any other):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32          &lt;span class="c"&gt;# copy the output&lt;/span&gt;
npx wrangler secret put STATE_KEY   &lt;span class="c"&gt;# paste it when prompted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ztb609ovf6yanabtixu.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ztb609ovf6yanabtixu.png" alt="wrangler setup" width="797" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ One gotcha from my own run: the key must be at least 32 bytes or the codec throws at startup. &lt;code&gt;openssl rand -hex 32&lt;/code&gt; gives you 64 hex characters, which is plenty.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And ship it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wrangler deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;First deploy asks you to pick your free &lt;code&gt;workers.dev&lt;/code&gt; subdomain. Ten seconds later:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://updated-mcp-spec-2026.&amp;lt;your-subdomain&amp;gt;.workers.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your MCP server is live on Cloudflare's global edge.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcja7s8fxhktca8wy70o.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcja7s8fxhktca8wy70o.png" alt="mcp server in cloudflare" width="798" height="262"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Verify from the outside
&lt;/h3&gt;

&lt;p&gt;Run the Step 6 curl against the public URL (just swap the host), hit &lt;code&gt;/healthz&lt;/code&gt; in a browser, and then the real proof:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MCP_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://updated-mcp-spec-2026.&amp;lt;your-subdomain&amp;gt;.workers.dev/mcp npx tsx client.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Same output. Except now it's on the internet.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdjl92s674r1jubmq1fn.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdjl92s674r1jubmq1fn.png" alt="remote mcp server" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect a real agent to it, with no tunnel and no ngrok:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http updated-mcp-spec-2026 &lt;span class="se"&gt;\&lt;/span&gt;
  https://updated-mcp-spec-bot.&amp;lt;your-subdomain&amp;gt;.workers.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run &lt;code&gt;/mcp&lt;/code&gt; in a Claude Code session to see it connected, then ask it to "deploy to staging". Since Claude Code doesn't declare the elicitation capability yet, our capability-aware fallback kicks in: the tool tells the agent to confirm with you first, you say yes in chat, and the deploy lands.&lt;/p&gt;

&lt;p&gt;Bonus: run &lt;code&gt;npx wrangler tail&lt;/code&gt; while you do it and watch the requests land in your production logs live.&lt;/p&gt;

&lt;p&gt;Here’s a small demo:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9xQ5RmU-Hrc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;
&lt;h3&gt;
  
  
  One caveat
&lt;/h3&gt;

&lt;p&gt;Our &lt;code&gt;deployments&lt;/code&gt; array lives in memory, and on Workers, memory is extra ephemeral: isolates spin up and down per location, so two requests might see different histories. That's not a bug in the demo; it's the whole lesson of the spec, one more time. Protocol state is gone by design, and app state belongs in real storage. On Cloudflare, that's KV, D1, or Durable Objects.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where Composio fits
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5wnytjebt7lcoblnckp8.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5wnytjebt7lcoblnckp8.png" alt="Composio" width="799" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What we just built is one server with three tools. Real agents need Gmail, Slack, Notion, GitHub, Linear, and fifty other things.&lt;/p&gt;

&lt;p&gt;You could build and deploy a similar server for every one of those. Handle each app's OAuth. Keep up with every API change. Run all that infra.&lt;/p&gt;

&lt;p&gt;Or you point your agent at Composio, which gives you 1000+ apps behind a single MCP endpoint:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build custom MCP servers (like the one we built) for your own domain logic, and let Composio be the app layer for everything else.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The 2026-07-28 spec is a breaking release, and it's the good kind of breaking.&lt;/p&gt;

&lt;p&gt;MCP servers are now boring HTTP services. Deploy them like you deploy everything else: stateless, load-balanced, cacheable, autoscaled. The handshake is gone, sessions are gone, and interactive tools work anyway thanks to MRTR.&lt;/p&gt;

&lt;p&gt;If you're starting a new server today: use SDK v2, use the &lt;code&gt;createMcpHandler(buildServer)&lt;/code&gt; factory pattern, keep resources at module level, seal your &lt;code&gt;requestState&lt;/code&gt;, and split your logic from your platform entry. We went from localhost to Cloudflare's global edge with an eleven-line file, and the same split works for Railway, Render, Fly, or a plain VM through &lt;code&gt;server.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you have existing servers: you've got a 12-month window on everything deprecated. Use it.&lt;/p&gt;

&lt;p&gt;Now your MCP server finally gets to be just another web service. 🤌&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr11gknb9xy4kfo0eq31y.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr11gknb9xy4kfo0eq31y.gif" alt="noiceee" width="450" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ You can find the entire source code in &lt;a href="https://github.com/shricodev/updated-2026-july-mcp-spec-tut" rel="noopener noreferrer"&gt;the repository&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;SDE • GOLD @Microsoft Student Ambassador • Prev Lead Collab and Dev-Team Lead @oppiaorg • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>mcp</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>7 Best Claude Cowork Alternatives in 2026 (Free &amp; Open Source Included)</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Wed, 05 Aug 2026 03:29:13 +0000</pubDate>
      <link>https://dev.to/composiodev/7-best-claude-cowork-alternatives-in-2026-free-open-source-included-5f4l</link>
      <guid>https://dev.to/composiodev/7-best-claude-cowork-alternatives-in-2026-free-open-source-included-5f4l</guid>
      <description>&lt;p&gt;At this point, I have become a heavy user of Claude Co-work. I let it handle most of my tasks, like research, content, reports and even YouTube.&lt;/p&gt;

&lt;p&gt;However, one thing always bugs me: the $ 100 bill that comes at the end of each month. Yup, that’s the price I pay for owning simplicity and that too at the cost of sharing my data &amp;amp; it's inevitable. This really bugs me. &lt;/p&gt;

&lt;p&gt;So I went and looked for alternative versions and found a few. Out of curiosity, I tested a few, and they are surprisingly good. Even one was launched on June 23 (Open Worker by AndrewNG) &lt;/p&gt;

&lt;p&gt;This article shares the alternative I tried, what each offers, and how I used them. Though none solves all the problems, but ya reduces/removes some of them - either cost, data sharing, or vendor-lock in.&lt;/p&gt;

&lt;p&gt;Let’s begin with revisiting Claude Cowork.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Claude Cowork
&lt;/h2&gt;

&lt;p&gt;For those who are probably living under a rock;&lt;/p&gt;

&lt;p&gt;Claude Cowork is Anthropic's agentic knowledge-work tool, available with Claude Desktop. It's aimed at people who are non-technical  but want to use Claude to do a lot of their mundane tasks like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading, editing, and creating files,&lt;/li&gt;
&lt;li&gt;pulling from connected apps, and r&lt;/li&gt;
&lt;li&gt;returning finished deliverables: reports, spreadsheets, or organised folders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It became quite popular because these are things most top executives always do; it kind of automates that.  Also, the experience is polished, effective, and worth the switch (at least that's what I happened to think earlier)&lt;/p&gt;

&lt;p&gt;However, it comes at a steep cost for heavy users: Max Plan ($100 or $200/month, depending on usage multiplier). Also, it consumes the limit faster than regular chat because of tool calling, browser use, and PC use, and it shares data with Claude's servers. &lt;/p&gt;

&lt;p&gt;If you are someone like me, you probably don’t want that roi on your investment, so here are a few alternatives I figured out.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Look for in Claude Cowork Alternatives
&lt;/h2&gt;

&lt;p&gt;Before choosing an alternative, focus on how well it fits your actual workflow—not just how many features it offers. Here are the key factors I considered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy and data control:&lt;/strong&gt; Check whether your files and conversations stay on-device, are sent to third-party model providers, or are used for training.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing and usage limits:&lt;/strong&gt; Compare subscriptions, API costs, rate limits, and the price of running long or tool-heavy tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model flexibility:&lt;/strong&gt; Look for support for multiple providers or local models so you are not locked into one AI ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool integrations:&lt;/strong&gt; Make sure it connects to the apps you use, such as Gmail, Slack, calendars, browsers, CRMs, and local files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomy and approvals:&lt;/strong&gt; A capable coworker should complete multi-step tasks while asking for approval before sending messages, changing files, or taking other consequential actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output quality:&lt;/strong&gt; Prioritise tools that return polished, usable documents, spreadsheets, presentations, or reports—not just chat responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of setup:&lt;/strong&gt; Consider whether you want a ready-to-use cloud product or are comfortable configuring API keys, permissions, models, and self-hosted infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory and recurring tasks:&lt;/strong&gt; Persistent context, scheduled workflows, and background execution matter if you want an agent that improves over time and handles ongoing work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No single option wins across every category. The best Claude Cowork alternative is the one that offers the right balance of cost, privacy, integrations, and control for your needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top Alternatives to Claude Cowork in 2026
&lt;/h2&gt;

&lt;p&gt;Here’s a quick comparison of the seven alternatives before we examine each one in detail.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Alternative&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Starting price&lt;/th&gt;
&lt;th&gt;Open source&lt;/th&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenWorker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privacy, local control, and model flexibility&lt;/td&gt;
&lt;td&gt;Free + model costs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Local-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ChatGPT Work&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy setup and polished business deliverables&lt;/td&gt;
&lt;td&gt;Free; paid plans from $8/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cloud-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Copilot Cowork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft 365 organisations and enterprise workflows&lt;/td&gt;
&lt;td&gt;Copilot licence + usage credits&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perplexity Computer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep research and long-running multi-model tasks&lt;/td&gt;
&lt;td&gt;Pro from $20/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cloud-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Technical users, self-hosting, memory, and automation&lt;/td&gt;
&lt;td&gt;Free + model/hosting costs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Local or self-hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rowboat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistent knowledge graphs and context-rich work&lt;/td&gt;
&lt;td&gt;$14/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Local-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenWork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shareable agent skills, MCPs, and team workflows&lt;/td&gt;
&lt;td&gt;Free; teams from $10/seat/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Local or self-hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. OpenWorker
&lt;/h3&gt;

&lt;p&gt;Local-first, open-source AI coworker for private, model-flexible work.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lpjowfz8a8cbhe08i92.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lpjowfz8a8cbhe08i92.png" alt="OpenWorker" width="799" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenWorker is an open-source, local-first AI coworker built for people who want Claude Cowork-style execution without committing to one model provider. &lt;/p&gt;

&lt;p&gt;This is by Andrew Ng, by the way.&lt;/p&gt;

&lt;p&gt;It works across local files and everyday apps, produces finished deliverables, and pauses for approval before taking consequential actions. Its strongest advantages are privacy and flexibility: credentials are stored on-device, and your data leaves the machine only through the model providers and integrations you choose. You can use OpenAI, Anthropic, Google, open-weight providers, or Ollama for a fully local setup. The trade-off is setup complexity—you need to supply and manage your own model access, and Windows support is still forthcoming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenWorker app:&lt;/strong&gt; Free and open source; there is no subscription or seat fee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model usage:&lt;/strong&gt; Bring your own API key and pay the selected provider directly based on token usage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local option:&lt;/strong&gt; Ollama can eliminate recurring model provider fees, though you still provide the hardware and electricity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional costs:&lt;/strong&gt; Connected services may require their own paid accounts. Your total is therefore usage-dependent rather than a fixed monthly bill.&lt;/li&gt;
&lt;li&gt;See the official OpenWorker website for current availability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free, open source, and local-first.&lt;/li&gt;
&lt;li&gt;Works with multiple hosted providers and local models through Ollama.&lt;/li&gt;
&lt;li&gt;Stores credentials on-device and gives you control over where data is sent.&lt;/li&gt;
&lt;li&gt;Requests approval before consequential actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires you to configure and pay for model providers yourself.&lt;/li&gt;
&lt;li&gt;Total API costs can be difficult to predict for heavy workloads.&lt;/li&gt;
&lt;li&gt;Less polished and more technical than fully managed alternatives.&lt;/li&gt;
&lt;li&gt;Windows support is not yet available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can download a pre-built macOS binary from &lt;a href="https://download.openworker.com/mac" rel="noopener noreferrer"&gt;https://download.openworker.com/mac&lt;/a&gt; (signed/notarized, auto-updates).&lt;/li&gt;
&lt;li&gt;Or clone &lt;a href="https://github.com/andrewyng/openworker" rel="noopener noreferrer"&gt;https://github.com/andrewyng/openworker&lt;/a&gt; and follow the bootstrap script for source builds (Python/Node/Rust prerequisites).&lt;/li&gt;
&lt;li&gt;Not available for Windows yet&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. ChatGPT Work
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Cloud-based agentic workspace for polished deliverables across connected apps.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F21pz8aztg76t1k54pe6p.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F21pz8aztg76t1k54pe6p.png" alt="ChatGPT Work" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Released in July 2026, ChatGPT Work is OpenAI’s cloud-first agentic workspace for turning a requested outcome into a finished document, spreadsheet, deck, site, or other deliverable. It has the lowest setup friction in this list and works well for users who value polished output, long-running execution, and connected-app orchestration. It is available across ChatGPT plans, but limits and model access vary significantly by tier. Unlike local-first alternatives, your work is processed in OpenAI’s environment, and your model choices are limited to what OpenAI makes available. Business and Enterprise plans are the better fit when governance, shared workspaces, and organisational controls matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; $0, with access to Work but the lowest usage limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go:&lt;/strong&gt; About $8/month, offering more capacity than Free but fewer premium capabilities than Plus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plus:&lt;/strong&gt; $20/month for higher limits and access to more advanced models and tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; $100 or $200/month, depending on the usage tier, aimed at heavy individual users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business:&lt;/strong&gt; $20/user/month billed annually or $25/user/month billed monthly, generally with a two-seat minimum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise and Edu:&lt;/strong&gt; Custom pricing, with additional security, governance, support, and administrative controls.&lt;/li&gt;
&lt;li&gt;ChatGPT Work is included with eligible ChatGPT plans rather than sold as a separate add-on. API usage is billed separately. Check the official pricing page for current limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comes with ChatGPT, so no extra cost for the Work product.&lt;/li&gt;
&lt;li&gt;Produces polished documents, spreadsheets, decks, sites, and other deliverables.&lt;/li&gt;
&lt;li&gt;Offers the easiest setup experience on this list.&lt;/li&gt;
&lt;li&gt;Strong connected-app orchestration and long-running task execution.&lt;/li&gt;
&lt;li&gt;Available across individual, business, education, and enterprise plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-first processing provides less local data control.&lt;/li&gt;
&lt;li&gt;Limited to models and capabilities selected by OpenAI.&lt;/li&gt;
&lt;li&gt;Free and lower-cost plans have tighter usage limits.&lt;/li&gt;
&lt;li&gt;Heavy users may need an expensive Pro tier, while API usage is billed separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No install needed; use the ChatGPT web app or official desktop/mobile apps. Least friction option.&lt;/li&gt;
&lt;li&gt;Enable Work mode in the interface after signing in with a ChatGPT account.&lt;/li&gt;
&lt;li&gt;Connect apps via the built-in integrations/plugins panel or use composio to access 1000+ plus apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Microsoft Copilot Cowork
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Enterprise AI coworker built for end-to-end execution across Microsoft 365.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fptsaeq3thinvsd6pwtqz.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fptsaeq3thinvsd6pwtqz.png" alt="Microsoft Copilot Cowork" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft 365 Copilot Cowork is the strongest fit for organisations already centred on Microsoft 365. &lt;/p&gt;

&lt;p&gt;It uses Work IQ context to execute multi-step tasks across Outlook, Teams, Word, Excel, PowerPoint, calendars, and tenant data, with approval checkpoints before actions are completed. &lt;/p&gt;

&lt;p&gt;Its biggest advantage is deep organisational context and native integration rather than model flexibility. It is cloud-based, governed through Microsoft 365, and designed primarily for enterprise knowledge work. &lt;/p&gt;

&lt;p&gt;Setup is straightforward for licensed users, but administrators must enable access and configure usage-based billing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Required licence:&lt;/strong&gt; An eligible Microsoft 365 Copilot User Subscription Licence is required; the exact base price depends on the organisation’s Microsoft 365 plan, region, and contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cowork usage:&lt;/strong&gt; Cowork tasks are billed separately through usage-based &lt;strong&gt;Copilot Credits&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How task cost is calculated:&lt;/strong&gt; Microsoft factors in model use, context retrieval, tool calls, and task runtime, so complex workflows cost more than simple ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budgeting:&lt;/strong&gt; The effective total is the Copilot licence plus consumed credits. Administrators can configure billing and usage policies in the Microsoft 365 admin environment.&lt;/li&gt;
&lt;li&gt;Microsoft does not present Cowork as a simple unlimited flat-rate add-on. See the official Copilot pricing page and Cowork pricing explanation for current terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep native integration with Outlook, Teams, Word, Excel, PowerPoint, and Microsoft 365 data.&lt;/li&gt;
&lt;li&gt;Work IQ provides rich organisational context for enterprise tasks.&lt;/li&gt;
&lt;li&gt;Includes approval checkpoints and central administrative controls.&lt;/li&gt;
&lt;li&gt;Strong fit for organisations already standardised on Microsoft 365.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires an eligible Microsoft 365 Copilot licence.&lt;/li&gt;
&lt;li&gt;Usage-based Copilot Credits make the total cost less predictable.&lt;/li&gt;
&lt;li&gt;Offers less flexibility in model and deployment than open-source alternatives.&lt;/li&gt;
&lt;li&gt;Setup and billing may require administrator involvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires a Microsoft 365 Copilot license (User Subscription License); costs $30 / month/user, billed annually&lt;/li&gt;
&lt;li&gt;Access via the Microsoft 365 Copilot app or web interface (toggle to Cowork mode); no separate download for core users.&lt;/li&gt;
&lt;li&gt;Enable via admin/Frontier rollout if not yet visible; works on desktop, web, and mobile.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Perplexity Computer
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Multi-model computer agent for deep research and long-running workflows.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhoo0tvdrrxz4nbig0u1s.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhoo0tvdrrxz4nbig0u1s.png" alt="Perplexity Computer" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perplexity Computer is best suited to research-heavy, long-running work that benefits from multi-model orchestration. It can browse, research, create deliverables, connect tools, and run tasks in the background while selecting from multiple frontier models. &lt;/p&gt;

&lt;p&gt;This makes it more model-flexible than single-provider products, although execution still happens primarily in Perplexity’s managed cloud environment. &lt;/p&gt;

&lt;p&gt;Its research quality, citations, and polished outputs are major strengths; the main constraints are credit-based usage, less predictable costs for heavy workloads, and limited local control compared with open-source options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; $0, primarily for standard search; Computer access and credits are limited or unavailable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; $20/month or about $17/month when billed annually. Includes access to Computer, 4,000 bonus credits, advanced models, and the option to purchase additional usage credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max:&lt;/strong&gt; $200/month or about $167/month when billed annually. Includes higher model access and 10,000 monthly Computer credits; temporary bonus-credit promotions may vary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; Custom pricing with organisational controls, connectors, security features, and higher-scale usage.&lt;/li&gt;
&lt;li&gt;Computer is credit-metered, so intensive browser, research, and generation tasks can consume the allowance faster. Check Perplexity’s official pricing page for current credit allocations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent for deep, multi-source research with citations.&lt;/li&gt;
&lt;li&gt;Orchestrates multiple frontier models instead of relying on a single model family.&lt;/li&gt;
&lt;li&gt;Runs long tasks in the background and returns polished deliverables.&lt;/li&gt;
&lt;li&gt;Provides broad browsing, creation, and connected-tool capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credit-based usage can become expensive and difficult to forecast.&lt;/li&gt;
&lt;li&gt;Managed cloud execution provides less control than a local-first tool.&lt;/li&gt;
&lt;li&gt;The best capacity and model access require the costly Max plan.&lt;/li&gt;
&lt;li&gt;Desktop permissions and companion-app setup add friction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the Perplexity macOS or Windows app from perplexity.ai and sign in.&lt;/li&gt;
&lt;li&gt;Install the companion Comet agentic browser for full web automation.&lt;/li&gt;
&lt;li&gt;Grant Accessibility, Screen Recording, and Full Disk Access permissions; connect folders and services.&lt;/li&gt;
&lt;li&gt;Pair the phone app for 2FA/approvals and remote task kicks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all these steps, it might feel like a hassle, but it’s a one-time effort and worth it. &lt;/p&gt;

&lt;p&gt;I loved the research reports it created and the use of a background agent. UI also felt smooth.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Hermes Agent
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Self-hosted, self-improving autonomous agent for technical power users.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7104w120hrcdmvjomm2x.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7104w120hrcdmvjomm2x.png" alt="Hermes Agent" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hermes Agent by Nous Research is the most technical and customisable option in this list. It is open source, model-agnostic, and designed around persistent memory, scheduled work, and a learning loop that creates and improves skills over time. &lt;/p&gt;

&lt;p&gt;It can run locally, on a VPS, or on other infrastructure, and can be accessed via interfaces such as Telegram, Discord, Slack, and the CLI. This gives you strong privacy and deployment control, but it also demands more setup and maintenance than a managed coworker. &lt;/p&gt;

&lt;p&gt;Approval behaviour and data exposure depend on how you configure the model provider, tools, and hosting environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent software:&lt;/strong&gt; Free and open source under the MIT licence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nous Portal Free:&lt;/strong&gt; $0 with free models, standard rate limits, and no monthly paid credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nous Portal Plus:&lt;/strong&gt; $20/month with $22 in monthly credits and a $10 rollover cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nous Portal Super:&lt;/strong&gt; $100/month with $110 in monthly credits and a $50 rollover cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nous Portal Ultra:&lt;/strong&gt; $200/month with $220 in monthly credits and a $100 rollover cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own provider:&lt;/strong&gt; OpenRouter, Anthropic, OpenAI, and other providers are billed at their respective token rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Local use may cost only hardware and electricity; an always-on VPS adds a separate monthly infrastructure bill. See Nous Portal pricing for current credits and limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free, open source, model-agnostic, and highly customisable.&lt;/li&gt;
&lt;li&gt;Persistent memory and a learning loop help it improve across sessions.&lt;/li&gt;
&lt;li&gt;Supports local machines, VPSs, clusters, and multiple chat interfaces.&lt;/li&gt;
&lt;li&gt;Handles scheduled and always-on workflows without tying you to one vendor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has the steepest setup and maintenance burden in this list.&lt;/li&gt;
&lt;li&gt;Security, approvals, and data exposure depend heavily on your configuration.&lt;/li&gt;
&lt;li&gt;Model, tool, and hosting charges can accumulate separately.&lt;/li&gt;
&lt;li&gt;Less suitable for non-technical users who want a polished, ready-made experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux / macOS / WSL2 / Termux: Run curl -fsSL &lt;a href="https://hermes-agent.nousresearch.com/install.sh" rel="noopener noreferrer"&gt;https://hermes-agent.nousresearch.com/install.sh&lt;/a&gt; | bash&lt;/li&gt;
&lt;li&gt;Windows (native PowerShell): Run iex (irm &lt;a href="https://hermes-agent.nousresearch.com/install.ps1" rel="noopener noreferrer"&gt;https://hermes-agent.nousresearch.com/install.ps1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;After install, run hermes setup (or hermes model) to configure your LLM provider, then hermes to start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, if you are starting out / non-technical, I will suggest starting with Hermes Desktop.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Rowboat
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Local-first AI coworker powered by a persistent, editable knowledge graph.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9doibxysvk3qwrcwmcdc.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9doibxysvk3qwrcwmcdc.png" alt="Rowboat" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rowboat is a local-first AI coworker built around persistent memory. It turns emails, meeting notes, projects, and other sources into an editable, Obsidian-compatible Markdown knowledge graph, then uses that context to complete work. &lt;/p&gt;

&lt;p&gt;It supports hosted models and local options via Ollama or LM Studio, making it flexible for users who care about data ownership and model choice. Background agents, voice, MCP support, and integrated work surfaces make it capable, but its output depends heavily on the quality of the knowledge graph and chosen model. &lt;/p&gt;

&lt;p&gt;Initial connector and provider configuration is more involved than with a fully managed cloud product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-source deployment:&lt;/strong&gt; The source is available for users who want to run and configure Rowboat themselves; model, hosting, and optional service costs remain separate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starter:&lt;/strong&gt; $14/month with a seven-day trial, unlimited notes, meeting note-taking, voice mode, current models, knowledge-graph context, background agents, integrations, and MCP access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; $50/month with everything in Starter, higher or effectively unlimited usage, and more direct access to the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External services:&lt;/strong&gt; Local models can reduce provider fees, while hosted LLMs, voice services, web search, and integration providers may introduce additional usage charges.&lt;/li&gt;
&lt;li&gt;See the official Rowboat pricing page for current allowances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds persistent, editable memory from emails, meetings, and project context.&lt;/li&gt;
&lt;li&gt;Keeps its knowledge graph in portable, Obsidian-compatible Markdown.&lt;/li&gt;
&lt;li&gt;Supports hosted providers and local models via Ollama and LM Studio.&lt;/li&gt;
&lt;li&gt;Includes background agents, voice features, integrations, and MCP support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output quality depends on the accuracy of the knowledge graph and selected model.&lt;/li&gt;
&lt;li&gt;Initial provider, connector, and optional service setup may be involved.&lt;/li&gt;
&lt;li&gt;Hosted plans and third-party services can add several layers of cost.&lt;/li&gt;
&lt;li&gt;Large knowledge graphs may introduce context-management challenges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can download the latest Mac/Windows/Linux release from &lt;a href="https://www.rowboatlabs.com/downloads" rel="noopener noreferrer"&gt;https://www.rowboatlabs.com/downloads&lt;/a&gt; or &lt;a href="https://github.com/rowboatlabs/rowboat/releases/latest" rel="noopener noreferrer"&gt;https://github.com/rowboatlabs/rowboat/releases/latest&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For Google services (Gmail/Calendar/Drive), follow the setup guide in the repo’s google-setup.md.&lt;/li&gt;
&lt;li&gt;Optionally add API keys for Deepgram (voice input), ElevenLabs (voice output), Exa (web search), or Composio (1000 + tools) in &lt;code&gt;~/.rowboat/config/&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. OpenWork
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Open-source desktop coworker for shareable skills, workflows, and local automation.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7xr0mz2ic5l3dxlno9n.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7xr0mz2ic5l3dxlno9n.png" alt="OpenWork" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do not confuse OpenWork with OpenWorker: they are separate products from different teams. &lt;/p&gt;

&lt;p&gt;OpenWork is an open-source desktop coworker for individuals and teams that want local file access, broad model choice, and reusable workflows.&lt;/p&gt;

&lt;p&gt;It supports more than 50 LLMs through bring-your-own keys and lets teams package and share skills, MCP servers, plugins, providers, and configurations. &lt;/p&gt;

&lt;p&gt;Local execution provides strong file control, while team and enterprise tiers add distribution, governance, and deployment options. &lt;/p&gt;

&lt;p&gt;The trade-off is that model costs and configuration remain your responsibility unless your organisation manages them centrally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo:&lt;/strong&gt; Free and open source, with desktop access and bring-your-own model keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Starter:&lt;/strong&gt; $10/seat/month, billed monthly; the first five seats are free. It adds API access, an extension marketplace, and shared LLM-key distribution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; Custom pricing for SSO/SAML, SCIM, policies, version controls, managed or self-hosted deployment, support, and custom commercial terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model usage:&lt;/strong&gt; LLM-provider charges are separate from the OpenWork subscription and depend on the models and volume used.&lt;/li&gt;
&lt;li&gt;See the official OpenWork pricing page for current terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free, open-source desktop app with local file access.&lt;/li&gt;
&lt;li&gt;Supports more than 50 models and avoids single-provider lock-in.&lt;/li&gt;
&lt;li&gt;Makes skills, MCP servers, plugins, and configurations easy to package and share.&lt;/li&gt;
&lt;li&gt;Offers team and enterprise governance without forcing a cloud-only deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires users or administrators to configure model keys and providers.&lt;/li&gt;
&lt;li&gt;LLM usage charges are separate from team subscription costs.&lt;/li&gt;
&lt;li&gt;More technical than a fully managed coworker such as ChatGPT Work.&lt;/li&gt;
&lt;li&gt;Some collaboration and governance features require paid plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Paste this prompt into Claude Code, Cursor, Codex, or any command-capable agent:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install OpenWork on my computer, set up my first workspace, and open it ready to use. Follow the steps in https://openworklabs.com/start.md?v=hero.
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or download directly from &lt;a href="https://openworklabs.com/download" rel="noopener noreferrer"&gt;https://openworklabs.com/download&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also use this one with Claude or Codex using MCP.  &lt;/p&gt;

&lt;p&gt;For MCP integrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# codex&lt;/span&gt;
codex mcp add openwork &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.openworklabs.com/mcp/agent
codex mcp login openwork

&lt;span class="c"&gt;# claude&lt;/span&gt;
claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http openwork https://api.openworklabs.com/mcp/agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Open Claude Code and run&amp;nbsp;&lt;strong&gt;&lt;code&gt;/mcp&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;strong&gt;&lt;code&gt;openwork&lt;/code&gt;&lt;/strong&gt;, then follow the browser sign-in and choose your organisation.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Connect Any Coworker to the apps your business uses in 2 minutes
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuju8fodybqoiut3n1qjz.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuju8fodybqoiut3n1qjz.png" alt="Composio" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of these agents need to interact with the real world, and you already know the hassle of connecting multiple tools, adding API keys, performing context management, and writing tool-calling prompts. What if all this can be automated?&lt;/p&gt;

&lt;p&gt;That’s where &lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; comes in: it offers a unified interface that lets businesses connect to 1000+ tools via verified &amp;amp; secure OAuth, handles tool calls intelligently, manages tool context, provides observability through the Composio dashboard, and ships with its own CLI &amp;amp; Skill.&lt;/p&gt;

&lt;p&gt;You can install it with any knowledge worker and get started.&lt;/p&gt;

&lt;p&gt;These were my top alternative recommendations to Cowork,  but here is the most important factor for these to exist.&lt;/p&gt;

&lt;p&gt;Recommended Read: &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://composio.dev/content/best-cowork-plugins" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fframerusercontent.com%2Fimages%2FGPW7fJHng1SnG3g1FCeE3p1GUQ.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://composio.dev/content/best-cowork-plugins" rel="noopener noreferrer" class="c-link"&gt;
            Best Claude Cowork Plugins You Must not Miss in 2026 | Composio
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A firsthand review of the Claude Cowork plugins that actually improve day-to-day work, with who each plugin is for, what it does, how to install it, and when to use Composio for secure cross-app workflows.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcomposio.dev%2Ffavicon.ico" width="48" height="48"&gt;
          composio.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;






&lt;h2&gt;
  
  
  How to choose your Claude Cowork alternative
&lt;/h2&gt;

&lt;p&gt;Start with the constraint that matters most to you, then compare the options against your existing workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose OpenWorker&lt;/strong&gt; if you want a free, local-first coworker with model flexibility and approval checkpoints - and you are comfortable managing API keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose ChatGPT Work&lt;/strong&gt; if you want the smoothest setup, polished deliverables, and strong cross-app execution without having to maintain infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Microsoft Copilot Cowork&lt;/strong&gt; if your organisation already runs on Microsoft 365 and needs enterprise context, governance, and native Office integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Perplexity Computer&lt;/strong&gt; if deep research, citations, browser-based work, and long-running multi-model tasks are your priorities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Hermes Agent&lt;/strong&gt; if you are a technical user who wants persistent memory, self-hosting, scheduled tasks, and maximum customisation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Rowboat&lt;/strong&gt; if you want a local, editable knowledge graph that turns emails, meetings, and project history into long-term agent memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose OpenWork&lt;/strong&gt; if you want an open-source desktop coworker with shareable skills, MCP servers, and team-ready workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A quick decision checklist
&lt;/h3&gt;

&lt;p&gt;Before committing, test your top two choices with the same real task and compare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Final output:&lt;/strong&gt; Which one produces the most usable result with the least editing?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total cost:&lt;/strong&gt; Include subscriptions, model usage, credits, hosting, and paid integrations—not just the advertised price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data exposure:&lt;/strong&gt; Identify exactly what stays local and what is sent to model providers or connected services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup effort:&lt;/strong&gt; Decide whether the additional control offered by a self-hosted tool is worth the maintenance overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily fit:&lt;/strong&gt; Check whether it integrates with your core tools and can reliably repeat the workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For most non-technical users, &lt;strong&gt;ChatGPT Work&lt;/strong&gt; is the easiest starting point. For privacy and model freedom, start with &lt;strong&gt;OpenWorker&lt;/strong&gt; or &lt;strong&gt;OpenWork&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;For enterprise Microsoft environments, &lt;strong&gt;Copilot Cowork&lt;/strong&gt; is the natural choice. Technical users who want maximum control should look at &lt;strong&gt;Hermes Agent&lt;/strong&gt;, while research-heavy users will get the most value from &lt;strong&gt;Perplexity Computer&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The shift is real. &lt;/p&gt;

&lt;p&gt;I can grab a closed-source powerhouse like ChatGPT Work, Microsoft Copilot, or Perplexity when I want polish and deep integrations, or switch to open-source tools like OpenWorker, Hermes, Rowboat, and OpenWork when I want privacy, local control, and zero lock-in. &lt;/p&gt;

&lt;p&gt;Either way, I no longer have to accept the $100 bill, constant data sharing or one-vendor walls as the only option.&lt;/p&gt;

&lt;p&gt;Whether you accept it or not, both worlds exist, and knowing which one to use when will be the differentiating factor going forward.&lt;/p&gt;

&lt;p&gt;So get your coworkers, try them out, pick the ones that suit the needs, add tools like composio to access tools intelligently and keep adding contributions and fixes to the open ones.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Top Skills &amp; Plugins to use with Grok Build 2026</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Thu, 30 Jul 2026 13:39:35 +0000</pubDate>
      <link>https://dev.to/composiodev/top-skills-plugins-to-use-with-grok-build-2026-39a0</link>
      <guid>https://dev.to/composiodev/top-skills-plugins-to-use-with-grok-build-2026-39a0</guid>
      <description>&lt;p&gt;xAI released Grok Build in May, and it’s been improving steadily since then.&lt;/p&gt;

&lt;p&gt;With support for spawning up to 8 parallel subagents and a recently added system for skills and plugins, Grok is now a full-fledged ecosystem that rivals contenders like Claude Code and Codex.&lt;/p&gt;

&lt;p&gt;However, unlike Claude or Codex, Grok comes with a superpower - it can scrape X data, the real-time engine behind every major announcement, quality content, trends and conspiracies, all with your X subscription.&lt;/p&gt;

&lt;p&gt;This gives Grok Build a unique edge for research-heavy workflows. You can track launches as they happen, pull insights from real conversations, spot emerging trends, and turn that live context into apps, agents, or automated workflows.&lt;/p&gt;

&lt;p&gt;Access to real-time data is only one part of the equation, though. To make that information useful, Grok needs the right tools to search, process, design, code, and take action across different platforms.&lt;/p&gt;

&lt;p&gt;But with so many options in place for a single need, it's hard to find the right one.&lt;/p&gt;

&lt;p&gt;This guide aims to cover which ones are worth installing on your first install, why to install them, and how to install them.&lt;/p&gt;

&lt;p&gt;Let’s begin with a quick refresher on what skills and plugins are and why you should install them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What are Skills &amp;amp; Plugins &amp;amp; Why They Matter
&lt;/h2&gt;

&lt;p&gt;The concept of skills and plugins is not new, yet people still often interchange them. Both extend the capabilities of Grok Build and are related but not the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; are small, reusable instruction packs (usually a SKILL.md plus optional scripts) that turn Grok into a consistent specialist.&lt;/p&gt;

&lt;p&gt;They eliminate repetitive, long prompts, enforce high-quality practices such as TDD or careful planning, reduce token waste through focused behaviour, and deliver the same reliable results across projects.&lt;/p&gt;

&lt;p&gt;On the other hand;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plugins&lt;/strong&gt; are larger, one-command packages that bundle one or more skills with MCP servers, automation hooks, sub-agents, and platform integrations, giving Grok real superpowers.&lt;/p&gt;

&lt;p&gt;With plugins, Grok Build can do live web research, control browsers, perform database operations, analyse production errors, and enable seamless deployments.&lt;/p&gt;

&lt;p&gt;This is essential for complex agentic workflows and is easy to install, adopt, and share.&lt;/p&gt;

&lt;p&gt;With that clarification done, let’s look at how to install skills and plugins in Grok Build before looking at some of the best skills and plugins you should check out/install first.&lt;/p&gt;

&lt;p&gt;Related: Best OpenCode Skills&lt;/p&gt;




&lt;h2&gt;
  
  
  How to install Skills &amp;amp; Plugins in Grok Build
&lt;/h2&gt;

&lt;h3&gt;
  
  
  kills
&lt;/h3&gt;

&lt;p&gt;The Official ones listed on the marketplace can be accessed using &lt;code&gt;/marketplace&lt;/code&gt; inside Grok Build itself.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Finisf53vsh7yzg843q13.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Finisf53vsh7yzg843q13.png" alt="Way 1" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you can try manual placement&lt;/p&gt;

&lt;p&gt;Put skills in &lt;code&gt;./.grok/skills/&lt;/code&gt; or &lt;code&gt;~/.grok/skills/&lt;/code&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs38thr6bsizslal6e7y3.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs38thr6bsizslal6e7y3.png" alt="Way 2" width="351" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;or add an extra path in the ~/.grok/config.toml under [skills] .&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhse4pcvta4hw8rq1y7el.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhse4pcvta4hw8rq1y7el.png" alt="Way 3" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugins
&lt;/h3&gt;

&lt;p&gt;Grok Plugins can be installed using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; grok plugin install &amp;lt;name&amp;gt; --trust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then verify the plugin by doing &lt;code&gt;/plugin&lt;/code&gt; . &lt;/p&gt;

&lt;p&gt;If it fails, use the Grok Build Marketplace to add it as a plugin.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgaug1ab1lgmf91by97ik.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgaug1ab1lgmf91by97ik.png" alt="Way 1" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you can add extra paths in ~/.grok/config.toml under  [plugins] &lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpr6u70a4dh36gzjc6rik.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpr6u70a4dh36gzjc6rik.png" alt="Way 2" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For both skills and marketplace,  Grok Build comes with automatic compatibility support for &lt;code&gt;.claude/skills&lt;/code&gt; and &lt;code&gt;agent/skills&lt;/code&gt;.  Just put skills there and let grok build pick it up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Alternative
&lt;/h3&gt;

&lt;p&gt;For non-official skills packs like skills.sh use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx skills@latest add &amp;lt;skill&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will use any one of the methods listed going forward. Now time to look at top skills and plugins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top Skills to Use with Grok Build CLI in 2026
&lt;/h2&gt;

&lt;p&gt;These are the top skills I would install if I reinstall Grok Build. Most of them still live in my workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Composio CLI: Power Grok with 1000+ apps from GitHub, Linear, to Figma, Canva.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjosnvdd5nhisf0wrcgp.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjosnvdd5nhisf0wrcgp.png" alt="Compsio" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Composio provides Grok Build with access to more than 1,000 applications via a single remote MCP connection. Instead of loading every integration action into the model’s context, it exposes seven meta-tools that let the agent find tools, initiate authorisation, and execute actions when needed.&lt;/p&gt;

&lt;p&gt;This makes it useful for workflows involving applications such as  GitHub, Linear, Jira, Figma, and other external services. When an application has not been connected, Composio can generate an OAuth authorisation link for the user.&lt;/p&gt;

&lt;p&gt;You can install Composio using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grok mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http composio https://connect.composio.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then type &lt;code&gt;/mcp&lt;/code&gt; , select Composio and complete the OAuth flow.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: In WSL you can’t access the browser directly, so copy-paste the produced URL and configure it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alternatively; &lt;/p&gt;

&lt;p&gt;You can type &lt;code&gt;/mcp&lt;/code&gt;  inside Grok Build, in the mcp window press a to add a new mcp. Add the  &lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt;  and initiate the OAuth flow&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgq9mo0uigg01wvf4yoin.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgq9mo0uigg01wvf4yoin.png" alt="Step 1" width="799" height="500"&gt;&lt;/a&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrpztur8uewbs6e55vg4.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrpztur8uewbs6e55vg4.png" alt="Step 2" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or install the Composio CLI directly. It's a CLI for everything Composio&amp;nbsp;that can handle authentication management, tool calling, bash scripting and everything in-between.&lt;/p&gt;

&lt;p&gt;This gives a more composable way for Grok CLI to work with Composio toolkits.&lt;/p&gt;

&lt;p&gt;You can install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://composio.dev/install | bash
composio login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Complete the OAuth flow and then add the composio-cli skill&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composio --install-skill composio-cli claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that composio-cli, used by Grok Build, follows the correct instructions and doesn’t hallucinate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The reason I put this one at the top is because , it offers the skill, plugins and mcp all bundled together under one ecosystem, so one time config is all you need.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Matt Pocock Skills: Add disciplined planning, TDD, debugging, and handoff workflows.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fek4knyhxmgvui4ny8hlt.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fek4knyhxmgvui4ny8hlt.png" alt="Matt Pocock" width="738" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Matt Pocock Skills adds proper engineering discipline to Grok Build. &lt;/p&gt;

&lt;p&gt;Similar to superpowers, it helps the agent plan more effectively, avoid common failure modes, and follow structured processes rather than jumping straight into code.&lt;/p&gt;

&lt;p&gt;It includes practical skills like &lt;code&gt;/grill-me&lt;/code&gt; for questioning plans, &lt;code&gt;/tdd&lt;/code&gt; for test-first development, &lt;code&gt;/diagnosing-bugs&lt;/code&gt; for testing hypotheses before fixing, and handoff for clean session transfers. &lt;/p&gt;

&lt;p&gt;This is still one of the highest-signal skill packs available across coding agents and one of my favourites.&lt;/p&gt;

&lt;p&gt;You can install Matt Pocock Skills using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills@latest add mattpocock/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;code&gt;/setup-matt-pocock-skills&lt;/code&gt; once inside Grok Build so it learns your project conventions.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://composio.dev/content/top-codex-skills" rel="noopener noreferrer"&gt;Top Codex Skills&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Caveman: Cut token waste with terse, high-signal agent responses.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44wc63rhsrf1jfh1fd1f.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44wc63rhsrf1jfh1fd1f.png" alt="Caveman" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caveman is an answer for those who want to reduce token waste on long sessions. It forces Grok to drop the unnecessary politeness and over-explanation that usually appears in agent responses like Claude Code, Codex, and so on. &lt;/p&gt;

&lt;p&gt;In practice, it can cut output length by roughly 65% on average (ranging from ~22–87% depending on the task) while keeping the useful content intact. It's a small skill but one worth keeping enabled almost all the time.&lt;/p&gt;

&lt;p&gt;You can install Caveman using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills@latest add JuliusBrussee/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; caveman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, toggle it with:  &lt;code&gt;/caveman&lt;/code&gt; or by saying "talk like caveman"; turn it off with "normal mode." &lt;/p&gt;

&lt;p&gt;Companion commands include &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/caveman-commit&lt;/code&gt; (terse commit messages),&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/caveman-review&lt;/code&gt; (one-line PR comments), and&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/caveman-stats&lt;/code&gt; (session savings).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Whathappened: Turn real-time X conversations into structured briefings.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3c7qtfsfz2i3hbc31ml.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3c7qtfsfz2i3hbc31ml.png" alt="WhatHappened" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are X-savvy or want real-time information about X in a structured way, what happened is the answer.&lt;/p&gt;

&lt;p&gt;WhatHappened&amp;nbsp;turns real-time X data into clean, structured briefings rather than raw noise, summarises what happened, maps public opinion, surfaces live debates, and pulls key receipts,&amp;nbsp;all using Grok’s built-in X tools. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note : This skill only works properly inside Grok Build.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can install whathappened using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add kunchenguid/whathappened
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then use: &lt;code&gt;/whathappened &amp;lt;query&amp;gt;&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. XActions Skills: Scrape, monitor, and automate X workflows without the official API.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb4n3yxcqhjmyjy72ioay.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb4n3yxcqhjmyjy72ioay.png" alt="XActions" width="799" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;XActions takes whathappend ability to the next level by doing more than just reading X. It packages scraping, monitoring, and automation capabilities into ready-to-use agent skills.&lt;/p&gt;

&lt;p&gt;You can scrape profiles, followers, threads, monitor accounts, or run simple automation tasks without needing the official X API. This is one of the cleaner ways people have begun to package Grok’s X advantage.&lt;/p&gt;

&lt;p&gt;You can install XActions Skills by cloning the repository and placing the skills you want under your skills folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;https://github.com/nirholas/XActions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then copy the relevant skill folders into ~/.grok/skills/ or your project’s .grok/skills/.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Wangnov/grok-skills: Combine web/X research with image, video, and ffmpeg workflows.
&lt;/h3&gt;

&lt;p&gt;Haven’t tried it yet, but on my to-do list. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Wangnov/grok-skills&lt;/code&gt; is especially useful when your workflow needs both research and media generation. It combines web and X research with image generation, video generation, and basic ffmpeg post-processing.&lt;/p&gt;

&lt;p&gt;Everything runs through a logged-in Grok session, so you avoid extra API costs for media tasks. It’s a practical all-in-one skill for research-plus-assets work.&lt;/p&gt;

&lt;p&gt;You can install Wangnov/grok-skills using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add Wangnov/grok-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can learn more at: &lt;a href="https://github.com/Wangnov/grok-skills" rel="noopener noreferrer"&gt;https://github.com/Wangnov/grok-skills&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Agentic-Code-Review &amp;amp; Repo-Health-Check: Review code and understand unfamiliar repos safely.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfbp4t9k4lcl0t6m6q56.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfbp4t9k4lcl0t6m6q56.png" alt="Agentic Code Review" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These two skills from the &lt;code&gt;awesome-grok-build&lt;/code&gt; starter kits are especially useful for properly reviewing code and getting oriented in unfamiliar repositories.&lt;/p&gt;

&lt;p&gt;agentic-code-review focuses on correctness, security, tests and regression risk. repo-health-check helps you quickly understand a new codebase and propose the smallest, safe-first change. Both work well with Plan Mode.&lt;/p&gt;

&lt;p&gt;You can install them by cloning the community kit and copying the skill folders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;https://github.com/DominikTobureto/awesome-grok-build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then place the skill folders into your &lt;code&gt;.grok/skills/&lt;/code&gt; directory. Learn more at: &lt;a href="https://github.com/DominikTobureto/awesome-grok-build" rel="noopener noreferrer"&gt;https://github.com/DominikTobureto/awesome-grok-build&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ### 8. GodotPrompter: Give Grok better Godot, GDScript, scenes, and signal context.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft63d5cgphmbnik831vel.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft63d5cgphmbnik831vel.png" alt="GoDotPrompter" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are building games with Godot and want Grok Build to understand Godot-specific patterns, project structure, and common workflows.&lt;/p&gt;

&lt;p&gt;It gives the Grok/Cursor agent better context around GDScript, scenes, signals, and Godot conventions so the suggestions stay more accurate and less generic. &lt;/p&gt;

&lt;p&gt;This is one of the cleanest game-engine-focused plugins currently available for Grok Build.&lt;/p&gt;

&lt;p&gt;You can install GodotPrompter using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok plugin install jame581/GodotPrompter --trust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then enable it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok plugin enable godot-prompter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Learn more at: &lt;a href="https://github.com/jame581/GodotPrompter" rel="noopener noreferrer"&gt;https://github.com/jame581/GodotPrompter&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Hyperframes: Create and edit programmatic videos with HTML, CSS, and JavaScript.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0u2rltq2b9bcmkctkhn.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0u2rltq2b9bcmkctkhn.png" alt="Hyperframes" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hyperframes is for those who want a Grok Build or similar agent to create and edit videos using HTML, CSS, and JavaScript rather than traditional timeline editors.&lt;/p&gt;

&lt;p&gt;It ships a full set of agent skills that teach the correct patterns for planning compositions, writing valid HyperFrames HTML, adding animations, linting, previewing and rendering. &lt;/p&gt;

&lt;p&gt;The main entry skill is &lt;code&gt;/hyperframes&lt;/code&gt;, which routes “make me a video” requests to the right workflow.&lt;/p&gt;

&lt;p&gt;You can install Hyperframes skills using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add heygen-com/hyperframes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and use it with &lt;code&gt;/hyperframes&lt;/code&gt;  in grok build. Learn more at: &lt;a href="https://hyperframes.heygen.com/" rel="noopener noreferrer"&gt;https://hyperframes.heygen.com/&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  10. Remotion Skills: Build production-ready motion graphics and videos with React and TypeScript.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mankrz86yy6exayq2mv.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mankrz86yy6exayq2mv.png" alt="Remotion" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remotion is similar to Hyperframes in that it allows you to create motion graphics and programmatic videos using React and TypeScript.&lt;/p&gt;

&lt;p&gt;It teaches the agent Remotion best practices like compositions, animations, sequencing, rendering and project structure &lt;/p&gt;

&lt;p&gt;This makes the output clean and production-ready, rather than generic React code that happens to render video.&lt;/p&gt;

&lt;p&gt;You can install Remotion Skills using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx skills add remotion-dev/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can learn more at: &lt;a href="https://www.remotion.dev/docs/ai/skills" rel="noopener noreferrer"&gt;https://www.remotion.dev/docs/ai/skills&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Remotion skill work best inside an existing Remotion project, so better first create it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Related: &lt;a href="https://composio.dev/content/top-design-skills" rel="noopener noreferrer"&gt;Top Design Skills&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Top Plugins to Use with Grok Build
&lt;/h2&gt;

&lt;p&gt;Skills are great; some even perform tasks, but for a seamless experience, plugins are mandatory. These are the ones that still reside directly in my skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Firecrawl: Search, scrape, crawl, and extract clean data from websites.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokkzf5n1gf1p08bz2w29.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokkzf5n1gf1p08bz2w29.png" alt="Firecrawl" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Firecrawl is especially useful for research, document retrieval, competitive analysis, and data collection from websites.&lt;/p&gt;

&lt;p&gt;It gives Grok Build live access to the web through search, scraping, crawling, website mapping, structured extraction, and browser interaction. &lt;/p&gt;

&lt;p&gt;It can render JavaScript-heavy pages, handle common anti-bot restrictions, and return content as clean Markdown or structured data.&lt;/p&gt;

&lt;p&gt;You can install Firecrawl using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/marketplace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;firecrawl&lt;/code&gt; and press &lt;code&gt;i&lt;/code&gt; to install it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Firecrawl may request authentication when you first use its hosted MCP server.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  12. Superpowers: Add structured engineering workflows for planning, TDD, and debugging.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05b5x39z0eui2zu58bpg.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05b5x39z0eui2zu58bpg.png" alt="Superpowers" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Superpowers is for those who want their agent to plan carefully, validate its work, and follow a more disciplined development process instead of immediately generating code.&lt;/p&gt;

&lt;p&gt;It adds structured software engineering workflows to Grok Build, and the current implementation includes test-driven development, systematic debugging, collaboration patterns, and repeatable engineering processes.&lt;/p&gt;

&lt;p&gt;I personally use this before switching to Matt Pocock's skills.&lt;/p&gt;

&lt;p&gt;You can install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok plugin install superpowers --trust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: Review the plugin before using --trust, since that option skips the interactive trust prompt.&lt;/p&gt;




&lt;h3&gt;
  
  
  13. Exa: Get fast, high-quality agent-oriented web search results.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuf5phugkpywbnvg2kmp.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuf5phugkpywbnvg2kmp.png" alt="EXA" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exa provides fast, high-quality agent-oriented search. It works particularly well as a complement to Firecrawl.&lt;/p&gt;

&lt;p&gt;Exa's API is purpose-built for LLMs, so results come back structured and filtered rather than cluttered with ads and navigation, fast enough for an agent to search mid-task without breaking flow. &lt;/p&gt;

&lt;p&gt;For teams, that means less time and token spend per lookup, so search-heavy steps (competitor checks, source verification, quick fact lookups) stop being a bottleneck inside the coding session itself&lt;/p&gt;

&lt;p&gt;Use Exa for quick, accurate retrieval, and switch to Firecrawl for full-page scraping or site crawling.&lt;/p&gt;

&lt;p&gt;You can install the Exa plugin using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;exa&lt;/code&gt; and press &lt;code&gt;i&lt;/code&gt;to install it.&lt;/p&gt;




&lt;h3&gt;
  
  
  14. Vercel: Let Grok manage deployments, environment variables, logs, and domains.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkz9b384mj9wslorypn1.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkz9b384mj9wslorypn1.png" alt="Vercel" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vercel is for those who want their agents to deploy their projects on the Vercel platform. It gives Grok direct control over deployments, environment variables, build logs, and domains.&lt;/p&gt;

&lt;p&gt;It also keeps Grok aware of current Vercel features, which reduces outdated suggestions.&lt;/p&gt;

&lt;p&gt;For teams, this pairing of live platform knowledge with real deploy/env/log access leads to fewer review cycles spent catching agent suggestions that no longer reflect how Vercel actually works. &lt;/p&gt;

&lt;p&gt;This fixes a common issue with agent integrations: context drift.&lt;/p&gt;

&lt;p&gt;You can install the Vercel plugin using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;vercel&lt;/code&gt; and install it using &lt;code&gt;i&lt;/code&gt; .&lt;/p&gt;




&lt;h3&gt;
  
  
  15. Cloudflare: Build and deploy Workers, Durable Objects, and edge apps with platform-aware guidance.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2p5fg7rhbddg31w9fklh.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2p5fg7rhbddg31w9fklh.png" alt="Cloudflare" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare is for those scenarios when part of your stack lives on the other side of the world. It provides skills for Workers, Durable Objects, and related Cloudflare tooling.&lt;/p&gt;

&lt;p&gt;The plugin covers the entire Cloudflare developer platform: Workers, Durable Objects, the Agents SDK, MCP servers, Wrangler CLI, and web performance, functioning as a skill library that maps Cloudflare concepts directly to prompts.&lt;/p&gt;

&lt;p&gt;This makes scaffolding and deploying edge projects noticeably smoother inside Grok Build for business and working with it easier.&lt;/p&gt;

&lt;p&gt;You can install Cloudflare skills or plugins using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;cloudflare&lt;/code&gt; and install it using &lt;code&gt;i&lt;/code&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Don’t get confused by the name, if you go to official repo , its given as a plugins.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  16. Chrome DevTools: Debug frontend issues through live browser inspection, traces, and network data.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwfnd6ja836poqc6sys8.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwfnd6ja836poqc6sys8.png" alt="Chrome Dev Tools" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome DevTools is useful for frontend debugging and performance work. It lets Grok control a live browser session. (not on WSL)&lt;/p&gt;

&lt;p&gt;You can record performance traces, inspect network requests, evaluate JavaScript, and take DOM snapshots without leaving the agent workflow.&lt;/p&gt;

&lt;p&gt;Under the hood, this runs on the official Chrome DevTools MCP server, which lets a coding agent control and inspect a live Chrome browser and acts as a Model Context Protocol server, giving the assistant access to the full power of Chrome DevTools for reliable automation, in-depth debugging, and performance analysis.&lt;/p&gt;

&lt;p&gt;This means that instead of an engineer manually opening DevTools, reproducing the issue, and reporting back what they saw, Grok can drive the same browser session directly and return a trace, a failing request, or a DOM state as evidence.&lt;/p&gt;

&lt;p&gt;You can install the Chrome DevTools plugin using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;chrome-devtools&lt;/code&gt; and install it using &lt;code&gt;i&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://composio.dev/content/top-claude-code-plugins" rel="noopener noreferrer"&gt;Top Claude Code Plugins&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  17. Sentry: Pull production errors and stack traces into Grok for faster fixes.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyqplpwldngo1f3tan1l.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyqplpwldngo1f3tan1l.png" alt="Sentry" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sentry closes the loop between local development and production. &lt;/p&gt;

&lt;p&gt;It lets Grok pull real error data and stack traces. Combined with Seer-powered analysis, it helps turn production issues into concrete fixes faster.&lt;/p&gt;

&lt;p&gt;This works through Sentry's official Grok plugin, which connects Grok to Sentry via the Sentry MCP server, providing real production issue-debugging context, code review with Sentry data, and monitoring configuration- on top of SDK setup for any platform.&lt;/p&gt;

&lt;p&gt;This means less engineer time spent context-switching between logs, code, and chat to reconstruct what broke, and a shorter gap between an alert firing and a fix landing.&lt;/p&gt;

&lt;p&gt;You can install the Sentry plugin using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search for &lt;code&gt;sentry&lt;/code&gt; and install it. Part of the official Grok Build Marketplace.&lt;/p&gt;




&lt;h3&gt;
  
  
  18. Unity MCP + CLI: Drive the Unity editor and iterate on game projects from Grok.
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2434044nlqzo01whd8y.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2434044nlqzo01whd8y.png" alt=" Unity MCP " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are like me and like to build games in Unity and want Grok Build to actually drive the editor and project instead of just writing C# in isolation.&lt;/p&gt;

&lt;p&gt;People are already using this combination to let Grok open scenes, modify GameObjects, work with the Asset Store, and iterate on playable prototypes much faster. It is currently one of the most practical ways to pair Grok Build with Unity.&lt;/p&gt;

&lt;p&gt;You can set it up by installing the Unity MCP server and connecting it through Grok’s MCP system, then pairing it with a simple Unity-focused skill that teaches the agent your project conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. In Unity, open Package Manager → Add package from git URL
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/CoderGamester/mcp-unity.git" rel="noopener noreferrer"&gt;https://github.com/CoderGamester/mcp-unity.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the package is installed, open Tools → MCP Unity → Server Window and click Force Install Server.&lt;/p&gt;

&lt;p&gt;Then connect it to Grok Build with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grok mcp add unity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: There is no single official marketplace plugin yet. Most people combine the Unity MCP with grok build and a lightweight custom skill for best results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Skills give Grok better judgment and consistency. Plugins give Grok real tools and reach, but don’t install them all at once.&lt;/p&gt;

&lt;p&gt;Start with a solid foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-app workflows: Composio CLI or MCP&lt;/li&gt;
&lt;li&gt;Engineering discipline → Matt Pocock Skills + Superpowers&lt;/li&gt;
&lt;li&gt;Token control → Caveman&lt;/li&gt;
&lt;li&gt;X advantage → what happened or XActions&lt;/li&gt;
&lt;li&gt;Web power → Firecrawl + Exa&lt;/li&gt;
&lt;li&gt;Game development → GodotPrompter or Unity MCP setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then add the platform plugins that match the work you actually do (Vercel, Cloudflare, Sentry, etc.).&lt;/p&gt;

&lt;p&gt;Use both skills and plugins, but do it with a clear understanding of the use case. Only then does Grok Build start to feel like a real system instead of just another coding agent.&lt;/p&gt;





&lt;p&gt;&lt;/p&gt;&lt;br&gt;
  Sources&lt;br&gt;
  &lt;ul&gt;

&lt;li&gt;Official docs: &lt;a href="https://docs.x.ai/build/features/skills-plugins-marketplaces" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://docs.x.ai/build/features/skills-plugins-marketplaces" rel="noopener noreferrer"&gt;https://docs.x.ai/build/features/skills-plugins-marketplaces&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Plugin Marketplace announcement: &lt;a href="https://x.ai/news/grok-plugin-marketplace" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://x.ai/news/grok-plugin-marketplace" rel="noopener noreferrer"&gt;https://x.ai/news/grok-plugin-marketplace&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Firecrawl roundup: &lt;a href="https://www.firecrawl.dev/blog/best-grok-plugins" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.firecrawl.dev/blog/best-grok-plugins" rel="noopener noreferrer"&gt;https://www.firecrawl.dev/blog/best-grok-plugins&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Matt Pocock Skills: &lt;a href="https://github.com/mattpocock/skills" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/mattpocock/skills" rel="noopener noreferrer"&gt;https://github.com/mattpocock/skills&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Superpowers: &lt;a href="https://github.com/obra/superpowers" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/obra/superpowers" rel="noopener noreferrer"&gt;https://github.com/obra/superpowers&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;whathappened: &lt;a href="https://github.com/kunchenguid/whathappened" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/kunchenguid/whathappened" rel="noopener noreferrer"&gt;https://github.com/kunchenguid/whathappened&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;XActions: &lt;a href="https://github.com/nirholas/XActions" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/nirholas/XActions" rel="noopener noreferrer"&gt;https://github.com/nirholas/XActions&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Wangnov/grok-skills: &lt;a href="https://github.com/Wangnov/grok-skills" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/Wangnov/grok-skills" rel="noopener noreferrer"&gt;https://github.com/Wangnov/grok-skills&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;awesome-grok-build: &lt;a href="https://github.com/DominikTobureto/awesome-grok-build" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/DominikTobureto/awesome-grok-build" rel="noopener noreferrer"&gt;https://github.com/DominikTobureto/awesome-grok-build&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What Actually Is an MCP Gateway?</title>
      <dc:creator>Sunil Kumar Dash</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:21:38 +0000</pubDate>
      <link>https://dev.to/composiodev/what-actually-is-an-mcp-gateway-37aa</link>
      <guid>https://dev.to/composiodev/what-actually-is-an-mcp-gateway-37aa</guid>
      <description>&lt;p&gt;Every team that connects agents to real tools hits the same wall at roughly the same time. It usually looks like a Slack message: &lt;em&gt;"Who has the Jira token?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's what's underneath that, and what a gateway does about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The N×M problem
&lt;/h2&gt;

&lt;p&gt;You have N agents and M tools. Connect them directly, and you get N×M integrations. Each one carries its own credentials, its own auth flow, its own error handling, its own version drift.&lt;/p&gt;

&lt;p&gt;Three agents and four tools is twelve connections. Ten agents and twenty tools is two hundred. Nobody plans for that number — you arrive at it one integration at a time.&lt;/p&gt;

&lt;p&gt;A gateway collapses it to N+M. Agents connect once to the gateway. The gateway connects once to each tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:  agent ──┬──&amp;gt; GitHub
                 ├──&amp;gt; Slack
                 └──&amp;gt; Jira        (× every agent)

After:   agent ──&amp;gt; gateway ──┬──&amp;gt; GitHub
                             ├──&amp;gt; Slack
                             └──&amp;gt; Jira
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What an &lt;a href="https://composio.dev/mcp-gateway" rel="noopener noreferrer"&gt;MCP gateway&lt;/a&gt; actually does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routing and aggregation&lt;/strong&gt; — one endpoint fronting many MCP servers, with tool filtering so agents don't blow past context limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — holds credentials centrally, runs OAuth flows, passes through per-user identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorisation&lt;/strong&gt; — who can call which tool; RBAC, allowlists, blocking destructive actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit&lt;/strong&gt; — logs every call: user, tool, action, outcome, including denied ones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat handling&lt;/strong&gt; — tool poisoning, rug-pull updates, cross-server shadowing, prompt injection via tool descriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt; — rate limits, retries, timeouts, absorbing schema drift when upstream APIs change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The threat handling deserves a note, because it's genuinely new. Tool descriptions are input the agent trusts. A server can change its tool definitions after you've approved it. Generic API security doesn't cover this, and most gateways describe their handling of it vaguely.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwth4nydhu456f2gwj5tn.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwth4nydhu456f2gwj5tn.png" alt="Whats MCP gateway" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Gateway ≠ server ≠ client
&lt;/h2&gt;

&lt;p&gt;Constantly confused, so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client&lt;/strong&gt; — the agent (Claude, Cursor, ChatGPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt; — the thing exposing tools over MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt; — sits between them, governs the traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it's not an API gateway. An API gateway routes HTTP between services. An MCP gateway is protocol-aware — it understands tools and tool-call semantics, which is what lets it enforce per-tool policy.&lt;/p&gt;




&lt;h2&gt;
  
  
  The landscape splits four ways
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xvk8ul8b5anqvfbh8u3.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xvk8ul8b5anqvfbh8u3.png" alt="MCP Gateway market map" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Purpose-built managed
&lt;/h3&gt;

&lt;p&gt;Built for MCP from the start. They differ mainly in whether they also supply the tools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Composio &lt;a href="https://composio.dev/mcp-gateway" rel="noopener noreferrer"&gt;MCP gateway&lt;/a&gt;&lt;/strong&gt; — 1,000+ managed integrations behind per-team scoped endpoints. SCIM, action-level blocking, exportable audit. Managed, VPC, or self-hosted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TrueFoundry&lt;/strong&gt; — one control plane for LLM and MCP traffic. Publishes &amp;lt;5ms p95 overhead. Bring your own servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lunar MCPX&lt;/strong&gt; — granular RBAC, immutable audit, centralised secrets. ~4ms p99. Open source core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MintMCP&lt;/strong&gt; — governance-first. SOC 2 / HIPAA / GDPR log formats, SCIM-driven bundles, per-agent identity. BYO servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operant AI&lt;/strong&gt; — runtime security rather than routing. Scans servers, maps threats to OWASP, catches shadow MCP usage on dev machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StackOne&lt;/strong&gt; — per-user OAuth into HRIS/ERP/CRM, plus meta-tools that keep you under client tool-count caps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Open source / self-hosted
&lt;/h3&gt;

&lt;p&gt;You run it, you own it. No licence cost, real operational cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obot&lt;/strong&gt; — multi-role RBAC, curated server catalogue, composite servers. Names MCP-specific threats explicitly, which most don't. Kubernetes or Docker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker MCP Gateway&lt;/strong&gt; — one container per server with signed images and resource limits. Security via isolation rather than policy. 50–200ms overhead, and no built-in RBAC or audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft MCP Gateway&lt;/strong&gt; — MIT, Kubernetes-native, session-aware stateful routing. Genuinely useful plumbing; tightly coupled to AKS in practice. Not to be confused with Agent 365, which is a different product with a similar name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IBM ContextForge&lt;/strong&gt; — Apache 2.0. Federates MCP, A2A, REST and gRPC through one endpoint, 40+ plugins, OTel tracing. Broadest scope here; also the heaviest lift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCPJungle&lt;/strong&gt; — gateway and registry in one lightweight package. Basic RBAC, minimal ceremony.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lasso&lt;/strong&gt; — open-source, security-first. Server reputation scanning and PII redaction, at 100–250ms.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  API gateways extended
&lt;/h3&gt;

&lt;p&gt;If you already run one, MCP becomes another middleware in a chain you understand.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kong&lt;/strong&gt; — Agent Gateway (3.14, April 2026) covers LLM, MCP and A2A on one runtime. Autogenerates MCP tools from existing REST endpoints, which is the shortest migration path if your services are already APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traefik Hub&lt;/strong&gt; — MCP as middleware, acting as an OAuth 2.1 resource server. Task-Based Access Control lets policies key on amounts, time windows and record types, not just tool names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portkey&lt;/strong&gt; — MCP registry alongside its LLM gateway. Remote HTTP servers only; local stdio needs wrapping.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Automation platforms extended
&lt;/h3&gt;

&lt;p&gt;Enormous catalogues, thinner governance. Fastest route to a working prototype.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zapier&lt;/strong&gt; — 9,000+ apps, 30,000+ actions, browser-based setup. Task-based pricing gets unpredictable once an agent is driving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workato&lt;/strong&gt; — 12,000+ enterprise connectors, existing recipes exposed over MCP. Compelling if you're already on it, hard to justify buying for MCP alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a longer and detailed read, check out: &lt;a href="https://composio.dev/content/best-mcp-gateway-for-developers" rel="noopener noreferrer"&gt;Best MCP Gateway&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The trade-off nobody states plainly
&lt;/h2&gt;

&lt;p&gt;Most gateways are strong on &lt;strong&gt;governance&lt;/strong&gt; or strong on &lt;strong&gt;integration breadth&lt;/strong&gt;. Rarely both.&lt;/p&gt;

&lt;p&gt;Governance-first products — MintMCP, Lunar, Obot — do RBAC and audit well and supply zero connectors. Bring your own servers. That's a real ongoing cost: OAuth setup, schema maintenance, security review, per tool, forever.&lt;/p&gt;

&lt;p&gt;Breadth-first products — Zapier, Workato — hand you thousands of integrations and much less control over who calls what.&lt;/p&gt;

&lt;p&gt;Work out which of those is your actual constraint before you shortlist anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing, briefly
&lt;/h2&gt;

&lt;p&gt;In rough order, because the early ones eliminate options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; — managed SaaS, self-hosted, or VPC. Data residency rules kill whole categories before anything else matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt; — SOC 2, ISO, HIPAA if relevant. Then check the audit trail actually exports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; — SSO and SCIM, or you're provisioning access by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration depth&lt;/strong&gt; — do they supply connectors, or do you?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing model&lt;/strong&gt; — agents are chatty. Per-task pricing that's fine for human-triggered automation gets weird when an agent fans one request into forty tool calls. Model your volume first.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Latency comes lower than you'd think. TrueFoundry publishes sub-5ms, Lunar around 4ms p99, Docker 50–200ms. Real differences — but a gateway that saves 3ms and costs six months of integration work is a bad trade for most teams.&lt;/p&gt;




&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;If you're prototyping, grab whatever's fastest to wire up and move on.&lt;/p&gt;

&lt;p&gt;If you're going to production, the question isn't which gateway is best. It's whether connector maintenance or governance is the thing that'll actually bite you — and then picking the one that solves that, knowing you'll compromise on the other.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://composio.dev/mcp-gateway" rel="noopener noreferrer"&gt;https://composio.dev/mcp-gateway&lt;/a&gt; for building agents with secure and auditable access to tools&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
      <category>automation</category>
    </item>
    <item>
      <title>Kimi K3 vs GLM-5.2: What a practical test between 2 taught me</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:36:28 +0000</pubDate>
      <link>https://dev.to/composiodev/kimi-k3-vs-glm-52-what-a-practical-test-between-2-taught-me-1ii8</link>
      <guid>https://dev.to/composiodev/kimi-k3-vs-glm-52-what-a-practical-test-between-2-taught-me-1ii8</guid>
      <description>&lt;p&gt;Moonshot AI released Kimi K3 on July 16, 2026, and it landed with a statement: 2.8 trillion parameters, 1 million token context, and open weights by July 27. The previous month, GLM-5.2 was released and is already in production&lt;/p&gt;

&lt;p&gt;This proves that open-source models aren't just catching up to closed ones; they're reshaping what developers and businesses expect.&lt;/p&gt;

&lt;p&gt;This is a comparison built for people who are &lt;em&gt;building things&lt;/em&gt;. No benchmark chasing. No marketing narratives. &lt;/p&gt;

&lt;p&gt;Just what each model does, where it shines, and what matters when you're shipping.&lt;/p&gt;

&lt;h3&gt;
  
  
  TLDR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kimi K3&lt;/strong&gt;: 2.8T params, 1M context, always-on reasoning, native multimodal. Best for long agent loops that need sustained reasoning and visual understanding. Frontier pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GLM-5.2&lt;/strong&gt;: 744B params (40B active via MoE), 1M context, flexible reasoning effort. Best for coding, math, and cost-efficient throughput. Open weights (MIT) available now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick K3&lt;/strong&gt; if: agents need to reason for hours, handle images/UI, cost isn't the bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick GLM-5.2&lt;/strong&gt; if: you want open weights today, need cheap high-volume inference, or your work leans coding/math.&lt;/li&gt;
&lt;li&gt;Few personal builds like games, physics-driven simulation, coding, and behavioral tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bottom line&lt;/strong&gt;: Both close the gap with closed models fast. Choice comes down to workload, not hype.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Architecture: Two Very Different Paths to Scale
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Kimi K3&lt;/th&gt;
&lt;th&gt;GLM-5.2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Parameters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.8 trillion&lt;/td&gt;
&lt;td&gt;744 billion total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active Parameters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not yet disclosed&lt;/td&gt;
&lt;td&gt;~40 billion active (MoE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 million tokens&lt;/td&gt;
&lt;td&gt;1 million tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kimi Delta Attention (KDA) + Attention Residuals&lt;/td&gt;
&lt;td&gt;Mixture-of-Experts (MoE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not yet published&lt;/td&gt;
&lt;td&gt;MIT (no regional limits)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Release Date&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;July 16, 2026&lt;/td&gt;
&lt;td&gt;June 13, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Kimi K3: Raw Scale Meets Long-Horizon Design with KDA
&lt;/h3&gt;

&lt;p&gt;Kimi K3 is built on Kimi Delta Attention (KDA), a hybrid linear attention mechanism, and Attention Residuals. Moonshot engineered this for &lt;em&gt;sustained&lt;/em&gt; agent workloads, not just bigger benchmarks.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6rb40x0g554aroo886l.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6rb40x0g554aroo886l.png" alt="Kimi K3 Architecture" width="800" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The move from K2's 1 trillion parameters to K3's 2.8 trillion is deliberate. Moonshot is charging frontier rates to make the price-to-capability tradeoff hard to ignore. &lt;/p&gt;

&lt;p&gt;You're not getting a discount model trying to go above its weight. Instead, you're getting brute-force capability with specialised attention for long reasoning chains.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: The full model weights will be released by July 27, 2026, but the technical report with full sparsity ratios and active parameter counts is still pending. You can build on K3 API today, but deep architectural details aren't locked in yet.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  GLM-5.2: Efficiency First, Capability Everywhere with MOE &amp;amp; Index Share
&lt;/h3&gt;

&lt;p&gt;GLM-5.2 is a 744-billion-parameter Mixture-of-Experts model with approximately 40 billion active parameters per token. &lt;/p&gt;

&lt;p&gt;That MoE design means only a fraction of the model activates per token.  This enables throughput that larger dense models can't match.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwuaf0rsoatwfwne9gw6q.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwuaf0rsoatwfwne9gw6q.png" alt="GLM 5.2 Architecture" width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The standout innovation of GLM is its IndexShare, which reuses the same indexer across every four sparse attention layers, reducing per-token FLOPs by 2.9× at a 1M context length. For you, this means GLM-5.2 makes the 1M context practical, not theoretical.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xhaxkmee51pq5g7cp0w.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xhaxkmee51pq5g7cp0w.png" alt="Index Share" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note :  GLM-5.2 is released under an unrestricted MIT license, which matters if you're deploying locally or need no-strings-attached weights. Deploy on your own hardware, fine-tune, fork with no regional restrictions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Kimi K3 vs GLM 5.2: Composio Golden Eval
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the bench look like?
&lt;/h3&gt;

&lt;p&gt;Composio Golden Eval is a real-account tool-use benchmark. Claude Code drives multi-step SaaS tasks through the hosted Composio MCP router against live accounts, then the final state is checked by reading the actual account back through APIs.&lt;/p&gt;

&lt;p&gt;The grader checks what changed in the account, which is why I care. The verifier reads the account state: labels, Sheets rows, Salesforce or HubSpot records, calendar edits, access lists. There is no transcript-only judgment that the agent basically got it.&lt;/p&gt;

&lt;p&gt;The accounts stay safe because writes are tag-scoped and cleaned up afterwards. Every run leaves tagged artefacts that can be removed after grading, which is the only sane way to run this kind of thing on live Gmail, Google Calendar, Google Drive, Google Sheets, Salesforce, HubSpot, GitHub, Linear, and Slack accounts.&lt;/p&gt;

&lt;p&gt;The run covered 12 scenarios across 24 trials. Seven are historical cases that a competent tool-use model should clear: CRM identity dedup, calendar free/busy checks, recurring-event repair, Drive external-share audits, Gmail label batches, GitHub access audits, and GitHub/Linear reconciliation. &lt;/p&gt;

&lt;p&gt;Five are the harder frontier-kill stress cases: cross-app “sync and reconcile” workflows where the agent has to read Gmail threads, apply exclusion rules, append exact rows to a Sheet ledger, send per-item replies, and write one ops-thread tally.&lt;/p&gt;

&lt;p&gt;The pass condition is an exact final state. These tasks mix exact-set reconciliation, dedup, cross-app joins, and audits with negative constraints. If the agent gets 90% of the rows right but includes one disqualified item, the run still fails. Failed runs can show partial-credit check counts like 8/13, but the outcome metric is still pass, fail, or DNF (did not finish).&lt;/p&gt;

&lt;h3&gt;
  
  
  How I ran it
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyy5l5dda1odrft3luhr0.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyy5l5dda1odrft3luhr0.png" alt="Eval Chain" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran both models through the same 12 Golden Eval cases against the same live accounts. The readback checks were identical, with the same check names and denominators. There is one harness caveat: Kimi K3 ran under the pi agent harness, while GLM 5.2 ran under Claude Code pointed at OpenRouter. I treat the pass/fail result as a same-task, same-grader comparison, and effort numbers as harness-dependent.&lt;/p&gt;

&lt;p&gt;Grading used real-account API readback, tag-scoped cleanup, pass/fail/dnf per trial, with partial-credit check counts on failures.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frontier-kill task&lt;/th&gt;
&lt;th&gt;Kimi K3 checks&lt;/th&gt;
&lt;th&gt;GLM 5.2 checks&lt;/th&gt;
&lt;th&gt;Kimi tool calls&lt;/th&gt;
&lt;th&gt;GLM tool calls&lt;/th&gt;
&lt;th&gt;Kimi runtime tokens&lt;/th&gt;
&lt;th&gt;GLM input tokens&lt;/th&gt;
&lt;th&gt;Kimi agent time&lt;/th&gt;
&lt;th&gt;GLM agent time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Invoice sync&lt;/td&gt;
&lt;td&gt;8/13&lt;/td&gt;
&lt;td&gt;8/13&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;896,094&lt;/td&gt;
&lt;td&gt;1,020,844&lt;/td&gt;
&lt;td&gt;389.8s&lt;/td&gt;
&lt;td&gt;507.4s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refund ledger&lt;/td&gt;
&lt;td&gt;8/13&lt;/td&gt;
&lt;td&gt;8/13&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;1,309,483&lt;/td&gt;
&lt;td&gt;1,334,127&lt;/td&gt;
&lt;td&gt;685.8s&lt;/td&gt;
&lt;td&gt;458.9s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roster sync&lt;/td&gt;
&lt;td&gt;8/13&lt;/td&gt;
&lt;td&gt;7/13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;609,233&lt;/td&gt;
&lt;td&gt;1,058,024&lt;/td&gt;
&lt;td&gt;505.1s&lt;/td&gt;
&lt;td&gt;418.9s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor directory&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;820,613&lt;/td&gt;
&lt;td&gt;1,683,579&lt;/td&gt;
&lt;td&gt;788.5s&lt;/td&gt;
&lt;td&gt;803.7s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ticket sync&lt;/td&gt;
&lt;td&gt;17/24&lt;/td&gt;
&lt;td&gt;dnf&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;dnf&lt;/td&gt;
&lt;td&gt;1,745,612&lt;/td&gt;
&lt;td&gt;dnf&lt;/td&gt;
&lt;td&gt;713.5s&lt;/td&gt;
&lt;td&gt;dnf&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Runs used the hosted Composio MCP router. Kimi ran under the pi agent harness; GLM ran under Claude Code pointed at OpenRouter. Kimi token counts are total runtime tokens (input + output); GLM's column is input tokens, with another 18K to 46K output tokens per task. Ticket sync is the one task GLM 5.2 did not finish inside the 30-minute cap.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pass rate was flat: Kimi K3 solved 7 of 12, and GLM 5.2 solved 7 of 12. That is 58% each.&lt;/p&gt;

&lt;p&gt;With the harness caveat above, effort favored Kimi on several finished frontier-kill runs. &lt;/p&gt;

&lt;p&gt;On the four frontier-kill tasks both models finished, Kimi used fewer tool calls on invoice, roster, and vendor, while GLM used one fewer on refund. Kimi also finished Ticket sync in 713.5s with 23 tool calls and 1,745,612 runtime tokens; GLM hit dnf inside the 30-minute cap. &lt;/p&gt;

&lt;p&gt;Time did not point one way: GLM was faster on refund ledger and roster sync, while Kimi was faster on invoice sync and slightly faster on vendor directory.&lt;/p&gt;




&lt;h3&gt;
  
  
  Findings
&lt;/h3&gt;

&lt;p&gt;Here is the task-for-task result on the same 12 cases.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Band&lt;/th&gt;
&lt;th&gt;Kimi K3&lt;/th&gt;
&lt;th&gt;GLM 5.2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRM identity dedup&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar free/busy&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recurring instance repair&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drive external-share audit&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gmail label batch&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub access audit&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub / Linear reconciliation&lt;/td&gt;
&lt;td&gt;Historical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoice sync&lt;/td&gt;
&lt;td&gt;Frontier kill&lt;/td&gt;
&lt;td&gt;❌ 8/13&lt;/td&gt;
&lt;td&gt;❌ 8/13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refund ledger&lt;/td&gt;
&lt;td&gt;Frontier kill&lt;/td&gt;
&lt;td&gt;❌ 8/13&lt;/td&gt;
&lt;td&gt;❌ 8/13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roster sync&lt;/td&gt;
&lt;td&gt;Frontier kill&lt;/td&gt;
&lt;td&gt;❌ 8/13&lt;/td&gt;
&lt;td&gt;❌ 7/13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ticket sync&lt;/td&gt;
&lt;td&gt;Frontier kill&lt;/td&gt;
&lt;td&gt;❌ 17/24&lt;/td&gt;
&lt;td&gt;❌ dnf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor directory&lt;/td&gt;
&lt;td&gt;Frontier kill&lt;/td&gt;
&lt;td&gt;❌ 11/13&lt;/td&gt;
&lt;td&gt;❌ 11/13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Solved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7/12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7/12&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Fractions on the failed rows are partial-credit verifier checks: how many graded assertions the model got right before missing the exact-final-state bar. &lt;code&gt;dnf&lt;/code&gt; means GLM 5.2 did not finish Ticket sync inside the 30-minute per-task cap, so no partial score was recorded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kimi K3 and GLM 5.2 both cleared the historical seven, both fell on all five frontier-kill workflows, and both ended at 7/12, 58%. The only score gap in the entire suite is one verifier check on Roster sync: Kimi got 8/13, GLM got 7/13.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9erh9bpavwich0pqn8s5.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9erh9bpavwich0pqn8s5.png" alt="Task Results" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The historical band did not separate them. Both passed all seven cleanly, including CRM identity dedup, which spans Salesforce, HubSpot, and Gmail. Calendar free/busy, recurring instance repair, Drive external-share audit, Gmail label batch, GitHub access audit, and GitHub / Linear reconciliation all landed green for both models.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it costs
&lt;/h3&gt;

&lt;p&gt;I priced the finished runs from their token counts against current OpenRouter list rates, before cache discounts. The dollar amounts are estimates, but the price gap is wide enough that the direction is clear.&lt;/p&gt;

&lt;p&gt;OpenRouter currently lists Kimi K3 at $3/M input and $15/M output. (openrouter.ai) For GLM 5.2, I used OpenRouter’s current model API rate of about $0.82/M input and $2.59/M output.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Tokens on the finished frontier-kill cases&lt;/th&gt;
&lt;th&gt;Estimated cost per case&lt;/th&gt;
&lt;th&gt;Four-case estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K3&lt;/td&gt;
&lt;td&gt;~609K to 1.75M runtime tokens&lt;/td&gt;
&lt;td&gt;~$1.83 to $5.25&lt;/td&gt;
&lt;td&gt;~$7.31 to $21.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.2&lt;/td&gt;
&lt;td&gt;~1.02M to 1.68M input, plus 18K to 46K output&lt;/td&gt;
&lt;td&gt;~$0.89 to $1.50&lt;/td&gt;
&lt;td&gt;~$3.55 to $6.02&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GLM sometimes spent more tokens. Its finished cases ran ~1.02M to 1.68M input tokens, while Kimi’s runtime-token band started lower at ~609K. But Kimi’s input rate is about 3.6x GLM’s, so the extra GLM context still comes out cheaper in this estimate.&lt;/p&gt;

&lt;p&gt;Tool calls landed in similar ranges, 13 to 23 per case for both. So the extra GLM tokens on roster and vendor work did not buy extra passes. The scores tied, with GLM carrying the cheaper bill.&lt;/p&gt;

&lt;p&gt;At 1,000 four-case batches, that envelope turns into roughly $7.3K to $21K for Kimi and $3.6K to $6.0K for GLM before cache discounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verdict
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobu4unmeg9dib78b2nc1.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobu4unmeg9dib78b2nc1.png" alt="Conclusion" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kimi K3 and GLM 5.2 tied on pass rate, 7/12 each, 58%. I’d give the practical win to Kimi because it finished the biggest frontier case at 17/24 while GLM hit the 30-minute cap, and GLM spent more tokens on roster and vendor for the same or worse result.&lt;/p&gt;

&lt;p&gt;I would pick Kimi K3 when finishing the long tool workflow matters more than the cheaper rate. Ticket sync shows why: Kimi got through 24 turns, posted 17/24, and burned 1.75M runtime tokens. GLM did not finish inside the 30-minute cap. On Roster sync, Kimi also scored 8/13 while GLM scored 7/13, because Kimi posted the cover replies GLM dropped. It did that with 13 tool calls and 609K runtime tokens, while GLM used 19 tool calls and 1.06M input tokens.&lt;/p&gt;

&lt;p&gt;GLM 5.2 makes sense if your workload looks more like the easier historical band, or if you already want the Claude Code via OpenRouter setup and can live with the frontier misses. It matched Kimi’s top-line score, cleared the same 7/7 historical cases, and tied Kimi on Invoice sync, Refund ledger, and Vendor directory by score. Refund ledger is the one frontier case where GLM was cleaner on latency: 458.9s versus Kimi’s 685.8s, with both landing at 8/13.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kimi K3 vs GLM 5.2: On personal builds
&lt;/h2&gt;

&lt;p&gt;So let me share some of the builds I tried with GLM and Kimi K3, along with prompt, time, cost, and builds. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For all builds I have used open router chatroom&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Meteor City (revival)
&lt;/h3&gt;

&lt;p&gt;Used Kimi K3 + GLM 5.2 to build Meteor City Revival, a game where you race to destroy the entire city before it can regenerate itself. &lt;/p&gt;

&lt;p&gt;The task was initially given to GLM 5.2, but for some reason it stopped mid-session, so I took all the code and asked Kimi to refine and recreate the entire build.&lt;/p&gt;

&lt;p&gt;Cost was approx. $4.3, used around 18.1M Tokens, Time: 1 hr 45 min. This is justified cause without explicitly mentioning it, it generated 10K procedural buildings, the engine, and figured out the lighting, ray tracing, shaders, and optimized the game for mobile as well as web. &lt;/p&gt;

&lt;p&gt;You can play the game at: &lt;a href="https://meteor-city-revival.vercel.app/" rel="noopener noreferrer"&gt;https://meteor-city-revival.vercel.app/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Prompt Used
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a complete, self-contained, single HTML file using Three.js (via CDN only — no other external dependencies or files) that implements a large-scale 3D photorealistic procedural meteor impact city destruction game/simulation.

**Core Gameplay (must be fully implemented and preserved exactly):**
- Procedural city with buildings that can be damaged and destroyed.
- Clickable "Launch Meteor" button that fires a meteor. User can launch multiple times.
- Buildings regenerate over time.
- **Push-and-wait mechanic**: Holding/clicking the Launch Meteor button charges a larger, more powerful meteor (powerup style).
- **Infinity powerup**: When activated, launches 5 big meteors in quick succession that deal massive damage (enough to push the destruction bar to ~95%).
- Powerups (larger meteor charge and Infinity) drop from meteor impacts and are automatically collected when the player is near them.
- Destruction progress bar that tracks overall city damage.
- At 100% destruction, display the text: "Now I am become Death, the destroyer of worlds."
- UI sliders for meteor size, speed, angle, time of day, and destruction intensity.
- Meteor and impact sounds using Web Audio API.
- Playable simulation/game with smooth performance.

**Visual &amp;amp; Technical Polish Requirements (focus here for realism and quality):**
- Highly realistic procedural city at night: varied building heights (low-rises to skyscrapers), realistic facades with window grids using InstancedMesh (windows have individual emissive colors that flicker or turn off when damaged), different roof styles, subtle material variation (concrete, glass, brick), minor architectural details like ledges.
- Use seed-based procedural variation so the city feels organic. Add roads, paths, and scattered green areas/parks between building clusters.
- Heavy use of InstancedMesh and LOD (Level of Detail) for performance.
- Realistic ground/terrain with subtle height variation, road networks, and support for crater formation on impact.
- Rich night sky: procedural starfield with twinkling stars, subtle moon glow, gradient sky with horizon haze and light pollution from the city. Add very subtle atmospheric effects.
- High-quality meteor: glowing fiery body with long dynamic particle trail (fire, sparks, smoke) that intensifies on entry.
- Realistic impact sequence: bright flash, expanding shockwave (particles + ground ripple), crater, layered particle systems for fire/explosions, dense rising dust/smoke plumes, and flying debris with gravity and tumbling.
- Improved building destruction: pieces break off with dust, structures partially crumble or lean, and damaged areas show reduced lighting/exposed sections.
- Dynamic lighting: moonlight + hemisphere light, multiple flickering point lights from fires and impact, emissive building windows, and fire effects. City lights progressively dim or extinguish with damage.
- Materials: Use MeshStandardMaterial where appropriate. Add subtle specular/roughness variation and rim lighting for depth.
- Special effects: Performant particle systems, screen shake on impact, bloom-like glow on bright elements, subtle motion blur during fast movement or camera fly-through, atmospheric perspective, and fog for depth.
- Overall cinematic yet realistic look with balanced night-time color grading (cool tones with warm fire accents).

**Camera, Controls &amp;amp; Performance Polish:**
- Smooth OrbitControls-style camera (mouse drag to orbit/pan, scroll to zoom) with optional free-fly mode (WASD + mouse look).
- Smooth camera interpolation and gentle auto-orbit when idle.
- Refined slow-motion replay with smooth timeScale control.
- Aggressive performance optimizations for stable 60+ FPS: InstancedMesh, LOD, frustum culling, efficient particle pooling, minimal draw calls.
- Subtle ambient animations (random window flickering, gentle dust movement).

**Technical Requirements:**
- Output ONLY the complete single HTML file (nothing else before or after).
- Must be immediately runnable in a modern browser with no errors.
- Include helpful inline comments explaining key visual, lighting, particle, and optimization techniques.
- Prioritize photorealistic visuals, cinematic quality, smoothness, and immersion while keeping all gameplay mechanics fully functional and unchanged.

Generate the full polished HTML code now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RSDQZWeAP8E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Plane Currents
&lt;/h3&gt;

&lt;p&gt;I always wanted to try low-poly 3D graphics, so I tried it with Kimi K3. &lt;/p&gt;

&lt;p&gt;Use Kimi K3 to build a paper plane simulator where the player passes through rings to gather points and complete the course. All while having a relaxing scene and music going in the background. (no 3d assets)&lt;/p&gt;

&lt;p&gt;This took around 16 minutes to generate, cost me approx $0.45, and used 30K tokens.&lt;/p&gt;

&lt;p&gt;You can play the game by opening the &lt;a href="https://gist.github.com/DevloperHS/0512038a0e1d21a8e854e4a771db8fa7" rel="noopener noreferrer"&gt;game file&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Prompt Used
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build me a self contained  Relaxed 3D paper-plane flying gameplay where you launch and steer a customizable plane through glowing rings and floating islands over an ocean, collecting score multipliers in short, physics-light runs with easy controls (hold to launch, mouse/keyboard steering) with stylized low-poly 3D with clean cel-shaded visuals and a sleek, colorful indie-game UI featuring customizable paper planes, glowing rings, floating islands, and simple HUD element graphics. Output a single HTML file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;And the output generated by the above prompt.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/F6zLuzzFbGk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Gargantua Black Hole Geodesic Ray Tracer (Complex Physics Game/Sim) - inspo from X
&lt;/h2&gt;

&lt;p&gt;I was scrolling X and found this massive black hole geodesic ray tracer simulation made by someone. Being the space nerd I am, I wanted to make this too.&lt;/p&gt;

&lt;p&gt;So I did a bit of research and constructed a prompt that requires the model to think through the actual light-bending physics and math that happens near the event horizon of a black hole.&lt;/p&gt;

&lt;p&gt;I was completely hopeless cause fable and GLM 5.3 gave up on the calculation task earlier, but anyway I entered the prompt.  To my surprise, Kimi K3 actually went through the maths and solved it in its thinking traces. &lt;/p&gt;

&lt;p&gt;After approx 14 minutes and burning through 33K tokens, which costed around $0.51 (operouter), it handed me the complete code. &lt;/p&gt;

&lt;p&gt;I ran it, and here are the results&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/oidzFPtpU28"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Prompt Used
  &lt;p&gt;Create a complete, self-contained single HTML file (no external libraries like Three.js) that implements a real-time geodesic raytracer for a Schwarzschild black hole inspired by Gargantua.&lt;/p&gt;

&lt;p&gt;Use raw WebGL2 with GLSL ES 3.00 in a single fragment shader. Implement accurate physics: null geodesic integration with 4th-order Runge-Kutta solver, event horizon, photon sphere, accretion disk with proper rendering, gravitational lensing, Doppler beaming, and gravitational redshift effects. Target stable 60 FPS performance.&lt;/p&gt;

&lt;p&gt;Include mouse-controlled camera orbiting/zooming, and a cyberpunk-style control panel with sliders for parameters (mass, spin, disk density, view angle, etc.). Add subtle particle effects for matter falling in and dynamic lighting/shadows.&lt;/p&gt;

&lt;p&gt;The output must be 100% complete, immediately runnable in a modern browser, with no black screen, NaNs, errors, or missing features. Prioritize numerical correctness, boundary handling, solver discipline, and physical accuracy above all. Verify and comment key physics equations in the code. Make it visually stunning and interactive like a premium physics demo/game.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/DevloperHS/0ca2efb20b16dd8497026b77a7d5dbba" rel="noopener noreferrer"&gt;Game File&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yup, the code, math, and physics engine are all built by Kimi K3, and Fable failed to build the simulation with such a level of detail, which makes its claim worth the hype.&lt;/p&gt;

&lt;p&gt;I also tried 2 more tests to verify my doubts, sharing them as a bonus.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bonus Test 1 (Held Karp Problem Solution (NP-Hard)
&lt;/h3&gt;

&lt;p&gt;It's not a surprise to me that Kimi K3 and GLM 5.2 were both able to solve this in no time, but I ran the test to check just raw coding + reasoning ability.&lt;/p&gt;

&lt;p&gt;The task was simple: fix the bug, create an optimal path, load env, run code, and give an answer to the buggy Held-Karp problem. Yup, the task has multiple steps for testing instruction following&lt;/p&gt;

&lt;p&gt;The test cost 0.03 cents, used 82K tokens (most on reasoning), and the result was out in 5 minutes. You can check the buggy code and fixed code from the attached files.&lt;/p&gt;

&lt;p&gt;Game File: &lt;a href="https://gist.github.com/DevloperHS/81d56857c2cee7b8cdd3b84e1d219d9f#file-problem-py" rel="noopener noreferrer"&gt;problems.py&lt;/a&gt; , &lt;a href="https://gist.github.com/DevloperHS/81d56857c2cee7b8cdd3b84e1d219d9f#file-solution-py" rel="noopener noreferrer"&gt;solution.py&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The prompt I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix all bugs in the Held-Karp code in @file:problem.py so it correctly computes the minimum-cost tour for this 12-city TSP instance. Make the DP, base cases, transitions, and path reconstruction fully correct in  @file:fixed.py. Then create a new environment (.env) inside @file:held-karp-problem, install the dependencies, activate the environment, and run it to output the optimal cost and the tour as a list of cities starting and ending at 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpfxq3xm0pjgn347td3i.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpfxq3xm0pjgn347td3i.png" alt="output" width="799" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I even validated it with one of my code geek friends and Grok 4.5 (expert)&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4wyeonlqc8t0vptd9iz.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4wyeonlqc8t0vptd9iz.png" alt="grok val" width="799" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Models don’t just need to output code; they also need to maintain behavioural constraints, so I tested both with a behavioural question. The result was similar.&lt;/p&gt;

&lt;p&gt;The task was simple: to resolve a conflict between team and stakeholder using the STAR Method &lt;/p&gt;

&lt;p&gt;Prompt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Act as an experienced tech interview coach. Answer the following behavioral interview question using the STAR method (Situation, Task, Action, Result). Make the answer concise, professional, and impactful for a software engineering or tech role. Include quantifiable results where possible and highlight leadership or collaboration skills.

Question: Tell me about a time when you had to resolve a conflict within your team or with a stakeholder.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both models thought for a very short time and delivered the result in almost the same time. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model Name&lt;/th&gt;
&lt;th&gt;Token Count&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.2&lt;/td&gt;
&lt;td&gt;592&lt;/td&gt;
&lt;td&gt;$0.00162095856&lt;/td&gt;
&lt;td&gt;25.0 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K3&lt;/td&gt;
&lt;td&gt;763&lt;/td&gt;
&lt;td&gt;$0.012987&lt;/td&gt;
&lt;td&gt;18.3 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;However, Kimi K3 won as it delivered a more credible, business-aligned conflict story with quantified stakeholder impact ($200K ARR, measurable failure reduction).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A product manager and backend engineer clashed over shipping a checkout feature on deadline versus fixing payment failures (affecting 3% of transactions). The tech lead reframed both concerns as "reliable payments delivered fast," then proposed shipping the feature behind a flag while hotfixing the top failure points. The plan shipped on time, cut failures from 3% to 0.4%, retained a $200K client, and became a team standard practice.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the other hand, GLM&amp;nbsp;tells a technically impressive but somewhat predictable "engineering debate resolved by benchmarking" narrative.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Two senior engineers deadlocked over GraphQL vs REST for an API redesign, stalling the team for two weeks. The tech lead ran a proof-of-concept benchmark showing GraphQL won on performance (35% payload reduction), then added REST endpoints for backward compatibility to honor both perspectives. Development resumed in 3 days; the API improved response times 30% and maintained support for 12 existing clients.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple table for understanding&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;GLM 2.5&lt;/th&gt;
&lt;th&gt;Kimi K3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stakeholder Range&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two engineers only&lt;/td&gt;
&lt;td&gt;PM + Engineer (broader influence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process improvement&lt;/td&gt;
&lt;td&gt;Revenue at risk ($200K)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conflict Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Technical disagreement&lt;/td&gt;
&lt;td&gt;Business vs. tech risk trade-off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resolution Approach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proof-of-concept (predictable)&lt;/td&gt;
&lt;td&gt;Phased delivery + data compromise (creative)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lasting Impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Team velocity restored&lt;/td&gt;
&lt;td&gt;Process adoption + trust rebuilt + client retained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interviewer Appeal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows technical leadership&lt;/td&gt;
&lt;td&gt;Shows &lt;strong&gt;business acumen&lt;/strong&gt; + technical leadership&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This shows Kimi K3 is more aligned with the workspace and can provide factual answers when needed. Really impressive.&lt;/p&gt;

&lt;p&gt;With this, we have come to the end of this deep dive, but here is what I have to say at the end.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The Gap is Closing
&lt;/h2&gt;

&lt;p&gt;Six months ago, comparing open-source models to Claude and GPT meant accepting tradeoffs with performance, quality, builds, and output.&lt;/p&gt;

&lt;p&gt;Today, models like Kimi K3 are extremely competitive across coding, agentic, and multimodal tasks.&lt;/p&gt;

&lt;p&gt;Also, GLM-5.2 shows competitive performance across industry-standard evaluations, frequently rivalling or approaching proprietary models such as GPT-5.5 and Claude Opus 4.8.&lt;/p&gt;

&lt;p&gt;Here is what most people are missing.&lt;/p&gt;

&lt;p&gt;The talk is no longer about closed vs open source;&amp;nbsp; It's about&amp;nbsp;&lt;em&gt;specialised&lt;/em&gt;&amp;nbsp;vs general, and&amp;nbsp;&lt;em&gt;long-context practical&lt;/em&gt;&amp;nbsp;vs theoretical.&lt;/p&gt;

&lt;p&gt;Both K3 and GLM-5.2 are proving that open-source can own specific workloads better than models 10x the marketing budget.&lt;/p&gt;

&lt;p&gt;For builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose Kimi K3&lt;/strong&gt; if you're building agents that reason for hours, need multimodal perception, or can absorb frontier pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose GLM-5.2&lt;/strong&gt; if you want open weights today, need fast inference on a GPU, or are optimizing for math and code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, you're not choosing good models. You're choosing the right model for the right task, and that matters.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to connect MCP servers to Slackbot</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Sat, 18 Jul 2026 11:57:47 +0000</pubDate>
      <link>https://dev.to/composiodev/how-to-connect-mcp-servers-to-slackbot-1al4</link>
      <guid>https://dev.to/composiodev/how-to-connect-mcp-servers-to-slackbot-1al4</guid>
      <description>&lt;p&gt;Slackbot recently added support for MCP, which means you can now connect it with external apps and let it take actions across your work tools directly from Slack&lt;/p&gt;

&lt;p&gt;But the native app list is still limited. By the time of writing this post, there's just about &lt;strong&gt;20 apps&lt;/strong&gt; that you can connect from the &lt;a href="https://slack.com/marketplace" rel="noopener noreferrer"&gt;Slack marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And for most teams, that's not enough.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlyug2z5afeztlhxrwtd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlyug2z5afeztlhxrwtd.gif" alt="not enough gif" width="480" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But luckily, Slack allows you to set up or use your custom MCP servers and not have to be limited by the number of apps available in marketplace.&lt;/p&gt;

&lt;p&gt;That's where &lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; helps you. It can connect your slack bots to &lt;strong&gt;1000+ apps&lt;/strong&gt; that you can use.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll go through how to connect Slackbot with Composio’s MCP server in 3 steps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ The steps will be pretty much the same with other MCP servers as well.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;Once this is set up, you can ask Slackbot things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find my latest unread Gmail emails.
Search my Notion workspace for launch notes.
Check my Google Calendar for meetings tomorrow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And a bunch more. Imagine all the stuff you can do with 1000+ apps. 😵‍💫&lt;/p&gt;

&lt;p&gt;I'll leave the rest to your imagination...&lt;/p&gt;

&lt;p&gt;Slackbot sends the request to Composio Connect, Composio finds the right tool, asks you to connect the app if needed (one time), and then executes the action.&lt;/p&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Slack workspace with Slackbot MCP client access (comes with Business+ and Enterprise plan)&lt;/li&gt;
&lt;li&gt;Permission to create or configure a Slack app.&lt;/li&gt;
&lt;li&gt;A Composio account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Get the Composio Connect MCP URL
&lt;/h2&gt;

&lt;p&gt;First, you need the MCP server URL from Composio.&lt;/p&gt;

&lt;p&gt;For this setup, use Composio Connect:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is Composio’s hosted MCP server that gives your AI agent access to 1,000+ apps with just &lt;strong&gt;7 meta-tools&lt;/strong&gt; that let the slackbot discover what's available, authorize apps on demand, and execute tools across apps in parallel through a single connection.&lt;/p&gt;

&lt;p&gt;You don’t need to create a custom MCP server for this guide.&lt;/p&gt;

&lt;p&gt;Composio also supports custom MCP servers for more scoped project-specific use cases, but those can require API-key-based auth. For Slackbot, Composio Connect is the simpler path because it works with OAuth-based MCP client flows.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9r6it1xz4hl4h3ifel7a.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9r6it1xz4hl4h3ifel7a.png" alt="Composio Connect" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: Add Composio Connect to a Slack App
&lt;/h2&gt;

&lt;p&gt;Now, we need to register the Composio MCP server inside a Slack app.&lt;/p&gt;

&lt;p&gt;Go to the Slack developer dashboard and create a new app.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5kkqe4kem5xnfmpyla6r.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5kkqe4kem5xnfmpyla6r.png" alt="Slack new app creation" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the app is created:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your Slack app.&lt;/li&gt;
&lt;li&gt;In the left sidebar, go to &lt;strong&gt;Features&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;MCP Servers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwvranutnruw5ja1w5vhm.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwvranutnruw5ja1w5vhm.png" alt="Slack MCP Servers button" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Get Started&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2yx87053fw9upha8l28.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2yx87053fw9upha8l28.png" alt="Slack get started button" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now fill in the MCP server details.&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Composio (or anything you wish)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href="https://connect.composio.dev/mcp" rel="noopener noreferrer"&gt;https://connect.composio.dev/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth Type&lt;/strong&gt;: Dynamic Client Registration&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnyzro2ycp7xjqhb3gsnw.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnyzro2ycp7xjqhb3gsnw.png" alt="Slack Add MCP" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the auth type, select &lt;strong&gt;Dynamic Client Registration&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ This is the right option for MCP servers that support OAuth discovery and client registration. Slack handles the client registration automatically, so you don’t need to manually create OAuth credentials first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, if you click the three dots and then &lt;strong&gt;Tools&lt;/strong&gt;, you should see that it currently cannot fetch the tools because the MCP server uses a dynamic connection and must be installed in your workspace first.&lt;/p&gt;

&lt;p&gt;So, now head over to the &lt;strong&gt;Install App&lt;/strong&gt; tab, and install it to the workspace you selected when creating the app.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwv4sjhjmjvmkiflvhyp.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwv4sjhjmjvmkiflvhyp.png" alt="Slack Install App" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your workspace requires approval, send the app request to your admin.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Connect Composio inside Slackbot
&lt;/h2&gt;

&lt;p&gt;Once your Slack app is installed and approved, open a DM with Slackbot.&lt;/p&gt;

&lt;p&gt;Then, just type in a prompt that requires using the app, Slack will use the correct app automatically for you.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp5wb4l3ab4anrfqv8y9.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp5wb4l3ab4anrfqv8y9.png" alt="Slack connecting composio" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Connect,&lt;/strong&gt; and you’ll be taken to a confirmation page.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f5nvtnc0j1x1wkbv356.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f5nvtnc0j1x1wkbv356.png" alt="Slack connecting composio confirmation" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Continue, and then confirm it on the Composio end.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljriezhxmemb38w8apqz.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljriezhxmemb38w8apqz.png" alt="Composio confirmation" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything went well, you should see that your account is connected.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58g6dsw3n767nztxc4mo.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58g6dsw3n767nztxc4mo.png" alt="Slack final confirmation" width="799" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, Slackbot should be able to discover Composio’s MCP tools.&lt;/p&gt;

&lt;p&gt;Start with a simpler test:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What tools are available from Composio?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once that goes through, now try an actual app action.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Send a mail to x@y.com saying 'Hi, from Composio 👋 inside Slackbot'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If Gmail is not connected yet, Composio should generate an OAuth link for you to connect it. Once you approve it, the connection persists for future use. So, you don't have to repeat this step again and again.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fb169cfpktm2xynzoe3.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fb169cfpktm2xynzoe3.png" alt="Composio connection link" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Slackbot may ask you to approve the action before it writes data to another app.&lt;/p&gt;

&lt;p&gt;That's expected. Once connected, Slackbot can use that app through Composio.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxlw14j7ed5fi6h0o6dk.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxlw14j7ed5fi6h0o6dk.png" alt="Composio MCP in action" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voilà, you've successfully connected Slackbot to Composio MCP. 🎊&lt;/p&gt;

&lt;p&gt;Here’s a quick workflow for initiating a connection and running an actual app action:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/m6kv3tqjUgU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Slack's own marketplace is good, and if it covers all the tools you require, you can completely stick to it.&lt;/p&gt;

&lt;p&gt;But for some of you, that's simply not enough. I hope this helps overcome that problem.&lt;/p&gt;

&lt;p&gt;So instead of jumping between different tools, you can ask Slackbot to find information, create tasks, update records, and run actions across your apps from inside Slack.&lt;/p&gt;

&lt;p&gt;This is a much-needed quality-of-life improvement for teams that already live in Slack.&lt;/p&gt;

&lt;p&gt;Slackbot gives you the interface. MCP gives you the protocol.&lt;/p&gt;

&lt;p&gt;And Composio gives you the app layer. 👌&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;SDE • GOLD @Microsoft Student Ambassador • Prev Lead Collab and Dev-Team Lead @oppiaorg • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>automation</category>
    </item>
    <item>
      <title>Cursor Vs Claude Code: Which one you should pick (or both)</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Thu, 16 Jul 2026 17:10:26 +0000</pubDate>
      <link>https://dev.to/composiodev/cursor-vs-claude-code-which-one-you-should-pick-or-both-8o7</link>
      <guid>https://dev.to/composiodev/cursor-vs-claude-code-which-one-you-should-pick-or-both-8o7</guid>
      <description>&lt;p&gt;Cursor and Claude Code are 2 leading products that engineers reach out for nowadays. &lt;/p&gt;

&lt;p&gt;Both can refactor whole codebases, hunt for bugs, run spec-driven builds, and handle vibe coding needs, in the same ecosystem (skills, mcps, plugins, hooks ) and harness that ties the agent loop together. Same rig, yet both cater to a different workflow.&lt;/p&gt;

&lt;p&gt;And Cursor had recently become hard to ignore as SpaceX&amp;nbsp;signed a $60 billion all-stock deal to buy its parent company,&amp;nbsp;Anysphere&amp;nbsp;(closes Q3 2026), and around the same time, it shipped&amp;nbsp;Origin, its own githost for agents, plus&amp;nbsp;cloud agents,&amp;nbsp; Composer 2.5,&amp;nbsp;and Grok 4.5.&lt;/p&gt;

&lt;p&gt;As for me, I use both every single day. I even rewrote my X bio in their honor: &lt;em&gt;I touch Claude Code, Cursor for a living.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;None of this is free, though. For 6 months, I have happily paid&amp;nbsp;&lt;strong&gt;$20/mo for Cursor&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;$100/mo for Claude Code&lt;/strong&gt;&amp;nbsp;because neither tool excels at everything in my workflow.&lt;/p&gt;

&lt;p&gt;However, not everyone needs both, and not everyone wants to spend $120 a month to find out. If that is you, the question shifts to what you actually get for each dollar. &lt;/p&gt;

&lt;p&gt;This is what this guide answers. Let’s begin&lt;/p&gt;




&lt;h4&gt;
  
  
  TLDR
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;Which to pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Models and tooling&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for depth on one model;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for option across many&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing cost's real story&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; on focused tasks (pay per fetch, ~5.5x fewer tokens);&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for huge monorepos, but you pay to keep the index fresh&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task delegation (async agents)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for supervised and visual;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for raw delegated horsepower&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The harness&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for UI-heavy work you want to watch and control;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for repeatable, version-controlled instructions that run themselves&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyday usage&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for hands-on control over every edit;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for reviewing finished work instead of keystrokes&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for simple, predictable flat pricing;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;'s $100 only pays off on token-heavy work&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility (MCP, Skills, plugins)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; to distribute a governed toolset to a large team;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for reproducible agent behavior that lives in the repo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data privacy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for a narrower footprint;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; will soon route your whole stack through one owner (SpaceX)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But before moving forward, I would like to clear up a common paradox people get caught up in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The common paradox
&lt;/h2&gt;

&lt;p&gt;Most people think Cursor is an AI editor with tools, while Claude Code is an AI agent you hand tasks to. That is not their fault tbh. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But my friend, that framing died twice.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, the interfaces merged:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code now runs in VS Code, as a desktop app, and in the browser.&lt;/li&gt;
&lt;li&gt;Cursor runs as a desktop app, in a terminal, in the cloud, on iOS, and on the web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I even run Claude Code &lt;em&gt;inside&lt;/em&gt; Cursor most days now.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp7277g03008gltdp7ojx.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp7277g03008gltdp7ojx.png" alt="Cursor Image" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, Cursor stopped being a code editing tool and became a platform.&lt;/strong&gt; It now owns the full software factory, top to bottom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write your code in Cursor,&lt;/li&gt;
&lt;li&gt;Review it with Bugbot,&lt;/li&gt;
&lt;li&gt;Host it on Origin (new release),&lt;/li&gt;
&lt;li&gt;Run it on models trained by its own group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look at the last seven months alone:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Move&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dec 2025&lt;/td&gt;
&lt;td&gt;Acquired &lt;strong&gt;Graphite&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Owns code review: stacked PRs, merge queues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 2026&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Bugbot&lt;/strong&gt; went reviewer to &lt;em&gt;fixer&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Spots a bug, spins its own agent, tests a fix, proposes it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 2026&lt;/td&gt;
&lt;td&gt;Announced &lt;strong&gt;Origin&lt;/strong&gt;, a GitHub rival&lt;/td&gt;
&lt;td&gt;Git hosting for the agentic era, AI merge-conflict resolution. Waitlist, ships fall 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 16, 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SpaceX agreed to acquire Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$60B all-stock per an SEC 8-K filing, close expected Q3 2026, into the xAI group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This tells you that the platform is no longer what it was 6 months ago; the cursor now owns the entire integrated software factory stack. More about it on the Product Hunt discussion.&lt;/p&gt;

&lt;p&gt;So if the interfaces are roughly the same now, what actually separates these two tools? Read on.&lt;/p&gt;




&lt;p&gt;Two years ago, the model was the moat. In 2026, it hardly is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; runs on Claude, currently Opus 4.8. The tool and the model are tuned for each other, and you feel it in how confidently it plans multi-step work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; lets you select your own brains: GPT-5.5, Claude Opus 4.8, Gemini 3.1 Pro, Grok 4.5, and its own Kimi K2.5 finetuned Composer 2.5. Pick the right model per task, pay Cursor to route.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On my 12-file NASA JPL refactor, Claude Code read most of the tree before writing a line, and the first pass barely needed correction. &lt;/p&gt;

&lt;p&gt;As for the cursor, it also handled things smoothly with a one-time correction with a function. It was because a model API call failed and was partially completed.&lt;/p&gt;

&lt;p&gt;This has also been a concern for the cursor teams, and they aim to be the lab, rather than a model router.  Also, it aims to invent a new kind of programming where any idea can just be represented in English.&lt;/p&gt;

&lt;p&gt;Truell’s June 16 Compile keynote &amp;amp; later in Lenny’s podcast addresses this nicely:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Our goal with Cursor is to invent a new type of programming. It looks like a world where you have a representation of the logic of your software that does look more like English. You can imagine kind of an evolution of programming language towards pseudocode. You have written down the logic of the software, and you can edit that at a high level. It won't be the impenetrable millions of lines of code, it'll instead be something that's much terser and easier to understand and easier to navigate."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now that’s training its first frontier model from scratch, 1.5 trillion parameters, on xAI's Colossus cluster, under SpaceX's $60 billion deal. It seems the company is heading into its next phase and aims to become the model developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who wins?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want a model tuned straight into the tool, go to Claude Code.&lt;/li&gt;
&lt;li&gt;If you want model variety today and a bet on Cursor's own lab tomorrow, go with Cursor.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Pricing: Cursor vs Claude Code
&lt;/h2&gt;

&lt;p&gt;Most of us stop at the sticker price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hobby&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;$60/mo&lt;/td&gt;
&lt;td&gt;3x usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra&lt;/td&gt;
&lt;td&gt;$200/mo&lt;/td&gt;
&lt;td&gt;20x usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;$40/user ($120 Premium seat)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Every paid plan runs on usage credits, with on-demand billing past your allotment. Turn on spend limits the day you start.&lt;/li&gt;
&lt;li&gt;Auto mode is the cheap lever: it runs Composer 2.5 or routes to a capable model automatically, and it is unlimited on paid plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;No free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max&lt;/td&gt;
&lt;td&gt;$100/mo ($200 for 20x)&lt;/td&gt;
&lt;td&gt;Unlocks Opus, up-to-1M context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;$25/seat ($20 annual)&lt;/td&gt;
&lt;td&gt;Caps at 150 seats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Base seat + API usage&lt;/td&gt;
&lt;td&gt;Cheaper light, pricier heavy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;No free tier; the cheapest door is Pro at $20.&lt;/li&gt;
&lt;li&gt;Limits run on two clocks at once: a 5-hour rolling window plus a weekly cap, so an all-day session can hit the wall mid-task.&lt;/li&gt;
&lt;li&gt;To trim spend, route routine edits to Sonnet or Haiku, save Opus for hard refactors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On paper, both start at $20, and the offerings look even. It isn’t!&lt;/p&gt;

&lt;p&gt;The sticker price hides what it actually costs to run a task.&lt;/p&gt;

&lt;p&gt;On a widely repeated refactor test, the same job cost wildly different amounts of compute:&lt;/p&gt;

&lt;p&gt;Tokens used on the same refactor  (lower is better)&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1c36ikwdq4vggbdq8vl.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1c36ikwdq4vggbdq8vl.png" alt="comaprison" width="799" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@gvelosa/claude-code-vs-cursor-in-2026-the-token-efficiency-gap-befd0864e0a5" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is a &lt;strong&gt;5.5x gap&lt;/strong&gt; for identical output. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One honest note: this is a single community benchmark; the two agents ran different models under the hood, and at least one prints the numbers flipped. Treat it as a strong signal, not a law. It also does not hold everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This happens because each tool loads the context differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor retrieves using a hybrid stack: a semantic index, grep, and an Explore subagent. Index-backed and targeted, strong on huge monorepos, but the index carries a standing cost to build and keep fresh. You pay for it.&lt;/li&gt;
&lt;li&gt;Claude Code skips the index and greps, globs, and reads on demand. Index-free and just-in-time, so you pay only for what it pulls into context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One caveat&lt;/strong&gt;: both start to degrade beyond roughly 150k tokens of genuinely relevant context, so neither truly wins at extreme scale.&lt;/p&gt;

&lt;p&gt;So, who wins?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor:&lt;/strong&gt; Use it if you want simple, predictable flat pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; the $100 only pays off on token-heavy work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro tip:&lt;/strong&gt; Model both against your own usage, then decide.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Task Delegation with Async agents
&lt;/h2&gt;

&lt;p&gt;The refactor task I gave to Claude and the bug hunt task to Cursor were not from the terminal/app UI; they were through my mobile phone. In fact, I barely touch my pc while traveling.&lt;/p&gt;

&lt;p&gt;Essence is simple.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F10e3f5sq7mohu5pw95ts.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F10e3f5sq7mohu5pw95ts.png" alt="Task Delegation" width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In short, task delegation is here, but both Claude Code and cursor build around this differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; builds this around cloud agents and Automations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launches cloud dev environment in under 10 minutes, snapshot it, reuse it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/in-cloud&lt;/code&gt; spins a subagent on its own VM and branch, while your laptop stays unaffected.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/automate&lt;/code&gt; creates jobs in plain language, with GitHub and Slack triggers.&lt;/li&gt;
&lt;li&gt;Bugbot review runs ~3x faster, roughly 90 seconds a pass, and can be called with &lt;code&gt;/review&lt;/code&gt; before you push.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; builds this around agent teams and background sessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud dev environment for remote sessions, spun up automatically the first time you run a remote feature, no manual web setup.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/agents&lt;/code&gt; launches a coordinated team where one session leads and others execute, viewable and steerable in the &lt;code&gt;claude agents&lt;/code&gt; view.&lt;/li&gt;
&lt;li&gt;Background agents run on separate git worktrees; kick one off from &lt;code&gt;claude agents&lt;/code&gt;, then steer it from your phone via Remote Control in the mobile app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/code-review&lt;/code&gt; runs a review pass on your changes, improved on Opus 4.8 across effort levels, and &lt;code&gt;/security-review&lt;/code&gt; scans for vulnerabilities before you push.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who wins?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervised and visual, go for Cursor.&lt;/li&gt;
&lt;li&gt;Raw delegated horsepower, go for Claude Code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Harness
&lt;/h2&gt;

&lt;p&gt;Strip as an agent down to its core, and that is a model in a loop with tools. &lt;/p&gt;

&lt;p&gt;Everything wrapped around that loop: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The memory,&lt;/li&gt;
&lt;li&gt;The standing instructions (system prompt),&lt;/li&gt;
&lt;li&gt;The automatic hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;decides whether the loop is reliable and works. Some people call this layer the rig, but it's commonly called a harness.&lt;/p&gt;

&lt;p&gt;Both Claude code and cursor ships with this harness, but are targeted for different workflows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ships the harness native and documented:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt;: standing instructions, the agent reads every session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: packaged workflows you invoke like &lt;code&gt;/review-pr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt;: shell commands that fire on lifecycle events, so a formatter runs after every edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifacts&lt;/strong&gt;: session work captured as a live web page (a PR walkthrough, a dashboard), a non-terminal teammate can read, with private org sharing and version history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Its harness version exists too, and it is growing fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single &lt;strong&gt;Customize&lt;/strong&gt; page pulls together plugins, skills, MCP servers, subagents, rules, commands, and hooks, with a marketplace on top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design Mode&lt;/strong&gt; lets you point at UI elements in the browser or on a canvas, select several at once, and narrate changes by voice while agents edit beneath the surface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is the center of gravity:&lt;/p&gt;

&lt;p&gt;Cursor's harness orbits the editor and the visual surface, and yes, it's amazing. I give one instruction in the 1st prompt, and it carries forward until the chat ends. &lt;/p&gt;

&lt;p&gt;Claude Code orbits the agent loop and the command line. In my experience, I tend to forget important instructions mid-conversation if the topic strays too far or the chat goes on too long.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, who wins?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor: For UI-heavy work where you want to see every change and be in control. (not true delegation, but secure)&lt;/li&gt;
&lt;li&gt;Claude Code: For repeatable, version-controlled instructions (a &lt;code&gt;CLAUDE.md&lt;/code&gt; file plus Hooks) that your whole team inherits automatically, so the rules run on their own instead of relying on you to remember them. (true delegation, but feel less secure)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Everyday Usage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cursor feels at home;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It&lt;/strong&gt;&amp;nbsp;is a VS Code fork, so it looks like the editor I already use,&lt;/li&gt;
&lt;li&gt;Tab autocomplete predicts my next several edits as I type.&lt;/li&gt;
&lt;li&gt;Within an hour of writing by hand, I felt faster when I tried it for the 1st time 6 months back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Claude Code feels like running a company;&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's terminal + ui native, no autocomplete to fall for. Mainly for task delegation.&lt;/li&gt;
&lt;li&gt;Once I have written a good enough &lt;code&gt;CLAUDE.md&lt;/code&gt; and wired a couple of Hooks, Specs, and project-level skills, it runs whole tickets across multiple subagents in parallel while I go through the diff.&lt;/li&gt;
&lt;li&gt;Mainly for task delegation, the payoff arrives late but is bigger than the current.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Review style&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What you see&lt;/td&gt;
&lt;td&gt;Each change inline, accept or edit before it lands&lt;/td&gt;
&lt;td&gt;The finished result plus the reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;UI edits where you eyeball every pixel&lt;/td&gt;
&lt;td&gt;Delegated tickets you review as a whole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;You trigger them&lt;/td&gt;
&lt;td&gt;It runs them, iterates on failure, reports back&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Who wins?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tight control over every edit and well-controlled task delegation with AGENTS.md, go with Cursor.&lt;/li&gt;
&lt;li&gt;Review finished work instead of keystrokes, go with Claude Code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Extensibility: MCP, Skills, plugins
&lt;/h2&gt;

&lt;p&gt;Both speak MCP, the protocol for wiring outside tools and data into an agent. Both turned it into a team-management surface rather than a solo toy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the cursor, teams can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure Team MCP servers once, push them across cloud agents, the agents window, the IDE, and the CLI.&lt;/li&gt;
&lt;li&gt;Publish approved integrations to a team marketplace so members can install without touching config.&lt;/li&gt;
&lt;li&gt;Added GitLab, BitBucket, and Azure DevOps support for those imports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the Claude Code, teams can&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leans on Skills, Hooks, and a plugin system, plus MCP for outside connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Cowork&lt;/strong&gt; brings agent machinery to knowledge work within a local, isolated VM with access to their files.&lt;/li&gt;
&lt;li&gt;A computer-use preview lets Claude open files, click, and navigate for you.&lt;/li&gt;
&lt;li&gt;A Slack integration (Team and Enterprise plans) lets you tag Claude to hand off a task without leaving the channel.&lt;/li&gt;
&lt;li&gt;Treats extensibility as a code check-in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But what about solo dev’s?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solo Devs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the solo dev, none of the above matters; it's about speed, for example: how fast can you load tools, skills, and MCP that follow on every machine and get work done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; is the easy on-ramp.

&lt;ul&gt;
&lt;li&gt;Adding an MCP server is a few clicks with OAuth built in, no config file to hand-edit, and you inherit the entire VS Code extension library on day one.&lt;/li&gt;
&lt;li&gt;The Customize page works at the user level, too, so your rules, skills, and MCPs live in one place as local instructions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; gives a solo dev the same files-in-repo power the teams get.

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;CLAUDE.md&lt;/code&gt; skills, hooks, and plain files are plain files that users can commit to, so their agent behaves identically on their laptop, desktop, or any box they clone into.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, the setup is only half the battle.&lt;/p&gt;

&lt;p&gt;Often, we solo developers struggle to connect to multiple tools, manually pass API keys, worry about security, and hope for optimized tool calls. ‘&lt;/p&gt;

&lt;p&gt;So for this, I use composio, which helps me connect to 1000+ tools/services in one click, while handling all the issues I mentioned earlier.  - Just a practical experience here, your call.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who wins?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribute a governed toolset to a large team through a marketplace. Cursor leads today.&lt;/li&gt;
&lt;li&gt;Reproducible agent behavior that lives in the repo, Claude Code fits how engineers already work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Most Important Factor
&lt;/h2&gt;

&lt;p&gt;This is the point most take for granted. The data privacy.&lt;/p&gt;

&lt;p&gt;Cursor is on its way to becoming a SpaceX subsidiary, folded into the xAI group, once the $60B deal closes in Q3. &lt;/p&gt;

&lt;p&gt;Pair that with Origin (its own git host) and Composer (its own model), and one company could soon own the tool that writes your code, the place that stores it, and the model that learns from it. That is genuinely new. No prior git host has also owned the model doing the writing.&lt;/p&gt;

&lt;p&gt;I am not calling it a trap, and I am not assuming bad intent. But if you work on client repos with strict rules about where code can live, as I do, think about this before you migrate anything. &lt;/p&gt;

&lt;p&gt;Always read the terms. Watch where the data goes. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code keeps a narrower footprint, an agent and a harness rather than a whole hosting stack, though your code still travels to Anthropic's API either way.&lt;/li&gt;
&lt;li&gt;Cursor soon will own the stack, your code, your tool calls, your decision, plan, and all builds will go through the cursor for better model training.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You are...&lt;/th&gt;
&lt;th&gt;Your pick&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UI / product engineer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editor you know, inline autocomplete, visual diffs, pick a model per task. The best AI code editor you can buy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systems / backend engineer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delegate whole tickets, reproducible agent behavior from repo files, orchestrate several agents, review finished work. Its rig is the more serious engineering today, and its token efficiency is a real cost edge.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most of us&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Both&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$120/mo total, for a month. Let the work sort it out.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The engineers I know who ship fastest stopped treating this as a loyalty test and started treating it as two tools for two kinds of tasks. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor for the hands-on sessions.&lt;/li&gt;
&lt;li&gt;Claude Code for the delegated automations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The debate between cursor and clauded code ends the moment you stop arguing and start building. This is where I landed after six months with the two subscriptions. &lt;/p&gt;

&lt;p&gt;Remember, your repo and your habits will move these numbers in the future, so borrow my framework, not my conclusion.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>learning</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Enterprise MCP Gateway Buyer's Guide: SSO, SCIM, Audit, and Governance Requirements</title>
      <dc:creator>Dumebi Okolo</dc:creator>
      <pubDate>Sun, 05 Jul 2026 22:31:54 +0000</pubDate>
      <link>https://dev.to/composiodev/the-enterprise-mcp-gateway-buyers-guide-sso-scim-audit-and-governance-requirements-ho7</link>
      <guid>https://dev.to/composiodev/the-enterprise-mcp-gateway-buyers-guide-sso-scim-audit-and-governance-requirements-ho7</guid>
      <description>&lt;p&gt;&lt;em&gt;MCP gateways are becoming mandatory infrastructure for any organization deploying AI agents at scale. Here is what they actually do, what they must do, and how to evaluate one honestly.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In November 2024, Anthropic released the Model Context Protocol: a wire format for connecting AI clients to tools, data sources, and APIs. Eighteen months later, MCP has crossed 78% adoption among production AI engineering teams. The public registry has passed 9,400 servers. Anthropic, OpenAI, Google, and Microsoft all support it. Practitioners have started calling it "the USB-C of AI applications."&lt;/p&gt;

&lt;p&gt;The protocol's success created an infrastructure problem that nobody anticipated at quite this speed. Every MCP server connection expands an organization's attack surface. Every AI agent operating with tool access can read private data, write to production systems, and execute commands under the permissions of whoever authorized it. Without a governance layer, these agents are black boxes: no audit trail, no access control, no identity attribution, no way to answer "what did this agent do?" to an auditor.&lt;/p&gt;

&lt;p&gt;The answer the market has converged on is an MCP gateway: a control plane that sits between AI agents and the tools they call. But the term covers a lot of ground, from lightweight protocol proxies to full enterprise governance platforms. The differences are significant. Getting the choice wrong creates compliance exposure; getting it right creates the foundation for scaling AI safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a gateway actually is
&lt;/h2&gt;

&lt;p&gt;The core function of an MCP gateway is collapsing what engineers call the N×M integration problem. Without a gateway, every AI agent manages its own credentials, authentication flows, and access policies for every tool it connects to. &lt;/p&gt;

&lt;p&gt;Ten agents and twenty tools produce two hundred independent connection paths, each with its own credentials, each potentially leaking secrets, each invisible to anyone trying to govern AI behavior centrally. A gateway reduces that to a single control point: N agents connect to the gateway; the gateway manages access to M tools.&lt;/p&gt;

&lt;p&gt;That description makes it sound like a proxy. It is not just a proxy. The proxy, the routing layer, accounts for roughly five percent of what an enterprise-grade gateway actually delivers. The remaining ninety-five percent is everything else: identity federation, automated user provisioning, audit logging, role-based access control, policy enforcement, and protection against attack vectors that API gateways from the previous decade were never designed to handle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The proxy is roughly 5% of the actual scope. The rest is what makes it usable, governed, and defensible to your security team."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This distinction matters for procurement. Organizations that evaluate gateways primarily on latency benchmarks and integration counts are optimizing for the five percent. The ninety-five percent, whether the gateway can prove, in a form an auditor accepts, who did what, is what determines whether the deployment is actually enterprise-grade.&lt;/p&gt;

&lt;p&gt;The Composio MCP Gateway is designed around this reality. Rather than selling a proxy and calling it governance, it ships the full stack: 1,000+ managed integrations across enterprise SaaS, a unified authentication layer, action-level RBAC, zero data-retention architecture (tool call payloads and credentials are never stored on Composio infrastructure), and SOC 2 and ISO certification. The quickstart takes about ten minutes; the governance layer is built in from the start, not bolted on later.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1dbh6hq00ruqok0bcpb.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1dbh6hq00ruqok0bcpb.png" alt="How An MCP Gateway Collapses" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The four things that cannot be missing
&lt;/h2&gt;

&lt;p&gt;Across the compliance frameworks that govern enterprise AI deployments (SOC 2, HIPAA, GDPR, ISO 27001, and now the EU AI Act), four governance capabilities appear repeatedly, either explicitly or implicitly. Absence of any one of them creates either regulatory exposure or operational failures that scale into incidents.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn25oypjkqt2tfskyh2lu.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn25oypjkqt2tfskyh2lu.png" alt="mcp-governance-pillars" width="799" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Identity federation and SSO
&lt;/h3&gt;

&lt;p&gt;Without SSO integration, agents authenticate using shared service account credentials or locally-stored API keys. This creates credential sprawl, blocks user-level attribution in audit logs, and prevents IT from revoking access cleanly when an employee departs. With federated identity, every tool call carries the identity of the specific user who authorized it, flowing through the gateway from the enterprise identity provider down to the MCP server.&lt;/p&gt;

&lt;p&gt;The technical baseline is support for OAuth 2.1,  standardized in the MCP specification in June 2025, alongside SAML 2.0 for enterprise SSO and OpenID Connect for modern attribute mapping. &lt;/p&gt;

&lt;p&gt;But the capability that separates governance-capable gateways from identity-aware proxies is &lt;strong&gt;On-Behalf-Of (OBO) token propagation&lt;/strong&gt;: the pattern where a gateway passes the end-user identity downstream to the MCP server rather than substituting a service account. Without OBO, an audit log records "gateway service account called database write tool." With OBO, it records "Elena Mwangi in Finance called database write tool at 14:32 UTC." The difference is the difference between an audit log and an audit trail.&lt;/p&gt;

&lt;p&gt;Composio's MCP Gateway handles this through SSO via SAML and OIDC, with documented integrations for Okta, Microsoft Entra ID, and Google Workspace. Every team gets a unique, scoped MCP endpoint. Developers paste it into Claude, Cursor, or ChatGPT. SSO authenticates. Only the tools their team is authorized to use appear, and there is no separate configuration step to restrict visibility.&lt;/p&gt;

&lt;p&gt;One practical concern worth flagging: identity provider integrations that look stable can break silently. Microsoft Entra changed its attribute mapping behavior for synchronized users in late 2024 without a deprecation notice. Every such change is a potential gap in governance coverage. When evaluating any gateway, ask vendors specifically how they monitor for and respond to IdP-side breaking changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. SCIM provisioning
&lt;/h3&gt;

&lt;p&gt;SCIM — System for Cross-domain Identity Management — automates the user lifecycle at scale. New hires receive correct tool access on day one. Role changes propagate immediately to gateway permissions. Departing employees lose all access at the moment their directory account is disabled.&lt;/p&gt;

&lt;p&gt;Without SCIM, MCP gateway access management becomes a manual operation at every organizational boundary event. HIPAA requires that access to systems holding protected health information be revoked immediately upon role change or separation. SOC 2 CC6.2 requires that access be provisioned based on authorized requests and revoked promptly when no longer needed. Manual processes fail both tests at scale.&lt;/p&gt;

&lt;p&gt;The scenario that illustrates this most clearly: a developer departs on difficult terms. Legal advises IT to immediately revoke all access. IT disables the directory account. If SCIM is integrated, that change propagates to the gateway; every agent connection that developer had, from GitHub to Jira to Salesforce to internal APIs, terminates immediately. No gap exists between directory disabling and access revocation. Without SCIM, someone has to hunt and manually revoke individual credentials across every connected system. At any scale above a handful of users, some will be missed.&lt;/p&gt;

&lt;p&gt;Composio's SCIM 2.0 implementation maps directory groups to teams directly. The mapping logic is explicit and auditable: if &lt;code&gt;department = Engineering&lt;/code&gt; then &lt;code&gt;Team: engineering&lt;/code&gt;. New hires get the right tools on day one without any manual gateway configuration. The group sync is active and continuous, not a nightly batch job.&lt;/p&gt;

&lt;p&gt;For teams building toward this themselves: the build vs. buy analysis Composio published puts the engineering effort for SCIM provisioning at 4–8 weeks for a mid-sized team, before accounting for ongoing maintenance as IdP behavior changes. That estimate covers the SCIM endpoint, group sync logic, and conflict resolution. It does not cover the OAuth token lifecycle management that sits adjacent to it, which is typically another 4–8 weeks and carries higher ongoing maintenance cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Audit logging
&lt;/h3&gt;

&lt;p&gt;Audit logs answer the question every regulator and every security team will eventually ask: "what did your AI agents access, and when?" Without comprehensive, immutable, structured audit logs, the honest answer is "we don't know." That answer fails every compliance framework that governs regulated data.&lt;/p&gt;

&lt;p&gt;The minimum required fields per log entry are: timestamp in UTC at millisecond precision; user identity attributed through the IdP, not a service account; agent identity; MCP server and tool name invoked; tool input parameters; tool output or error state; authorization decision and the policy rule that produced it; and session identifier for multi-turn correlation. These fields are what make a log entry into evidence.&lt;/p&gt;

&lt;p&gt;Beyond minimum fields, enterprise-grade logs must be immutable after writing, tamper-evident, either through cryptographic signing or append-only storage. They must be structured for reliable SIEM ingestion. They must support configurable retention aligned to the organization's most demanding applicable requirement: HIPAA access records for protected health information require six-year retention; SOC 2 typically requires twelve months.&lt;/p&gt;

&lt;p&gt;Composio's audit trail logs every tool call as: user, team, tool, action, outcome. Critically, &lt;strong&gt;no payloads are stored&lt;/strong&gt; , only metadata. This zero data-retention architecture matters for regulated industries where storing tool call contents on third-party infrastructure creates its own compliance risk. The logs support CSV export for compliance reviews, and retention is configurable from 7 days to 1 year. The audit log format generates entries compliant with SOC 2, HIPAA, and GDPR requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Policy enforcement
&lt;/h3&gt;

&lt;p&gt;The fourth pillar is where identity, provisioning, and audit turn from documentation tools into enforcement tools. Policy enforcement means the gateway doesn't just record that an agent attempted to call a destructive action. It blocks the call if the agent's role doesn't permit it.&lt;/p&gt;

&lt;p&gt;The critical implementation detail is the granularity at which access control operates. Standard RBAC in legacy API gateways operates at the API endpoint level. MCP gateway RBAC must operate at the action level within each toolkit. A GitHub integration may expose &lt;code&gt;GITHUB_CREATE_PR&lt;/code&gt;, &lt;code&gt;GITHUB_MERGE_PR&lt;/code&gt;, and &lt;code&gt;GITHUB_DELETE_REPO&lt;/code&gt;. Governance requires that a junior developer role can call the first two but not the third, without blocking access to the GitHub toolkit entirely.&lt;/p&gt;

&lt;p&gt;Composio enforces action-level RBAC at the gateway layer, not at the model layer. Each team gets a scoped MCP endpoint exposing only the tools they are authorized to use. Destructive actions within allowed toolkits — &lt;code&gt;GITHUB_DELETE_REPO&lt;/code&gt;, &lt;code&gt;SLACK_DELETE_CHANNEL&lt;/code&gt; — can be blocked independently of toolkit access. This is enforced in the gateway: if a model tries to call a blocked action, the gateway refuses it regardless of what the model was instructed to do.&lt;/p&gt;

&lt;p&gt;The access model supports both whitelist and blacklist modes. Teams can request access to blocked tools; admins approve or deny. This creates a self-service discovery path that doesn't require IT to anticipate every team's tooling needs in advance, while retaining central control over what actually gets enabled.&lt;/p&gt;




&lt;h2&gt;
  
  
  Attack vectors that API gateways were not built for
&lt;/h2&gt;

&lt;p&gt;Traditional API gateways were built for HTTP traffic between services. MCP traffic between AI agents and tool servers introduces attack vectors that legacy infrastructure was never designed to handle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool poisoning&lt;/strong&gt; places instructions inside tool Metadata, specifically in tool descriptions and parameter documentation that AI models read to understand how tools work. If descriptions contain adversarial instructions, the model may execute them. Unlike prompt injection, tool poisoning persists across sessions: it affects every agent that interacts with the tool, not just the session in which the attack was introduced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rug pull attacks&lt;/strong&gt; are tool poisoning with a delayed trigger. A server publishes clean, vetted tool definitions at the time of security review. After approval, the operator modifies descriptions to inject malicious instructions. Without tool hash pinning, hashing tool descriptions on first scan and alerting when they change, the gap between approved state and live state can persist indefinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt injection via tool output&lt;/strong&gt; embeds adversarial instructions in tool outputs  (document contents, database records, web page responses) that the agent ingests as legitimate input. The MCP specification only "SHOULD" require a human in the loop, which is insufficient protection in production environments handling sensitive data at agent speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-server shadowing&lt;/strong&gt; is an MCP-specific threat with no analog in traditional API security. A malicious MCP server impersonates a trusted server or embeds instructions in tool metadata that override the behavior of adjacent servers in the same agent context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credential sprawl&lt;/strong&gt; is the most operationally common risk. Agents storing API keys, database passwords, and OAuth tokens in local configuration files create exposure through prompts, logs, or accidental repository commits. In multi-agent architectures, credentials propagate through chained tool calls in ways invisible without gateway-level telemetry.&lt;/p&gt;

&lt;p&gt;A security leader at Medtronic described the operational concern accurately: "MCP opens a lot of opportunities to do a lot of damage very quickly." The velocity at which autonomous agents can chain tool calls makes human review an insufficient backstop without gateway-level guardrails enforcing limits in real time.&lt;/p&gt;

&lt;p&gt;Composio's zero data-retention architecture addresses the credential sprawl risk directly: tool call payloads and credentials are never stored on Composio infrastructure. This eliminates the most common vector for credential exfiltration through the gateway layer itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What compliance frameworks actually require
&lt;/h2&gt;

&lt;p&gt;No compliance framework names MCP gateways explicitly. All of them implicitly require what a gateway provides: a centralized layer where AI tool access is governed, logged, and restricted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOC 2&lt;/strong&gt; Trust Services Criteria CC6.1 through CC6.3 require access to be restricted to minimum necessary permissions, action-level RBAC satisfies this. CC7.2 and CC7.3 require monitoring and investigation of anomalies,  real-time audit log alerting and SIEM integration satisfy this. CC8.1 requires change management controls; access approval workflows and configurable retention policies satisfy this.&lt;/p&gt;

&lt;p&gt;For teams pursuing SOC 2 Type II certification, the observation period is at minimum six months. That means an organization that starts building its own gateway today won't have a reportable SOC 2 Type II audit for seven or eight months at the earliest, and that timeline assumes the controls were architected correctly from day one. Composio ships with SOC 2 Type II and ISO 27001 certification already in place, which removes this timeline entirely from the governance roadmap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HIPAA&lt;/strong&gt; adds a harder requirement: Business Associate Agreements. Any vendor that creates, receives, maintains, or transmits protected health information on an organization's behalf is a Business Associate and legally requires a signed BAA before any PHI touches their infrastructure. Composio's enterprise plan supports BAA execution. For healthcare organizations, this is a binary filter that precedes all technical evaluation: verify BAA availability before spending time on feature comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The EU AI Act&lt;/strong&gt;, whose high-risk system provisions became fully enforceable in August 2026, requires documented risk management, human oversight mechanisms, and technical evidence of controls for AI systems operating in healthcare, financial services, employment, and critical infrastructure. MCP gateway audit logs are the primary evidence artifact for conformity assessment. Organizations that have not established audit logging infrastructure before enforcement begins cannot retroactively generate evidence for the period before capture began.&lt;/p&gt;




&lt;h2&gt;
  
  
  The build vs. buy question, answered honestly
&lt;/h2&gt;

&lt;p&gt;Internal builds of MCP gateway infrastructure are a recurring theme in enterprise AI teams. The engineering argument is usually that "a proxy is a few weeks of work." That framing is accurate for the proxy. The full enterprise stack is different.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Build estimate&lt;/th&gt;
&lt;th&gt;Ongoing cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP routing proxy&lt;/td&gt;
&lt;td&gt;2–4 weeks&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.1 implementation&lt;/td&gt;
&lt;td&gt;3–6 weeks&lt;/td&gt;
&lt;td&gt;High — each SaaS app handles OAuth differently and changes without notice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAML/OIDC IdP integration&lt;/td&gt;
&lt;td&gt;2–4 weeks&lt;/td&gt;
&lt;td&gt;Medium — silent breaking changes require active monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCIM provisioning endpoint&lt;/td&gt;
&lt;td&gt;4–8 weeks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-user OAuth token lifecycle&lt;/td&gt;
&lt;td&gt;4–8 weeks&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit log infrastructure&lt;/td&gt;
&lt;td&gt;3–5 weeks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action-level RBAC policy engine&lt;/td&gt;
&lt;td&gt;6–8 weeks&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 SaaS integrations&lt;/td&gt;
&lt;td&gt;~15 weeks&lt;/td&gt;
&lt;td&gt;Ongoing per-integration maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOC 2 Type II observation period&lt;/td&gt;
&lt;td&gt;6+ months&lt;/td&gt;
&lt;td&gt;Continuous&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The proxy is five percent of the scope. The OAuth maintenance burden is where most internal builds stall or quietly degrade over time: every SaaS application handles OAuth slightly differently, and those implementations change without notice. GitHub OAuth app permissions behave differently depending on whether the organization has SAML SSO enabled. Entra changed its attribute mapping behavior in late 2024 without a deprecation notice. Each change is a potential silent breakage.&lt;/p&gt;

&lt;p&gt;Buying wins for most teams because they are not buying a proxy, they are buying maintained integrations, per-user OAuth lifecycle management, SSO and SCIM support, RBAC enforcement, audit logging, and compliance readiness, with the maintenance burden sitting on the vendor rather than internal engineering. Composio's MCP Gateway developer quickstart gets a working agent connected to its first toolkit in about ten minutes. That's the realistic comparison point against a multi-month internal build.&lt;/p&gt;

&lt;p&gt;The cases where building makes sense are narrower: unique deployment constraints no vendor accommodates, classified network requirements, or organizations with the appetite to own the entire AI infrastructure stack as a long-term strategic investment.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to evaluate a gateway honestly
&lt;/h2&gt;

&lt;p&gt;Start with deployment model. For organizations in healthcare, finance, or government where regulated data must remain within specific boundaries, deployment model is often a legal requirement before any technical comparison begins. Cloud-hosted managed gateways reduce time to production but involve data transiting vendor infrastructure. Self-hosted or VPC-deployed options provide data sovereignty. Composio operates as managed SaaS with a zero data-retention architecture as the default; for organizations requiring VPC or on-premises deployment, that narrows the field significantly and should be the first filter applied.&lt;/p&gt;

&lt;p&gt;After deployment model, evaluate in this sequence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity depth.&lt;/strong&gt; Does the gateway support OBO token propagation, or does it substitute service accounts? Ask vendors for a sample audit log entry and verify that user identity is IdP-attributed, not a service account name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SCIM implementation.&lt;/strong&gt; Does it support SCIM 2.0 with push provisioning? What is the documented maximum deprovisioning latency? The deprovisioning case, an employee departure or a security incident requiring immediate access revocation, is where manual processes fail most expensively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit log quality.&lt;/strong&gt; Require vendors to provide a sample log entry with all fields populated. Confirm the format is structured and suitable for SIEM ingestion. Confirm logs are immutable after writing. Confirm the retention policy can be configured to your longest applicable requirement. Ask whether PII redaction in tool parameters is configurable and, in Composio's case, whether the zero data-retention architecture means payloads aren't stored at all, which is the stronger answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access control granularity.&lt;/strong&gt; Confirm that RBAC operates at the action level, not the toolkit level. A gateway that blocks or enables whole toolkits but cannot distinguish between &lt;code&gt;GITHUB_CREATE_PR&lt;/code&gt; and &lt;code&gt;GITHUB_DELETE_REPO&lt;/code&gt; is not implementing least-privilege access control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance certification.&lt;/strong&gt; Request the current SOC 2 Type II report date and auditor. Confirm whether a BAA is available. For European deployments, ask whether the vendor has documented controls relevant to EU AI Act high-risk system provisions. Composio's SOC 2 and ISO 27001 certifications are current, which shortens the security review process significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP-specific threat coverage.&lt;/strong&gt; Ask whether tool hash pinning is implemented and whether it generates alerts when tool definitions change post-approval. Ask whether tool metadata is scanned for hidden prompt instructions. These questions distinguish purpose-built MCP governance platforms from extended API management products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exit terms.&lt;/strong&gt; Gateway choice shapes AI adoption architecture for three to five years. Confirm that gateway configuration, audit logs, and access policies can be exported in standard formats, and that contract exit terms do not create data portability barriers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The MCP specification continues to evolve. Client ID Metadata Documents, added in the November 2025 spec update, introduce a new mechanism for trusted client discovery. The Agent-to-Agent protocol is emerging as a complement to MCP for multi-agent orchestration, governing agent-to-agent delegation rather than agent-to-tool connectivity. Future enterprise governance will require control planes spanning both protocols.&lt;/p&gt;

&lt;p&gt;As AI agents gain persistent memory and state across sessions, the audit and governance scope expands beyond tool calls to memory operations and state modifications. Gateways scoped only to tool call governance will require extension as these capabilities become standard.&lt;/p&gt;

&lt;p&gt;The broader trajectory is toward federated multi-gateway architectures: separate gateway instances per business unit or geographic region with centralized policy management. This pattern addresses data residency requirements without requiring monolithic governance infrastructure. Including A2A roadmap questions in current gateway evaluations is forward-looking work that belongs in any RFP issued in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up,
&lt;/h2&gt;

&lt;p&gt;The teams establishing MCP governance infrastructure now  (building audit trails, connecting identity providers, implementing SCIM provisioning, enforcing action-level access policies) are building the foundation for AI adoption that compliance teams can accept and auditors can verify. The teams deferring governance are accumulating technical debt measured not in refactoring effort but in regulatory exposure.&lt;/p&gt;

&lt;p&gt;The audit log for last quarter does not exist if it was never captured. The SOC 2 observation period clock does not start until you start running controls. The EU AI Act conformity evidence is not retroactively generatable. The compliance timeline is contracting, and the enforcement mechanisms are real.&lt;/p&gt;

&lt;p&gt;For most teams moving from pilot to production, the practical starting point is a managed gateway that handles the ninety-five percent — Composio's MCP Gateway covers the integrations, the OAuth lifecycle, the SCIM provisioning, the action-level RBAC, the audit logging, and the compliance certifications in a single product. The developer quickstart takes ten minutes. The governance is not an afterthought.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Further reading:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://composio.dev/content/what-is-mcp-gateway-and-why-your-enterprise-need-it" rel="noopener noreferrer"&gt;&lt;em&gt;What is an MCP Gateway and why your enterprise needs one&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://composio.dev/content/building-vs-buying-an-enterprise-mcp-gateway" rel="noopener noreferrer"&gt;&lt;em&gt;Building vs. buying an enterprise MCP gateway&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://composio.dev/content/mcp-gateways-guide" rel="noopener noreferrer"&gt;&lt;em&gt;MCP Gateways: a developer's guide to AI agent architecture&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://composio.dev/content/best-mcp-gateway-for-developers" rel="noopener noreferrer"&gt;&lt;em&gt;10 best MCP gateways for developers in 2026&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>mcp</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
