/ a2a · agent2agent protocol

Let other agents call
your tools as governed skills

A2A (Agent2Agent) is the platform's second AI-facing protocol, alongside MCP: the same governed tool catalog, opened up so other AI agents — not just chat clients — can discover and call it directly, under the same identity, credentials, and audit controls.

Two agent kinds, one directoryMicrosoft Agent FrameworkSame governance, credentials, and audit as MCP
Two agent kinds

One Agent Directory,
two ways to answer a call

A registered agent's Kind decides what actually executes when a caller reaches it — set once at registration, immutable afterward.

Concentrator — proxy to a real peer

Register a remote A2A agent, bound to an existing target system and authentication profile — the same building blocks every downstream HTTP/SOAP API already uses. The platform ingests and caches the remote agent's Agent Card, then exposes it two ways: composed into a client's own composite card, or reachable directly at its own per-agent route. Nothing about registering an agent grants it network reach or credentials on its own — both exposure paths start closed until an admin opts them in.

Hosted Agent — LLM-backed, runs locally

The other kind of registered agent executes inside the platform instead of proxying out. An admin defines one or more Skills — a name, a prompt, and an explicit, curated subset of individual tools drawn from the tenant's MCP toolsets and knowledge-base exposures — and a caller's message is handed to that skill's LLM turn, built on Microsoft Agent Framework. The LLM decides which tool to call and with what arguments, or asks a clarifying question instead of failing outright when the request is incomplete.

How Concentrator mode works

Five steps, one governed proxy

From registering a remote peer to a caller reaching it, without that caller — or the peer — ever holding a credential the platform doesn't already broker.

01
Register the agent

An admin registers a remote A2A agent by pointing it at an existing target system and authentication profile — the same two building blocks every downstream HTTP or SOAP API already uses. No new connection type, no credentials held anywhere else.

02
It starts fully closed

A newly registered agent is reachable by nothing until an admin explicitly opts it in — to direct passthrough, composite inclusion, or both. Registering an agent never grants access on its own.

03
Grant access

An access policy decides who may invoke the agent — optionally narrowed to one skill, one caller, or one client application. The most specific matching policy wins, mirroring how tool access is already governed.

04
Choose how it's exposed

Composite inclusion folds the agent's skills into a client's own unified Agent Card, indistinguishable from that client's local skills. Direct passthrough gives it its own dedicated route instead. Either, both, or neither.

05
Card stays fresh

The remote agent's published Agent Card is fetched and cached, refreshed on demand or on a recurring schedule — so a slow or briefly unreachable peer never blocks a caller from seeing what it offers.

Configuring Concentrator mode

Four things an admin
sets to bring a peer in

Registering a remote agent has no configuration surface of its own beyond what downstream connections and access policy already define — Concentrator mode reuses both.

/ Target & credentials

Reuse the connection you already trust

A registered agent is bound to an existing target system (its base URL) and authentication profile — nothing new to provision. It inherits outbound allow-list enforcement, credential storage, and rotation support the same way any downstream API already does.

agent.targetSystem: "partner-agent"
agent.authProfile:  "oauth-client-cred"
/ Access policy

Allow or deny, as narrow as you need

A policy can match on skill, caller, and client application — any left blank means "everyone" for that dimension. Several policies can apply to the same agent; the most specific match wins.

policy: skill? + caller? + clientApp?
decision: Allow | Deny
/ Exposure

Composite card or its own route

An admin turns on composite inclusion — the agent's skills merged into a client's unified Agent Card — direct passthrough at a dedicated route, both, or neither. Exposure only opens a route; every call on it still passes the access policy above.

exposure:
  compositeInclusion: true
  directPassthrough:  false
/ Card refresh

Cached, never queried live

The remote agent's Agent Card is cached and refreshed on demand or on a recurring schedule, so a slow or unreachable peer never blocks a caller. A failed refresh leaves the last good card in place rather than clearing it.

card.refresh: OnDemand | Scheduled
How a Hosted Agent turn works

Six steps, one governed conversation

From an incomplete request to a resumed, completed task, without the platform ever having to mechanically approximate whether a caller gave it enough information.

01
Define Skills

