Git 저장소:A2A MCP
이 저장소는 a2a-python SDK를 설정하고 사용하여 간단한 서버와 클라이언트를 만들어 a2a 프로토콜을 구현하는 방법을 보여주며, 에이전트 서버는 mcp로 구현됩니다.
OPENROUTER_API_KEY로 설정)저장소 복제:
git clone https://github.com/sing1ee/a2a-mcp-openrouter
cd https://github.com/sing1ee/a2a-mcp-openrouter
종속성 설치:
uv venv
source .venv/bin/activate
환경 변수 설정:
export OPENROUTER_API_KEY=your-openrouter-api-key
또는 다음 내용으로 .env 파일을 생성하세요:
OPENROUTER_API_KEY=your-openrouter-api-key
참고: OpenRouter API 키는 https://openrouter.ai/에서 얻을 수 있습니다.
uv run --env-file .env a2a-server
에이전트 카드 검증:
새 터미널에서:
uv venv
source .venv/bin/activate
uv run --env-file .env a2a-client --question "A2A 프로토콜이 무엇인가요?"
시스템은 다음 구성을 사용합니다:
google/gemini-flash-1.5https://openrouter.ai/api/v1src/a2a_mcp_openrouter/server/: 서버 구현.src/a2a_mcp_openrouter/client/: 클라이언트 구현.response.xml: 클라이언트의 예제 응답.uv가 설치되어 있는지 확인하세요.OPENROUTER_API_KEY가 올바르게 설정되어 있는지 확인하세요.이 구현을 통해 A2A (Agent-to-Agent)와 MCP (Model Context Protocol)가 놀라운 아키텍처 유사성을 공유한다는 것을 발견했습니다. 두 프로토콜 모두 발견, 기능 교환 및 실행에 대해 유사한 패턴을 따릅니다.
핵심 발견: A2A와 MCP 모두 동일한 기본 구현 패턴을 따릅니다:
mcp.py 구현을 보면 다음과 같습니다:
# HTTP를 통한 MCP 도구 발견
async with sse_client(url) as (read, write):
resources = await session.list_tools()
# LLM 의사 결정을 위한 프롬프트 생성
return template.render(tools=resources.tools)
# HTTP를 통한 도구 호출 실행
return await session.call_tool(tool_name, arguments=arguments)
이는 A2A 에이전트 호출 패턴과 개념적으로 동일합니다 - 기능을 발견하고, LLM을 사용하여 무엇을 호출할지 결정한 다음, 호출을 실행합니다.
핵심 통찰: A2A는 호출 패턴이 본질적으로 동일하기 때문에 에이전트 간 통신과 도구 호출 모두에 대한 통합 인터페이스 역할을 할 수 있습니다:
클라이언트 → HTTP → 에이전트 → LLM 응답클라이언트 → HTTP → 도구 래퍼 → MCP 도구 응답두 패턴 모두 다음을 사용합니다:
이는 A2A와 MCP가 경쟁하는 프로토콜이 아니라 단일 인터페이스 패러다임 하에서 통합될 수 있는 상호 보완적인 패턴임을 보여줍니다.
다음은 클라이언트 입력에서 최종 응답까지 A2A 프로토콜의 완전한 플로우를 보여주는 상세한 시퀀스 다이어그램입니다:

시스템은 다음과 같은 주요 단계를 따릅니다:
클라이언트 단계: 사용자 질문 입력 → 클라이언트가 에이전트 발견 → LLM이 관련 에이전트 선택
서버 단계: 서버가 요청 수신 → 에이전트가 도구 발견 → LLM이 도구 선택 → 도구가 반복적으로 실행
응답 단계: 결과가 파이프라인을 통해 스트리밍됨 → 클라이언트가 최종 답변 합성 → 사용자가 응답 수신
이 아키텍처는 서로를 발견하고 협력할 수 있는 상호 운용 가능한 AI 에이전트를 만드는 A2A 프로토콜의 힘을 보여주며, 외부 지식 소스에 액세스하기 위해 MCP 도구를 활용합니다.