A2A · AGENT CARD
Agent Card 설계
Agent Card는 A2A 에이전트의 자기소개서입니다. 어떤 기능을 제공하고, 어떻게 호출하며, 어떤 인증이 필요한지를 기술합니다.
Agent Card란
Agent Card는 /.well-known/agent.json 경로에 노출되는 JSON 문서입니다. Orchestrator Agent가 원격 에이전트를 발견하고 호출하기 전, 이 파일을 먼저 조회해 지원 기능(Skills), 인증 방식, 입출력 모드를 파악합니다.
💡 Robot.txt + OpenAPI Spec의 결합
Agent Card = 에이전트 발견을 위한 robots.txt + 기능 명세를 위한 openapi.json의 역할을 동시에 수행합니다.
전체 Agent Card 예시
json/.well-known/agent.json
{
"name": "Research Agent",
"description": "웹 검색과 문서 요약을 전문으로 하는 리서치 에이전트",
"url": "https://research-agent.example.com",
"version": "2.1.0",
"documentationUrl": "https://research-agent.example.com/docs",
"capabilities": {
"streaming": true, // tasks/sendSubscribe 지원
"pushNotifications": true, // Webhook 알림 지원
"stateTransitionHistory": false
},
"authentication": {
"schemes": ["bearer"] // "none", "bearer", "apiKey", "oauth2"
},
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain", "application/json"],
"skills": [
{
"id": "web-search",
"name": "Web Search",
"description": "최신 정보를 웹에서 검색하고 요약합니다",
"tags": ["search", "research", "information"],
"examples": [
"2024년 AI 트렌드를 검색해줘",
"LangGraph 최신 릴리즈 내용 알려줘"
],
"inputModes": ["text/plain"],
"outputModes": ["text/plain", "application/json"]
},
{
"id": "doc-summary",
"name": "Document Summarizer",
"description": "URL 또는 텍스트 문서를 요약합니다",
"tags": ["summary", "document"],
"examples": ["https://arxiv.org/abs/2501.xxxxx 요약해줘"],
"inputModes": ["text/plain", "text/uri-list"],
"outputModes": ["text/plain"]
}
]
}
Agent Card 필드 레퍼런스
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| name | string | 필수 | 에이전트 이름. 사람이 읽는 식별자 |
| description | string | 권장 | 에이전트 기능 요약. Orchestrator가 라우팅 결정에 사용 |
| url | string (URL) | 필수 | A2A 요청을 수신하는 HTTP 엔드포인트 기본 URL |
| version | string | 권장 | 에이전트 버전. semver 권장 |
| capabilities | object | 필수 | streaming, pushNotifications, stateTransitionHistory 지원 여부 |
| authentication | object | 필수 | 지원하는 인증 방식. schemes 배열 |
| defaultInputModes | string[] | 필수 | 기본 입력 MIME 타입 목록 |
| defaultOutputModes | string[] | 필수 | 기본 출력 MIME 타입 목록 |
| skills | Skill[] | 권장 | 에이전트가 제공하는 특화 기술 목록 |
| documentationUrl | string (URL) | 선택 | 상세 문서 링크 |
Skill 필드 레퍼런스
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| id | string | 필수 | Skill 고유 식별자. tasks/send 시 skill 파라미터로 지정 |
| name | string | 필수 | 사람이 읽는 Skill 이름 |
| description | string | 권장 | Skill 상세 설명. Orchestrator LLM이 라우팅에 활용 |
| tags | string[] | 선택 | 검색/분류용 태그 |
| examples | string[] | 권장 | 이 Skill을 사용하는 예시 요청. Few-shot 힌트 역할 |
| inputModes | string[] | 선택 | 이 Skill에 특화된 입력 MIME 타입 (기본값 재정의) |
| outputModes | string[] | 선택 | 이 Skill에 특화된 출력 MIME 타입 (기본값 재정의) |
FastAPI로 Agent Card 노출
pythonagent_card.py — FastAPI 구현
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import os
app = FastAPI()
AGENT_CARD = {
"name": "Research Agent",
"description": "웹 검색과 문서 요약 전문 에이전트",
"url": os.getenv("AGENT_URL", "http://localhost:8000"),
"version": "1.0.0",
"capabilities": {
"streaming": True,
"pushNotifications": False,
"stateTransitionHistory": False
},
"authentication": {"schemes": ["bearer"]},
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain"],
"skills": [
{
"id": "web-search",
"name": "Web Search",
"description": "웹에서 최신 정보를 검색합니다",
"examples": ["2025년 AI 동향 검색해줘"],
"inputModes": ["text/plain"],
"outputModes": ["text/plain"]
}
]
}
@app.get("/.well-known/agent.json")
async def agent_card():
return JSONResponse(
content=AGENT_CARD,
headers={"Cache-Control": "max-age=3600"} # 1시간 캐시
)