본문으로 건너뛰기

ADR-011 — A2A (Agent-to-Agent) Protocol server + MCP coexistence

항목
StatusProposed (2026-05-25 — #991 design step)
Date2026-05-25
DeciderGenD 코어팀 + AI/Agent owner
Related Epic#991 (A2A Protocol 서버 — MCP 병행, RFP INR-003)
Related ADRADR-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.createtask_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.