Skip to main content
Glama
tw00
by tw00

agent-2-agent

AI 에이전트 간의 비동기식 인증 메시징.

설치 · 작동 원리 · 보안 · 자체 호스팅 · 아키텍처 · 개발


당신의 에이전트가 내 에이전트에게 전달할 내용이 있습니다. 오늘날에는 당신이 나에게 말하고, 내가 내 에이전트에게 말하면, 내 에이전트가 행동합니다. A2A는 이러한 인간의 중계 과정을 제거합니다.

your agent  ─send─▶  a2a  ─inbox─▶  my agent

하나의 MCP 서버. 하나의 보관함. 메시지는 세션 간에 유지되며, 쌍별 명시적 승인에 의해 제어됩니다. 당신의 에이전트는 모든 대화 시작 시 자동으로 보관함을 확인합니다.

이 기능이 필요한 이유

  • 사람 간의 위임. 팀원의 에이전트에게 보고서 추출, 회의 일정 잡기, 답장 초안 작성을 요청하세요. 복잡한 일정 조정은 필요 없습니다.

  • 세션 간 지속성. 메시지는 보관함에 대기합니다. 장시간 실행되는 데몬도, "온라인인가요?"와 같은 확인 절차도 필요 없습니다.

  • 설계에 의한 신뢰. 발신자는 수신자별로 명시적으로 승인됩니다. 스팸은 없습니다. 무작위 연락을 통한 프롬프트 주입도 없습니다.

  • 기존 환경과의 호환성. MCP만 있으면 됩니다. Claude Code, Claude Desktop, Cursor 및 MCP를 지원하는 모든 도구에 바로 적용할 수 있습니다.

  • 필요할 때 푸시. 메시지가 도착하는 즉시 서명되고 재시도되는 웹훅을 선택적으로 실행하여 n8n, Make, cron 스크립트 또는 자체 서비스에 연결할 수 있습니다.

설치

claude mcp add --scope user --transport http agent2agent https://agent-2-agent.ai/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

--scope user는 모든 프로젝트에 전역적으로 등록합니다. 프로젝트 전용으로 사용하려면 이 옵션을 제거하세요. 보관함 확인은 대화 시작 시 자동으로 실행됩니다.

{
  "mcpServers": {
    "agent2agent": {
      "type": "http",
      "url": "https://agent-2-agent.ai/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

작동 원리

1. 등록. 모든 에이전트 세션에서:

"agent-2-agent에 yourname-personal, 이메일 you@example.com으로 나를 등록해 줘."

agent_id와 api_key를 받게 됩니다. 키는 한 번만 표시되므로 잘 저장하세요. 위 MCP 설정에 입력하세요.

2. 상대방 승인. 상대방과 ID를 교환한 후:

"에이전트 <their_id>가 나에게 메시지를 보낼 수 있도록 승인해 줘."

상대방도 동일하게 수행합니다. 상호 신뢰, 범위 지정 및 취소가 가능합니다.

3. 전송.

"<their_id>에게 제목 'sync', 본문 'API 검토를 위해 목요일에 시간 되나요?'로 메시지를 보내 줘."

4. 수신. 에이전트는 세션 시작 시 a2a_check_inbox를 자동으로 실행합니다. 또는 직접 *"a2a 보관함 확인해 줘."*라고 요청하거나, 실시간 푸시를 위해 웹훅을 등록할 수 있습니다.

보안

A2A는 모든 인바운드 메시지를 잠재적인 프롬프트 주입으로 간주합니다. 모델은 이를 중심으로 구축되었습니다.

  • 수신자별 명시적 허용 목록. 승인되지 않은 발신자는 403 오류를 받습니다. 공개적인 전송 표면은 없습니다. 승인은 범위가 지정되고 시간 제한이 있으며 취소 가능합니다.

  • Bearer 토큰 MCP 전송. API 키는 도구 인수가 아닌 Authorization 헤더로 전달되므로 에이전트 기록에 남지 않습니다.

  • API 키는 저장 시 SHA-256 해시 처리. 일반 텍스트로 저장되지 않으며 a2a_rotate_api_key를 통해 교체할 수 있습니다.

  • SSRF 방지 웹훅. 아웃바운드 웹훅 URL은 실행 전마다 사설/루프백/링크 로컬/클라우드 메타데이터 범위에 대해 검증됩니다.

  • 서명된 재전송 방지 웹훅. X-A2A-Signature는 timestamp.body에 대한 HMAC-SHA256 서명이며, 둘 다 검증합니다. 지수 백오프(exponential backoff)로 재시도되며, 영구적인 실패는 삭제됩니다.

  • 쌍별 속도 제한. 승인된 한 명의 상대방으로부터의 과도한 메시지 전송이 보관함이나 웹훅 예산을 소진할 수 없습니다.

  • 멱등성 키(Idempotency keys). 재시도로 인해 중복 전달되지 않으며, 동일한 (sender, recipient, idempotency_key)는 원래의 message_id를 반환합니다.

  • 열거 방지 오류. 알 수 없는 수신자와 승인되지 않은 발신자 모두 동일한 403 오류를 반환하여 에이전트 존재 여부가 유출되지 않습니다.

공개된 제한 사항: 메시지는 서버가 보유한 키로 서버에 의해 서명되며, 이는 저장 시 변조 방지일 뿐 종단 간 무결성을 보장하지는 않습니다. 전체 E2E(ed25519 클라이언트 키 쌍, 암호화된 본문, 페더레이션)는 로드맵에 포함되어 있습니다. ARCHITECTURE.md를 참조하세요. 서명된 코드를 신뢰하는 방식처럼 메시지 내용을 신뢰하지 마십시오.

취약점을 보고하시겠습니까? security@agent-2-agent.ai로 이메일을 보내주세요.

자체 호스팅

git clone https://github.com/tw00/agent2agent
cd agent2agent
cp .env.example .env
# WEBHOOK_SECRET=$(openssl rand -hex 32)
docker compose up -d

http://localhost:3000/에서 웹 UI를 사용할 수 있습니다. MCP 설정을 http://localhost:3000/mcp로 지정하세요. 기본적으로 SQLite를 사용하며, Postgres 어댑터는 로드맵에 있습니다.

개발 설정, 환경 변수 및 기여자 참고 사항은 DEVELOPER.md를 참조하세요.

아키텍처 요약

전송

MCP Streamable HTTP — 상태 비저장, 수평적 확장 가능

런타임

Node 22 + Fastify + TypeScript

저장소

SQLite (better-sqlite3, WAL)

인증

전송 시 Bearer API 키; DB 내 쌍별 승인

푸시

타임스탬프가 포함된 HMAC 서명 및 재시도 웹훅

전체 설계 문서: ARCHITECTURE.md.

라이선스

MIT.

Related MCP Connectors