<?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: Cristian Alejandro</title>
    <description>The latest articles on DEV Community by Cristian Alejandro (@c_alejandro).</description>
    <link>https://dev.to/c_alejandro</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%2Fuser%2Fprofile_image%2F3843600%2F6a6e6b6e-cb95-4c45-a04e-6685baa1c9c3.jpeg</url>
      <title>DEV Community: Cristian Alejandro</title>
      <link>https://dev.to/c_alejandro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/c_alejandro"/>
    <language>en</language>
    <item>
      <title>Stop Paying Premium-Model Prices for Grunt Work</title>
      <dc:creator>Cristian Alejandro</dc:creator>
      <pubDate>Fri, 17 Jul 2026 22:37:27 +0000</pubDate>
      <link>https://dev.to/c_alejandro/stop-paying-premium-model-prices-for-grunt-work-2pkd</link>
      <guid>https://dev.to/c_alejandro/stop-paying-premium-model-prices-for-grunt-work-2pkd</guid>
      <description>&lt;p&gt;Your orchestrator model is brilliant. It's also doing work an intern could handle.&lt;/p&gt;

&lt;p&gt;Every time Claude Code renames a variable, writes boilerplate tests, or greps through a codebase, you're paying Opus-tier (or Fable-tier) prices for a task a cheaper model would do just as well. Worse: while your top model is busy running that grunt work, it isn't doing the thing you actually hired it for — thinking about your architecture, your bug, your feature.&lt;/p&gt;

&lt;p&gt;The fix isn't a smarter prompt. It's a division of labor: &lt;strong&gt;the expensive model directs, cheaper models execute&lt;/strong&gt;. The orchestrator breaks the problem down, delegates the mechanical pieces, reviews the results, and keeps its context — and your budget — focused on the hard parts.&lt;/p&gt;

&lt;p&gt;That's exactly what &lt;a href="https://github.com/alejandro-technology/opencode-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;opencode-mcp&lt;/code&gt;&lt;/a&gt; does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea in one sentence
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;opencode-mcp&lt;/code&gt; is an MCP server that lets any MCP host — Claude Code, Codex, Cursor — drive an &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; instance and delegate tasks to its subagents, asynchronously and in parallel.&lt;/p&gt;

&lt;p&gt;Your orchestrator stays in charge. OpenCode's agents — running whatever models you've configured, from budget tiers to specialized ones — do the heavy lifting.&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%2Fd49e1uv28xaz3fhf3icq.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%2Fd49e1uv28xaz3fhf3icq.png" alt="architecture opencode-mcp" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it in 30 seconds
&lt;/h2&gt;

&lt;p&gt;You need Node.js 18+ and &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; installed with at least one provider configured. Then, for Claude Code:&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 opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex mcp add opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No cloning, no building. Restart your host and the &lt;code&gt;opencode_*&lt;/code&gt; tools are available.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real session: five test suites, in parallel, while Claude keeps working
&lt;/h2&gt;

&lt;p&gt;Here's the demo that convinced me to build this. The prompt to Claude Code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Generate unit tests for blocks 1-5. Delegate the work to OpenCode agents and review the results when they're done."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What happens under the hood:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Claude starts a server and checks who's available.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude calls &lt;code&gt;opencode_start_server&lt;/code&gt;, then &lt;code&gt;opencode_list_agents&lt;/code&gt; to see which agents and models the OpenCode instance exposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Claude fires five tasks — and doesn't wait.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Five &lt;code&gt;opencode_start_task&lt;/code&gt; calls go out, one per block. Each returns a &lt;code&gt;task_id&lt;/code&gt; &lt;strong&gt;immediately&lt;/strong&gt;. Each task runs in its own isolated OpenCode session, so the five agents can't step on each other.&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%2Fkf2awnkyqm2ixn1qhcbh.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%2Fkf2awnkyqm2ixn1qhcbh.gif" alt="Claude Code firing five start_task calls in parallel" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the key design decision: delegation is &lt;strong&gt;asynchronous&lt;/strong&gt;. Claude isn't blocked watching a progress bar. While the five subagents write tests, the orchestrator keeps moving — in my session, it used that time to review the service interfaces and draft the integration-test plan itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Claude waits for all five — with visibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it's ready to collect, Claude calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;opencode_wait_for_task&lt;/span&gt;
  &lt;span class="s"&gt;task_ids&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;t1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;t2&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;t3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;t4&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;t5&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all"&lt;/span&gt;
  &lt;span class="na"&gt;include_progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;wait_for_task&lt;/code&gt; long-polls until every task finishes (or a timeout elapses). If something is still running when the timeout hits, &lt;code&gt;include_progress&lt;/code&gt; returns a partial output snippet and &lt;strong&gt;the tool the subagent is executing right now&lt;/strong&gt; — so you see "it's running the test suite", not a black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Claude reviews and iterates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the five suites came back thin — missing edge cases on error paths. Instead of starting over, Claude calls &lt;code&gt;opencode_continue_task&lt;/code&gt; on that session: "Add tests for the failure paths in &lt;code&gt;retry()&lt;/code&gt;." The subagent picks up right where it left off, full context intact.&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%2Fbpgyen918s1o1qvnvw59.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%2Fbpgyen918s1o1qvnvw59.gif" alt="Final summary: the five completed tasks in Claude Code" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total orchestrator involvement: break down the work, fire, review, refine. The mechanical writing happened elsewhere, on the models you chose for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why async changes everything
