Build1 distinct publisher3 min readUpdated
One line of Google ADK turns an agent into an A2A server. Deployed to Cloud Run and called from AWS and Azure, it advertised the address it binds instead of the address anyone can dial.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A bind address and a dial address are two different facts that happen to be the same string on a laptop [7]. That coincidence is the whole mechanism. `to_a2a(agent, host, port)` writes host and port straight into the interface URL the agent card advertises, and on Cloud Run the process binds `0.0.0.0:8080`, so a public HTTPS service publishes unroutable plaintext as its address [6][5]. A2A callers resolve that card at `/.well-known/agent-card.json` and dial what it says, over JSON-RPC, at protocol version 1.0 [4]. Local tests cannot see the defect, because locally the card is right.
The Strands agent on Bedrock AgentCore and the Agent Framework agent on Container Apps both take a `PUBLIC_URL` and advertise that [8]. Count the deployments: of three agents speaking the same protocol version, one publishes the address it listens on and two publish the address a stranger can reach [1]. That is an argument-list difference, not a verdict on frameworks, and it surfaces only when the resolver is somebody else.
The sharper detail is who found it. The all-first-party pairing, ADK client against ADK server, is the one hop that cannot complete, because both halves pass Google's own tests on the laptop identity [9]. When the client does fail, it fails at the wrong layer: `RemoteA2aAgent`'s handler assumes every `A2AClientError` carries a status code, which a transport failure does not, so the operator receives `AttributeError: 'A2AClientError' object has no attribute 'status_code'` while `All connection attempts failed` lands on a separate log line [10]. One defect sends the client somewhere unroutable, the second deletes the evidence of where it went [10].
Reply placement is the same species of problem with a worse failure mode. ADK's executor attaches the answer as a task artifact and also leaves a copy in task history [12]. Microsoft's `A2AExecutor` drives the full task lifecycle and leaves the answer only in history, artifacts empty [13]. A client that reads artifacts alone is the obvious implementation, works against ADK, and returns an empty string against Agent Framework: a successful call, no error, no timeout, no content [14]. Read every carrier the spec allows and ADK's reply now arrives twice [15]. So no single-carrier read is correct against both servers, and the both-carrier read is only correct with deduplication bolted on [2].
An earlier version of the same project hid that entirely. The agents returned exchange rates, and the parser indexed quotes by target currency, so the duplicate overwrote the original and the answer came out correct [16]. The payload shape was doing the deduplication, silently, for free, until the payload changed.
Both findings share a precondition, and it is not the framework. `to_a2a()` really is the shortest path from an `LlmAgent` to something another vendor's agent can call [3]. The path is short because it assumes the caller shares your process view. The author's operational advice is narrow and correct: fetch your own card after every deploy, and if you cannot fix the card, make your callers rewrite the interface URL after resolution rather than routing by it [11]. Which is to say that on today's A2A, the card is a hint, and the client owns the address.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
ADK's own client cannot reach ADK's own server once hosted; both halves pass Google's own tests because locally the two addresses are identical, so the one pairing that is entirely first-party code is the one that cannot complete a hop.
A single research project answered one research brief with three agents on three clouds over one protocol and no stored credentials between them: Google ran an ADK agent on Cloud Run, AWS ran a Strands agent on Bedrock AgentCore, Azure ran an Agent Framework agent on Container Apps, and a coordinator asked all three the same question and scored what came back.
The Agent Development Kit is Google's open source agent framework, model agnostic and deployment agnostic, running Gemini through Vertex AI or an API key, and to_a2a() turns an agent into an A2A server in one line; the author calls it the shortest path from an LlmAgent to something another vendor's agent can call.
A2A is an open protocol in which an agent publishes a card at /.well-known/agent-card.json describing what it does and how to reach it, and speaks JSON-RPC over HTTP; this project runs A2A v1.0.
Fetching the deployed agent's own card over public HTTPS returned {"url": null, "additionalInterfaces": [{"url": "http://0.0.0.0:8080", "protocolBinding": "JSONRPC"}]}, described by the author as a public HTTPS endpoint advertising unroutable plaintext.
to_a2a(agent, host, port) writes host:port straight into the card's interface URL, and on Cloud Run the process binds 0.0.0.0:8080, so that is what the card says.
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.
Specific first-hand artifacts, single unverified source
The report carries unusually concrete artifacts for a single-source item: the verbatim agent-card JSON returned over public HTTPS, the exact AttributeError text from RemoteA2aAgent, the mechanism (to_a2a writing host:port into the interface URL), and a word-count discrepancy (202 versus 98) illustrating the duplicate reply. All of it, however, comes from one practitioner post with no ADK version pinned, no upstream issue or vendor confirmation, and no independent reproduction, so the framework-level generalisations rest on the author's own testing.
One practitioner project across three clouds
The only observed usage is the author's own project: one ADK agent on Cloud Run, one Strands agent on Bedrock AgentCore, one Agent Framework agent on Container Apps, all speaking A2A v1.0, plus a coordinator and a newly added parity test. Nothing in the supplied material shows other teams hitting the card defect, downstream fixes shipping, or any measure of how widely to_a2a() is used in production.
Slightly overstated by generalisation
The writing is technical and mostly proportionate: the mitigation is modest and the author flags that the defect only appears with a deployment plus a non-Google caller. The mild overstatement is one of scope — a single unverified project is generalised into framework-level statements about ADK's client, ADK's tests and Microsoft's executor, and the headline framing implies broad breakage that no version pinning, upstream issue or second observer supports.
Practitioner post promoting its own project
The author writes as a hands-on builder, links their own project repository ('The code is here'), and publishes on a developer platform; the incentive visible in the material is attention for their own multi-cloud agent project and their debugging findings. No sponsorship, vendor commissioning, funding or commercial dependency is disclosed in the supplied source, and the post criticises rather than promotes the framework it uses, so commercial pull appears low.
Moderate: reproducible detail, no corroboration
Confidence is held down by single-source, single-publisher coverage with no vendor or upstream confirmation and no version pinning, and held up by artifact-level specificity (card JSON, exception text, carrier behaviour, word counts) that a reader can verify independently against a live deployment.
build
Three clouds, one protocol, no stored credentials: the runtime becomes a swappable part1 distinct publisher
build
A2A holds on the wire. ADK, Strands and Agent Framework are still not substitutable.1 distinct publisher
invest
Microsoft's Idle AI Chips Are A Construction Problem, Not A Shortage1 distinct publisher
build
Agent Plugins 1.0.0 standardises file paths. Anthropic still owns the behaviour.1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 23, 2026