"매 agent 가 다른 agent 와 모델/벤더 차이 없이 task 를 위임/협상/결과 교환 하기 위한 open protocol." Google 이 2025 봄 announce, 2025-06 Linux Foundation 으로 stewardship 이전, 2026 현재 Anthropic / Microsoft / Salesforce 등 50+ 기업 adoption. 매 MCP (tool/data) 와 directly complementary — 매 A2A 는 agent ↔ agent, MCP 는 agent ↔ tool.
매 핵심
매 5 design principles
Agentic by default: 매 agent autonomy 를 가정 (매 mere RPC 가 아님).
Modality-agnostic: 매 text / audio / video / structured data 모두 transport.
Built on web standards: HTTP + JSON-RPC 2.0 + SSE / WebSocket — 매 separate runtime 불필요.
Secure by design: OAuth 2.1, 매 mTLS, 매 capability scoping.
Long-running task aware: 매 minutes ~ days 의 async task — 매 polling + push-notification 모두 지원.
매 핵심 primitives
AgentCard (/.well-known/agent.json): 매 agent 의 capability advertisement.
Task: 매 unit of work — submitted → working → input-required → completed/failed/canceled.
Message + Artifact: 매 conversation chunk + 매 final output.
Streaming: SSE 로 매 partial token / 매 status update 전송.
{"name":"claude-research-agent","version":"1.2.0","url":"https://api.example.com/a2a","capabilities":{"streaming":true,"pushNotifications":true,"stateTransitionHistory":true},"skills":[{"id":"deep-research","description":"Multi-source web research","inputModes":["text"],"outputModes":["text","file"]}],"auth":{"type":"oauth2.1","scopes":["task:submit"]}}
2) Task 제출 (client agent)
importhttpx,uuidresp=httpx.post("https://api.example.com/a2a/tasks/send",json={"jsonrpc":"2.0","id":"1","method":"tasks/send","params":{"id":str(uuid.uuid4()),"message":{"role":"user","parts":[{"type":"text","text":"Summarize Q4 earnings of NVDA."}]}}},headers={"Authorization":f"Bearer {token}"})task=resp.json()["result"]
fromfastapiimportFastAPIapp=FastAPI()@app.post("/a2a/tasks/send")asyncdefsend(req:dict):task_id=req["params"]["id"]# 매 background worker 에게 dispatchawaitqueue.put((task_id,req["params"]["message"]))return{"jsonrpc":"2.0","id":req["id"],"result":{"id":task_id,"status":{"state":"submitted"}}}
6) Multi-agent orchestration (A2A + MCP combo)
# Orchestrator agent: A2A 로 specialist 호출, MCP 로 tool 사용research=awaita2a_call("research-agent",query)draft=awaitclaude.messages.create(# MCP tools attachedmodel="claude-opus-4-7",tools=mcp_tools,messages=[{"role":"user","content":f"Draft based on: {research}"}])
7) Capability negotiation
card=httpx.get(agent_url+"/.well-known/agent.json").json()ifnotcard["capabilities"]["streaming"]:# 매 polling fallbackuse_polling=True
매 결정 기준
상황
Approach
매 agent ↔ tool / data
MCP
매 agent ↔ agent (cross-vendor)
A2A
매 same-process agent
Direct call (no protocol)
매 long-running (>30s)
A2A + push notification
매 strict typing 필요
A2A + JSON Schema in skill spec
기본값: 매 cross-org / cross-vendor agent collaboration 에 매 A2A, 매 internal tool wiring 은 매 MCP.
언제: 매 multi-vendor agent stack 의 interop, 매 long-running specialist agent 의 호출.
언제 X: 매 single-process tool 호출 (매 MCP 를 사용), 매 latency-critical (<50ms) 의 inner loop.
❌ 안티패턴
A2A 로 tool 호출: 매 MCP scope. 매 protocol 혼동.
No AgentCard: 매 capability 알려주지 않으면 매 client 가 fallback 못함.
Sync polling on long task: 매 push notification 또는 SSE 필수.
Token leakage: 매 webhook URL 의 token 검증 누락.
🧪 검증 / 중복
Verified (a2aproject.org spec v0.3, Linux Foundation A2A Project 2025-06-23, Anthropic A2A blog 2025).