&lt;/h2&gt;

&lt;p&gt;Most "delegate to another agent" MCP servers make a blocking tool call: the host calls the tool, the tool runs the agent, and everybody waits. That breaks down fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP client timeouts.&lt;/strong&gt; A 20-minute refactor doesn't fit inside a tool-call timeout. Async delegation sidesteps this entirely: &lt;code&gt;start_task&lt;/code&gt; responds in milliseconds, and status is polled separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No parallelism.&lt;/strong&gt; Blocking calls serialize your subagents. With fire-and-forget tasks, five agents genuinely run at once, each in an isolated session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No visibility.&lt;/strong&gt; A blocking call is silent until it returns. &lt;code&gt;get_task_status&lt;/code&gt; and &lt;code&gt;wait_for_task&lt;/code&gt; with &lt;code&gt;include_progress&lt;/code&gt; show partial output and the currently running tool mid-flight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No conversation.&lt;/strong&gt; When a blocking call returns, the session is gone. Here, &lt;code&gt;continue_task&lt;/code&gt; keeps the subagent's session alive for iterative back-and-forth — you refine the result instead of re-running the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more piece worth highlighting: the server ships a &lt;code&gt;delegate_task&lt;/code&gt; MCP prompt that includes a &lt;strong&gt;model selection guide&lt;/strong&gt; — a mapping from each OpenCode model tier to the task difficulty it should handle. The point of delegation isn't just &lt;em&gt;being able&lt;/em&gt; to hand off work; it's knowing &lt;em&gt;what&lt;/em&gt; to hand off &lt;em&gt;to whom&lt;/em&gt;. The prompt teaches your orchestrator exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool surface
&lt;/h2&gt;

&lt;p&gt;Nine focused tools — servers, agents, and the task lifecycle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;opencode_start_server&lt;/code&gt; / &lt;code&gt;opencode_stop_server&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Start (or attach to) / stop an OpenCode instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_list_agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List available agents and models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_start_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delegate a task; returns a &lt;code&gt;task_id&lt;/code&gt; immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_continue_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send a follow-up prompt to an existing task's session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_cancel_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abort a running task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_get_task_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Poll status, optionally with partial progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_get_task_result&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch the final result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_wait_for_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Long-poll one or many tasks (&lt;code&gt;mode: "all"&lt;/code&gt; / &lt;code&gt;"any"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's deliberate. This server doesn't try to wrap every OpenCode capability behind seventy tools — it does one thing: async task delegation, done properly. The codebase backs that up with a 100% coverage threshold enforced in CI (lines, branches, functions, and statements — any uncovered line breaks the build).&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the fan-out
&lt;/h2&gt;

&lt;p&gt;The demo covered the parallel-tasks case, but the same pattern works for more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost-tiering&lt;/strong&gt;: route mechanical work (renames, boilerplate, docs) to budget models and save the premium one for decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-model second opinions&lt;/strong&gt;: have a different model review your orchestrator's diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-running background work&lt;/strong&gt;: kick off a 20-minute refactor and keep working while it runs.&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo is at &lt;a href="https://github.com/alejandro-technology/opencode-mcp" rel="noopener noreferrer"&gt;github.com/alejandro-technology/opencode-mcp&lt;/a&gt; and the package is &lt;a href="https://www.npmjs.com/package/mcp-server-opencode" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-server-opencode&lt;/code&gt; on npm&lt;/a&gt;. Install it, delegate something, and tell me what you handed off — I want to hear what your orchestrator stopped doing itself.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>ai</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Deja de pagar precios de modelo premium por trabajo mecánico</title>
      <dc:creator>Cristian Alejandro</dc:creator>
      <pubDate>Fri, 17 Jul 2026 22:06:34 +0000</pubDate>
      <link>https://dev.to/c_alejandro/deja-de-pagar-precios-de-modelo-premium-por-trabajo-mecanico-2ka</link>
      <guid>https://dev.to/c_alejandro/deja-de-pagar-precios-de-modelo-premium-por-trabajo-mecanico-2ka</guid>
      <description>&lt;p&gt;Tu modelo orquestador es brillante. Y aun así está haciendo trabajo que podría hacer un becario.&lt;/p&gt;

