<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Agents' Codex</title><link>https://agentscodex.com/tags/agent-tool-access/</link><description>Practical, no-hype insights on AI agents — cost optimization, multi-agent architecture, and real-world operations.</description><generator>Hugo -- 0.165.0</generator><language>en-us</language><lastBuildDate>Fri, 14 Aug 2026 19:01:19 -0300</lastBuildDate><atom:link href="https://agentscodex.com/tags/agent-tool-access/index.xml" rel="self" type="application/rss+xml"/><item><title>Federated MCP: Distributed Tool Access Without a Central Server</title><link>https://agentscodex.com/posts/2026-08-14-federated-mcp-distributed-tool-access/</link><pubDate>Fri, 14 Aug 2026 06:00:00 -0300</pubDate><author>Agents' Codex</author><guid>https://agentscodex.com/posts/2026-08-14-federated-mcp-distributed-tool-access/</guid><category>federatedmcp</category><category>modelcontextprotocol</category><category>distributedagents</category><category>mcpfederation</category><description>Federated MCP lets agents discover and invoke tools across organizational boundaries without a central server, using stateless trust and capability negotiation.</description><content:encoded><![CDATA[<p><strong>TL;DR</strong></p>
<ul>
<li>Federated MCP shifts tool access from a hub-and-spoke client-server model to a mesh where servers delegate to each other across trust boundaries.</li>
<li>Stateless protocol changes (SEP-2575, SEP-2567) are what make cross-boundary, load-balanced MCP deployments practical.</li>
<li>Capability attestation (proving a downstream invocation is authorized) remains the unsolved problem in the ecosystem.</li>
</ul>
<p>Every MCP deployment you have seen so far fits the same shape: a host process opens one client per server, and each client talks to exactly one server [1]. That model worked when tools lived inside your own org. It breaks the moment an agent must call a tool in a partner&rsquo;s environment, or delegate across three teams running separate infrastructure. Federated MCP is the emerging answer, but the plumbing is not the hard part. The real value is trust: deciding who can invoke what, across a boundary no single party controls. Most teams reach for a central gateway to solve this and quietly rebuild the exact single point of failure they were trying to escape. The better path is a mesh of servers that attest to each other and scope invocation statelessly. This article maps that path.</p>
<h2 id="why-session-coupled-mcp-breaks-at-the-federation-boundary">Why Session-Coupled MCP Breaks at the Federation Boundary</h2>
<p>The original MCP design is explicitly client-host-server. A host manages multiple clients; each client holds a one-to-one relationship with a single server [1]. Sessions are the glue. Every connection carries state that the server must remember across calls; that is exactly the property that makes federation painful; state lives on the wrong side of the boundary.</p>
<p>Two spec changes unwind that coupling. SEP-2575 removes the mandatory initialization handshake; each request is self-contained; it carries its protocol version in an HTTP header [2]. SEP-2567 goes further and deletes the Mcp-Session-Id header entirely, replacing session-scoped state with explicit, server-minted handles that the model carries through subsequent calls [3].</p>
<p>The practical payoff is horizontal scaling without sticky sessions. A stateless server can sit behind a standard load balancer; list endpoints (tools/list, resources/list, prompts/list) become session-independent; they are cacheable across boundaries [3].</p>
<div class="alert alert-alert">
  <p class="alert-heading">ALERT</p>
  <p>Session-scoped state wasn&rsquo;t an accident; it was a shortcut. Real-world clients already diverged on it; ChatGPT creates a fresh session per tool call, Claude.ai moved to process-scoped sessions, and most desktop and IDE clients keep one session per application launch [3]. The spec is now catching up to a mess already in production.</p>
