<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>A2A on Matt Goodrich</title><link>https://mattgoodrich.com/tags/a2a/</link><description>Recent content in A2A on Matt Goodrich</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 29 May 2026 12:00:00 -0700</lastBuildDate><atom:link href="https://mattgoodrich.com/tags/a2a/index.xml" rel="self" type="application/rss+xml"/><item><title>MCP Earns Its Keep at the Boundary</title><link>https://mattgoodrich.com/posts/mcp-at-the-boundary/</link><pubDate>Fri, 29 May 2026 12:00:00 -0700</pubDate><guid>https://mattgoodrich.com/posts/mcp-at-the-boundary/</guid><description>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/header.png" alt="Featured image of post MCP Earns Its Keep at the Boundary" />&lt;p>&lt;strong>The articles arguing that MCP is going away in favor of direct API calls with workload identity are half right. The half that&amp;rsquo;s right is the half that has been right about every abstraction layer for the last twenty years: inside the trust boundary you control end-to-end, the abstraction usually costs more than it returns.&lt;/strong>&lt;/p>
&lt;p>The half that&amp;rsquo;s wrong is the half that treats MCP like it lives only on one side of that boundary. Almost nothing important in security architecture lives entirely inside the boundary you own. The interesting work happens at the boundary you cannot reimplement, against the systems whose APIs you do not control, where the only enforcement surface you get is the one your tooling brings with it. That has been true since SOAP. It is true now. It is the reason the published &amp;ldquo;MCP is going away&amp;rdquo; case is narrower than the framing suggests.&lt;/p>
&lt;p>I argued in &lt;a class="link" href="https://mattgoodrich.com/posts/mcp-headless-authorization/" >MCP Authorization When the User Isn&amp;rsquo;t Clicking&lt;/a> that direct API with workload identity was the right answer for single-cloud blast radius and a small set of well-known APIs. This post is the question that immediately follows. What about everything else? Where does MCP earn its keep, and where does it become the 2026 version of an ESB?&lt;/p>
&lt;h2 id="weve-been-here-before-four-times">We&amp;rsquo;ve Been Here Before, Four Times
&lt;/h2>&lt;p>The argument that an abstraction layer between your application and a backend system is overhead waiting to be removed has been made about every abstraction layer the industry has built since the mid-2000s. The lineage is worth walking, because the conditions under which each one was right are the same conditions that apply to MCP today.&lt;/p>
&lt;p>&lt;strong>API gateways (Apigee, Kong, AWS API Gateway, 2004 onwards).&lt;/strong> The original case was centralization of authentication, rate limiting, request transformation, audit logging, and security policy at the perimeter of an API surface. Two decades in, the practitioner consensus is settled: gateways earn their keep on north-south traffic, where you do not own both ends. They become cruft on east-west traffic, where they become the place uncoordinated teams hide coupling. Sam Newman&amp;rsquo;s &lt;a class="link" href="https://samnewman.io/books/building_microservices_2nd_edition/" target="_blank" rel="noopener"
>&lt;em>Building Microservices&lt;/em>&lt;/a> states it directly: &amp;ldquo;Putting smarts in the pipes is problematic — logic is preferred in the clients… a shared proxy layer can slow down the process of making and deploying changes.&amp;rdquo; Gateways won at the perimeter. They lost in the mesh.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-api-gateway.png"
width="672"
height="278"
srcset="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-api-gateway_hu16110707845692227817.png 480w, https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-api-gateway_hu7849768121444332845.png 1024w"
loading="lazy"
alt="API gateway pattern: external clients flow through a central gateway to internal services"
class="gallery-image"
data-flex-grow="241"
data-flex-basis="580px"
>&lt;/p>
&lt;p>&lt;strong>Service mesh (Istio, Linkerd, Consul Connect, 2017 onwards).&lt;/strong> The original case was zero-trust service-to-service mTLS, observability, traffic shaping, and policy as infrastructure, pulled out of every service into a sidecar. By 2024, sidecar mesh adoption was in decline, dropping from 50% to 42% in one year, and Istio Ambient Mode shipped specifically to move the abstraction out of the pod. The mesh community did not kill the abstraction. They killed the implementation cost. The lesson is precise: a control-plane abstraction is worth its operational tax only when cross-cutting concerns genuinely need to be centralized. Where they don&amp;rsquo;t, the abstraction&amp;rsquo;s cost shows up first and most painfully.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-service-mesh.png"
width="481"
height="554"
srcset="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-service-mesh_hu6400887261631143133.png 480w, https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-service-mesh_hu9226901923362116897.png 1024w"
loading="lazy"
alt="Service mesh pattern: two service pods each with a sidecar, mTLS between them, control plane providing policy and observability"
class="gallery-image"
data-flex-grow="86"
data-flex-basis="208px"
>&lt;/p>
&lt;p>&lt;strong>Enterprise Service Bus (TIBCO, IBM Integration Bus, Mulesoft, 2005-2012).&lt;/strong> The original case was a central smart bus doing routing, transformation, orchestration, and policy for any-to-any integration. The published retrospective from &lt;a class="link" href="https://martinfowler.com/articles/microservices.html" target="_blank" rel="noopener"
>Fowler and Lewis&amp;rsquo;s 2014 &lt;em>Microservices&lt;/em> article&lt;/a> is the foundational repudiation: &amp;ldquo;we have seen so many botched implementations of service orientation, from the tendency to hide complexity away in ESBs, to failed multi-year initiatives that cost millions and deliver no value, to centralised governance models that actively inhibit change.&amp;rdquo; The counter-pattern they coined, &lt;em>smart endpoints and dumb pipes&lt;/em>, was a direct inversion. Jim Webber&amp;rsquo;s &lt;a class="link" href="https://www.infoq.com/presentations/webber-guerilla-soa/" target="_blank" rel="noopener"
>&lt;em>Guerrilla SOA&lt;/em>&lt;/a> (InfoQ, 2007) catalogs the failure modes: coupling, the bus accumulating business rules, vendor lock-in, single point of failure. The ESB became the canonical example of an abstraction that absorbed too much domain knowledge to remain neutral.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-esb.png"
width="850"
height="231"
srcset="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-esb_hu2242278391725135891.png 480w, https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-esb_hu4897360741168262197.png 1024w"
loading="lazy"
alt="ESB pattern: five enterprise systems connected through a central Enterprise Service Bus doing routing, transformation, orchestration, and business rules"
class="gallery-image"
data-flex-grow="367"
data-flex-basis="883px"
>&lt;/p>
&lt;p>&lt;strong>ORMs and ANSI SQL (1986 onwards, still settling).&lt;/strong> ANSI SQL survived forty years on a clear deal: the lowest-common-denominator surface is acceptable enough, and the vendor independence payoff is real enough, that most shops accept it and dip into vendor extensions only where the payoff demands it. ORMs ran the same deal and got punished for it. Joel Spolsky&amp;rsquo;s &lt;a class="link" href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/" target="_blank" rel="noopener"
>&lt;em>Law of Leaky Abstractions&lt;/em>&lt;/a> (2002) and Ted Neward&amp;rsquo;s &lt;a class="link" href="https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/" target="_blank" rel="noopener"
>&lt;em>The Vietnam of Computer Science&lt;/em>&lt;/a> (2004) named the failure mode. ORMs win on stable schemas and CRUD-shaped workloads. They lose on high-performance OLTP and analytical queries. The teams running Stack Overflow, Shopify, and GitHub all dropped to raw SQL on the hot paths. SQL survived because it was a contract. ORMs struggled because they were a translation.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-orm-sql.png"
width="1119"
height="362"
srcset="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-orm-sql_hu12389529183959342771.png 480w, https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-orm-sql_hu4968818688926626563.png 1024w"
loading="lazy"
alt="Two paths: SQL as a clean contract from application to vendor database; ORM as an extra translation layer that leaks"
class="gallery-image"
data-flex-grow="309"
data-flex-basis="741px"
>&lt;/p>
&lt;p>The cross-cutting principle each of these lineages independently arrived at is the one that matters for MCP: &lt;strong>an abstraction earns its keep at the boundaries the team does not own, and becomes theater at the boundaries the team does own.&lt;/strong> Gateways at the edge, not in the mesh. Mesh sidecars where centralization is paid for, not where it isn&amp;rsquo;t. The bus is the wrong place for business rules. The ORM is the wrong tool over your own schema.&lt;/p>
&lt;p>MCP is the next entry in this catalog, and the test is the same.&lt;/p>
&lt;h2 id="what-mcp-actually-buys-you-as-a-security-layer">What MCP Actually Buys You as a Security Layer
&lt;/h2>&lt;p>Strip out the protocol details and what MCP gives a security architect is four specific capabilities, each of which has a clean analog in the lineage above.&lt;/p>
&lt;p>&lt;strong>A single audit surface for tool calls.&lt;/strong> Every call into the MCP server can be logged in a uniform shape: caller identity, tool name, arguments, response status, timing. Without MCP, the audit trail is scattered across whatever logs the underlying API happens to write, in whatever format that API happens to write them. With MCP, the audit shape is yours.&lt;/p>
&lt;p>&lt;strong>A central policy enforcement point.&lt;/strong> Authorization decisions, rate limiting, output filtering, redaction of PII or secrets in responses, and structural denial of dangerous tool combinations all live in one place. Without MCP, each of those concerns has to be re-implemented at every API the agent can call, or punted to the API itself, which means relying on the vendor&amp;rsquo;s interpretation.&lt;/p>
&lt;p>&lt;strong>Identity translation.&lt;/strong> The agent&amp;rsquo;s identity primitive (workload identity, OAuth client credentials, IdP-issued JWT) is translated by the MCP layer into whatever credential the downstream API expects. The agent never holds the downstream credential. Without MCP, the agent has to hold every credential for every API, with all the credential-rotation and blast-radius cost that implies.&lt;/p>
&lt;p>&lt;strong>Blast-radius reduction.&lt;/strong> A compromised agent that holds an MCP token can take only the actions that token&amp;rsquo;s scope allows. A compromised agent that holds raw API credentials for ten downstream systems can take any action those credentials permit. The MCP layer is the choke point where scope is enforced.&lt;/p>
&lt;p>Those four capabilities are the case for MCP. They are also the case for an API gateway in 2008, a service mesh in 2018, an ESB in 2005, and ANSI SQL in 1986. They are real. They are not new.&lt;/p>
&lt;h2 id="what-the-skip-mcp-argument-actually-says">What the &amp;ldquo;Skip MCP&amp;rdquo; Argument Actually Says
&lt;/h2>&lt;p>The published case for skipping MCP, as of mid-2026, is more specific than the framing &amp;ldquo;MCP is going away.&amp;rdquo; It comes from three distinguishable positions.&lt;/p>
&lt;p>&lt;strong>&lt;a class="link" href="https://awesomeagents.ai/news/perplexity-agent-api-mcp-shift/" target="_blank" rel="noopener"
>Perplexity&amp;rsquo;s defection&lt;/a>.&lt;/strong> CTO Denis Yarats at Ask 2026 publicly described Perplexity&amp;rsquo;s move away from MCP toward direct APIs and CLIs, citing two concrete problems: MCP tool descriptors burn context tokens at every call, and the OAuth authentication friction was an operational tax. This is the flagship &amp;ldquo;we tried MCP and moved off&amp;rdquo; story. It is real and it is specific. It is also one company optimizing for a cost profile (model context tokens) that does not apply to every deployment.&lt;/p>
&lt;p>&lt;strong>The structural critique.&lt;/strong> The most-cited Hacker News thread on the topic, &lt;a class="link" href="https://news.ycombinator.com/item?id=45868088" target="_blank" rel="noopener"
>&lt;em>MCP was the wrong abstraction for AI agents&lt;/em>&lt;/a>, argues that routing tool output through the LLM as tokens is structurally wasteful. The argument points toward a &lt;em>successor protocol&lt;/em>, not toward direct APIs. The HN argument is &amp;ldquo;MCP is the wrong shape,&amp;rdquo; not &amp;ldquo;replace MCP with raw calls.&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>The &amp;ldquo;stable production pipeline&amp;rdquo; argument.&lt;/strong> Practitioner essays from Improving (&lt;a class="link" href="https://www.improving.com/thoughts/when-mcp-is-not-the-right-choice/" target="_blank" rel="noopener"
>&lt;em>When MCP Is Not The Right Choice&lt;/em>&lt;/a>) and BSWEN (&lt;a class="link" href="https://docs.bswen.com/blog/2026-04-24-mcp-vs-direct-api/" target="_blank" rel="noopener"
>&lt;em>MCP vs Direct API&lt;/em>&lt;/a>) make a narrower case: where the tool surface is well-defined, stable, and runs at production scale, direct API calls are simpler, faster, and cheaper than the MCP layer in front of them. This is a real argument. It is also the same argument that says don&amp;rsquo;t put an API gateway in front of your own service when both sides are yours.&lt;/p>
&lt;p>What does &lt;em>not&lt;/em> support the broader framing is the hyperscaler position. &lt;a class="link" href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-oauth.html" target="_blank" rel="noopener"
>AWS Bedrock AgentCore&amp;rsquo;s published architecture&lt;/a> recommends MCP in front of AgentCore Identity for accessing AWS services. AWS&amp;rsquo;s own position is &lt;em>MCP-in-front, workload identity behind.&lt;/em> &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/ai-gateway" target="_blank" rel="noopener"
>Microsoft Foundry Agent Service&lt;/a> recommends the AI gateway URL rather than the direct MCP endpoint. Google&amp;rsquo;s &lt;a class="link" href="https://docs.cloud.google.com/gemini-enterprise-agent-platform" target="_blank" rel="noopener"
>Gemini Enterprise Agent Platform&lt;/a> centralizes policy at an Agent Gateway. &lt;a class="link" href="https://developers.cloudflare.com/agents/model-context-protocol/authorization/" target="_blank" rel="noopener"
>Cloudflare Agents&lt;/a> is MCP-native by design. The four largest cloud platforms running agents do not, in their own documentation, advise direct API calls without an MCP-shaped layer in front. They advise the abstraction.&lt;/p>
&lt;p>There is also no Gartner, Forrester, or RedMonk position arguing the abstraction itself is obsolete. The published &amp;ldquo;MCP is going away&amp;rdquo; case is real but is much narrower than the framing implies.&lt;/p>
&lt;h2 id="where-mcp-becomes-the-esb-again">Where MCP Becomes the ESB Again
&lt;/h2>&lt;p>The post would oversell if it stopped at &amp;ldquo;use MCP.&amp;rdquo; There are specific conditions under which MCP is the wrong abstraction, and the lineage above is the lens that surfaces them.&lt;/p>
&lt;p>&lt;strong>When MCP carries domain logic.&lt;/strong> The MCP server that knows how to format invoices, route customer-tier-specific escalations, or apply business rules is the 2026 version of IBM Integration Bus. Pipes carry. Endpoints decide. The moment your MCP layer starts encoding policy that belongs to the application, you are repeating the SOA mistake.&lt;/p>
&lt;p>&lt;strong>When MCP sits between your own agent and your own service.&lt;/strong> The east-west traffic problem the API gateway community settled on applies directly. If you control both sides of the call, the abstraction is overhead. The audit, policy, and identity-translation benefits are achievable through workload identity, IAM, and your own service mesh. Inside the trust boundary you own, MCP is a hop you do not need. The same boundary test applies to A2A and other agent-to-agent communication frameworks emerging in 2026; they are abstractions that earn their keep at the boundary they span, not within trust boundaries you fully control. I will cover A2A specifically in a future post.&lt;/p>
&lt;p>&lt;strong>When the per-vendor implementation re-creates lock-in.&lt;/strong> MCP-the-protocol is open. MCP-the-implementation is not. Each vendor&amp;rsquo;s MCP server has its own auth quirks, its own session model, its own scope vocabulary, its own discovery shape. The protocol portability promise lives at the standard layer. The lock-in cost lives at the server layer. This is the same trick SQL pulled off and ORMs did not: portability at the contract is not portability at the implementation.&lt;/p>
&lt;p>&lt;strong>When the abstraction is leaky in ways that matter.&lt;/strong> MCP exposes a generic tool surface. The vendor&amp;rsquo;s actual API surface is richer. The ORM problem applies: if you frequently need the vendor-specific capability and MCP cannot expose it, you are paying the abstraction&amp;rsquo;s cost for the 80% case and bypassing it for the 20% that matters, which means the abstraction is in the way.&lt;/p>
&lt;p>These are the conditions under which the &amp;ldquo;skip MCP&amp;rdquo; argument is right. They are not the same conditions as &amp;ldquo;MCP is going away.&amp;rdquo; They are the conditions under which the lineage above tells us &lt;em>any&lt;/em> abstraction becomes theater.&lt;/p>
&lt;h2 id="the-boundary-test">The Boundary Test
&lt;/h2>&lt;p>The decision criterion that survives all four lineages is the same one that applies to MCP, and it is the one that matters for the architect&amp;rsquo;s answer.&lt;/p>
&lt;p>&lt;strong>For systems you own end-to-end.&lt;/strong> Your APIs, your services, your databases, your internal tools all qualify. Skip MCP. Use workload identity (SPIFFE, AWS IAM role, Azure managed identity, GCP workload identity federation). Authenticate the agent to the API directly. The audit trail is cloud-native, the policy is in your IAM, the credential lifecycle is ephemeral, and the abstraction cost is paid in operational simplicity. This is the case where direct API with workload identity is genuinely cleaner, and the case Perplexity, Improving, and BSWEN are making is correct.&lt;/p>
&lt;p>&lt;strong>For systems you do not own and cannot reimplement.&lt;/strong> Third-party SaaS APIs, vendor services, partner integrations, the GitHub MCP, the Slack MCP, the Notion MCP, your payroll system, your CRM. Keep MCP. It is the only enforcement surface where security policy, audit, identity translation, and blast-radius control can be made consistent across vendors. The vendor&amp;rsquo;s own audit log is whatever the vendor decided it should be. The vendor&amp;rsquo;s own policy enforcement is whatever the vendor decided it should be. The MCP layer in front is yours, and that is the only place the cross-cutting concerns are uniformly applied.&lt;/p>
&lt;p>&lt;strong>For the hybrid case, which is most enterprises.&lt;/strong> Run the pattern the practitioner consensus is converging on: an API gateway for REST/GraphQL traffic, an AI gateway for LLM tokens, and an MCP gateway in front of the MCP servers for the third-party integrations that need them. &lt;a class="link" href="https://www.solo.io/blog/mcp-authorization-is-a-non-starter-for-enterprise" target="_blank" rel="noopener"
>Solo.io&lt;/a>, &lt;a class="link" href="https://www.strata.io/resources/news/strata-identity-introduces-ai-identity-gateway-and-validation-sandbox/" target="_blank" rel="noopener"
>Strata&lt;/a>, &lt;a class="link" href="https://aurascape.ai/secure-agentic-ai/" target="_blank" rel="noopener"
>Aurascape&lt;/a>, Traefik, and the &lt;a class="link" href="https://mcpproxy.app/blog/2026-03-22-three-gates-ai-infrastructure/" target="_blank" rel="noopener"
>&lt;em>Three Gates&lt;/em> essay&lt;/a> all describe variations of this pattern. It is not MCP-or-direct-API. It is MCP at the boundary where it earns its keep, direct API where MCP would be theater, and the gateways in between to make the seam manageable.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-boundary-test.png"
width="586"
height="932"
srcset="https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-boundary-test_hu3741484746472306768.png 480w, https://mattgoodrich.com/posts/mcp-at-the-boundary/diagram-boundary-test_hu3603318193403879423.png 1024w"
loading="lazy"
alt="Boundary test decision tree: per-integration ownership question leads to skip MCP or keep MCP, with most enterprises running both in a Triple Gate pattern"
class="gallery-image"
data-flex-grow="62"
data-flex-basis="150px"
>&lt;/p>
&lt;p>The decision is not about MCP. The decision is about ownership.&lt;/p>
&lt;h2 id="an-old-pattern-under-new-conditions">An Old Pattern Under New Conditions
&lt;/h2>&lt;p>The case for MCP is the case for ANSI SQL in 1986, for API gateways in 2008, for service mesh in 2018, and for every abstraction layer that survived its hype cycle. The conditions are the same. Vendor independence matters where you cannot reimplement the vendor. Centralized policy matters where the cross-cutting concerns genuinely cross system boundaries. Blast-radius reduction is the operational version of both, applied at the agent&amp;rsquo;s call site.&lt;/p>
&lt;p>The case for skipping MCP is also the case for skipping the API gateway between your own services, for skipping the service mesh in a single-team monolith, for skipping the ORM on hot OLTP paths, and for skipping the ESB inside the trust boundary it cannot make trustworthy. Inside the boundary you own, the abstraction is paid for and not used.&lt;/p>
&lt;p>The &amp;ldquo;MCP is going away&amp;rdquo; claim, read carefully, says the same thing the &amp;ldquo;ESBs are dying&amp;rdquo; claim said in 2011. ESBs did not die. They retreated to the boundary they had always been correct at, and the abstraction inside the trust boundary was replaced by smart endpoints and dumb pipes. MCP is on the same arc, and it will land in the same place. Keep it at the boundary you do not own. Skip it where you do. The pattern is twenty years old. The conditions are new only in the sense that the caller is now an agent, and the caller has never been the part the abstraction was for.&lt;/p></description></item></channel></rss>