&lt;p&gt;Cada vez que Claude Code renombra una variable, escribe tests de boilerplate o hace grep por el código, estás pagando precios de Opus (o de Fable) por una tarea que un modelo más barato haría igual de bien. Peor aún: mientras tu mejor modelo está ocupado con ese trabajo mecánico, no está haciendo aquello para lo que realmente lo contrataste - pensar en tu arquitectura, tu bug, tu feature.&lt;/p&gt;

&lt;p&gt;La solución no es un prompt más inteligente. Es una división del trabajo: &lt;strong&gt;el modelo caro dirige, los modelos baratos ejecutan&lt;/strong&gt;. El orquestador descompone el problema, delega las piezas mecánicas, revisa los resultados y mantiene su contexto - y tu presupuesto - enfocado en las partes difíciles.&lt;/p&gt;

&lt;p&gt;Eso es exactamente lo que hace &lt;a href="https://github.com/alejandro-technology/opencode-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;opencode-mcp&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  La idea en una frase
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;opencode-mcp&lt;/code&gt; es un servidor MCP que permite a cualquier host MCP — Claude Code, Codex, Cursor — controlar una instancia de &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; y delegar tareas a sus subagentes, de forma asíncrona y en paralelo.&lt;/p&gt;

&lt;p&gt;Tu orquestador sigue al mando. Los agentes de OpenCode — corriendo los modelos que tengas configurados, desde tiers económicos hasta especializados — hacen el trabajo pesado.&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%2Fc6fm4d7zuk2rlzd1b9k3.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%2Fc6fm4d7zuk2rlzd1b9k3.png" alt="opencode mcp architecture" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instálalo en 30 segundos
&lt;/h2&gt;

&lt;p&gt;Necesitas Node.js 18+ y &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; instalado con al menos un proveedor configurado. Luego, para Claude Code:&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 opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex mcp add opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso es todo. Sin clonar, sin compilar. Reinicia tu host y las herramientas &lt;code&gt;opencode_*&lt;/code&gt; quedan disponibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una sesión real: cinco suites de tests, en paralelo, mientras Claude sigue trabajando
&lt;/h2&gt;

&lt;p&gt;Esta es la demo que me convenció de construir esto. El prompt a Claude Code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Genera tests unitarios para los bloques 1-5. Delega el trabajo a agentes de OpenCode y revisa los resultados cuando terminen."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lo que pasa por debajo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Claude levanta un servidor y consulta quién está disponible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude llama a &lt;code&gt;opencode_start_server&lt;/code&gt; y luego a &lt;code&gt;opencode_list_agents&lt;/code&gt; para ver qué agentes y modelos expone la instancia de OpenCode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Claude dispara cinco tareas — y no espera.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Salen cinco llamadas a &lt;code&gt;opencode_start_task&lt;/code&gt;, una por bloque. Cada una devuelve un &lt;code&gt;task_id&lt;/code&gt; &lt;strong&gt;inmediatamente&lt;/strong&gt;. Cada tarea corre en su propia sesión aislada de OpenCode, así que los cinco agentes no pueden pisarse entre sí.&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%2Fz32wowq811jb6f3anszh.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%2Fz32wowq811jb6f3anszh.gif" alt="Claude Code disparando cinco start_task en paralelo" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta es la decisión de diseño clave: la delegación es &lt;strong&gt;asíncrona&lt;/strong&gt;. Claude no queda bloqueado mirando una barra de progreso. Mientras los cinco subagentes escriben tests, el orquestador sigue avanzando — en mi sesión, usó ese tiempo para revisar las interfaces de los servicios y redactar él mismo el plan de tests de integración.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Claude espera a los cinco — con visibilidad.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cuando está listo para recoger resultados, Claude llama a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opencode_wait_for_task
  task_ids: [t1, t2, t3, t4, t5]
  mode: "all"
  include_progress: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;wait_for_task&lt;/code&gt; hace long-polling hasta que todas las tareas terminan (o vence el timeout). Si algo sigue corriendo cuando llega el timeout, &lt;code&gt;include_progress&lt;/code&gt; devuelve un fragmento parcial de la salida y &lt;strong&gt;la herramienta que el subagente está ejecutando en ese momento&lt;/strong&gt; — así ves "está corriendo la suite de tests", no una caja negra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Claude revisa e itera.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una de las cinco suites volvió floja — le faltaban casos borde en las rutas de error. En lugar de empezar de cero, Claude llama a &lt;code&gt;opencode_continue_task&lt;/code&gt; sobre esa sesión: "Agrega tests para las rutas de fallo de &lt;code&gt;retry()&lt;/code&gt;." El subagente retoma justo donde lo dejó, con todo el contexto intacto.&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%2F8lbv6efho5e72tgolfei.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%2F8lbv6efho5e72tgolfei.gif" alt="Resumen final: las cinco tareas completadas en Claude Code" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Participación total del orquestador: descomponer el trabajo, disparar, revisar, refinar. La escritura mecánica ocurrió en otro lado, en los modelos que elegiste para eso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué lo asíncrono lo cambia todo
