<?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: Alfridus1</title>
    <description>The latest articles on DEV Community by Alfridus1 (@alfridus1).</description>
    <link>https://dev.to/alfridus1</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%2F3812246%2F4139a454-d0e9-41c9-bebc-2e0656f2ba21.png</url>
      <title>DEV Community: Alfridus1</title>
      <link>https://dev.to/alfridus1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfridus1"/>
    <language>en</language>
    <item>
      <title>We built SMTP for AI Agents — and they started talking</title>
      <dc:creator>Alfridus1</dc:creator>
      <pubDate>Sun, 08 Mar 2026 00:21:20 +0000</pubDate>
      <link>https://dev.to/alfridus1/we-built-smtp-for-ai-agents-and-they-started-talking-fgp</link>
      <guid>https://dev.to/alfridus1/we-built-smtp-for-ai-agents-and-they-started-talking-fgp</guid>
      <description>&lt;p&gt;Your AI agents can't talk to each other. Let that sink in.&lt;/p&gt;

&lt;p&gt;You've got LangChain agents. CrewAI crews. Custom pipelines. They all talk to &lt;em&gt;tools&lt;/em&gt; beautifully — APIs, databases, search engines. But ask Agent A to get information from Agent B? Suddenly you're duct-taping REST endpoints together, writing custom webhooks, and praying the JSON schemas match.&lt;/p&gt;

&lt;p&gt;We had the same problem. We run 4 AI agents in production at our company — Jarvis (operations), Clara (sales/CRM), Fischer (payments), and James (personal assistant). Each has its own LLM, tools, memory, and personality. They run on separate machines. And for months, the only way they could communicate was... through us.&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.amazonaws.com%2Fuploads%2Farticles%2Fdu6toy7wk3pjzypmagn0.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.amazonaws.com%2Fuploads%2Farticles%2Fdu6toy7wk3pjzypmagn0.png" alt="Live Agent-to-Agent Communication" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we built &lt;strong&gt;Beam Protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea: What if agents had email addresses?
&lt;/h2&gt;

&lt;p&gt;Just like SMTP gave every person an address (&lt;code&gt;you@company.com&lt;/code&gt;), Beam gives every agent a &lt;strong&gt;Beam-ID&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jarvis@coppen.beam.directory
clara@coppen.beam.directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. That's the core idea. A global, unique address for every AI agent, with a directory to look them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it Works (60 seconds)
&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.amazonaws.com%2Fuploads%2Farticles%2Fk7ro2665c5nvho5ola40.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.amazonaws.com%2Fuploads%2Farticles%2Fk7ro2665c5nvho5ola40.png" alt="Beam Protocol Architecture" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Register your agent:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BeamClient&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="s1"&gt;beam-protocol-sdk&lt;/span&gt;&lt;span class="dl"&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;BeamClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;agentName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;orgName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mycompany&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;directoryUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.beam.directory&lt;/span&gt;&lt;span class="dl"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Talk to another agent:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reply&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;talk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clara@coppen.beam.directory&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="s1"&gt;What do you know about Chris?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Clara queries her CRM tools and responds&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="nx"&gt;reply&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="c1"&gt;// "400 deals, €5.8M total volume..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Listen for messages:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onTalk&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="k"&gt;from&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;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Use your LLM + tools to respond&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&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;myLLM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&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="k"&gt;return&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="nx"&gt;answer&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 the entire integration. Three functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Live Test
&lt;/h2&gt;

&lt;p&gt;On March 7, 2026, we ran a live test between our production agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jarvis → Clara: "What do you know about Chris Schnorrenberg? 
                  Deals, volume, last activity."

Clara → Jarvis: "400 deals, €5.8M total volume. 
                  Last active: today. 
                  Top deal: Sahillioglu — €88K."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;7.2 seconds round-trip.&lt;/strong&gt; Clara actually queried her HubSpot CRM tools, aggregated the data, and sent back a natural language response. No pre-agreed schema. No shared database. Just a question.&lt;/p&gt;

&lt;p&gt;Every message is Ed25519 signed, replay-protected, and ACL-enforced. The agents verified each other's identity cryptographically before exchanging a single byte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Natural Language First
&lt;/h2&gt;

&lt;p&gt;Here's what makes Beam different from every other agent protocol: &lt;strong&gt;natural language is a first-class message type.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most protocols force you to define schemas upfront. "Here's my &lt;code&gt;payment.status_check&lt;/code&gt; intent with these exact fields." That's fine for structured workflows. But it means two agents can't communicate unless someone pre-agreed on the data format.&lt;/p&gt;

&lt;p&gt;With Beam, agents can just... talk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reply&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;talk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fischer@coppen.beam.directory&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="s1"&gt;Hey, did we get paid for the Müller project?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fischer uses his tools (bank API, ERP, invoice database) to figure out the answer. No schema needed. The receiving agent's LLM does the understanding.&lt;/p&gt;

&lt;p&gt;You can &lt;em&gt;also&lt;/em&gt; use typed intents for high-frequency structured communication. But the default is conversation. Because that's how collaboration actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it Compares
&lt;/h2&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;MCP&lt;/th&gt;
&lt;th&gt;Google A2A&lt;/th&gt;
&lt;th&gt;Beam&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent ↔ Tool&lt;/td&gt;
&lt;td&gt;Agent ↔ Agent&lt;/td&gt;
&lt;td&gt;Agent ↔ Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implicit&lt;/td&gt;
&lt;td&gt;Google IAM&lt;/td&gt;
&lt;td&gt;Ed25519 + ACL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (1 Docker container)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NL Messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;First-class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Apache 2.0&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;&lt;span class="c"&gt;# TypeScript&lt;/span&gt;

&lt;span class="o"&gt;![&lt;/span&gt;Beam Protocol - SMTP &lt;span class="k"&gt;for &lt;/span&gt;AI Agents]&lt;span class="o"&gt;(&lt;/span&gt;https://beam.directory/images/beam-hero.png&lt;span class="o"&gt;)&lt;/span&gt;

npm &lt;span class="nb"&gt;install &lt;/span&gt;beam-protocol-sdk

&lt;span class="c"&gt;# Python&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;beam-directory

&lt;span class="c"&gt;# Or scaffold a new agent&lt;/span&gt;
npx create-beam-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hosted directory running at &lt;a href="https://api.beam.directory" rel="noopener noreferrer"&gt;api.beam.directory&lt;/a&gt;. Self-hosting is a single Docker container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://beam.directory" rel="noopener noreferrer"&gt;beam.directory&lt;/a&gt; — Landing page&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://github.com/Beam-directory/beam-protocol" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; — Full source, RFC spec, SDKs&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/Beam-directory/beam-protocol/blob/main/spec/RFC-0001.md" rel="noopener noreferrer"&gt;RFC-0001&lt;/a&gt; — Protocol specification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'd love feedback on the protocol design — especially the natural language vs typed intent tradeoff. Open an issue or email &lt;a href="mailto:info@beam.directory"&gt;info@beam.directory&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by the team at &lt;a href="https://coppen.de" rel="noopener noreferrer"&gt;COPPEN GmbH&lt;/a&gt;, where 4 AI agents run the company's operations. Apache 2.0.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>protocol</category>
    </item>
  </channel>
</rss>
