<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/" rel="alternate" type="text/html" /><updated>2026-05-18T17:59:30+00:00</updated><id>https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/feed.xml</id><title type="html">AGNTCY Blogs</title><subtitle>Building infrastructure for the Internet of Agents</subtitle><entry><title type="html">Now you’re thinking with Agents</title><link href="https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/technical/agents/a2a/2026/05/18/thinking-with-agents.html" rel="alternate" type="text/html" title="Now you’re thinking with Agents" /><published>2026-05-18T09:00:00+00:00</published><updated>2026-05-18T09:00:00+00:00</updated><id>https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/technical/agents/a2a/2026/05/18/thinking-with-agents</id><content type="html" xml:base="https://blogs.agntcy.org/drafts/feat-thinking-with-agents-blog/technical/agents/a2a/2026/05/18/thinking-with-agents.html"><![CDATA[<p>There is a moment in Portal when the game clicks. You stop trying to find a way
around the obstacle and you realise you can just connect two surfaces with a
portal and walk straight through. The puzzle hasn’t changed, but your perception
of the solution has — and that makes all the difference.</p>

<p>Something similar happens when you build AI agent systems and you stop asking
“how do I give my agent access to this remote resource?” and start asking “what
if I deployed an agent where the resource already lives?”.</p>

<!--more-->

<h2 id="the-old-mental-model">The old mental model</h2>

<p>The natural instinct when connecting an agent to a remote resource is to reach
for familiar tools: expose an API, open a port, set up a VPN, distribute
credentials. The agent lives on your laptop or in your cloud, so you bring the
remote resource to it.</p>

<p>For Kubernetes this might look like distributing a <code class="language-plaintext highlighter-rouge">kubeconfig</code>, opening the
API server to your agent’s network, and calling <code class="language-plaintext highlighter-rouge">kubectl</code> locally. For a remote
VM it might mean SSH access and an Ansible control machine with an up-to-date
inventory. For a database it might mean a connection string, firewall rules, and
a VPN. <a href="https://modelcontextprotocol.io/">MCP</a> servers follow the same pattern:
you stand up an MCP server that wraps the remote resource, expose it on a port
the agent can reach, and handle authentication between the two.</p>

<pre><code class="language-mermaid">flowchart LR
    subgraph LOCAL[Local / Cloud]
        A[Agent]
    end

    subgraph REMOTE[Remote Environment]
        K8S[Kubernetes API]
        VM[VM / Bare Metal]
        DB[Database]
        MCP[MCP Server]
    end

    A --&gt;|kubeconfig + open port| K8S
    A --&gt;|SSH key + firewall rule| VM
    A --&gt;|connection string + VPN| DB
    A --&gt;|open port + auth token| MCP

    style LOCAL fill:#eff3fc,stroke:#0251af,color:#1c1e21
    style REMOTE fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style A fill:#0251af,color:#f3f6fd
    style K8S fill:#cfe1fb,color:#1c1e21
    style VM fill:#cfe1fb,color:#1c1e21
    style DB fill:#cfe1fb,color:#1c1e21
    style MCP fill:#cfe1fb,color:#1c1e21
</code></pre>

<p>Each connection solves the immediate problem but widens the attack surface,
adds credentials to manage, and ties the agent to a specific network topology.
The agent becomes fragile: move the cluster, change the firewall, rotate a
key — and the agent breaks.</p>

<h2 id="now-youre-thinking-with-agents">Now you’re thinking with agents</h2>

<p>The shift is straightforward once you see it: instead of opening your
infrastructure to the agent, you deploy a small agent inside the
infrastructure and let your local agent talk to it.</p>

<p>The remote agent lives next to the resource. It has whatever local access it
needs — a <code class="language-plaintext highlighter-rouge">kubeconfig</code> that never leaves the cluster, a shell on the VM, a
database connection that stays inside the network. Your local agent never needs
any of that. It just sends an intent (“what pods are failing in the prod
namespace?”) to the remote agent over
<a href="https://a2a-protocol.org/latest/">A2A</a> and gets a result back.</p>