</div><p>The Python SDK v2.0 now supports every protocol revision since 2024-11-05, five total [4]. That breadth matters for federation: a mesh spans servers on different versions. A client that speaks all five can reach outdated internal servers without a coordinating upgrade.</p>
<h2 id="capability-negotiation-without-a-central-registry">Capability Negotiation Without a Central Registry</h2>
<p>A meshed system needs a way for two servers to agree on what each can do without a shared directory. MCP&rsquo;s answer is an extension framework, defined in SEP-2133 [5]. Extensions are optional, composable additions: layers of federation features on the core protocol that never break it.</p>
<p>Each extension carries a unique identifier in vendor-prefix form; for example, io.modelcontextprotocol/oauth-client-credentials [5]. The framework defines two official extensions today: ext-apps and ext-auth [5]. Everything else is a vendor&rsquo;s own namespace; that is how the protocol stays extensible with no central authority handing out names.</p>
<p>The negotiation model is graceful. A client advertises the extensions it supports; a server that doesn&rsquo;t recognize one simply ignores it. You stay compatible with servers that never heard of your federation features; incremental adoption across a boundary, not an all-or-nothing migration.</p>
<table>
	<thead>
			<tr>
					<th>Layer</th>
					<th>What it governs</th>
					<th>Status</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Core protocol</td>
					<td>Client-host-server, tools, resources, prompts</td>
					<td>Stable</td>
			</tr>
			<tr>
					<td>Extensions (SEP-2133)</td>
					<td>Optional composable capabilities, vendor-prefixed IDs</td>
					<td>Final</td>
			</tr>
			<tr>
					<td>Stateless requests (SEP-2575)</td>
					<td>Self-contained requests, version in HTTP header</td>
					<td>Final</td>
			</tr>
			<tr>
					<td>Sessionless state (SEP-2567)</td>
					<td>Explicit state handles, no Mcp-Session-Id</td>
					<td>Final</td>
			</tr>
			<tr>
					<td>OAuth client credentials (SEP-1046)</td>
					<td>Machine-to-machine authorization</td>
					<td>Final</td>
			</tr>
			<tr>
					<td>Header standardization (SEP-2243)</td>
					<td>Intermediary-friendly HTTP routing</td>
					<td>Final</td>
			</tr>
	</tbody>
</table>
<p>Five SEPs sit at Final status as of 2026-07-28 [2][5]. Notice how much of the federation surface arrived through extension and statelessness work rather than a dedicated federation spec. The community built the pieces first; naming them came later: a healthy order.</p>
<h2 id="the-attestation-problem-nobody-has-fully-solved">The Attestation Problem Nobody Has Fully Solved</h2>
<p>Here is the gap nobody likes to point at. The SEPs specify authentication, which answers how a caller proves its identity. They do not specify authorization across trust domains: the rule for whether a downstream server verifies that an upstream caller holds the right to invoke a tool on a user&rsquo;s behalf [6].</p>
<p>That missing piece is capability attestation; it is the genuine unsolved problem in federated MCP. When server A delegates to server B on a user&rsquo;s behalf, B has to trust that A actually holds that permission; that it was not spoofed; that it was not over-reaching. Authentication gets you an identity; it does not get you a decision.</p>
<p>This is a hard problem with no canonical answer yet.</p>
<div class="alert alert-alert">
  <p class="alert-heading">ALERT</p>
  <p>Treat this absence as the real technical risk: not a footnote. The SEPs are silent on it: SEP-1046 covers authentication for machine-to-machine calls [7], but authorization across trust domains has no normative treatment yet. If you build cross-boundary tool access today, you are designing this layer yourself.</p>
