Ir al contenido

A2A Protocol

Companion del AI-First Engineering Framework v7.4.0

Version: 1.0.0 | Fecha: Marzo 2026 Fuentes: Google A2A Spec (2025), Linux Foundation (2025-2026), Framework MCP Integration Guide

Agent2Agent (A2A) es un protocolo abierto creado por Google (Abril 2025) y donado a la Linux Foundation, que estandariza la comunicacion entre agentes AI de distintos proveedores, frameworks y organizaciones.

A2A vs MCP: complementarios, no competidores

Sección titulada «A2A vs MCP: complementarios, no competidores»
┌───────────────────────────────────────────────┐
│ Tu Sistema AI │
│ │
│ ┌────────┐ A2A Protocol ┌────────┐ │
│ │Agent A │◄──────────────────►│Agent B │ │
│ └───┬────┘ agent↔agent └───┬────┘ │
│ │ MCP (agent↔tools) │ MCP │
│ ▼ ▼ │
│ ┌────────┐ ┌────────┐ │
│ │ Tools │ │ Tools │ │
│ └────────┘ └────────┘ │
└───────────────────────────────────────────────┘
AspectoMCPA2A
RelacionAgent ↔ Tools/ResourcesAgent ↔ Agent
PropositoDar capacidades al agenteCoordinar trabajo entre agentes
Descubrimiento.well-known/mcp.json.well-known/agent.json
TransporteJSON-RPC sobre stdio/HTTPHTTP + JSON-RPC, SSE
EstadoStatelessStateful (Tasks con lifecycle)
CreadorAnthropic (2024)Google (2025) → Linux Foundation
EscenarioProtocolo
Agente necesita buscar en base de datosMCP
Agente necesita que otro agente analice datosA2A
Agente necesita leer archivos de configuracionMCP
Dos agentes negocian un plan de trabajoA2A
Agente delega sub-tarea a agente de QAA2A

PrimitivaDescripcion
Agent CardMetadata publica del agente: identidad, capacidades, autenticacion
TaskUnidad de trabajo con lifecycle (created → working → completed/failed/cancelled)
MessageComunicacion dentro de una Task entre agentes
ArtifactResultado producido por el agente (archivos, datos estructurados)
PartComponente atomico de un Message o Artifact (texto, archivo, datos)
StreamingActualizaciones en tiempo real via SSE durante ejecucion de Task
Push NotificationNotificacion asincrona de cambio de estado de Task
Client Agent Server Agent
│ 1. GET /.well-known/agent.json │
│────────────────────────────────────►│
│◄────────────────────────────────────│ 2. Agent Card
│ 3. POST /tasks/create │
│────────────────────────────────────►│
│◄────────────────────────────────────│ 4. Task {status: working}
│ 5. GET /tasks/{id} │
│────────────────────────────────────►│
│◄────────────────────────────────────│ 6. Task {status: completed, artifacts}

El Agent Card es el documento de identidad de un agente A2A. Se publica en /.well-known/agent.json para discovery automatico.

CampoTipoReqDescripcion
namestringSiNombre del agente
descriptionstringSiQue hace el agente
versionstringNoVersion semver
urlstringNoURL base del agente
capabilitiesarrayNoCapacidades con schemas de I/O
skillsarrayNoHabilidades categorizadas
authenticationobjectNoTipo de auth requerida
supported_protocolsarrayNoProtocolos: a2a, mcp, rest, grpc
constraintsobjectNoLimites: RPM, concurrencia, tamano
providerobjectNoOrganizacion, contacto, docs URL
{
"name": "data-analyst-agent",
"description": "Agente de analisis de datos y generacion de reportes",
"version": "1.2.0",
"url": "https://mi-agente.ejemplo.com",
"capabilities": [{
"name": "analyze_dataset",
"description": "Analiza un dataset y produce insights",
"input_schema": { "type": "object", "properties": { "data_url": { "type": "string" } } },
"output_schema": { "type": "object", "properties": { "insights": { "type": "array" } } }
}],
"authentication": { "type": "oauth2", "required": true },
"supported_protocols": ["a2a", "rest"],
"skills": [
{ "id": "statistical-analysis", "name": "Analisis Estadistico", "description": "Regresion, correlacion" }
],
"constraints": { "rate_limit_rpm": 60, "max_concurrent_tasks": 5, "max_message_size": 10485760 },
"provider": { "organization": "Mi Empresa", "contact": "ai-team@miempresa.com" }
}