<pre><code class="language-mermaid">flowchart LR
    subgraph LOCAL[Local / Cloud]
        A[Local Agent]
    end

    subgraph SLIM_NET[SLIM Overlay]
        SN[SLIM Node]
    end

    subgraph RK[Kubernetes Cluster]
        KA[k8s Agent]
        K8S[Kubernetes API]
        KA --&gt;|local access| K8S
    end

    subgraph RV[VM / Bare Metal]
        VA[VM Agent]
        SH[Shell / Services]
        VA --&gt;|local access| SH
    end

    subgraph RD[Database Network]
        DA[DB Agent]
        DB[Database]
        DA --&gt;|local access| DB
    end

    A --&gt;|A2A over SLIM| SN
    SN --&gt;|A2A over SLIM| KA
    SN --&gt;|A2A over SLIM| VA
    SN --&gt;|A2A over SLIM| DA

    style LOCAL fill:#eff3fc,stroke:#0251af,color:#1c1e21
    style SLIM_NET fill:#fff8e1,stroke:#f0a500,color:#1c1e21
    style RK fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style RV fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style RD fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style A fill:#0251af,color:#f3f6fd
    style SN fill:#f0a500,color:#1c1e21
    style KA fill:#0251af,color:#f3f6fd
    style VA fill:#0251af,color:#f3f6fd
    style DA fill:#0251af,color:#f3f6fd
    style K8S fill:#cfe1fb,color:#1c1e21
    style SH fill:#cfe1fb,color:#1c1e21
    style DB fill:#cfe1fb,color:#1c1e21
</code></pre>

<p>The remote environment only needs an outbound connection to a
<a href="https://github.com/agntcy/slim">SLIM</a> node. No inbound ports. No VPN. No
credentials shipped out of the environment.</p>

<h2 id="example-kubernetes-cluster-management">Example: Kubernetes cluster management</h2>

<p>The typical approach to letting an agent manage a Kubernetes cluster involves
distributing a <code class="language-plaintext highlighter-rouge">kubeconfig</code> to wherever the agent runs and making the API
server reachable from there. For a private cluster this often means a VPN, a
bastion host, or an ingress rule — any of which expands the attack surface
and requires ongoing maintenance.</p>

<p>The agent-native approach deploys a small Kubernetes agent <em>inside</em> the cluster.
It runs as a pod with a service account that gives it the access it needs. It
never exposes the API server externally. Your local agent or a cloud-hosted
orchestrator communicates with it via A2A, asking questions and requesting
actions in natural language.</p>

<pre><code class="language-mermaid">sequenceDiagram
    participant OPS as Operator / Orchestrator
    participant SN as SLIM Node
    participant KA as k8s Agent (in-cluster pod)
    participant API as Kubernetes API

    OPS-&gt;&gt;SN: A2A: "list failing pods in prod"
    SN-&gt;&gt;KA: route request
    KA-&gt;&gt;API: kubectl get pods --field-selector=status.phase=Failed
    API--&gt;&gt;KA: pod list
    KA--&gt;&gt;SN: A2A response with summary
    SN--&gt;&gt;OPS: deliver result
</code></pre>

<p>The cluster’s security posture is unchanged. The <code class="language-plaintext highlighter-rouge">kubeconfig</code> stays inside the
cluster. The API server is never exposed. The agent pod itself can be locked
down to a least-privilege service account scoped to exactly the namespaces it
needs to observe.</p>

<p>When you need to reach a second cluster, you deploy another agent pod there.
The orchestrator addresses each cluster’s agent by its SLIM name — no new
network rules, no new credentials to distribute.</p>

<h2 id="example-vm-and-server-configuration">Example: VM and server configuration</h2>

<p>Configuring remote VMs traditionally means SSH access, an Ansible control
machine, and a maintained inventory. Every new VM is a new entry in the
inventory and a new host that needs to trust your control machine’s key.</p>