An admin gives a Hosted Agent a system prompt and an LLM connection, then authors one or more Skills — a name, a prompt fragment, and an explicit subset of individual tools drawn from the tenant's MCP toolsets and knowledge-base exposures. A skill's LLM turn can only ever see and invoke the tools assigned to it.

02
A caller sends a message

The message names the skill. The platform builds a reasoning agent scoped to exactly that skill's prompt and exactly that skill's tools — never the tenant's whole catalog, never another skill's tools.

03
The LLM decides

It calls a tool with chosen arguments, or — if the request is incomplete — asks a clarifying question instead. Recognizing insufficient information is inherent to the model's own tool-selection judgment; no separate detector exists.

04
Every tool call is governed

A tool the LLM invokes goes through the exact same authorization, credential resolution, downstream call, and audit pipeline a deterministic invocation uses. The LLM never gets a bypass path to a downstream API.

05
Incomplete requests pause, not fail

A request needing more information pauses the task instead of failing it. A credential-rejected downstream call (401/403) pauses it too, distinguishing “the request was wrong” from “the credentials need fixing.”

06
A follow-up resumes the same turn

The paused conversation's full state is serialized and persisted. A caller's follow-up, correlated by the original context id, resumes that exact session — nothing mechanically merges two partial payloads.

Configuring a Hosted Agent

Four things an admin
sets before a caller can reach it

A Hosted Agent has no configuration surface of its own beyond what MCP toolsets and ESRA already define — it reuses the connections, tools, and access policy you already manage, curated down to the shape a given Skill actually needs.

/ LLM connection

One prompt, your own model

An admin gives the Hosted Agent a system prompt and points it at an existing LLM connection — the same OpenAI-compatible or Azure OpenAI configuration the Portal already manages for enrichment. There is nothing new to stand up: the model choice, endpoint, and credentials are reused, not duplicated.

agent.systemPrompt: "…"
agent.llmConnection: "enrichment-gpt4o"
/ Skills

A name, a prompt, a curated toolset

Each Skill is the unit an admin designs around: a name a caller addresses directly, a short prompt fragment appended to the agent's own instructions for that skill's turns, and an explicit list of individual tools it may call. A skill can mix tools from several MCP toolsets — one skill can bundle several search tools while deliberately leaving out the write-shaped ones.

skill: "search-job-postings"
tools: [jobs.search, jobs.getById, …]
/ Tool & knowledge-base curation

Nothing granted by accident

Tools come from the tenant's existing MCP toolsets and ESRA knowledge-base exposures — never a whole toolset at once, never automatically. An admin opts a toolset or ESRA exposure in for Hosted Agent use, then hand-picks which of its tools a given skill actually gets.

toolset.visibility:
  "McpClientsOnly" |
  "HostedAgentsOnly" |
  "Both"
/ Access policy

Same rules, one governance model

A Hosted Agent invocation is authorized through the same access-policy check as every other registered agent — agent, optionally narrowed to a skill, caller, and client application — so nothing about turning an agent LLM-backed changes who is allowed to reach it.

policy: agent + skill? + caller + clientApp
Security & governance

An LLM with tool access is
a new risk surface, this is the control set

A2A adds no separate governance surface. Authentication, access policy, audit, and tenant isolation are the platform's — Hosted Agent mode just uses them, plus two mandatory structural defenses against prompt injection.

Structural tool scoping

The LLM can't reach what it wasn't given

  • A skill's tools are an explicit, curated subset — never the whole catalog
  • Never another skill's tools, even on the same agent
  • Bounds the blast radius of a successful prompt injection regardless of what the message says
Message-role separation

The caller's text can't rewrite the system prompt

  • Admin-authored instructions and caller text travel on distinct channels
  • Caller-supplied text is submitted only as the conversation's user turn
  • Neither layer alone is sufficient — both are mandatory
No bypass, ever

Every tool call is the same governed call

  • Every LLM-invoked tool call goes through the same authorization and credential brokering
  • The LLM never gets its own path to a downstream API
  • Every turn is audited with its actual decision — tool chosen, question asked, tokens spent
Documentation

Read the full spec

Five documents covering discovery, task lifecycle, concentrator mode, Hosted Agent mode, and push notifications.

Licensing

Included on every plan

A2A is not licensed separately, in either mode. It runs inside your licensed Runtime capacity, alongside MCP, on Starter, Team, and Enterprise alike.

See pricing Request a technical walkthrough