테마
AI A2A 업무 위임
MCP에서 도구를 직접 호출하는 대신 구조화된 업무를 보내고 task ID로 관리하려면 AI A2A를 사용합니다. Infirium은 A2A 1.0 / JSON-RPC 2.0 인터페이스를 제공하며 도구 이름과 입력을 명시한 요청을 처리합니다.
| 인터페이스 | 시작 요청 | 결과 확인 |
|---|---|---|
| MCP | tools/call로 도구와 인자 전달 | 도구 응답의 structuredContent |
| AI A2A | SendMessage의 JSON data part로 도구와 인자 전달 | task ID로 상태·artifacts 조회 |
A2A에도 같은 OAuth·scope·조직·그룹·검토 경계가 적용됩니다. 서버가 자유 자연어를 해석해 자동으로 업무를 결정하는 챗봇은 아니며 외부 유료 AI는 서버의 필수 의존성이 아닙니다. EDC 간 계약 A2A는 별도 개념입니다.
AI A2A 업무 위임
- 요청
처리할 업무와 입력 자료를 A2A 요청으로 보냅니다.
- 권한 확인
연결한 조직과 동의 범위에서 요청 가능한 업무인지 확인합니다.
- 작업 상태
반환된 작업 식별자로 진행 상태와 추가로 필요한 조치를 확인합니다.
- 결과
완료된 결과나 오류를 읽고 다음 행동을 결정합니다.
두 독립 AI가 서로 질문·답변하려면
두 AI 에이전트의 양방향 협업으로 이동하세요. 이 페이지는 기존 루트 /mcp/a2a의 구조화된 업무 위임을 설명합니다. 여기서 안내하는 자유 대화형 continuation 제한은 이 루트 인터페이스에 해당합니다.
주소·인증
연결이 허용된 개발 환경에서 /.well-known/agent-card.json을 읽어 인터페이스와 허용 도구를 확인합니다. 운영 환경에서는 MCP·AI A2A를 차단합니다.
bash
curl --fail --silent --show-error \
https://dev-api.infirium.org/.well-known/agent-card.json| 항목 | 개발 환경 기본값 |
|---|---|
| AgentCard | https://dev-api.infirium.org/.well-known/agent-card.json |
| JSON-RPC | https://dev-api.infirium.org/mcp/a2a |
| OAuth resource | https://dev-api.infirium.org/mcp |
| 필수 헤더 | A2A-Version: 1.0, Authorization: Bearer <access_token> |
실제 AgentCard의 주소를 우선합니다. OAuth resource를 /mcp/a2a로 바꾸지 않습니다. OAuth 인증을 마치고 해당 도구의 scope를 가진 token을 사용합니다. 버전 헤더가 없거나 지원하지 않는 값이면 거절합니다.
구조화된 작업 요청
첫 연습은 data:read로 입력 필드 안내 한 항목을 읽습니다. toolName은 AgentCard의 허용 목록, arguments는 MCP tools/list의 최신 inputSchema를 따릅니다. 하나의 JSON data part만 받으며 자유 텍스트·파일 URL·임의 HTTP·스크립트를 실행하지 않습니다.
아래 요청을 guidance-request.json으로 저장합니다. messageId는 같은 업무의 재시도에서 유지합니다. 새 업무를 만들 때만 새 ID를 사용합니다.
json
{
"jsonrpc": "2.0",
"id": "guidance-read-1",
"method": "SendMessage",
"params": {
"message": {
"messageId": "infirium-guidance-example-1",
"role": "ROLE_USER",
"parts": [{
"data": {
"toolName": "infirium_get_input_field_guidance",
"arguments": {
"profileKey": "part-type-information",
"catalogVersion": 3,
"purpose": "registration",
"guidanceVersion": 2,
"take": 1
}
}
}]
}
}
}Node.js로 보내고 결과 읽기
Node.js 20 이상이 필요하며 별도 SDK 설치는 필요 없습니다. a2a-first-read.mjs와 JSON 파일을 같은 폴더에 저장합니다. 스크립트는 위 요청을 fetch로 POST하고, 반환된 task를 GetTask로 한 번 조회합니다.
SDK 첫 조회의 환경변수 설정과 같이 MCP resource와 data:read OAuth token을 준비한 뒤 실행합니다.
bash
node a2a-first-read.mjs예상 결과: taskId와 TASK_STATE_COMPLETED 상태, 필드 안내가 담긴 artifacts를 확인합니다. 성공 본문은 SendMessage의 result.task.id, GetTask의 result.artifacts[].parts[].data에서 읽습니다. 도구 결과가 실패하거나 추가 조치가 필요하면 상태와 artifacts의 고정 오류를 확인합니다. 이 예제는 요청 후 한 번 조회하며 자동 재실행하지 않습니다.
같은 연결의 동일한 messageId·입력은 도구를 다시 실행하지 않습니다. 같은 ID에 다른 입력을 보내면 충돌입니다. 결과 유실·작업 중단만으로 새 ID를 만들어 쓰기를 반복하지 않습니다.
조회·취소·보관
| 메서드 | params 예 | 의미 |
|---|---|---|
GetTask | {"id":"반환된 task UUID"} | 현재 연결·조직·그룹·사용자·권한을 다시 검사해 조회 |
ListTasks | {"pageSize":20} | 최대 50개, 응답 페이지 토큰으로 계속 조회 |
CancelTask | {"id":"반환된 task UUID"} | 진행 중 로컬 task만 취소. 외부 계약·전송·게시를 되돌리지 않음 |
전체 프로필 카탈로그는 결과 한도를 넘을 수 있으므로 처음에는 위처럼 페이지 단위 필드 안내를 사용합니다. 결과는 최대 256 KiB이며 초과 시 output_size_exceeded로 실패합니다. 잘린 결과를 성공으로 반환하지 않습니다. 결과 본문은 24시간 뒤 읽을 수 없고 정기 정리됩니다. 중복 방지용 식별·digest 기록은 유지하며 원본 요청은 작업 저장소에 보관하지 않습니다.
이미 시작됐으나 결과를 확인하지 못한 작업은 outcomeUnknown을 읽고 원래 업무 journal을 조회합니다. EDC는 원래 review ID로 infirium_get_edc_execution_job을 사용합니다. streaming·push notification·자유 대화형 continuation은 제공하지 않습니다. 기준은 A2A 1.0 공식 명세와 접속 AgentCard이며 모든 외부 AI 제품의 native A2A 호환성을 보장하지 않습니다.
승인 기반 도메인 작업
허용 목록의 제품 등록·BOM·PCF·QN·인증서 작업에도 별도 scope와 원래 조직 소유자의 웹 승인이 필요합니다. 승인 대기·명시적 다음 단계·불확실 결과는 TASK_STATE_INPUT_REQUIRED로 표시합니다. task 완료는 실제 계약 체결·데이터 수신·최종 게시 완료와 구분합니다.
다음 작업은 정식 등록과 승인 기반 실행을 따릅니다. HTTP 401·권한 부족·입력/응답 한도는 오류·제한에서 확인하세요.
게시한 PTI 변경
제품 변경 가이드의 네 도구를 같은 입력으로 사용합니다. products:write의 소유자 동의와 별도 정상 웹 승인이 필요합니다. 준비·승인 대기·후속 단계가 있는 응답은 TASK_STATE_INPUT_REQUIRED입니다. CancelTask는 변경안을 취소하지 않으므로 후속 전송과 로컬 발행을 막으려면 infirium_cancel_product_update를 명시적으로 호출합니다.
복합 업무 진행
고정 workflow의 다섯 도구도 같은 입력을 받습니다. 활성 업무에 승인 대기·후속 입력·명시적 실행·원래 상태 관측·권한 요청·조사가 남으면 TASK_STATE_INPUT_REQUIRED입니다. 취소·완료 응답의 로컬 task 완료를 외부 계약·전송 완료로 해석하지 마세요. 영수증과 실제 완료는 응답의 result.stages와 원래 journal이 근거입니다.
CancelTask는 workflow를 취소하지 않습니다. 이미 결과를 받은 task는 task_not_cancelable일 수 있으며 workflow는 계속 유지됩니다. 후속 업무를 막으려면 infirium_cancel_workflow({workflowId})를 별도로 호출하세요. A2A task 출력 정리는 workflow 사실을 삭제하지 않습니다.

