<?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: Marc Verchiani</title>
    <description>The latest articles on DEV Community by Marc Verchiani (@fl7_93dc7dc638d86979).</description>
    <link>https://dev.to/fl7_93dc7dc638d86979</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3864401%2F72d9c84e-b5e7-44aa-b50b-c52d9255074a.jpg</url>
      <title>DEV Community: Marc Verchiani</title>
      <link>https://dev.to/fl7_93dc7dc638d86979</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fl7_93dc7dc638d86979"/>
    <language>en</language>
    <item>
      <title>Go for AI agents: a field report</title>
      <dc:creator>Marc Verchiani</dc:creator>
      <pubDate>Sun, 12 Apr 2026 22:44:07 +0000</pubDate>
      <link>https://dev.to/fl7_93dc7dc638d86979/go-for-ai-agents-a-field-report-d70</link>
      <guid>https://dev.to/fl7_93dc7dc638d86979/go-for-ai-agents-a-field-report-d70</guid>
      <description>&lt;p&gt;This is a post I've been wanting to write for a while. Not because I think I've figured something out, but because I keep getting the same reaction when I mention my stack: "wait, you're doing agent stuff in Go?" So here's the long answer.&lt;/p&gt;

&lt;p&gt;The agentic AI ecosystem runs on Python. LangChain, CrewAI, AutoGen, Semantic Kernel, LlamaIndex, all Python. The SDKs are Python-first. The tutorials assume Python. If you want to build something for AI agents, the path of least resistance is &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I went the other way. Over the past weeks I've built five agent-related projects in Go: a governance proxy, a memory server, an MCP bridge for Ollama, an autonomous research agent, and a management dashboard backend. This wasn't a carefully planned decision. I started with one project, it worked, thanks to Claude, and I kept going. This is a field report on that choice, for better or worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The projects
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Go lines&lt;/th&gt;
&lt;th&gt;Binary&lt;/th&gt;
&lt;th&gt;Direct deps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/KTCrisis/agent-mesh" rel="noopener noreferrer"&gt;agent-mesh&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Governance proxy for agent tool calls&lt;/td&gt;
&lt;td&gt;11,340&lt;/td&gt;
&lt;td&gt;7.2 MB&lt;/td&gt;
&lt;td&gt;1 (yaml.v3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/KTCrisis/mem7" rel="noopener noreferrer"&gt;mem7&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shared memory MCP server&lt;/td&gt;
&lt;td&gt;2,938&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;1 (sqlite)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/KTCrisis/scout7" rel="noopener noreferrer"&gt;scout7&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autonomous web research agent&lt;/td&gt;
&lt;td&gt;1,112&lt;/td&gt;
&lt;td&gt;9.3 MB&lt;/td&gt;
&lt;td&gt;1 (yaml.v3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/KTCrisis/ollama-mcp-go" rel="noopener noreferrer"&gt;ollama-mcp-go&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MCP server for Ollama&lt;/td&gt;
&lt;td&gt;929&lt;/td&gt;
&lt;td&gt;8.4 MB&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/KTCrisis/agent7" rel="noopener noreferrer"&gt;agent7&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mesh management dashboard&lt;/td&gt;
&lt;td&gt;—&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 pattern that jumps out: &lt;strong&gt;agent-mesh has one external dependency&lt;/strong&gt;. Eleven thousand lines of Go covering the MCP client and server, a policy engine, rate limiter, approval workflow, trace store, OTEL exporter, HTTP proxy, and CLI. All built on the standard library plus a YAML parser. ollama-mcp-go has zero external dependencies. I didn't plan this. It just kept working without pulling in more packages, so I never did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Go for this layer
&lt;/h2&gt;

&lt;p&gt;AI agents need two things to work: an LLM that reasons, and infrastructure that moves data between the LLM and the outside world. The first part is model weights and tensor math, and Python owns that space for good reason. The second part is networking, concurrency, serialization, and process management. That's plumbing. Go was designed for plumbing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP is a concurrency problem.&lt;/strong&gt; An MCP proxy manages multiple stdio subprocesses (one per upstream server), each with its own stdin/stdout pair, plus incoming requests from multiple agents over HTTP or stdio. agent-mesh starts all MCP servers in parallel on boot, and goroutines with channels make this natural. The equivalent Python code would be asyncio tasks with subprocess pipes, which works but can be difficult to implement properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single binary distribution matters.&lt;/strong&gt; &lt;code&gt;curl | tar xz&lt;/code&gt; and it runs. No runtime, no virtualenv, no node_modules. When your user is a developer setting up Claude Code, "download one file" beats "install Python 3.11+, create a venv, pip install six packages, hope nothing conflicts with your system Python." Cross-compilation is free: &lt;code&gt;GOOS=darwin GOARCH=arm64 go build&lt;/code&gt; produces a macOS ARM binary from a Linux machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Startup time is not trivial.&lt;/strong&gt; agent-mesh launches as a subprocess of Claude Code (via MCP stdio). Every millisecond of startup is latency the user feels on the first tool call. Go binaries start in single-digit milliseconds. A Python process with imports takes ~200–500ms before it executes a single line of application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory footprint is predictable.&lt;/strong&gt; agent-mesh idles at ~14 MB RSS. A comparable Python process with FastAPI, uvicorn, and a few imports sits at 80–120 MB before handling a request. When you run five MCP servers plus a proxy on a developer laptop, that adds up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost
&lt;/h2&gt;

&lt;p&gt;Choosing Go for agent infrastructure has real costs. I'd be lying if I said it was all smooth, and I think being honest about that is more useful than a sales pitch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ecosystem doesn't exist.&lt;/strong&gt; There's no LangChain for Go. No official MCP SDK (I wrote my own client and server, which was educational but not exactly fast). No Ollama Go client that speaks MCP (I wrote &lt;a href="https://github.com/KTCrisis/ollama-mcp-go" rel="noopener noreferrer"&gt;ollama-mcp-go&lt;/a&gt;). Every integration point is hand-built. In Python, these are one-line imports. In Go, they're weekends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM interaction is verbose.&lt;/strong&gt; Calling Ollama's chat API in Python with the official SDK is three lines. In Go, it's an HTTP request, JSON marshaling, response parsing, and explicit error handling. About 30 lines for the same result. And I do not mention the headache with understanding how interfaces works in Go...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prototyping is slower.&lt;/strong&gt; Python lets you sketch an idea in 20 lines and iterate. Go's type system and explicit error handling force structure earlier. For scout7 (the web research agent), the first working version took longer than it would have in Python. But the second version, with proper error handling, timeouts, and graceful shutdown, came almost for free because Go had already made me handle those cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hiring and contributions.&lt;/strong&gt; If these projects grow, the contributor pool for Go agent tooling is smaller than Python's. Most people building in this space think in Python. That's a real constraint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm still learning Go.&lt;/strong&gt; I should probably mention that. I don't come from a Go background. My primary language is Python (even if I'm not an expert), and I've been writing Go for weeks only, not years. I don't always understand what the compiler is angry about. I occasionally discover that a pattern I was proud of is actually an antipattern in Go. &lt;/p&gt;

&lt;p&gt;Half of these projects were pair-programmed with Claude, which means an AI agent helped me build governance tooling for AI agents. There's a joke in there somewhere. But the point is: you don't need to master a language to ship useful things in it. You need a good feedback loop. The compiler catches the stupid mistakes. The AI catches the architectural ones, and you keep asking questions about things you don't understand. I catch the rest... eventually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Python wins
&lt;/h2&gt;

&lt;p&gt;I still use Python where it makes sense. &lt;a href="https://github.com/KTCrisis/event7" rel="noopener noreferrer"&gt;event7&lt;/a&gt; (schema registry governance) has a FastAPI backend because it's a web app with a database, not a systems proxy. The LangChain demo for agent-mesh is Python, because it demonstrates governance on a Python agent. If I were building a RAG pipeline or fine-tuning a model, I'd use Python without hesitation.&lt;/p&gt;

&lt;p&gt;The split is simple: &lt;strong&gt;if it touches model weights or needs rapid ML prototyping, Python. If it's infrastructure that moves data, enforces policy, or manages processes, Go.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the ecosystem is missing
&lt;/h2&gt;

&lt;p&gt;The Go ecosystem for agentic AI has real gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No official MCP SDK for Go.&lt;/strong&gt; Anthropic ships Python and TypeScript. The community Go implementations are young and incomplete. I ended up writing my own MCP client and server inside agent-mesh because none of the existing options handled both stdio and SSE transports reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No structured output libraries.&lt;/strong&gt; Python has Instructor, Outlines, Marvin for forcing LLM output into typed schemas. In Go, you parse JSON and hope. scout7 for example does regex extraction on LLM responses as a fallback. It works but it's not elegant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No agent framework.&lt;/strong&gt; Not necessarily a bad thing, since frameworks often add more abstraction than value in my opinion. But it means every Go agent starts from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These gaps are also opportunities. The first solid Go MCP SDK will get adoption, because Go developers building agent tooling have no good option today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real argument
&lt;/h2&gt;

&lt;p&gt;The case for Go in agent infrastructure isn't "Go is better than Python." It's that &lt;strong&gt;agents are not monoliths&lt;/strong&gt;. An agent system has layers: the reasoning layer (LLM), the orchestration layer (framework), and the infrastructure layer (transport, policy, memory, tracing). Python dominates the first two. The third layer is systems programming, and Go is a systems language.&lt;/p&gt;

&lt;p&gt;Service meshes didn't get written in Java because microservices were Java. Envoy is C++. Linkerd is Rust. They're infrastructure. They sit below the application and need to be fast, small, and reliable. Agent governance, memory servers, and MCP proxies are the same kind of thing. They deserve a systems language.&lt;/p&gt;

&lt;p&gt;Five projects in, I haven't regretted the choice. The binaries are small, the deploys are trivial, the concurrency model fits perfectly the problem, and the dependency count stays close to zero. The ecosystem cost is real but manageable. You write more code eventually, but you understand all of it.&lt;/p&gt;

&lt;p&gt;If you're considering Go for this kind of work and you're not sure, just try one small project. A single MCP server, maybe. The worst that happens is you learn something. That's more or less how all of this started for me.&lt;/p&gt;




&lt;p&gt;All projects mentioned are open-source: &lt;a href="https://github.com/KTCrisis/agent-mesh" rel="noopener noreferrer"&gt;agent-mesh&lt;/a&gt;, &lt;a href="https://github.com/KTCrisis/mem7" rel="noopener noreferrer"&gt;mem7&lt;/a&gt;, &lt;a href="https://github.com/KTCrisis/scout7" rel="noopener noreferrer"&gt;scout7&lt;/a&gt;, &lt;a href="https://github.com/KTCrisis/ollama-mcp-go" rel="noopener noreferrer"&gt;ollama-mcp-go&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>mcp</category>
      <category>python</category>
    </item>
    <item>
      <title>Middleware vs Sidecar: two ways to govern AI agents</title>
      <dc:creator>Marc Verchiani</dc:creator>
      <pubDate>Mon, 06 Apr 2026 19:13:34 +0000</pubDate>
      <link>https://dev.to/fl7_93dc7dc638d86979/middleware-vs-sidecar-two-ways-to-govern-ai-agents-2pcb</link>
      <guid>https://dev.to/fl7_93dc7dc638d86979/middleware-vs-sidecar-two-ways-to-govern-ai-agents-2pcb</guid>
      <description>&lt;p&gt;I've spent the last years building governance layers like schema registries for Kafka, policies for Kong, contract validation for event-driven systems. Always the same job: sit between components, enforce rules, keep a trace.&lt;/p&gt;

&lt;p&gt;When I started running multiple AI agents (Claude Code, Cursor, custom LangChain bots), I noticed the same gap I'd seen before. Every agent has some permission model. None of them talk to each other. No shared policy. No unified trace. Sound familiar? It's 2018 microservices all over again, before service meshes became a thing.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/KTCrisis/agent-mesh" rel="noopener noreferrer"&gt;agent-mesh&lt;/a&gt; for my needs, a sidecar proxy for agent tool calls. YAML policy, centralized traces, per-agent identity. One Go binary, works with anything that speaks MCP or HTTP.&lt;/p&gt;

&lt;p&gt;Recently, Microsoft dropped the &lt;a href="https://github.com/microsoft/agent-governance-toolkit" rel="noopener noreferrer"&gt;Agent Governance Toolkit&lt;/a&gt;. Open-source, MIT. Same problem space. Different architecture.&lt;/p&gt;

&lt;p&gt;Worth comparing honestly especially now that OWASP gave us a shared vocabulary for what "agent security" actually means.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: Microsoft AGT dropped while I was already building agent-mesh. To be honest, I hadn't even thought about OWASP until Microsoft showed up.. That comparison forced me to think harder about what a sidecar actually covers and what it doesn't.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The two approaches
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Microsoft AGT&lt;/strong&gt; is a middleware. It runs &lt;em&gt;inside&lt;/em&gt; your agent's process with Python callbacks for LangChain, decorators for CrewAI, plugins for ADK. Sub-millisecond policy checks. Deep integration. You add a few lines of code and your agent is governed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;agent-mesh&lt;/strong&gt; is a sidecar proxy. It runs &lt;em&gt;next to&lt;/em&gt; your agents. It simply intercepts tool calls at the MCP/HTTP level. No code changes. Your agent points to agent-mesh instead of the real backend. Agent-mesh checks the policy, logs the trace, forwards or denies.&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="c1"&gt;# config.yaml — what agent-mesh governance looks like. Yet another YAML!&lt;/span&gt;
  &lt;span class="na"&gt;policies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude&lt;/span&gt;
      &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude"&lt;/span&gt;
      &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filesystem.read_*"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filesystem.list_*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filesystem.write_file"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;human_approval&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filesystem.move_file"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
      &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
      &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;    &lt;span class="c1"&gt;# fail closed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# plug it into Claude Code — one command, zero code change&lt;/span&gt;
  claude mcp add agent-mesh &lt;span class="nt"&gt;--&lt;/span&gt; ./agent-mesh &lt;span class="nt"&gt;--mcp&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt; config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you've worked with API gateways, you already know this pattern. Microsoft AGT is like Express middleware. agent-mesh is similar to Envoy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which approach is better ?
&lt;/h2&gt;

&lt;p&gt;None of course !&lt;/p&gt;

&lt;p&gt;Middleware:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You own the agent's code&lt;/li&gt;
&lt;li&gt;You're all-in on one framework (LangChain, CrewAI, Semantic Kernel)&lt;/li&gt;
&lt;li&gt;You want sub-millisecond overhead&lt;/li&gt;
&lt;li&gt;Your agents are Python or .NET&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sidecar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run heterogeneous agents (CLI tools + frameworks + custom bots)&lt;/li&gt;
&lt;li&gt;You can't or won't modify agent code&lt;/li&gt;
&lt;li&gt;You want one YAML policy for all agents&lt;/li&gt;
&lt;li&gt;Your agents are Claude Code, Cursor, Gemini CLI, or anything MCP-native&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. Claude Code, Cursor, Gemini CLI, Cline, OpenCode, none of these expose Python callback hooks. Microsoft AGT can't govern them. A sidecar proxy can, because it operates at the protocol level.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about Openclaw, LangChain and CrewAI?
&lt;/h2&gt;

&lt;p&gt;OpenClaw operates at a different layer. It's an agent gateway focused on delivering agents to end-users via messaging platforms&lt;br&gt;
(Telegram, Slack, Discord). It has tool-level allow/deny and ask mode, but no semantic policy on action parameters or cross-agent&lt;br&gt;
governance. It's complementary: OpenClaw routes agents to users, agent-mesh governs what those agents can do.&lt;/p&gt;

&lt;p&gt;LangChain has LangSmith Fleet: agent identity, permissions, sandboxes. Real features. But scoped to LangChain. If you also run Claude Code and a custom HTTP agent, LangSmith doesn't see them.&lt;/p&gt;

&lt;p&gt;CrewAI has task guardrails meaning validation after the agent produces output. That's quality control, not governance. You can't block a dangerous action before it happens.&lt;/p&gt;

&lt;p&gt;Neither provides cross-agent policy-as-code.&lt;/p&gt;
&lt;h2&gt;
  
  
  What about Kong, Gravitee, Apigee?
&lt;/h2&gt;

&lt;p&gt;These are AI gateways and operate at a different layer. They govern north-south traffic between your apps and LLMs. Rate limiting, PII redaction, semantic routing, model abstraction. Important stuff, but not the same problem.&lt;/p&gt;

&lt;p&gt;They don't know which &lt;em&gt;agent&lt;/em&gt; made the call, don't enforce &lt;em&gt;action-level&lt;/em&gt; policy (allow &lt;code&gt;create_issue&lt;/code&gt;, deny &lt;code&gt;delete_repo&lt;/code&gt;), and don't differentiate permissions per agent identity.&lt;/p&gt;

&lt;p&gt;Gateways and governance meshes are complementary. You can run Gravitee in front for LLM routing and agent-mesh behind for tool call governance. Different layers, different jobs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent CLI / Framework
      │
  AI Gateway (Kong/Gravitee/Apigee) ← LLM routing, PII, token rate limits
      │
  Governance Mesh (agent-mesh) ← semantic policy, agent identity, trace
      │
  Tools (GitHub, DB, APIs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mapping to OWASP Agentic Top 10
&lt;/h2&gt;

&lt;p&gt;OWASP published the &lt;a href="https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/" rel="noopener noreferrer"&gt;Top 10 for Agentic Applications&lt;/a&gt; the first serious attempt at cataloging what can go wrong when AI agents act in the real world. It's peer-reviewed by 100+ security researchers. If you build or run agents, you should read it.&lt;/p&gt;

&lt;p&gt;Here's how the landscape maps against it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OWASP Risk&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Who covers it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI01 — Goal Hijacking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Poisoned input redirects agent objectives&lt;/td&gt;
&lt;td&gt;Prompt-level defenses (none of the governance tools below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI02 — Tool Misuse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent uses tools in unintended or dangerous ways&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (semantic policy on params), &lt;strong&gt;Microsoft AGT&lt;/strong&gt; (action interception)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI03 — Identity &amp;amp; Privilege Abuse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent abuses its tokens, roles, sessions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (per-agent identity, temporal grants), &lt;strong&gt;Microsoft AGT&lt;/strong&gt; (zero-trust Ed25519)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI04 — Delegated Trust&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blind trust between agents&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (policy-as-code between agents), &lt;strong&gt;Microsoft AGT&lt;/strong&gt; (trust scoring)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI05 — Uncontrolled Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical decisions without human validation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (human approval workflow), CLI tools (approval prompts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI06 — Memory Poisoning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistent memory is poisoned with malicious data&lt;/td&gt;
&lt;td&gt;Not directly addressed by governance layers , needs runtime sandboxing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI07 — Multi-Agent Comms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inter-agent communication is not secured&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (JWT auth on sidecar), &lt;strong&gt;Microsoft AGT&lt;/strong&gt; (Agent Mesh component)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI08 — Cascading Failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One agent failing triggers a chain reaction&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (rate limiting, loop detection), gateways (circuit breaking)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI09 — Emergent Behavior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent develops unanticipated behavior&lt;/td&gt;
&lt;td&gt;Observability + traces (LangSmith, agent-mesh traces, Microsoft AGT audit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASI10 — Rogue Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compromised agent diverges from intended behavior&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;agent-mesh&lt;/strong&gt; (policy enforcement, deny-by-default), &lt;strong&gt;Microsoft AGT&lt;/strong&gt; (trust scoring)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few things stand out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No single tool covers everything.&lt;/strong&gt; ASI01 (goal hijacking) is a prompt-level problem. ?o governance proxy or middleware can fix it. ASI06 (memory poisoning) needs runtime isolation, not policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The middleware vs sidecar split shows up clearly.&lt;/strong&gt; Microsoft AGT and agent-mesh cover roughly the same risks (ASI02-05, ASI07-08, ASI10), but from different positions in the stack. Microsoft intercepts inside the process. agent-mesh intercepts at the protocol boundary. Same coverage, different blast radius if the governance layer itself is compromised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gateways (Kong, Gravitee, Apigee) cover almost none of this.&lt;/strong&gt; They weren't designed for it. They govern LLM traffic, not agent behavior. That's fine, it's a different layer. But if someone tells you their AI gateway handles agentic security, check which ASIs it actually addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real question
&lt;/h2&gt;

&lt;p&gt;The agentic ecosystem is splitting into two governance models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framework-level&lt;/strong&gt; : fast, tightly integrated, but you're locked to that framework&lt;br&gt;
&lt;strong&gt;Protocol-level&lt;/strong&gt; : works with anything, no code changes, but add an extra network hop&lt;/p&gt;

&lt;p&gt;My bet is that protocol-level wins long-term. The same way Envoy won over framework-specific circuit breakers, because in practice, nobody runs just one framework. You'll have Claude Code for coding, a LangChain pipeline for data, a custom agent for ops. You need one policy layer that sees all of them.&lt;/p&gt;

&lt;p&gt;But I'm probably biased. I built the sidecar and work in multi framework environment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written with AI assistance (Claude Opus 4.6) for research and structure. The analysis, architecture comparisons, and&lt;br&gt;
opinions are based on my own experience building governance layers for Kafka, Kong, and agent-mesh.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/KTCrisis/agent-mesh" rel="noopener noreferrer"&gt;agent-mesh&lt;/a&gt; is open-source, written in Go. One binary, one YAML config. Works with any agent that speaks MCP or HTTP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