&lt;/h2&gt;

&lt;p&gt;La mayoría de los servidores MCP de "delega a otro agente" hacen una llamada bloqueante: el host llama a la herramienta, la herramienta ejecuta al agente, y todos esperan. Eso se rompe rápido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timeouts del cliente MCP.&lt;/strong&gt; Un refactor de 20 minutos no cabe dentro del timeout de una tool call. La delegación asíncrona esquiva el problema por completo: &lt;code&gt;start_task&lt;/code&gt; responde en milisegundos y el estado se consulta por separado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sin paralelismo.&lt;/strong&gt; Las llamadas bloqueantes serializan a tus subagentes. Con tareas fire-and-forget, cinco agentes corren genuinamente a la vez, cada uno en una sesión aislada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sin visibilidad.&lt;/strong&gt; Una llamada bloqueante es silenciosa hasta que retorna. &lt;code&gt;get_task_status&lt;/code&gt; y &lt;code&gt;wait_for_task&lt;/code&gt; con &lt;code&gt;include_progress&lt;/code&gt; muestran salida parcial y la herramienta en ejecución a mitad de vuelo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sin conversación.&lt;/strong&gt; Cuando una llamada bloqueante retorna, la sesión desaparece. Aquí, &lt;code&gt;continue_task&lt;/code&gt; mantiene viva la sesión del subagente para un ida y vuelta iterativo — refinas el resultado en lugar de relanzar la tarea.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hay una pieza más que vale la pena destacar: el servidor incluye un prompt MCP llamado &lt;code&gt;delegate_task&lt;/code&gt; con una &lt;strong&gt;guía de selección de modelo&lt;/strong&gt; — un mapeo de cada tier de modelo de OpenCode a la dificultad de tarea que debería manejar. El punto de delegar no es solo &lt;em&gt;poder&lt;/em&gt; pasar trabajo; es saber &lt;em&gt;qué&lt;/em&gt; delegar y &lt;em&gt;a quién&lt;/em&gt;. El prompt le enseña exactamente eso a tu orquestador.&lt;/p&gt;

&lt;h2&gt;
  
  
  La superficie de herramientas
&lt;/h2&gt;

&lt;p&gt;Nueve herramientas enfocadas — servidores, agentes y el ciclo de vida de las tareas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Qué hace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;opencode_start_server&lt;/code&gt; / &lt;code&gt;opencode_stop_server&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Inicia (o se conecta a) / detiene una instancia de OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_list_agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lista los agentes y modelos disponibles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_start_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delega una tarea; devuelve un &lt;code&gt;task_id&lt;/code&gt; inmediatamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_continue_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envía un prompt de seguimiento a la sesión de una tarea existente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_cancel_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aborta una tarea en ejecución&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_get_task_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consulta el estado, opcionalmente con progreso parcial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_get_task_result&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Obtiene el resultado final&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opencode_wait_for_task&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Long-polling de una o varias tareas (&lt;code&gt;mode: "all"&lt;/code&gt; / &lt;code&gt;"any"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Este servidor no intenta envolver cada capacidad de OpenCode detrás de setenta herramientas — hace una sola cosa: delegación asíncrona de tareas, bien hecha. El código lo respalda con un umbral de cobertura del 100% aplicado en CI (líneas, ramas, funciones y sentencias — cualquier línea sin cubrir rompe el build).&lt;/p&gt;

&lt;h2&gt;
  
  
  Más allá del fan-out
&lt;/h2&gt;

&lt;p&gt;La demo cubrió el caso de tareas en paralelo, pero el mismo patrón sirve para más:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escalonamiento por costo&lt;/strong&gt;: enruta el trabajo mecánico (renombres, boilerplate, docs) a modelos económicos y reserva el premium para decidir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segundas opiniones entre modelos&lt;/strong&gt;: haz que un modelo distinto revise el diff de tu orquestador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trabajo largo en segundo plano&lt;/strong&gt;: lanza un refactor de 20 minutos y sigue trabajando mientras corre.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add opencode &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-server-opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El repositorio está en &lt;a href="https://github.com/alejandro-technology/opencode-mcp" rel="noopener noreferrer"&gt;github.com/alejandro-technology/opencode-mcp&lt;/a&gt; y el paquete es &lt;a href="https://www.npmjs.com/package/mcp-server-opencode" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-server-opencode&lt;/code&gt; en npm&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cursor</category>
      <category>codex</category>
    </item>
  </channel>
</rss>
