The card of a hosted agent can be read only with a credential, so Add agent
asks for the sign-in before it reads the card.
Sign-in
A hosted agent accepts only its own cloud’s credential. AWS IAM (SigV4), Microsoft Entra ID and Google service account each offer these credentials:
On a SaaS gateway, Assume a role requires the External ID that the role’s
trust policy requires. Without one, anyone who knew another organisation’s role
ARN could have the gateway assume it. Use the gateway’s AWS identity is not
offered there. On a gateway served by your own data plane the external id is
optional.
A cloud credential is sent only over HTTPS, and only to the host derived for the
agent. Secrets are encrypted at rest and masked when read back.
When calls go as the user
With as the user sign-in there is no user when the agent is added, yet its card still needs a credential. Reading the card asks for an application credential, used only to read the card:- AgentCore: OAuth client credentials (
card_auth: "client_credentials"). - Foundry: a Microsoft Entra ID credential (
card_auth: "cloud"withcloud_auth.azure).
-32093.
Amazon Bedrock AgentCore
On AWS:- Deploy the agent to an AgentCore runtime with the A2A protocol.
- Set the runtime’s inbound authorization to match the sign-in: IAM for AWS IAM (SigV4), or a JWT authorizer that accepts the tokens of the OAuth client or the identity provider you choose in TrustGate.
- For SigV4, allow the AWS identity TrustGate uses to invoke the runtime. For an assumed role, put the external id in its trust policy.
arn:aws:bedrock-agentcore:{region}:{account}:runtime/{id}) and an optional
Endpoint qualifier (default DEFAULT). The region comes from the ARN.
As the user, signed by TrustGate is not offered: AgentCore cannot validate a
token TrustGate signs yet. No sign-in and API key in a header are refused
too.
Sessions. Every call carries
X-Amzn-Bedrock-AgentCore-Runtime-Session-Id. Messages of one A2A context reuse the
session the gateway recorded with that context; a new conversation gets a new
one. A caller cannot choose the session.
Errors. AgentCore answers JSON-RPC errors with their real HTTP status. The
gateway relays the agent’s error over HTTP 200, and:
- a
401that asks for authentication is-32093; - a
403with no JSON-RPC error (the signature refused) is-32092upstream_auth_failed; -32054Session operation in progress is retried twice, after 100 ms and 400 ms, on calls that are not streams. AgentCore did not process the call, so a retry does not repeat work.
Microsoft Foundry
On Azure:- Enable the
a2aprotocol on the agent’s endpoint. - Give the identity TrustGate uses the Foundry Agent Consumer role on the project. For on-behalf-of, the users need it.
https://ai.azure.com/.default, even to read the card.
In TrustGate: the Project endpoint
(https://{account}.services.ai.azure.com/api/projects/{project}) and the
Agent name.
Versions. Foundry serves 1.0 and 0.3 on the same endpoint; 0.3 is in preview
on Foundry. The default is 1.0. Every call carries
A2A-Version with the pinned
version, because Foundry answers 0.3 to a request that names none.
Limits. Foundry’s A2A endpoint takes text only and does not stream: streaming
and subscribe methods answer -32004 without reaching it.
Google Vertex AI Agent Engine
On Google Cloud:- Deploy the agent to Agent Engine as an
A2aAgent. - Give the service account TrustGate uses an IAM role on the project that allows it to query the Agent Engine.
us-central1) and the Agent Engine ID, the number at the end of the resource
name. The gateway calls
https://{location}-aiplatform.googleapis.com/v1beta1/projects/{project}/locations/{location}/reasoningEngines/{id}/a2a
and reads the card at /v1/card under it.
There is no as the user option: the token is always the service account’s.
HTTP+JSON. Vertex AI serves A2A 0.3 over HTTP+JSON only. Callers still speak
JSON-RPC 0.3 to the gateway, which sends each method as its REST request and wraps
the answer as the JSON-RPC
result. The card a caller gets names JSON-RPC at the
gateway’s URL.
From the API
Setprovider and the object named after it instead of card_url and url, and
auth.mode: "cloud" with cloud_auth:
preview-agent-card takes the same fields and uses the credentials for that read
only. A sign-in another cloud’s agent would need, or a card_url on a hosted
agent, is refused with 422 and a message naming what the agent accepts. The
response carries the derived endpoint and cloud_auth with secrets masked.