A2A vs MCP: două protocoale, două probleme diferite
Marți dimineață, un inginer mă întreabă pe Talk: „pot folosi MCP în loc de A2A ca să conectez agenții între ei?". Răspuns scurt: nu.
A2A vs MCP: două protocoale, două probleme diferite
Marți dimineață, un inginer mă întreabă pe Talk: „pot folosi MCP în loc de A2A ca să conectez agenții între ei?”. Răspuns scurt: nu. Lungi: sunt protocoale complementare, nu interschimbabile, iar confuzia asta costă săptămâni de refactor.
Model Context Protocol (MCP), publicat de Anthropic, rezolvă problema agent-către-unealtă: cum conectezi un LLM la o bază de date, un filesystem sau un API extern. Agent2Agent (A2A), introdus de Google în aprilie 2025 și donat ulterior Linux Foundation, rezolvă problema agent-către-agent: cum negociază două sisteme autonome o sarcină pe care niciunul nu o poate termina singur.
Când folosești fiecare
MCP e protocolul potrivit când agentul tău are nevoie să citească un fișier, să interogheze Postgres sau să cheme un endpoint REST. Serverul MCP expune resurse și unelte tipizate, clientul (de obicei LLM-ul) le descoperă prin introspecție. E un contract rigid, deterministic, cu schema JSON clară.
A2A intră în joc când ai doi sau mai mulți agenți cu capabilități distincte care trebuie să colaboreze: un agent de research face discovery, altul face scoring, al treilea generează raportul. Fiecare are un „Agent Card” (specificația publică) care declară ce poate face, iar negocierea sarcinii e asincronă, cu stare partajată.
# agent-card.json — fragment real
name: "aegis-triage-agent"
version: "1.2.0"
capabilities:
- skill: "soc.alert.enrich"
input_schema: "alert.v1"
streaming: true
- skill: "soc.alert.correlate"
input_schema: "alert.v1"
auth:
schemes: ["oauth2", "mtls"]
endpoint: "https://aegis.caitech.ro/a2a/v1"
De ce nu sunt interschimbabile
Diferența fundamentală e în modelul de stare. MCP e stateless pe partea de protocol — fiecare call e independent, serverul nu reține context între apeluri. A2A e stateful prin design: un „task” are id, trece prin stări (submitted → working → input-required → completed), poate dura ore și acceptă update-uri incrementale prin streaming SSE.
A doua diferență: autoritatea. În MCP, agentul decide ce unealtă cheamă; serverul execută. În A2A, agenții negociază — unul poate refuza o sarcină, poate cere clarificări, poate propune o descompunere alternativă. E diferența dintre a chema o funcție și a trimite un mesaj unui coleg.
A treia: descoperirea. MCP folosește tools/list pentru a enumera capabilități runtime. A2A folosește Agent Cards publicate la /.well-known/agent.json, ceea ce permite discovery federativ între organizații — un pattern care contează pentru NIS2 Art. 21 când colaborezi cu CSIRT-uri externe.
Poziția noastră
În AEGIS rulăm ambele: MCP pentru conectarea agenților la Elastic, VirusTotal și baza de incidente; A2A pentru coordonarea între agentul de triage, cel de correlation și cel de response. Când am testat să forțăm totul prin MCP, am pierdut streaming-ul de progres și posibilitatea ca un agent să refuze argumentat o sarcină — exact lucrurile care fac diferența între demo și producție. Pentru decizia „un singur LLM sau mai mulți agenți”, vezi analiza noastră despre când merită un orchestrator pe proces.
Regula noastră operațională: MCP pentru unelte, A2A pentru colegi. Dacă entitatea din partea cealaltă poate zice „nu”, e A2A.