<?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: Alex</title>
    <description>The latest articles on DEV Community by Alex (@dugubuyan).</description>
    <link>https://dev.to/dugubuyan</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%2F3962450%2F2dfe9e24-57c5-4541-88dd-448a77b21055.png</url>
      <title>DEV Community: Alex</title>
      <link>https://dev.to/dugubuyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dugubuyan"/>
    <language>en</language>
    <item>
      <title>The Missing Piece in Multi-Agent Coordination: Who Tells the Agent How to Use Your Service?</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 05 Jun 2026 09:53:44 +0000</pubDate>
      <link>https://dev.to/dugubuyan/the-missing-piece-in-multi-agent-coordination-who-tells-the-agent-how-to-use-your-service-6ck</link>
      <guid>https://dev.to/dugubuyan/the-missing-piece-in-multi-agent-coordination-who-tells-the-agent-how-to-use-your-service-6ck</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/dugubuyan/why-i-stopped-organizing-ai-agents-by-role-and-built-a-document-exchange-center-instead-1765"&gt;previous article&lt;/a&gt;, I described AgentNexus — a document exchange center that coordinates LLM agents at the service granularity rather than the role granularity. The core idea: services publish versioned Markdown documents, subscribe to each other's changes, and receive diff-aware notifications when something upstream changes.&lt;/p&gt;

&lt;p&gt;That architecture works. It's been running in production for over a month coordinating two services. But as I tried to onboard new agents to it, I ran into a different problem — one that turned out to be more general than AgentNexus itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bootstrapping Problem
&lt;/h2&gt;

&lt;p&gt;When a new agent connects to an MCP server, it knows one thing: the endpoint URL. Everything else — what tools are available, what workflows to follow, what conventions to respect — has to come from somewhere.&lt;/p&gt;

