Dissecting A2A's core architecture: the two roles of client agent and remote agent, the Agent Card as the discovery gateway, the Task lifecycle as the communication contract, Message/Part for multimodal content, and the four protocol bindings JSON-RPC, HTTP, gRPC, and SSE.

In episode 1 we understood why A2A was born: agents from different frameworks need a shared language, and interaction was chosen to be as opaque peers. Now it's time to see how this protocol is structured.
Episode 2 is a concept map. You'll understand the two main roles — client agent and remote agent — and then the four building blocks: Agent Card, Task, Message/Part, and protocol bindings. Each block will be dissected more deeply in episodes 3 to 5, so focus on how everything fits together into one flow.
The entire A2A architecture rests on two roles:
It's important to understand: these roles are not permanent. An agent can be a client in one collaboration and a remote agent in another. This is the peer-to-peer nature we discussed in episode 1 — there's no permanent hierarchy between the two roles.
Client Agent --(1) fetch Agent Card--> Server endpoint
Client Agent --(2) send task--------> Remote Agent
Remote Agent --(3) reply status------> Client Agent
Remote Agent --(4) send result-------> Client AgentBefore sending a task, a client agent must discover and understand the remote agent. This is where the Agent Card comes in — a JSON document the remote agent publishes at its public URL. Its contents describe who the agent is and what it can do:
{
"name": "Agent Dukungan",
"description": "Membantu troubleshooting produk",
"url": "https://dukungan.example.com",
"capabilities": {
"streaming": true
}
}The concept is exactly analogous to OpenAPI: before calling an API, a client reads its spec. The difference is that the Agent Card focuses on agent capabilities, not just a list of endpoints. Episode 3 will dissect every field. To see a card in its raw form, try curl -s https://dukungan.example.com/.well-known/agent-card.
A single unit of work in A2A is called a Task. The Task is the "thread" that connects the entire conversation between the client and the remote agent. Each task has an identifier, a status, and a message history.
{
"id": "task-123",
"status": {
"state": "working"
},
"messages": []
}The task status flows through a state machine: from submitted, it becomes working, can stop at input-required if the agent needs additional information, and ends at completed, failed, or canceled. We'll dissect this state machine completely in episode 4.
A conversation within a task is represented as a sequence of Messages, and each message contains one or more Parts. The beauty of this model: content is not limited to text.
| Part Type | Example |
|---|---|
| text | instructions, explanations, concise results |
| file | report PDFs, images, documents |
| structured | schema'd JSON data |
An agent can send a result made up of text plus a CSV file plus structured data in a single message. This multimodal capability is what sets A2A apart from a plain text API — and we'll put it into practice in episode 8.
A2A doesn't bind itself to a single transport. Its data model is defined over JSON-RPC 2.0, but it can be carried over several bindings:
This separation between the data model and transport makes A2A flexible: the protocol logic doesn't change when you move from HTTP to gRPC. This is one reason its design has survived to v1.0.
Info
Don't be confused by the term "binding" here. A binding is simply the way JSON-RPC messages are wrapped into a particular transport — the message content stays the same, only the wrapper changes.
Now let's assemble all the blocks into one complete flow. An A2A collaboration runs like this:
message/send method over the JSON-RPC over HTTP binding.submitted to working.completed status, carrying the final multimodal result.tasks/get method.Technically, step two looks like this over HTTP:
curl -s -X POST https://dukungan.example.com \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"message/send","params":{"message":{"role":"user","parts":[{"text":"Bantu analisis log error"}]}}}'All these steps work without the client ever seeing the remote agent's internal state, memory, or tools — consistent with the opacity principle we learned in episode 1.
Here's the core takeaway:
In episode 3 we dissect the first component thoroughly: Agent Card & discovery — from the agentName, description, capabilities, skills, and authentication fields to the signed security cards in v1.0. You'll learn to read and write your own Agent Card. See you there!