Build1 distinct publisher3 min readPublished
A discovery-only comparison of A2A agents on three clouds, measured in August 2026, found one protocol producing three auth models and one card whose sole declared interface URL is the container's bind address.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Start with `to_a2a()`. The helper writes the process bind address into the card's `supportedInterfaces` block [10]. On Cloud Run the container binds `0.0.0.0:8080`, so the published card offers exactly one route to the agent, and that route is `http://0.0.0.0:8080` [9][10]. 0.0.0.0 is a reasonable thing to bind and a poor thing to dial. The card itself came back over HTTPS on the service hostname, gated by `roles/run.invoker` at the Google Frontend [8], which means the client already holds the only address that works. The field whose job is to name the transport is the field it has to discard.
That matters because the card is the only artifact a client reads before it commits to a runtime [3]. Path handling adds its own tax. The spec puts the card at `/.well-known/agent-card.json` and keeps `/.well-known/agent.json` as the older path [4]. Six targets in the mesh [2], and a client that cannot assume which path a given vendor serves, is twelve requests before anything useful happens [16].
The permission model splits the same way. By the writeup's count, two of the three clouds do not let you issue a read-only discovery credential at all [17]. That is why the sample attaches the credential to the `httpx` client rather than to the invocation it is preparing: the card fetch is its own authenticated request, not a side effect of the call downstream [7].
Treat the field table as a measurement of one mesh on one day. The results are dated 2026-08-25 [2], and the environment is deliberately unpinned, with no virtualenv, running a2a-sdk 1.1.2, google-adk 2.6.3, httpx 0.28.1 and starlette 1.3.1 on Python 3.13.14 [12]. For the `0.0.0.0` finding to transfer to your deployment, you need the same `to_a2a()` code path, the same bind, and no proxy rewriting the interface URL on the way out. Bump the SDK minor and you are running a fresh experiment, not reading this one.
Two pieces of the harness are worth copying regardless of what your cards say. The local mesh script checks that its own child process survived rather than that something answered on 11001, 11002 and 11003, because sharing a port range with another project hands you three healthy agents and a comparison of the wrong ones [15]. And the whole suite is hermetic: 125 tests in 0.52 seconds, with ruff clean [13]. Those are the two failure modes a live cloud will not reproduce for you on demand, and both are cheap to encode now.
In my context, the ordering I would ship is: fetch the card, store the exact bytes, and route on the hostname that answered rather than the URL the card advertises. Storing the bytes is what makes the divergence auditable later [1]; the alternative is arguing about what a vendor published three weeks ago. If a future SDK stops leaking the bind address, that policy costs nothing and you delete a line.
Ranked by verification strength, evidence, and original report placement.
The project fetches the agent card from every agent in a mesh, stores the exact bytes each server sent, and compares the fields side by side. It never invokes anything: there is no model, no prompt and no token spend in the measurement path. It stops at discovery.
The targets are three local specimens on 127.0.0.1 and three deployed agents on Cloud Run, Bedrock AgentCore and Azure Container Apps. All results were measured on 2026-08-25.
The agent card is a JSON document published at a well known path that names the agent, lists its skills and declares how to reach it. It is the only thing a client reads before committing to a runtime; if two vendors describe the same agent differently, every routing decision downstream inherits that difference.
The A2A spec places the card at /.well-known/agent-card.json, with /.well-known/agent.json as the older path.
Only AgentCore lets you grant discovery without granting invocation. On Cloud Run the card and the call sit behind one role, so anything that can read the card can also run the agent. On Container Apps the platform intercepts every path ahead of the container, which is stricter still.
On AgentCore, a policy granting only InvokeAgentRuntime denies the card fetch, and the denial surfaces as a transport or protocol error nowhere near auth.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 27, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Three clouds, one protocol, no stored credentials: the runtime becomes a swappable part1 distinct publisher
build
AgentCore charges a second IAM action just to read the agent card, and the card talks1 distinct publisher
build
The A2A card said 0.0.0.0:8080, and the only caller it broke was Google's1 distinct publisher
build
A2A holds on the wire. ADK, Strands and Agent Framework are still not substitutable.1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Concrete but single-source
The findings are backed by concrete, verifiable artifacts — raw card JSON, HTTP response headers, and pytest/ruff output — which is strong evidence for the specific measurements. But everything comes from one self-reported author on a single date, with cloud hostnames and ARNs redacted, and no independent reproduction, which caps evidentiary strength.
No third-party uptake evidence
The only observed events are the author's own demonstration deployments and the publication of a personal sample repo. There are no stars, forks, downloads, or third-party usage figures, so market adoption of the tool or the approach cannot be measured.
Sober, slightly understated
The framing is measured and evidence-first: claims are tightly scoped ('it stops at discovery', 'this does not reproduce on a local mesh'), and the strong security-flavored finding is fully backed by the quoted card bytes. If anything, the operational severity of a public endpoint advertising an unroutable bind address is stated more soberly than the concern warrants, so claims are aligned to mildly understated rather than hyped.
Mild self-promotion
The author promotes their own GitHub sample repo within an educational dev.to tutorial. That is a modest incentive to present the project favorably, but there is no commercial product, funding, or vendor sponsorship at stake, and the content is largely factual measurement.
Moderate
Confidence is lifted by detailed, internally consistent artifacts but held down by reliance on a single uncorroborated author and redacted cloud specifics that prevent independent verification.