--- name: a2a-agent-protocol-expert description: "Expert guide for Agent-to-Agent (A2A) Protocol interoperability, /.well-known/agent.json Agent Cards, cross-vendor swarm task negotiation, and bridging A2A with Model Context Protocol (MCP) / Panduan ahli protokol interoperabilitas antar-agen (A2A), Agent Cards, dan integrasi A2A + MCP." author: "Roedy Rustam" version: "4.4.2" --- # Agent-to-Agent (A2A) Protocol & Federated Swarm Expert (2026 Edition) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Orchestration & Integration - **Multi-Agent & MCP Ecosystem**: `multi-agent-orchestration`, `mcp-server-architect`, `mcp-sampling-critic`, `parallel-tool-orchestrator`, `durable-agent-execution-expert`, `computer-use-os-agent-expert` - **Agentic Economy & Settlement**: `agentic-m2m-settlement`, `agentic-micro-economy-architect`, `doku-mcp-server` - **Security & Contracts**: `structured-output-contracts`, `prompt-injection-firewall`, `zero-trust-secret-vault` - **Lifecycle & Governance**: `brainstorming`, `zero-to-prod-orchestrator`, `session-memory-manager` ### Description Production guide for implementing the open **Agent-to-Agent (A2A) Protocol** alongside **Model Context Protocol (MCP)**. While **MCP** connects an agent to deterministic tools and resources (*Agent-to-Tool*), **A2A** enables opaque autonomous agents built on different frameworks (LangGraph, Pydantic AI, Google ADK, OpenAI Agents SDK, Mastra) to discover capabilities via `/.well-known/agent.json` **Agent Cards**, negotiate multi-turn tasks (`tasks/send`, `tasks/sendSubscribe`), exchange typed **Artifacts**, and settle M2M budgets. ### Trigger Conditions - Exposing an autonomous agent service to external partner agents via standard HTTP JSON-RPC + SSE. - Publishing or consuming `/.well-known/agent.json` Agent Cards for dynamic capability discovery. - Orchestrating cross-organization or polyglot multi-agent workflows where subagents do not share internal memory. - Combining A2A horizontal agent delegation with MCP vertical tool execution. --- ### A2A vs MCP Architectural Separation | Dimension | Model Context Protocol (MCP v1.x) | Agent-to-Agent Protocol (A2A) | | :--- | :--- | :--- | | **Primary Relationship** | Agent $\leftrightarrow$ Deterministic Tool / Resource | Client Agent $\leftrightarrow$ Remote Autonomous Agent | | **Discovery Mechanism** | `tools/list`, `resources/list`, `prompts/list` | `GET /.well-known/agent.json` (Agent Card) | | **Execution Lifecycle** | Synchronous RPC call (`tools/call`) | Stateful Task lifecycle (`submitted` $\rightarrow$ `working` $\rightarrow$ `input-required` $\rightarrow$ `completed`) | | **State & Reasoning** | Stateless function execution | Opaque internal reasoning, memory, and multi-step planning | --- ### Core Implementation Patterns #### 1. Standard `/.well-known/agent.json` Agent Card Specification ```typescript // src/a2a/agent-card.ts export interface A2AAgentSkill { id: string; name: string; description: string; tags: string[]; inputModes: ('text/plain' | 'application/json')[]; outputModes: ('text/plain' | 'application/json')[]; } export interface A2AAgentCard { name: string; description: string; url: string; version: string; capabilities: { streaming: boolean; pushNotifications: boolean; stateTransitionHistory: boolean; }; authentication: { schemes: ('Bearer' | 'OAuth2' | 'MutualTLS')[]; }; skills: A2AAgentSkill[]; } export const FINTECH_AUDITOR_AGENT_CARD: A2AAgentCard = { name: 'vibes-fintech-auditor', description: 'Autonomous SNAP BI payment reconciliation and Z3 invariant verifier agent', url: 'https://agents.internal.example.com/a2a/fintech-auditor', version: '4.4.2', capabilities: { streaming: true, pushNotifications: true, stateTransitionHistory: true, }, authentication: { schemes: ['Bearer'], }, skills: [ { id: 'verify-settlement-batch', name: 'Verify Settlement Batch', description: 'Audits DOKU SNAP BI webhook records against double-entry ledger postings', tags: ['fintech', 'doku', 'ledger', 'audit'], inputModes: ['application/json'], outputModes: ['application/json'], }, ], }; ``` --- #### 2. A2A JSON-RPC Task Handler (`tasks/send` & State Machine) ```typescript // src/a2a/task-router.ts import { Hono } from 'hono'; import { z } from 'zod'; import { FINTECH_AUDITOR_AGENT_CARD } from './agent-card'; const app = new Hono(); const TaskSendSchema = z.object({ jsonrpc: z.literal('2.0'), id: z.union([z.string(), z.number()]), method: z.enum(['tasks/send', 'tasks/get', 'tasks/cancel']), params: z.object({ id: z.string().uuid(), sessionId: z.string().optional(), message: z.object({ role: z.enum(['user', 'agent']), parts: z.array( z.object({ type: z.enum(['text', 'data']), text: z.string().optional(), data: z.record(z.unknown()).optional(), }) ), }), }), }); app.get('/.well-known/agent.json', (c) => c.json(FINTECH_AUDITOR_AGENT_CARD)); app.post('/a2a/fintech-auditor', async (c) => { const body = await c.req.json(); const parsed = TaskSendSchema.safeParse(body); if (!parsed.success) { return c.json({ jsonrpc: '2.0', id: body?.id ?? null, error: { code: -32602, message: 'Invalid A2A task parameters', data: parsed.error.issues }, }, 400); } const { id: rpcId, params } = parsed.data; return c.json({ jsonrpc: '2.0', id: rpcId, result: { id: params.id, status: { state: 'completed', timestamp: new Date().toISOString(), }, artifacts: [ { name: 'audit-verdict.json', parts: [ { type: 'data', data: { verified: true, discrepanciesFound: 0, taskId: params.id }, }, ], }, ], }, }); }); export default app; ``` --- #### 3. A2A Streaming Task SSE Protocol (`tasks/sendSubscribe`) with Heartbeats (TypeScript) Real-time state streaming and token emission for long-running federated agent tasks: ```typescript // src/a2a/streaming-sse-handler.ts export interface A2ATaskEvent { taskId: string; eventType: 'state_changed' | 'token_stream' | 'artifact_published' | 'heartbeat'; state?: 'working' | 'input-required' | 'completed' | 'failed'; chunk?: string; artifactUri?: string; timestamp: string; } export function formatA2aSseFrame(event: A2ATaskEvent): string { return `event: a2a_event\ndata: ${JSON.stringify(event)}\n\n`; } export class A2aStreamingSession { private readonly taskId: string; private isClosed = false; constructor(taskId: string) { this.taskId = taskId; } public emitHeartbeat(): string { return formatA2aSseFrame({ taskId: this.taskId, eventType: 'heartbeat', timestamp: new Date().toISOString(), }); } public emitTokenChunk(chunk: string): string { return formatA2aSseFrame({ taskId: this.taskId, eventType: 'token_stream', chunk, timestamp: new Date().toISOString(), }); } public emitCompletion(artifactUri: string): string { this.isClosed = true; return formatA2aSseFrame({ taskId: this.taskId, eventType: 'artifact_published', state: 'completed', artifactUri, timestamp: new Date().toISOString(), }); } } ``` --- ### Verification Checklist - [ ] Agent service publishes a valid `/.well-known/agent.json` endpoint declaring authentication schemes and typed skills. - [ ] All A2A task states adhere to standard transitions (`submitted` $\rightarrow$ `working` $\rightarrow$ `input-required` | `completed` | `failed` | `canceled`). - [ ] Incoming `parts` payloads from remote agents are validated via Zod schemas and sanitized through `prompt-injection-firewall`. - [ ] Long-running tasks support SSE streaming (`tasks/sendSubscribe`) or signed webhook push notifications. ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec a2a-agent-protocol-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi - **Ekosistem Multi-Agen & MCP**: `multi-agent-orchestration`, `mcp-server-architect`, `mcp-sampling-critic`, `parallel-tool-orchestrator`, `durable-agent-execution-expert`, `computer-use-os-agent-expert` - **Ekonomi & Settlement Agen**: `agentic-m2m-settlement`, `agentic-micro-economy-architect`, `doku-mcp-server` - **Keamanan & Kontrak**: `structured-output-contracts`, `prompt-injection-firewall`, `zero-trust-secret-vault` - **Siklus Hidup & Tata Kelola**: `brainstorming`, `zero-to-prod-orchestrator`, `session-memory-manager` ### Deskripsi Panduan produksi untuk mengimplementasikan **Agent-to-Agent (A2A) Protocol** berdampingan dengan **Model Context Protocol (MCP)**. Jika MCP menghubungkan agen ke tool deterministik (*Agent-to-Tool*), A2A memungkinkan agen otonom lintas framework untuk saling menemukan kapabilitas melalui `/.well-known/agent.json` (**Agent Card**), menegosiasikan tugas multi-giliran (`tasks/send`), dan bertukar **Artifact** terstruktur. ### Panduan Arsitektur Inti 1. **Sinergi A2A + MCP**: Gunakan A2A untuk delegasi horizontal antar-agen spesialis, dan gunakan MCP untuk pemanggilan fungsi/tool vertikal di dalam masing-masing agen. 2. **Penemuan Dinamis (Agent Card)**: Publikasikan kapabilitas, mode input/output, dan skema autentikasi di `/.well-known/agent.json`. 3. **Pertahanan Injeksi Lintas-Agen**: Perlakukan setiap pesan dari agen eksternal sebagai input yang tidak tepercaya; validasi dengan skema JSON ketat dan `prompt-injection-firewall`. ### Daftar Periksa Verifikasi (Checklist) - [ ] Endpoint `/.well-known/agent.json` tersedia dan mendeklarasikan skema autentikasi. - [ ] Siklus hidup tugas mengikuti status standar (`submitted`, `working`, `input-required`, `completed`, `failed`). - [ ] Payload antar-agen divalidasi dengan Zod dan disanitasi dari serangan *indirect prompt injection*. ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec a2a-agent-protocol-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |