
여러 데이터 저장소에 액세스하기 위해 A2A를 사용하는 방법
요약
A2A(Agent2Agent) 프로토콜을 사용하여 여러 전문 에이전트를 오케스트레이션하는 SuperAgent 구축 방법을 설명합니다. MCP 서버를 래핑한 개별 에이전트들을 에이전트 카드로 발견하고, 이를 통합 관리하는 아키텍처를 다룹니다.
핵심 포인트
- A2A 프로토콜을 통한 에이전트 간 자율적 발견 및 라우팅
- MCP 서버를 래핑하여 전문 에이전트(Specialist Agents) 생성
- SuperAgent를 활용한 다중 데이터 저장소 액세스 확장
- 에이전트 카드(Agent Cards) 기반의 에이전트 오케스트레이션
David Tracey 작성
이 글은 Agent2Agent (A2A) 프로토콜에 관한 3부작 시리즈 중 제3부입니다. 제1부에서는 A2A 개념을 소개했습니다. 제2부에서는 Claude와 MCP 서버를 사용하여 여러 데이터 소스를 쿼리하는 방법을 보여주었습니다. 이 포스트는 조정자(coordinator) 역할을 하는 Claude를 전문 에이전트(specialist agents)를 자율적으로 발견하고 오케스트레이션(orchestrate)하는 적절한 A2A "SuperAgent"로 교체함으로써 해당 시나리오를 확장합니다.
시나리오는 동일합니다: 직원이 퇴사하면, IT 부서에서는 해당 직원의 세부 정보가 모든 시스템 — HR 데이터베이스와 로깅 플랫폼 — 에서 삭제되었는지 확인해야 합니다.
아키텍처 개요 (Architecture Overview)
우리는 다음을 구축할 것입니다:
- Bronto MCP 서버를 래핑(wrapping)한 A2A 에이전트 (
GetUsersAgent, 포트 9998) - SQLite MCP 서버를 래핑한 A2A 에이전트 (
GetEmployeesAgent, 포트 9999) - 에이전트 카드(Agent Cards)를 통해 두 에이전트를 발견하고 요청을 라우팅(route)하는 "SuperAgent" (포트 9000)
- SuperAgent에 쿼리를 보내는 A2A 클라이언트
1단계: A2A Bronto 에이전트 생성하기
각 A2A 에이전트는 두 개의 파일, 즉 __main__.py (에이전트 카드 + 서버 설정)와 agent_executor.py (실제 로직)를 가집니다.
__main__.py
import uvicorn
from a2a.server.apps import A2AStarletteApplication
from a2a.server.request_handlers import DefaultRequestHandler
...
agent_executor.py
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.utils import new_agent_text_message
...
직원 DB A2A 에이전트도 동일한 구조를 사용합니다. 단지 MCP URL을 포트 8081로 업데이트하고, 도구(tool) 이름을 get_employees로 변경하며, 그에 따라 에이전트 카드의 이름과 설명을 업데이트하기만 하면 됩니다.
2단계: A2A SuperAgent 생성하기
SuperAgent는 에이전트 카드 (Agent Cards)를 통해 하위 에이전트 (sub-agents)를 발견하며, 수신된 쿼리에 따라 요청을 라우팅 (routing) 합니다.
agent_executor.py (주요 부분)
import httpx
import asyncio
from uuid import uuid4
...
3단계: A2A 클라이언트 생성하기
# client.py
import sys, asyncio, logging
from uuid import uuid4
...
전체 데모 실행하기
(2부에서 수행한) MCP 서버들이 실행 중인 상태에서, A2A 에이전트들을 시작합니다:
# 터미널 1: Bronto A2A 에이전트 (Bronto MCP 서버를 래핑함)
cd bronto-get-users && uv run .
...
SuperAgent는 에이전트 카드 (Agent Cards)를 통해 사용 가능한 에이전트들을 발견한 다음, 각 에이전트가 무엇을 하는지에 대한 하드코딩된 지식 없이도 그에 따라 요청을 라우팅합니다.
요약
이 3부작 시리즈를 통해 다음을 확인했습니다:
- A2A는 에이전트 통신을 표준화합니다 — 어떤 A2A 에이전트든 누가 만들었는지와 관계없이 다른 모든 A2A 에이전트를 발견하고 호출할 수 있습니다.
- MCP와 A2A는 함께 작동합니다 — MCP는 도구 액세스 (tool access)를 처리하고, A2A는 에이전트 간 오케스트레이션 (agent-to-agent orchestration)을 처리합니다.
- 데이터를 이동시킬 필요가 없습니다 — 로그는 Bronto(대용량 고속 검색에 최적화됨)에 머물고, HR 데이터는 SQL에 머물며, 각각 목적에 맞게 제작된 에이전트들에 의해 액세스됩니다.
더 발전된 SuperAgent는 더 스마트한 라우팅을 위해 모든 에이전트 카드 (Agent Card) 설명을 LLM에 전달하거나, LLM으로 보내기 전에 하위 에이전트들로부터 데이터를 필터링/집계하여 토큰 사용량을 줄이고 대규모 원시 데이터셋으로 인한 LLM 환각 (hallucination)을 방지할 수 있습니다. 에이전트 비용 최적화에 관한 PostHog 블로그는 이것이 왜 중요한지를 잘 보여줍니다.
A2A가 에이전트 협업을 위한 보편적인 표준이 될지, 아니면 생태계가 커스텀 MCP 통합의 조각들로 남게 될지는 지켜봐야 하겠지만, Bronto의 고성능 로깅 플랫폼은 어떤 세상이 오더라도 일류 시민 (first-class citizen)으로서 자리 잡을 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기