<p>Instead, deploy a configuration agent directly on the VM. It runs with the
local permissions it needs to apply configuration, restart services, and tail
logs. Your orchestrator sends it instructions via A2A.</p>

<pre><code class="language-mermaid">flowchart LR
    subgraph ORCH[Orchestrator]
        O[Orchestrating Agent]
    end

    subgraph VM1[VM – region A]
        CA1[Config Agent]
        S1[Services / Files / Logs]
        CA1 --&gt;|local| S1
    end

    subgraph VM2[VM – region B]
        CA2[Config Agent]
        S2[Services / Files / Logs]
        CA2 --&gt;|local| S2
    end

    O --&gt;|A2A: apply config| CA1
    O --&gt;|A2A: apply config| CA2

    style ORCH fill:#eff3fc,stroke:#0251af,color:#1c1e21
    style VM1 fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style VM2 fill:#e8eefb,stroke:#0251af,color:#1c1e21
    style O fill:#0251af,color:#f3f6fd
    style CA1 fill:#0251af,color:#f3f6fd
    style CA2 fill:#0251af,color:#f3f6fd
    style S1 fill:#cfe1fb,color:#1c1e21
    style S2 fill:#cfe1fb,color:#1c1e21
</code></pre>

<p>You can ask the agent to tail logs and report on errors, apply a configuration
change, restart a service, or investigate why a process keeps crashing — all
without SSH, without maintaining an inventory, and without any inbound firewall
rules on the VM. The VM only needs to reach the SLIM node outbound to join
the topology.</p>

<p>This also makes edge deployments much cleaner. A device at a factory or retail
site connects outbound to SLIM when it starts up. From that moment it is
reachable by name from your orchestration plane without any per-site network
configuration.</p>

<h2 id="what-makes-this-practical">What makes this practical</h2>

<p>Three things enable this pattern at scale:</p>

<p><strong><a href="https://a2a-protocol.org/latest/">A2A</a></strong> provides the standard protocol for
agent-to-agent communication. Instead of inventing a bespoke API for each remote
capability, every agent speaks the same language. The orchestrator does not need
to know whether the remote agent wraps <code class="language-plaintext highlighter-rouge">kubectl</code>, Ansible, or something else
entirely — it sends a task and receives a result.</p>

<p><strong><a href="https://github.com/agntcy/slim">SLIM</a></strong> provides the transport. Rather than
addressing agents by IP and port, SLIM uses a hierarchical naming scheme
(<code class="language-plaintext highlighter-rouge">org/namespace/agent-name</code>) and routes messages through lightweight nodes that
act as brokers. A remote agent connects outbound to its nearest SLIM node at
startup and is immediately reachable by name from anywhere else on the overlay.
There is no need for publicly routable addresses, inbound firewall rules, or
VPN tunnels. SLIM also handles end-to-end MLS encryption and per-message
acknowledgment, so the reliability and confidentiality properties hold regardless
of what network sits between the agents.</p>

<p><strong><a href="https://agentskills.io">AgentSkills</a></strong> provides the capability layer. Rather
than building a bespoke agent binary for each environment from scratch, you
compose a generic agent runtime with a set of skills tailored to what that
environment needs — a Kubernetes skill set for cluster agents, a system
administration skill set for VM agents, and so on. The same runtime ships
everywhere; only the skills differ. This makes the remote agents cheap to
produce, easy to update, and straightforward to reason about: each agent does
exactly what its skill manifest describes, nothing more.</p>

<h2 id="the-properties-that-fall-out">The properties that fall out</h2>

<p>Once you adopt this pattern a number of useful properties emerge:</p>

<p><strong>Reduced attack surface.</strong> Remote environments only need one outbound connection
to SLIM. No API ports, no SSH, no VPN endpoints. The blast radius of a
compromised credential is limited to what the agent on that environment is
allowed to do.</p>