&lt;p&gt;For AgentNexus specifically, an agent needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to resolve its &lt;code&gt;project_id&lt;/code&gt; at startup&lt;/li&gt;
&lt;li&gt;That it should call &lt;code&gt;get_my_updates_with_context&lt;/code&gt; before doing anything else&lt;/li&gt;
&lt;li&gt;What the &lt;code&gt;doc_id&lt;/code&gt; format looks like (&lt;code&gt;{project_id}/{doc_type}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;When to push documents and how to acknowledge updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is in the MCP tool descriptions. It's workflow knowledge, not API knowledge.&lt;/p&gt;

&lt;p&gt;The current ecosystem's answer to this problem is a collection of static Markdown files that humans write and commit to repositories: &lt;code&gt;AGENTS.md&lt;/code&gt; (standardized by the Agentic AI Foundation under Linux Foundation), &lt;code&gt;CLAUDE.md&lt;/code&gt; (Claude Code), steering files (Kiro), rules (Cursor). These are all solving the same problem — injecting workflow context into an agent at startup — but they're authored by humans, maintained manually, and specific to a single client tool.&lt;/p&gt;

&lt;p&gt;That model has a flaw that only becomes visible when the &lt;em&gt;service&lt;/em&gt; is the one that needs to tell the agent what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Flaw
&lt;/h2&gt;

&lt;p&gt;Here's the situation: I'm building an MCP service. Someone else is running an agent that connects to my service. I need that agent to follow specific workflows to use my service correctly. How do I communicate those workflows?&lt;/p&gt;

&lt;p&gt;With the current model, I can't — not reliably. I could write documentation and hope the agent author reads it. I could put instructions in tool descriptions and hope the agent reads those carefully. But there's no protocol for a service to actively bootstrap an agent with the knowledge it needs.&lt;/p&gt;

&lt;p&gt;This is the gap that SDAOP (Service-Driven Agent Onboarding Protocol) addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SDAOP Does
&lt;/h2&gt;

&lt;p&gt;The idea is simple: the service generates the instruction file, not the human.&lt;/p&gt;

&lt;p&gt;AgentNexus exposes a &lt;code&gt;generate_instruction_file(project_name, project_space_id, client_type)&lt;/code&gt; tool. An agent calls it once at setup, gets back a file path and file content, writes that file to its workspace, and from that point on loads it automatically at every session start.&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;calls:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;generate_instruction_file(&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;project_name=&lt;/span&gt;&lt;span class="s2"&gt;"search-admin-frontend"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;project_space_id=&lt;/span&gt;&lt;span class="s2"&gt;"prod-space-id"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;client_type=&lt;/span&gt;&lt;span class="s2"&gt;"kiro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Gets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;back:&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;"steering_file_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".kiro/steering/doc-exchange.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steering_file_content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"---&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;inclusion: auto&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;# Doc Exchange Center&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&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;"instruction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write steering_file_content to steering_file_path."&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 agent writes the file. Every subsequent session, Kiro loads it automatically. The agent now knows exactly how to use the service — and the service is the source of that knowledge, not a human maintaining a separate document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Beyond AgentNexus
&lt;/h2&gt;

&lt;p&gt;The reason I think this is worth formalizing as a protocol rather than just an implementation detail is that &lt;em&gt;every non-trivial MCP service has this problem&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Any service that expects agents to follow a specific workflow — check for updates before starting, use a particular naming convention, call tools in a specific order — is currently relying on out-of-band documentation or hoping agents figure it out from tool descriptions alone. Neither works reliably.&lt;/p&gt;

&lt;p&gt;The proliferation of instruction file formats makes this worse. The same workflow knowledge needs to be expressed differently for Kiro, Claude Code, Codex, and Cursor. A service author who wants to support all four environments today has to maintain four separate files by hand.&lt;/p&gt;

&lt;p&gt;SDAOP makes the service the authoritative source of onboarding knowledge, and the client-specific file a derived artifact. One canonical document, multiple adapters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Service (authoritative source)
    ↓ generate_instruction_file(client_type=...)
    ├─ Kiro     → .kiro/steering/doc-exchange.md  (inclusion: auto frontmatter)
    ├─ Claude   → CLAUDE.md                        (plain markdown)
    ├─ Codex    → AGENTS.md                        (plain markdown)
    └─ Cursor   → .cursor/rules/doc-exchange.mdc   (alwaysApply frontmatter)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the same pattern OpenAPI uses: one contract, multiple SDK bindings. The contract doesn't change when the client ecosystem evolves; only the adapter layer changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Fits Into the Broader Stack
&lt;/h2&gt;

&lt;p&gt;It's worth being precise about where SDAOP sits relative to existing standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; handles tool invocation — how an agent calls a service and gets results back. It doesn't say anything about what workflows agents should follow or how they should be configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGENTS.md / CLAUDE.md / Kiro steering&lt;/strong&gt; handle context injection — giving an agent background knowledge about a project. They're authored by humans and committed to repositories alongside code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SDAOP&lt;/strong&gt; handles onboarding — the moment when an agent first connects to a service and needs to acquire service-specific workflow knowledge. The service is the author; the instruction file is the output.&lt;/p&gt;

&lt;p&gt;These three layers are complementary. SDAOP doesn't replace AGENTS.md — it provides a mechanism for services to generate AGENTS.md (or its equivalent) programmatically, making it a first-class service artifact rather than a manually maintained document.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Analogy That Clicked for Me
&lt;/h2&gt;

&lt;p&gt;When a human developer joins a new team, they don't read a generic role-playing script. They read the project's onboarding documentation — written and maintained by the project itself. If the project changes its deployment process, the onboarding docs get updated, and the next developer who joins learns the new process.&lt;/p&gt;

&lt;p&gt;SDAOP applies this same principle to agents. The service maintains its own onboarding documentation. Agents call &lt;code&gt;generate_instruction_file&lt;/code&gt; to get it. When the service's conventions change, the service updates the canonical document, and agents can refresh by calling the tool again.&lt;/p&gt;

&lt;p&gt;The difference from the human analogy is that SDAOP makes this a protocol operation — something any MCP client can invoke, any MCP service can implement, and any agent can follow without IDE-specific configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Still Open
&lt;/h2&gt;

&lt;p&gt;The current implementation in AgentNexus supports Kiro as the primary client, validated in production. The adapter pattern for Claude Code, Codex, and Cursor is defined in the v3 paper but not yet fully validated against live clients.&lt;/p&gt;

&lt;p&gt;There's also an open question about versioning: if a service updates its canonical onboarding document (adds new tools, changes workflow steps), how should connected agents be notified to refresh their instruction files? The current answer is "re-call &lt;code&gt;generate_instruction_file&lt;/code&gt; manually." A more complete protocol would include a versioned onboarding document that agents can subscribe to — which, conveniently, is exactly what AgentNexus's document subscription system already supports.&lt;/p&gt;

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

&lt;p&gt;The implementation is part of AgentNexus:&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 https://github.com/dugubuyan/agent-nexus
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; alembic upgrade &lt;span class="nb"&gt;head
&lt;/span&gt;python src/main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect from any MCP client and call &lt;code&gt;generate_instruction_file&lt;/code&gt; with your project details and client type. The v3 research paper with the formal SDAOP definition is on Zenodo: &lt;a href="https://doi.org/10.5281/zenodo.19692217" rel="noopener noreferrer"&gt;doi.org/10.5281/zenodo.19692217&lt;/a&gt; (v2; v3 forthcoming).&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The core shift in thinking: MCP solves "how does an agent call a service." SDAOP solves "how does a service teach an agent to use it." Both questions matter, and only one has a standard answer today.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>multiagent</category>
      <category>python</category>
    </item>
    <item>
      <title>Why I Stopped Organizing AI Agents by Role (and Built a Document Exchange Center Instead)</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Mon, 01 Jun 2026 09:46:12 +0000</pubDate>
      <link>https://dev.to/dugubuyan/why-i-stopped-organizing-ai-agents-by-role-and-built-a-document-exchange-center-instead-1765</link>
      <guid>https://dev.to/dugubuyan/why-i-stopped-organizing-ai-agents-by-role-and-built-a-document-exchange-center-instead-1765</guid>
      <description>&lt;p&gt;Most multi-agent frameworks for software development organize agents around &lt;em&gt;roles&lt;/em&gt;: a product manager agent, a developer agent, a tester agent. ChatDev and MetaGPT pioneered this approach, and it works well for monolithic tasks.&lt;/p&gt;

&lt;p&gt;But I ran into a wall when I tried to apply it to a real system with multiple independently-deployed services.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Role-Based Coordination
&lt;/h2&gt;

&lt;p&gt;Imagine you have a backend search service and a frontend management console. The backend team implements a new API endpoint. The frontend needs to adapt.&lt;/p&gt;

&lt;p&gt;In a role-based framework, there's no natural mechanism for this. Both agents are "developers" in the same simulated organization. There's no concept of service boundaries, no versioned contracts, no way to say "the backend changed, and the frontend needs to know exactly what changed."&lt;/p&gt;

&lt;p&gt;The coordination problem in multi-service development isn't &lt;em&gt;"which role should handle this task"&lt;/em&gt; — it's &lt;em&gt;"which service needs to know about this change, and what exactly changed."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That reframing led me to build something different.&lt;/p&gt;

&lt;h2&gt;
  
  
  AgentNexus: Coordinating Agents at the Service Granularity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/dugubuyan/agent-nexus" rel="noopener noreferrer"&gt;AgentNexus&lt;/a&gt; is a document exchange center that treats each service as a first-class citizen. Instead of roles, it uses &lt;strong&gt;service boundaries&lt;/strong&gt; as the coordination primitive.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each service registers as a &lt;strong&gt;sub-project&lt;/strong&gt; with its own document namespace&lt;/li&gt;
&lt;li&gt;Services publish versioned Markdown documents: requirements, design specs, API docs, config&lt;/li&gt;
&lt;li&gt;Services &lt;strong&gt;subscribe&lt;/strong&gt; to documents from other services they depend on&lt;/li&gt;
&lt;li&gt;When a subscribed document changes, the subscriber receives a &lt;strong&gt;diff-aware notification&lt;/strong&gt; containing both the structured diff and the full latest content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing is exposed as an MCP (Model Context Protocol) server running in streamable-HTTP mode, so multiple agents can connect simultaneously from different machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Diff-Aware Update Protocol
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most proud of. When an agent calls &lt;code&gt;get_my_updates_with_context&lt;/code&gt;, it gets 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;"update_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"doc_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend-service/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"doc_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;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"new_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"diff"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@@ -42,6 +42,12 @@&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;+## PUT /admin/docs/{doc_id}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;+Update a document in-place..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latest_content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# API Spec&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&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 agent gets both &lt;em&gt;what changed&lt;/em&gt; (to perform targeted modifications) and &lt;em&gt;the full current state&lt;/em&gt; (to maintain correct context). Providing only the diff risks missing context; providing only the full document makes it hard to identify what needs to change in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Concrete Example
&lt;/h2&gt;

&lt;p&gt;Here's the end-to-end flow when the backend implements a new endpoint:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backend agent updates &lt;code&gt;search-service/api&lt;/code&gt; via &lt;code&gt;push_document&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AgentNexus computes the diff and generates a notification for &lt;code&gt;search-admin-frontend&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Frontend agent calls &lt;code&gt;get_my_updates_with_context&lt;/code&gt;, receives the diff showing the new endpoint&lt;/li&gt;
&lt;li&gt;Frontend agent removes the mock implementation and integrates the real endpoint&lt;/li&gt;
&lt;li&gt;Frontend agent updates its own &lt;code&gt;requirement&lt;/code&gt; document to remove the "backend not yet implemented" annotation&lt;/li&gt;
&lt;li&gt;Frontend agent calls &lt;code&gt;ack_update&lt;/code&gt; to mark the notification as read&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;No human coordination required beyond the initial subscription configuration.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lifecycle Stage as a First-Class Entity
&lt;/h2&gt;

&lt;p&gt;One more thing that bothered me about role-playing frameworks: they have no concept of where a service &lt;em&gt;is&lt;/em&gt; in its development lifecycle.&lt;/p&gt;

&lt;p&gt;AgentNexus tracks each service's stage explicitly: &lt;code&gt;design → development → testing → deployment → upgrade&lt;/code&gt;. Stage transitions are real operations that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create immutable milestone snapshots of all published documents&lt;/li&gt;
&lt;li&gt;Generate cross-service notifications&lt;/li&gt;
&lt;li&gt;Produce stage-switch tasks for affected services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a service transitions from development to testing, that's a meaningful event — not just a prompt instruction to an agent playing the role of "scrum master."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The implementation is in Python using FastMCP, SQLAlchemy/SQLite, and watchdog. It runs as a persistent MCP server at &lt;code&gt;http://0.0.0.0:10086/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Key MCP tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;push_document&lt;/code&gt; / &lt;code&gt;patch_document&lt;/code&gt; — publish full or incremental updates&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_my_updates_with_context&lt;/code&gt; — one-call update check with diff + full content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add_subscription&lt;/code&gt; — subscribe by exact doc ID or doc type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_my_tasks&lt;/code&gt; — retrieve pending tasks generated by document changes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generate_steering_file&lt;/code&gt; — generate IDE agent instruction files automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;patch_document&lt;/code&gt; tool is worth calling out: instead of sending the full document content on every update, agents can send a unified diff patch. This avoids hitting tool-call payload size limits in IDEs like Kiro or Cursor when documents get large.&lt;/p&gt;

&lt;p&gt;250 tests (unit + property-based with Hypothesis). The system has been running in production coordinating two services for over a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison with Role-Centric Frameworks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;ChatDev / MetaGPT&lt;/th&gt;
&lt;th&gt;AgentNexus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coordination unit&lt;/td&gt;
&lt;td&gt;Agent role&lt;/td&gt;
&lt;td&gt;Service (sub-project)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle tracking&lt;/td&gt;
&lt;td&gt;Implicit in workflow&lt;/td&gt;
&lt;td&gt;Explicit stage per service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change propagation&lt;/td&gt;
&lt;td&gt;Shared context&lt;/td&gt;
&lt;td&gt;Pub-sub with versioned diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service boundaries&lt;/td&gt;
&lt;td&gt;Not enforced&lt;/td&gt;
&lt;td&gt;First-class namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-codebase&lt;/td&gt;
&lt;td&gt;Single codebase assumed&lt;/td&gt;
&lt;td&gt;Native multi-repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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;git clone https://github.com/dugubuyan/agent-nexus
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; alembic upgrade &lt;span class="nb"&gt;head
&lt;/span&gt;python src/main.py
&lt;span class="c"&gt;# MCP server running at http://0.0.0.0:10086/mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect from any MCP client:&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;"mcpServers"&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;"doc-exchange"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:10086/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The accompanying research paper is on Zenodo: &lt;a href="https://doi.org/10.5281/zenodo.19692217" rel="noopener noreferrer"&gt;doi.org/10.5281/zenodo.19692217&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're building multi-service systems with LLM agents and running into coordination problems, I'd love to hear what you're working on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>multiagent</category>
      <category>python</category>
    </item>
  </channel>
</rss>