</div><p>The spec offers one building block. SEP-1046 adds the OAuth client credentials flow for machine-to-machine scenarios where no end-user is available for interactive authorization [7]; it recommends asymmetric methods (JWT assertions per RFC 7523) while still allowing client secrets for backward compatibility [7].</p>
<p>Preferring JWT assertions over shared secrets is the correct instinct for a mesh. A client secret is a long-lived bearer credential; a signed assertion can be scoped, expiring, and bound to a specific downstream audience; three properties a secret simply lacks. Across organizational boundaries, secrets leak and get reused. Assertions at least give you a revocation story.</p>
<p>Identity, in short, is table stakes.</p>
<h2 id="federated-mcp-as-a-mesh-killing-the-single-point-of-failure">Federated MCP as a Mesh: Killing the Single Point of Failure</h2>
<p>The topological shift is the whole point. Hub-and-spoke centralizes every request through one gateway. A mesh lets a server call another server, which calls a third, forming delegation chains with no mandatory hub.</p>
<p>The diagram below contrasts the two patterns. On the left, every client routes through a single choke point; on the right, servers hand work off laterally; the failure of any one node does not cut off the rest.</p>
<pre class="mermaid">graph LR
  subgraph Hub-and-Spoke
    A1[Client A] --> G[Central Gateway]
    A2[Client B] --> G
    A3[Client C] --> G
    G --> S1[Server 1]
    G --> S2[Server 2]
    G --> S3[Server 3]
  end
  subgraph Mesh Topology
    M1[Server A] --> M2[Server B]
    M2 --> M3[Server C]
    M1 --> M3
    M3 --> M1
  end</pre><p>Delegation chains only work if a network intermediary can route MCP traffic without parsing the payload. SEP-2243 standardizes HTTP headers so load balancers, proxies, and observability tools can direct traffic without deep packet inspection [8]. It is a small, unglamorous change; the consequence is that your existing infrastructure participates without learning MCP internals; no MCP-aware proxy is required.</p>
<p>That last point is bigger than it looks.</p>
<p>Demand for this pattern predates the formal spec. Community proxies — sparfenyuk/mcp-proxy, open-webui/mcpo — already bridge between transports; a GitHub search for mcp proxy surfaces a growing ecosystem of them [9]. People were hacking federation together before the SEPs ratified it; the specs chased the practice.</p>
<h2 id="what-production-gateways-reveal-about-federation-maturity">What Production Gateways Reveal About Federation Maturity</h2>
<p>Two implementations show how far the pattern has already come. IBM&rsquo;s ContextForge is an open-source gateway that federates MCP, A2A, and REST/gRPC APIs with centralized governance, discovery, and observability; it runs over HTTP, JSON-RPC, WebSocket, SSE, and stdio [10].</p>
<p>MindsDB uses MCP as a unified data gateway; one query spans multiple federated data sources with auditability and no data movement [11]. Both are real, running systems: not architecture diagrams. That is the strongest evidence federated MCP has moved from concept to production.</p>
<p>Read them critically, though.</p>
<p>ContextForge is a vendor&rsquo;s gateway product; its GitHub page describes an implementation, not a general recipe for building your own federation [10]. MindsDB&rsquo;s write-up is a product announcement with limited technical depth on cross-organizational patterns [11]. Neither tells you how to solve the attestation gap we described. They prove the plumbing is solveable; they leave the trust question to you.</p>
<div class="key-takeaway">
  <span class="key-takeaway-label">Key Takeaway</span>
  Infrastructure is no longer the blocker. IBM and MindsDB prove you can federate MCP at production scale today; the unsolved cost is trust (capability attestation across boundaries), and no gateway product hands you that part.
</div>

<h2 id="building-for-the-federated-mcp-future">Building for the Federated MCP Future</h2>
<p>Start by separating what is stable from what you still have to design. The stateless and sessionless SEPs are Final; treating MCP as load-balanceable and cacheable is now safe [2][3]. OAuth client credentials are Final too; machine-to-machine authentication has a spec to lean on [7]. What remains yours to build is authorization; the policy that decides, per downstream call, whether an assertion maps to a permitted action.</p>
<p>Adopt federation where delegation actually crosses a boundary; stay hub-and-spoke while it doesn&rsquo;t. A mesh adds attestation surface area and debugging complexity: both are real costs. If every server lives inside one team&rsquo;s VPC and calls only each other, a central gateway is simpler and rarely the bottleneck. Reach for the mesh when a partner, a separate business unit, or a customer environment enters the picture [6].</p>
<p>Prefer short-lived scoped assertions over shared secrets for cross-boundary calls [7]. Design tools to be explicit about their authority requirements so a downstream server can make an allow-or-deny decision without guessing; and accept that graceful degradation via the extension framework is your friend: a server that ignores your federation extension degrades cleanly instead of failing the whole chain [5].</p>
<h2 id="practical-takeaways">Practical Takeaways</h2>
<ol>
<li>Adopt stateless MCP now; the SEPs backing SEP-2575 and SEP-2567 are Final, so you can put servers behind standard load balancers without sticky sessions.</li>
<li>Use short-lived JWT assertions (RFC 7523) over shared client secrets for any cross-boundary machine-to-machine call, per SEP-1046.</li>
<li>Treat each hop in a delegation chain as a fresh authorization decision, not a pass-through, and build your own attestation policy since no spec covers it yet.</li>
<li>Stay hub-and-spoke while all servers live inside one trust domain, and switch to a mesh only when a partner, business unit, or customer environment crosses the boundary.</li>
<li>Lean on the extension framework&rsquo;s graceful degradation so servers that don&rsquo;t support federation still work.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>The stateless protocol, extension framework, and machine-to-machine auth are all Final today, and two vendors already run them for real workloads. The open question is whether cross-boundary authorization ever gets a standard, because that is the line between a demo and a system you can actually operate. Watch where the community routes identity-to-permission mapping next; the answer decides whether your gateway stays proprietary or becomes interchangeable plumbing. The teams that win will treat that gray area as a first-class engineering discipline rather than a feature bolted on after the fact. Sketch your delegation chain on a whiteboard this week and mark every hop where a human still has to make the call.</p>
<h2 id="frequently-asked-questions">Frequently Asked Questions</h2>
<h3 id="is-mcp-stateless-today-or-do-i-still-need-sessions">Is MCP stateless today, or do I still need sessions?</h3>
<p>The stateless path is Final via SEP-2575 and SEP-2567, so you can run servers behind standard load balancers without sticky sessions. Older servers still speak the sessioned model, and Python SDK v2.0 supports all five protocol revisions, so a mixed estate works. Here is the honest caveat: we do not yet have clean production data on how a partially stateless mesh degrades when one node fails mid-chain, so treat cross-boundary resilience claims as design intent rather than measured fact.</p>
<h3 id="what-actually-distinguishes-federated-mcp-from-a-normal-mcp-gateway">What actually distinguishes federated MCP from a normal MCP gateway?</h3>
<p>A gateway centralizes; a federation distributes. See the mesh-versus-hub diagram in “Federated MCP as a Mesh” above.</p>
<h3 id="how-do-i-authenticate-machine-to-machine-tool-calls-when-no-user-is-present">How do I authenticate machine-to-machine tool calls when no user is present?</h3>
<p>Use the OAuth client credentials flow from SEP-1046, and prefer JWT assertions per RFC 7523 over shared client secrets. Assertions can be scoped, expiring, and audience-bound, which gives you a revocation story across boundaries that a plain secret cannot provide.</p>
<h3 id="what-is-the-biggest-unsolved-problem-in-federated-mcp">What is the biggest unsolved problem in federated MCP?</h3>
<p>Capability attestation. The specs define authentication and identity, but there is no standard for how a downstream server verifies that an upstream caller is authorized to act on a user&rsquo;s behalf. This is not a small gap: it is the difference between proving who you are and proving you are allowed to do the thing. No normative spec addresses it yet, and production gateway vendors do not hand you a general answer. Realistically, every team crossing an organizational boundary today builds this authorization policy itself, from scratch. That fragmentation is exactly what a future SEP needs to close, and until it lands, the trust logic remains the part you own.</p>
<hr>
<h2 id="sources">Sources</h2>
<table>
	<thead>
			<tr>
					<th>#</th>
					<th>Publisher</th>
					<th>Title</th>
					<th>URL</th>
					<th>Date</th>
					<th>Type</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;MCP Architecture - Client-Host-Server Model (2025-03-26)&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/architecture/index.mdx" target="_blank">https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/architecture/index.mdx</a>
</td>
					<td>2025-03-26</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>2</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;SEP-2575: Make MCP Stateless&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/specification/blob/main/seps/2575-stateless-mcp.md" target="_blank">https://github.com/modelcontextprotocol/specification/blob/main/seps/2575-stateless-mcp.md</a>
</td>
					<td>2025-06-18</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>3</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;SEP-2567: Sessionless MCP via Explicit State Handles&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/specification/blob/main/seps/2567-sessionless-mcp.md" target="_blank">https://github.com/modelcontextprotocol/specification/blob/main/seps/2567-sessionless-mcp.md</a>
</td>
					<td>2026-03-11</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>4</td>
					<td>Model Context Protocol (Python SDK)</td>
					<td>&ldquo;Python SDK v2.0 Documentation&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/python-sdk" target="_blank">https://github.com/modelcontextprotocol/python-sdk</a>
</td>
					<td>2026-07-28</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>5</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;SEP-2133: Extensions Framework&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/specification/blob/main/seps/2133-extensions.md" target="_blank">https://github.com/modelcontextprotocol/specification/blob/main/seps/2133-extensions.md</a>
</td>
					<td>2025-01-21</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>6</td>
					<td>Hacker News</td>
					<td>&ldquo;Federated Data Access for MCP (Model Context Protocol) Discussion&rdquo;</td>
					<td><a href="https://news.ycombinator.com/item?id=43613741" target="_blank">https://news.ycombinator.com/item?id=43613741</a>
</td>
					<td>2025-04-07</td>
					<td>Blog</td>
			</tr>
			<tr>
					<td>7</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;SEP-1046: Support OAuth Client Credentials Flow in Authorization&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/specification/blob/main/seps/1046-support-oauth-client-credentials-flow-in-authoriza.md" target="_blank">https://github.com/modelcontextprotocol/specification/blob/main/seps/1046-support-oauth-client-credentials-flow-in-authoriza.md</a>
</td>
					<td>2025-07-23</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>8</td>
					<td>Model Context Protocol Specification</td>
					<td>&ldquo;SEP-2243: HTTP Header Standardization for Streamable HTTP Transport&rdquo;</td>
					<td><a href="https://github.com/modelcontextprotocol/specification/blob/main/seps/2243-http-standardization.md" target="_blank">https://github.com/modelcontextprotocol/specification/blob/main/seps/2243-http-standardization.md</a>
</td>
					<td>2026-02-04</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>9</td>
					<td>GitHub</td>
					<td>&ldquo;MCP Proxy Implementations (search results)&rdquo;</td>
					<td><a href="https://github.com/search?q=mcp&#43;proxy&amp;type=repositories" target="_blank">https://github.com/search?q=mcp+proxy&type=repositories</a>
</td>
					<td>2026-08-14</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>10</td>
					<td>IBM</td>
					<td>&ldquo;ContextForge: Open Source MCP/A2A/REST Registry and Proxy&rdquo;</td>
					<td><a href="https://github.com/IBM/mcp-context-forge" target="_blank">https://github.com/IBM/mcp-context-forge</a>
</td>
					<td>2026</td>
					<td>Documentation</td>
			</tr>
			<tr>
					<td>11</td>
					<td>MindsDB</td>
					<td>&ldquo;MindsDB Now Supports Model Context Protocol: The Unified AI Data Hub&rdquo;</td>
					<td><a href="https://mindsdb.com/blog/mindsdb-now-supports-model-context-protocol-the-unified-ai-data-hub-your-enterprise-needs" target="_blank">https://mindsdb.com/blog/mindsdb-now-supports-model-context-protocol-the-unified-ai-data-hub-your-enterprise-needs</a>
</td>
					<td>2025-03-31</td>
					<td>Blog</td>
			</tr>
	</tbody>
</table>
<h2 id="image-credits">Image Credits</h2>
<ul>
<li><strong>Cover photo</strong>: Image generated with gemini-3-pro-image (Agents&rsquo; Codex AI illustration)</li>
</ul>
]]></content:encoded><media:content url="https://agentscodex.com/images/covers/2026-08-14-federated-mcp-distributed-tool-access/cover.jpg" medium="image"/><media:thumbnail url="https://agentscodex.com/images/covers/2026-08-14-federated-mcp-distributed-tool-access/cover.jpg"/></item></channel></rss>