<p><strong>Network-topology independence.</strong> Your orchestrator addresses remote agents by
SLIM name. Whether the remote environment is in a public cloud, a private
datacenter, or behind a carrier-grade NAT, the addressing model is the same.
Move the environment and reconnect it to SLIM — nothing in the orchestrator
changes.</p>

<p><strong>Semantic access control.</strong> A raw API gives a caller access to everything the
API exposes. An agent acts as a capability boundary: you define what it can do,
what it will refuse, and how it will report back. The remote agent can enforce
policies that a raw API cannot.</p>

<p><strong>Uniform interface.</strong> Every remote capability — a Kubernetes cluster, a VM, a
network device, a database — is reached through the same A2A interface. Your
orchestrator does not need a different SDK or a different mental model for each
one.</p>

<h2 id="things-to-consider">Things to consider</h2>

<p>The pattern shifts complexity rather than eliminating it. Before adopting it,
there are a few areas worth thinking through carefully.</p>

<p><strong>Authorization: who can ask the agent to do what?</strong></p>

<p>With a raw API, the API itself enforces authorization — Kubernetes RBAC,
database roles, IAM policies. A remote agent introduces two separate questions:
is the <em>caller</em> allowed to make this request, and is the <em>action the agent
derives from it</em> something that caller should be able to trigger? SLIM provides
transport-level caller identity, but the authorization policy for what each
caller may ask the agent to do needs to be designed explicitly. Neither question
is answered automatically.</p>

<p><strong>The agent is now the security boundary</strong></p>

<p>The remote agent holds the privileged local credentials, so it deserves the
same scrutiny as any privileged service: minimal permissions scoped to what it
actually needs, and isolation from untrusted input. Prompt injection — where
malicious content in data the agent reads manipulates it into taking unintended
actions — is a concrete risk worth designing against.</p>

<p><strong>Auditability</strong></p>

<p>A raw API call produces a deterministic log entry. An agent’s action is derived
from a task description, so the chain from “what was requested” to “what was
done” is less direct. Remote agents should log every action they take with the
originating task ID and caller identity attached, so that natural language
instructions can be traced back to the concrete operations they triggered.</p>

<p><strong>Operational overhead of many agents</strong></p>

<p>Agent proliferation has a cost: binaries to keep updated, SLIM identities to
manage, configurations to maintain across environments. Treat remote agents like
any other workload — version-controlled configuration, a defined deployment
pipeline, a clear owner. The overhead is manageable, but it does not disappear.</p>

<h2 id="closing-thoughts">Closing thoughts</h2>

<p>Portal hands you a new tool and the whole game changes. The puzzles were always
there — what changed is that you now have something that lets you approach them
differently. Agents are the same kind of gift. The hard parts of connecting
to remote infrastructure were always there; agents just give you a new primitive
for thinking about them — one that lets you deploy capability where the resource
lives rather than dragging the resource out to where your agent is.</p>

<p>A2A and SLIM are what make that primitive practical: a common language for
agent communication and a transport that does not care about network topology.
The connectivity, security, and operational problems do not disappear, but with
the right mental model they become much more tractable.</p>

<hr />

<p><em>Have questions? Join our <a href="https://join.slack.com/t/agntcy/shared_invite/zt-3hb4p7bo0-5H2otGjxGt9OQ1g5jzK_GQ">Slack community</a> or check out our <a href="https://github.com/agntcy">GitHub</a>.</em></p>]]></content><author><name>Sam Betts</name></author><category term="technical" /><category term="agents" /><category term="a2a" /><category term="a2a" /><category term="slim" /><category term="agents" /><category term="kubernetes" /><category term="architecture" /><category term="patterns" /><summary type="html"><![CDATA[There is a moment in Portal when the game clicks. You stop trying to find a way around the obstacle and you realise you can just connect two surfaces with a portal and walk straight through. The puzzle hasn’t changed, but your perception of the solution has — and that makes all the difference. Something similar happens when you build AI agent systems and you stop asking “how do I give my agent access to this remote resource?” and start asking “what if I deployed an agent where the resource already lives?”.]]></summary></entry></feed>