ADR-011 — A2A (Agent-to-Agent) Protocol server + MCP coexistence
| 항목 | 값 |
|---|---|
| Status | Proposed (2026-05-25 — #991 design step) |
| Date | 2026-05-25 |
| Decider | GenD 코어팀 + AI/Agent owner |
| Related Epic | #991 (A2A Protocol 서버 — MCP 병행, RFP INR-003) |
| Related ADR | ADR-004 (_protected_routers 익명 라우터 분리 — A2A discovery 의존) |
한 줄 결정: MCP (도구 계층) 와 A2A (에이전트 코디네이션 계층) 의 이중 표준 동시 지원. A2A AgentCard 는
/.well-known/agent.json익명 + 서명, Skill 호출은 JWT 보호. 동기 + 비동기 Task 모두 지원.
결정
1) Layered architecture
MCP 와 A2A 는 다른 라우터 / 같은 backend service. 도구 호출 backend (sdk/ 계층) 는 공유.
2) AgentCard signing
/.well-known/agent.json 의 본문은 JWS 로 서명. 외부 Agent 가 카드 무결성을
검증할 수 있어야 하므로 비대칭 알고리즘 (RS256 또는 ES256) 사용 — private
key (gend-a2a-private-key Secret) 로 서명, public key 는 /.well-known/jwks.json
에서 노출. HS256 같은 대칭 키는 검증 측에 secret 공유가 필요해 무결성 보장이
무의미하므로 사용 금지 (CodeRabbit #1067 Critical follow-up). signed 본문 fields:
{
"name": "gend-data-agent",
"description": "GenD data platform agent — catalog, query, quality, governance",
"version": "1.0.0",
"url": "https://gend.genon.ai/a2a",
"skills": [
{ "id": "query.execute", "input_schema": {...}, "output_schema": {...} },
{ "id": "catalog.search", ... }
],
"authentication": { "schemes": ["bearer"] },
"issued_at": "2026-05-25T...",
"issuer": "gend.genon.ai"
}
3) Skill registry
기존 MCP 도구 14개 + 본 Epic 의 새 A2A 전용 skill (e.g. task.create, task.status). 동일 SDK backend 재사용 — duplication 없음.
4) 동기 + 비동기 Task
- 동기 (sync): JSON-RPC
call— 결과 즉시 반환. Trino 짧은 쿼리 / catalog 메타. - 비동기 (async):
task.create→task_id반환 →task.status(task_id)폴링 +task.cancel(task_id). Trino 장기 쿼리 / RAG 빌드. - 비동기 백엔드: 기존
QueryHistory+ 신규A2ATask테이블 (id, skill_id, params_json, status, result_json, error_text, expires_at).
5) 인증 / 인가
- AgentCard discovery: 익명 (ADR-004 의
a2a_public_router외부 mount 패턴). - Skill 호출: JWT (기존 Keycloak) — 외부 Agent 가 OAuth client_credentials 로 GenD 토큰 발급 후 사용.
- ABAC: 모든 Skill 이
DataAccessService를 통과. workspace_id 컨텍스트는 JWT claim 의ws또는 group path 에서 추출. - 감사:
A2ACallLog테이블 (caller_id, skill_id, started_at, latency_ms, result_summary, denied_reason).
6) Rate limit + Cost
- AgentCard discovery: 100 req/min per IP (token bucket).
- Skill 호출: 사용자별 100 req/min (Redis token bucket 또는 in-memory).
- LLM 호출 Skill (e.g.
nl_search): 일일 한도 50 호출 / 사용자.
영향
- 새 API:
GET /.well-known/agent.json(익명, ADR-004 pattern),POST /a2a/jsonrpc,POST /a2a/task,GET /a2a/task/{id},DELETE /a2a/task/{id} - 새 테이블:
A2ATask,A2ACallLog - 새 Secret:
gend-a2a-private-key(JWS RS256/ES256 private key — public key 는/.well-known/jwks.json으로 노출) - Prerequisite: ADR-004 (익명 라우터 패턴), #1018 (Workspace Isolation), ADR-009 가능 (Text2SQL skill 의 prompt enrichment)
비목표
- A2A → A2A delegation (다단 Agent chain) 은 본 Phase 비목표. 단일 Agent 단계만.
- AgentCard 의 multi-version (v1, v2) 동시 노출은 향후.
- MCP 와 A2A 간 자동 Skill 변환 (auto-translation) 은 별도 ADR.