created → working → completed
→ failed
→ cancelled
EstadoDescripcion
createdTask recibida, pendiente de inicio
workingAgente procesando la tarea
completedTarea terminada con exito, artifacts disponibles
failedTarea fallida con mensaje de error
cancelledTarea cancelada por cliente o servidor
OperacionMetodoEndpoint
CrearPOST/tasks/create
ConsultarGET/tasks/{id}
CancelarPOST/tasks/{id}/cancel
Enviar mensajePOST/tasks/{id}/messages
StreamingGET/tasks/{id}/stream (SSE)
GET /tasks/{id}/stream
Accept: text/event-stream
event: status
data: {"status": "working", "progress": "Analizando 50,000 registros..."}
event: artifact
data: {"name": "resultado.json", "parts": [{"type": "text", "text": "..."}]}
event: status
data: {"status": "completed"}

AmenazaMitigacionOWASP
Suplantacion de identidadVerificacion Agent Card + TLSASI-03
Inyeccion de prompts via mensajesInput validation + sanitizacionASI-01
Exfiltracion de datos via artifactsClasificacion de datos + DLPASI-07
Denegacion de servicioRate limiting + circuit breakersASI-09
Escalacion de privilegiosAutorizacion granular por capabilityASI-03
TipoUso recomendado
oauth2Produccion, multi-tenant
bearerAPIs internas, service-to-service
api_keyDesarrollo, integraciones simples
noneSolo desarrollo local (nunca produccion)
seguridad_a2a:
transporte:
- tls_obligatorio: true
- certificados_validos: true
autenticacion:
- tipo_configurado: true # oauth2 | bearer | api_key
- credenciales_rotadas: true
- tokens_con_expiracion: true
autorizacion:
- capabilities_restringidas: true # Solo exponer lo necesario
- scopes_por_cliente: true
- audit_log_habilitado: true
input_validation:
- schemas_validados: true
- tamano_maximo: true # max_message_size en constraints
- sanitizacion_prompts: true
rate_limiting:
- rpm_configurado: true
- concurrent_tasks_max: true
- circuit_breaker: true

F04 — Architecture: Agent Cards como componentes

Sección titulada «F04 — Architecture: Agent Cards como componentes»
Artefacto F04Relacion con A2A
ai_partition_map.yamlDefinir que particiones se exponen como agentes A2A
integration_map.yamlRegistrar integraciones A2A como tipo a2a
a2a_agent_cards.yamlNuevo: catalogo de agent cards del proyecto

F05 — Contracts: Agent Cards SON contratos

Sección titulada «F05 — Contracts: Agent Cards SON contratos»
Aspecto del contratoCampo en Agent Card
Operacionescapabilities[].name + description
Schema de entradacapabilities[].input_schema
Schema de salidacapabilities[].output_schema
Versionadoversion (semver)
Autenticacionauthentication
Limites de usoconstraints

Regla: cambios breaking en Agent Cards requieren version major.

CheckQue verificar
Auth configuradaauthentication.type != "none" en produccion
Rate limitingconstraints.rate_limit_rpm > 0
Capabilities minimasSolo exponer lo necesario
Input schemasToda capability con input_schema
TLSurl comienza con https://
Providerprovider.organization y contact presentes
MetricaAlerta
a2a_tasks_createdSpike > 2x promedio
a2a_tasks_failed> 5% del total
a2a_task_duration_p95> SLO definido
a2a_messages_per_task> 20 (posible loop)
a2a_auth_failures> 10 en 5 minutos

En un sistema bien arquitectado, MCP conecta agentes con herramientas y A2A conecta agentes entre si:

┌─────────────────────────────────────────────────┐
│ Factory OS │
│ │
│ ┌───────────┐ A2A ┌───────────┐ A2A │
│ │ FAB: Arch │◄────────►│ FAB: Build│◄────────┐ │
│ └─────┬─────┘ └─────┬─────┘ │ │
│ │ MCP │ MCP ┌────▼┐│
│ ▼ ▼ │ FAB ││
│ ┌──────────┐ ┌──────────┐ │ QA ││
│ │MCP: Docs │ │MCP: Git │ └──┬──┘│
│ │MCP: Search│ │MCP: Deploy│ │MCP│
│ └──────────┘ └──────────┘ ▼ │
│ ┌────────┐ │
│ │MCP:Test│ │
│ └────────┘ │
└─────────────────────────────────────────────────┘
PasoProtocoloAccion
Orchestrator delega arquitecturaA2ATask a Arch Agent
Arch Agent consulta framework docsMCPTool: search_framework_docs
Arch Agent devuelve ADRA2AArtifact: adr_001.md
Orchestrator delega buildA2ATask a Build Agent
Build Agent usa Git toolsMCPTools: git_commit, run_tests

Usar en project/F04_architecture/a2a_agent_cards.yaml:

project: "mi-proyecto"
version: "1.0.0"
agents:
- name: "mi-agente-principal"
description: "Descripcion de lo que hace el agente"
version: "1.0.0"
url: "https://mi-agente.ejemplo.com"
capabilities:
- name: "procesar_solicitud"
description: "Procesa una solicitud y devuelve resultado"
input_schema:
type: "object"
properties:
solicitud: { type: "string" }
required: ["solicitud"]
output_schema:
type: "object"
properties:
resultado: { type: "string" }
confianza: { type: "number" }
authentication:
type: "oauth2"
required: true
supported_protocols: ["a2a", "mcp"]
skills:
- id: "analisis"
name: "Analisis de Datos"
description: "Capacidad de analizar datasets"
constraints:
rate_limit_rpm: 60
max_concurrent_tasks: 5
max_message_size: 10485760
provider:
organization: "Mi Organizacion"
contact: "equipo-ai@miorg.com"
documentation_url: "https://docs.miorg.com/agentes"

Crear project/F04_architecture/a2a_agent_cards.yaml con las capacidades del agente.

# Endpoint .well-known/agent.json (ejemplo FastAPI)
@app.get("/.well-known/agent.json")
async def agent_card():
with open("project/F04_architecture/a2a_agent_cards.yaml") as f:
cards = yaml.safe_load(f)
return cards["agents"][0]
# Endpoints basicos A2A (ejemplo conceptual)
@app.post("/tasks/create")
async def create_task(req: TaskCreate):
task = {"id": generate_id(), "status": "created", "messages": [req.message]}
process_task_async(task["id"])
return task
@app.get("/tasks/{task_id}")
async def get_task(task_id: str):
return tasks.get(task_id)
@app.post("/tasks/{task_id}/cancel")
async def cancel_task(task_id: str):
tasks[task_id]["status"] = "cancelled"
return tasks[task_id]
Ventana de terminal
# Validar Agent Card contra schema
python3 baseline/scripts/artifact-validator.py -f project/F04_architecture/a2a_agent_cards.yaml

Registrar en project/F04_architecture/integration_map.yaml:

integrations:
- id: "INT-A2A-001"
name: "Agent A2A Principal"
type: "bidirectional"
protocol: "a2a"
endpoint: "https://tu-agente.com"
timeout_ms: 30000
circuit_breaker: true

10. Interoperabilidad con Google Agent Development Kit (ADK)

Sección titulada «10. Interoperabilidad con Google Agent Development Kit (ADK)»

Google Agent Development Kit (ADK) es un framework open-source (lanzado en 2025) para construir agentes AI que son nativamente compatibles con el protocolo A2A. ADK proporciona:

  • Scaffolding de agentes con Agent Card auto-generada
  • Runtime A2A integrado (servidor HTTP con endpoints /tasks/* y /.well-known/agent.json)
  • Orquestacion multi-agente con delegacion de tareas entre agentes ADK y no-ADK
  • Herramientas integradas (Google Search, Code Execution, MCP bridges)

ADK simplifica la creacion de agentes que pueden participar en ecosistemas A2A sin implementar el protocolo manualmente.

Como los FABs pueden exponer Agent Cards para discovery

Sección titulada «Como los FABs pueden exponer Agent Cards para discovery»

Un Fullstack Agent Builder (FAB) puede exponerse como agente A2A publicando su Agent Card en /.well-known/agent.json. El mapeo natural es:

Concepto FABCampo Agent Card A2A
Nombre del FAB (ej: fab-arch)name
Fases ADLC asignadas (ej: F01-F04)skills[].id → fase, skills[].description → alcance
Modelo base (ej: Claude Opus)Metadata en description
Permisos (.claude/settings.json)constraints + authentication
MCP tools configuradoscapabilities[] — una por herramienta expuesta
# Ejemplo: FAB expuesto como agente A2A
agents:
- name: "fab-architect"
description: "FAB especializado en fases F01-F04: estrategia, dominio, conocimiento, arquitectura"
version: "1.0.0"
url: "https://factory.ejemplo.com/agents/fab-architect"
capabilities:
- name: "generate_architecture"
description: "Genera ADRs y mapas de arquitectura desde requerimientos"
input_schema:
type: "object"
properties:
requirements: { type: "string" }
track: { type: "string", enum: ["full", "lean", "solo"] }
required: ["requirements"]
output_schema:
type: "object"
properties:
adrs: { type: "array" }
architecture_map: { type: "object" }
- name: "review_contracts"
description: "Revisa contratos F05 contra arquitectura definida"
input_schema:
type: "object"
properties:
contracts_path: { type: "string" }
skills:
- id: "f01-strategy"
name: "Estrategia"
description: "Problem statement, stakeholder analysis, human-agent responsibility"
- id: "f02-domain"
name: "Dominio"
description: "Domain model, bounded contexts, ubiquitous language"
- id: "f03-knowledge"
name: "Conocimiento"
description: "Knowledge graph, RAG pipeline design"
- id: "f04-architecture"
name: "Arquitectura"
description: "ADRs, integration maps, AI partition maps"
authentication:
type: "bearer"
required: true
supported_protocols: ["a2a", "mcp"]
constraints:
rate_limit_rpm: 30
max_concurrent_tasks: 3
max_message_size: 5242880
provider:
organization: "Factory OS"
contact: "factory-ops@ejemplo.com"

Para validar que un FAB puede interoperar con agentes ADK (o cualquier agente A2A):

1. Mock A2A Server — Simular un agente remoto para probar el cliente:

# mock_a2a_server.py — Servidor A2A minimo para testing
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
AGENT_CARD = {
"name": "mock-agent",
"description": "Agente mock para testing A2A",
"version": "1.0.0",
"capabilities": [{"name": "echo", "description": "Devuelve el input"}],
"authentication": {"type": "none"},
}
TASKS = {}
class A2AHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/.well-known/agent.json":
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(AGENT_CARD).encode())
elif self.path.startswith("/tasks/"):
task_id = self.path.split("/")[-1]
task = TASKS.get(task_id, {"status": "not_found"})
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(task).encode())
def do_POST(self):
if self.path == "/tasks/create":
content_len = int(self.headers.get("Content-Length", 0))
body = json.loads(self.rfile.read(content_len)) if content_len else {}
task_id = f"task-{len(TASKS) + 1}"
TASKS[task_id] = {
"id": task_id,
"status": "completed",
"artifacts": [{"type": "text", "text": f"Echo: {body}"}],
}
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(TASKS[task_id]).encode())
# Usar: python mock_a2a_server.py → escucha en localhost:8080
if __name__ == "__main__":
HTTPServer(("localhost", 8080), A2AHandler).serve_forever()

2. Validacion de Agent Card — Verificar que el Agent Card cumple el schema:

Ventana de terminal
# Validar contra el JSON Schema del framework
python3 baseline/scripts/artifact-validator.py \
-f project/F04_architecture/a2a_agent_cards.yaml
# Verificar discovery endpoint
curl -s http://localhost:8080/.well-known/agent.json | python3 -m json.tool

3. Test de interaccion completa — Ciclo create → poll → artifacts:

Ventana de terminal
# Crear tarea
curl -X POST http://localhost:8080/tasks/create \
-H "Content-Type: application/json" \
-d '{"message": {"parts": [{"type": "text", "text": "Analizar requerimientos"}]}}'
# Consultar estado
curl -s http://localhost:8080/tasks/task-1

Ejemplo practico: FAB como agente A2A con fases ADLC

Sección titulada «Ejemplo practico: FAB como agente A2A con fases ADLC»

En un escenario Factory OS, cada FAB puede exponerse como agente A2A donde sus skills mapean directamente a fases del ADLC:

┌─────────────────────────────────────────────────────────┐
│ Factory OS + A2A │
│ │
│ ┌──────────────┐ A2A Task ┌──────────────┐ │
│ │ Coordinator │────────────►│ FAB Architect │ │
│ │ (Client) │ "disenar │ (Server A2A) │ │
│ │ │ arch para │ skills: F01-F04│ │
│ │ │ feature X"│ │ │
│ │ │◄────────────│ Artifact: ADR │ │
│ │ │ completed │ │ │
│ │ │ └──────────────┘ │
│ │ │ A2A Task ┌──────────────┐ │
│ │ │────────────►│ FAB Builder │ │
│ │ │ "implement │ (Server A2A) │ │
│ │ │ segun ADR"│ skills: F06 │ │
│ │ │◄────────────│ Artifact: PR │ │
│ └──────────────┘ completed └──────────────┘ │
│ │
│ Discovery: cada FAB publica /.well-known/agent.json │
│ Coordinacion: A2A Tasks con lifecycle completo │
│ Herramientas: cada FAB usa MCP internamente │
└─────────────────────────────────────────────────────────┘

El flujo seria:

  1. Coordinator descubre FABs disponibles via Agent Cards
  2. Crea una A2A Task con los requerimientos como mensaje
  3. El FAB ejecuta su flujo ADLC (F01→F04) internamente usando MCP para tools
  4. Devuelve Artifacts (ADRs, contratos, codigo) al Coordinator
  5. El Coordinator delega la siguiente fase a otro FAB via A2A

Limitaciones y trabajo pendiente para soporte runtime completo

Sección titulada «Limitaciones y trabajo pendiente para soporte runtime completo»
AreaEstado actualLo que falta
Agent CardSoportado via template YAMLPublicacion automatica desde .fab-config.yaml
DiscoveryManual (YAML estatico)Registro dinamico en Factory OS (service mesh A2A)
Task lifecycleNo implementado en FABsRuntime A2A (HTTP server) en cada FAB
StreamingNo soportadoSSE para tareas de larga duracion (builds, deploys)
AutenticacionSolo documentadaIntegracion con OAuth2/mTLS del Factory OS
ADK bridgeNo existeWrapper para que FABs consuman agentes ADK como peers
Multi-factoryNo soportadoFederation de Agent Cards entre factories independientes

Proximos pasos recomendados:

  1. Implementar un runtime A2A minimo en fab-factory.sh que exponga Agent Cards
  2. Agregar un bridge ADK en scripts/ para descubrir/invocar agentes ADK externos
  3. Extender fab-coordinator.py para usar A2A Tasks en vez de file-locking para coordinacion
  4. Integrar discovery automatico con el MCP server del framework

RecursoURL
A2A Protocol Spec (Google)https://github.com/google/A2A
A2A en Linux Foundationhttps://www.linuxfoundation.org/projects/a2a
MCP Protocol Spechttps://modelcontextprotocol.io
DocumentoRuta
MCP Integration Guideframework/guides/MCP_Integration_Guide.md
Multi-Agent Orchestrationframework/guides/Multi_Agent_Orchestration_Guide.md
OWASP Agentic Securityframework/guides/OWASP_Agentic_Security_Guide.md
Context Engineeringframework/guides/Context_Engineering_Guide.md
SchemaRuta
Agent Cardscripts/schemas/a2a_agent_card.schema.json
Integration Mapscripts/schemas/integration_map.schema.json
TerminoDefinicion
Agent CardDocumento JSON con metadata publica de un agente
TaskUnidad de trabajo con lifecycle en A2A
MessageComunicacion entre agentes dentro de una Task
ArtifactResultado/entregable producido por una Task
PartComponente atomico de un Message o Artifact
CapabilityHabilidad declarada con schemas de I/O
Client AgentAgente que inicia una Task
Server AgentAgente que ejecuta una Task