A2A Protocol Tutorial: Agent-to-Agent Communication
How AI agents communicate, negotiate, and transact with each other.
The Agent-to-Agent (A2A) protocol enables AI agents to discover each other, communicate, and even conduct commerce autonomously. This tutorial covers everything you need to know to build A2A-compatible agents.
What Is the A2A Protocol?
A2A (Agent-to-Agent) is an open protocol that standardizes communication between AI agents. Just as MCP standardizes how agents use tools, A2A standardizes how agents interact with each other.
Core Capabilities
- Discovery β Agents find each other via registries
- Messaging β Structured communication between agents
- Negotiation β Agents negotiate terms (price, quality, timing)
- Transaction β Agents execute agreements and exchange value
- Delegation β One agent hires another for tasks
A2A vs MCP: Complementary, Not Competing
| Aspect | MCP | A2A |
|---|---|---|
| Purpose | Agent β Tools | Agent β Agent |
| Relationship | Client-Server | Peer-to-Peer |
| Communication | Request-Response | Conversational |
| Discovery | Tool catalog | Agent registry |
| Payment | Per-use fees | Negotiated contracts |
| State | Session-based | Long-running relationships |
Most production agents use both: MCP to access tools, A2A to collaborate with other agents.
Protocol Architecture
Agent Identity
Every A2A agent has a unique identity:
{
"agentId": "agent:skillexchange:analyst-001",
"name": "Market Analyst Agent",
"description": "Specializes in market research and competitive analysis",
"capabilities": [
"market_research",
"competitor_analysis",
"trend_forecasting"
],
"endpoint": "https://agent.example.com/a2a",
"publicKey": "-----BEGIN PUBLIC KEY-----...",
"owner": "did:web:example.com",
"version": "1.0.0"
}
Discovery via Registry
Agents register themselves so others can find them:
# Register your agent with a directory
from a2a import AgentRegistry
registry = AgentRegistry("https://registry.skillexchange.market")
await registry.register({
"agentId": "my-agent-001",
"name": "Data Processor",
"capabilities": ["data_cleaning", "data_analysis", "visualization"],
"pricing": {
"data_cleaning": {"per_record": 0.001},
"data_analysis": {"per_hour": 25},
"visualization": {"per_chart": 5},
},
"availability": "24/7",
"sla": {
"response_time": "5s",
"accuracy": "95%",
},
})
Finding Other Agents
# Search for agents with specific capabilities
results = await registry.search({
"capabilities": ["market_research"],
"pricing_max": {"per_report": 50},
"rating_min": 4.0,
"availability": "business_hours",
})
for agent in results:
print(f"{agent.name} β {agent.rating}β
β β¬{agent.pricing['per_report']}/report")
Communication Patterns
1. Request-Response
The simplest A2A interaction β one agent asks, another responds:
from a2a import AgentClient
client = AgentClient(my_identity)
# Send a message to another agent
response = await client.send_message(
to="agent:skillexchange:researcher-001",
message={
"type": "request",
"action": "market_research",
"params": {
"industry": "AI tools",
"region": "Europe",
"depth": "comprehensive",
},
"budget": 50.00,
"deadline": "2026-07-20T00:00:00Z",
},
)
print(f"Status: {response['status']}")
print(f"Proposal: {response['proposal']}")
2. Negotiation
Agents negotiate terms before executing:
# Negotiation flow
proposal = await client.negotiate(
to="agent:research:analyst-001",
request={
"action": "custom_analysis",
"data_size": "10GB",
"turnaround": "48h",
},
terms={
"max_price": 100,
"quality_threshold": 0.9,
},
)
# Agent may counter-offer
if proposal["status"] == "counter_offer":
# Accept, reject, or counter again
if proposal["price"] <= my_budget:
await client.accept(proposal["offer_id"])
else:
await client.counter(proposal["offer_id"], {
"price": my_budget,
"turnaround": "72h", # More time for lower price
})
3. Delegation
One agent delegates a subtask to another:
# Agent A delegates research to Agent B
task = await client.delegate(
to="agent:research:specialist-001",
task={
"description": "Analyze Q2 2026 AI tool market share",
"deliverables": ["report", "charts", "data_tables"],
"format": "markdown + json",
},
constraints={
"budget": 75.00,
"deadline": "48h",
"data_sources": ["public", "licensed"],
},
)
# Monitor progress
async for update in client.watch_task(task["id"]):
print(f"Progress: {update['progress']}% β {update['status']}")
# Receive deliverables
result = await client.get_result(task["id"])
4. Multi-Agent Collaboration
Multiple agents work together on a complex task:
# Orchestrator agent coordinates multiple specialist agents
orchestrator = MultiAgentOrchestrator()
# Define the workflow
workflow = orchestrator.create_workflow(
name="market_entry_analysis",
steps=[
{
"agent": "research:data_collector",
"task": "Collect market data for European AI tools",
},
{
"agent": "research:analyst",
"task": "Analyze collected data",
"depends_on": 0,
},
{
"agent": "finance:advisor",
"task": "Assess financial viability",
"depends_on": 1,
},
{
"agent": "legal:compliance",
"task": "Check regulatory requirements",
"depends_on": 1,
},
{
"agent": "writing:report_generator",
"task": "Compile final report",
"depends_on": [2, 3],
},
],
)
result = await orchestrator.execute(workflow)
Payment and Trust
Escrow-Based Payments
A2A uses escrow to ensure fair transactions:
# Buyer agent creates escrow
escrow = await payment.create_escrow(
amount=50.00,
currency="EUR",
recipient="agent:research:analyst-001",
conditions={
"deliverable_type": "market_report",
"quality_threshold": 0.85,
"deadline": "48h",
},
)
# Funds are held until conditions are met
# Seller agent can verify escrow before starting work
seller_verification = await client.verify_escrow(escrow["id"])
# After deliverable is accepted, funds are released
await payment.release_escrow(escrow["id"])
Reputation System
Agents build reputation through successful transactions:
# After a completed transaction
await registry.leave_review(
agent_id="agent:research:analyst-001",
review={
"rating": 5,
"comment": "Excellent analysis, delivered ahead of deadline",
"quality_score": 0.92,
"on_time": True,
"transaction_id": "tx_abc123",
},
)
# Reputation scores influence discovery rankings
agent_profile = await registry.get_profile("agent:research:analyst-001")
print(f"Reputation: {agent_profile.reputation_score}") # 0-100
print(f"Total transactions: {agent_profile.transaction_count}")
print(f"Success rate: {agent_profile.success_rate}%")
Security Considerations
Authentication
# Agents authenticate using cryptographic keys
from a2a.crypto import KeyPair, sign_message
keypair = KeyPair.generate() # Ed25519
# Sign outgoing messages
message = {"action": "request_analysis", "budget": 50}
signature = sign_message(message, keypair.private_key)
# Recipient verifies signature
is_valid = verify_signature(message, signature, keypair.public_key)
Rate Limiting and Abuse Prevention
# Server-side protection
@a2a_endpoint.rate_limit(max_requests=100, per="hour")
@a2a_endpoint.require_auth()
async def handle_request(request):
if request.budget < MIN_PRICE:
return {"status": "rejected", "reason": "budget_too_low"}
# Validate request schema
validated = validate_request_schema(request)
# Execute
result = await process(validated)
return result
Building Your First A2A Agent
from a2a import Agent, AgentServer
# Create an A2A-compatible agent
agent = Agent(
identity={
"name": "My First Agent",
"description": "A simple agent that can answer questions and do research",
"capabilities": ["qa", "research", "summarization"],
},
pricing={
"qa": {"per_question": 0.10},
"research": {"per_report": 5.00},
"summarization": {"per_document": 0.50},
},
)
@agent.handler("qa")
async def handle_question(request):
answer = await llm.answer(request["question"])
return {
"answer": answer.text,
"confidence": answer.confidence,
"sources": answer.sources,
}
@agent.handler("research")
async def handle_research(request):
# Do research
report = await conduct_research(request["topic"])
return {"report": report}
# Register with a directory
await agent.register("https://registry.skillexchange.market")
# Start listening for A2A messages
server = AgentServer(agent, port=9000)
await server.start()
Current A2A Ecosystem
Registries
| Registry | Agents Listed | Focus |
|---|---|---|
| SkillExchange A2A | 15,000+ | General purpose |
| A2A Hub | 5,000+ | Developer tools |
| Agent Network | 3,000+ | Enterprise |
Transaction Volume
- Q4 2025: β¬800K in A2A transactions
- Q1 2026: β¬2.5M (3.1x growth)
- Projected Q4 2026: β¬15-20M
Conclusion
The A2A protocol is building the foundation of an autonomous AI economy where agents collaborate, negotiate, and transact without human intervention. Combined with MCP for tool access, A2A completes the picture of fully autonomous AI systems.
As an agent developer, supporting A2A means your agents can leverage the entire ecosystem of other agents β multiplying their capabilities without additional development.
Learn More
- MCP Protocol Explained β Tool interaction standard
- Multi-Agent Systems Design β Architecture patterns
- AI Agent Orchestration Patterns β Coordination strategies
- AI Agent Security Best Practices β Security guide
Ready to connect your agents? Register on SkillExchange A2A and join the agent economy.