MCP Sampling 검수: 병렬 도구 결과를 빠짐없이 전달하는 법
MCP Sampling의 병렬 도구 호출과 결과 ID를 대조합니다. 같은 턴의 결과 누락·중복·메시지 혼합을 가상 사례로 비교하고, 오류 결과와 다음 추론의 전달 조건을 담은 인수표를 제안합니다.
이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스
MCP Sampling은 같은 턴의 호출 ID와 결과 ID를 맞춘 뒤 다음 추론으로 넘깁니다. 2026-10-31 기준, 결과 개수만 같다고 통과시키지 않습니다.
병렬 조회가 끝났는데 모델이 한쪽 결과만 보고 답하는 상황을 가정해 보겠습니다. 도구 각각의 성공 여부와 다음 요청에 실제로 실린 메시지 구성을 나눠 봐야 합니다. 이 글은 누락·중복·혼합을 찾는 도구 결과 전달 인수표를 제안합니다.
어떤 MCP 연결에서 이 검수를 하나요?#
서버가 클라이언트에 모델 생성을 요청하는 Sampling 안에서 도구를 사용하는 연결이 대상입니다. 일반 도구 호출만 제공하는 연결이라면 먼저 MCP 서버 구축의 도구·권한 경계를 확인하세요. 같은 호스트·SDK·사양판과 같은 대화 턴을 고정해 비교합니다.
모델 요청을 받는 팀은 지원 capability와 메시지 변환을, 도구 실행 팀은 실제 호출 ID와 반환 상태를 준비합니다. 업무 책임자는 부분 실패 때 답변을 어디까지 허용할지 정하세요. 화면에 답변이 나왔다는 사실만으로 중간 결과가 모두 전달됐다고 판단하지 않습니다.
아래 사례와 인수표는 자사 합성 설계입니다. 실제 고객 장애, 특정 호스트·SDK의 실행 결과, MCP 인증을 보고하는 글이 아닙니다. 실제 재고 수량이나 출고 날짜도 사용하지 않습니다.
Sampling의 도구 호출과 결과는 누가 주고받나요?#
서버는 sampling/createMessage를 요청하고 클라이언트가 모델 생성을 중개합니다. 도구 사용을 제안하는 응답과 실제 도구 실행, 결과를 넣은 후속 요청을 나눠 추적하세요. sampling.tools를 선언하지 않은 클라이언트에 도구 포함 Sampling 요청을 보내면 안 됩니다.
근거는 MCP 2025-11-25 Sampling 고정판입니다. 같은 판의 공식 변경 기록은 tools·toolChoice를 이용한 Sampling 도구 호출 추가를 명시합니다. 사양판 날짜는 2025-11-25, 확인일은 2026-10-31이며 오늘 새로 나온 기능으로 해석하지 않습니다.
| 검수 단계 | 주고받는 것 | 확인할 근거 |
|---|---|---|
| 지원 확인 | 클라이언트의 sampling.tools 선언 | 실제 협상한 capability·사양판 |
| 모델의 도구 사용 응답 | assistant의 tool_use 목록 | 같은 턴의 id·도구명·입력 |
| 도구 실행과 수집 | 각 호출의 실제 반환 상태 | 호출 ID와 성공·오류·미완료 구분 |
| 후속 Sampling 요청 | 대응하는 user의 tool_result 묶음 | toolUseId·바깥 블록 종류·다음 메시지 |
표는 공식 규격을 검수 항목으로 바꾼 자사 설계입니다. 도구 실행은 모델이 요청했다는 이유만으로 허용하지 않고 실제 권한과 승인 조건을 확인합니다. Sampling 지원 여부와 개별 도구의 실행 권한은 서로 다른 조건입니다.
병렬 결과가 거꾸로 도착하면 어떻게 묶나요?#
같은 assistant 턴에서 재고 조회와 출고 일정 조회를 요청했다고 가정합니다. 출고 일정 결과가 먼저 도착해도 그 결과를 재고 조회에 붙이지 않습니다. 아래 가상 ID를 기준으로 각 결과의 대응을 보존합니다.
| 가상 도구 | 요청 id | 결과 toolUseId |
|---|---|---|
| read_stock, 재고 조회 | call_stock | call_stock |
| read_shipping_window, 출고 일정 조회 | call_window | call_window |
다음은 결과 두 개를 담은 user 메시지의 가상 조각입니다. 완전한 JSON-RPC 요청이나 실제 업무 데이터가 아니며, 앞선 assistant 메시지의 두 호출에 대응합니다. 배열에서 출고 일정 결과를 먼저 적었지만 ID 연결은 그대로입니다.
{
"role": "user",
"content": [
{
"type": "tool_result",
"toolUseId": "call_window",
"content": [{ "type": "text", "text": "가상 출고 일정 조회 완료" }]
},
{
"type": "tool_result",
"toolUseId": "call_stock",
"content": [{ "type": "text", "text": "가상 재고 조회 완료" }]
}
]
}이 예시는 2026-10-31 임시 ID·메시지 구성 대조로 확인했습니다. 전체 MCP 검증기나 호스트 실행 시험을 뜻하지 않습니다. 결과를 무조건 정렬하라는 규칙도 아닙니다. 실제 연결에서는 요청 턴과 세션, 호스트가 변환한 최종 메시지까지 대조하세요.
결과 개수가 같아도 왜 보류하나요?#
중복된 결과나 다른 호출에 붙은 결과가 섞일 수 있기 때문입니다. 같은 턴의 호출 ID 목록과 결과 ID 목록, 메시지 블록 종류를 함께 봅니다. 가상 예시에서 call_stock 결과가 중복돼 두 개가 와도 call_window의 누락은 해소되지 않습니다.
Sampling의 Tool Use and Result Balance는 각 도구 사용에 대응하는 결과를 바로 뒤 user 메시지에 갖추도록 정합니다. 같은 메시지의 바깥 content는 도구 결과 블록으로만 구성하며 일반 text 블록 등을 섞지 않습니다. 이 제약은 tool_result 내부 content의 설명 텍스트와 구별합니다.
공식 ToolResultContent 스키마에서 toolUseId는 앞선 ToolUseContent의 ID와 일치해야 합니다. isError는 도구 사용의 오류를 나타내는 선택 필드입니다. 오류 결과를 ID와 연결해 전달하는 것과 해당 업무를 성공으로 승인하는 것은 별도 판단입니다.
호출 ID를 JSON-RPC 요청의 id나 도구명과 혼동하지 마세요. 같은 도구를 여러 번 사용하면 이름만으로 결과를 구별하기 어렵습니다. 메시지 안에서 대응이 맞더라도 반환 값의 내용이 사실과 맞는지는 MCP 구조화 결과와 텍스트의 일치 검수처럼 따로 확인합니다.
누락·오류·중단은 인수표에서 어떻게 나누나요?#
누락을 성공한 빈 결과로 채우지 않습니다. 실제 반환한 오류와 아직 반환되지 않은 상태를 분리하고, 다음 요청의 전달·보류·종료 조건을 정하세요. 아래 판정은 같은 가상 두 호출을 사용한 자사 인수표 제안입니다.
| 가상 표본 | 대조할 증거 | 인수표의 판정 |
|---|---|---|
| 정상·결과 도착 역전 | 두 ID 대응·tool_result 전용 묶음 | 구성 통과 후 내용 검수 |
| 재고 결과만 도착 | call_window 결과가 없음 | 다음 추론 전달 보류·미완료 확인 |
| 재고 결과 두 개 | call_stock 중복·call_window 누락 | 개수 일치여도 보류 |
| 관계없는 결과 ID | 현재 턴에 없는 ID가 포함 | 대화/세션 연결 확인·보류 |
| 바깥 text 블록 혼합 | user content에 일반 설명 블록이 섞임 | 메시지 구성 수정 후 검수 |
| 두 결과 중 하나 오류 | ID는 일치·해당 결과 isError=true | 구성과 업무 실패를 나눠 판정 |
| 중단·루프 상한 도달 | 실제 종료 상태·미완료 호출·전달 이력 | 합의한 종료/재개 정책 확인 |
실패한 실제 결과를 전달할 수 있는 경우에도 답변은 확인된 범위를 벗어나지 않아야 합니다. 중단된 작업이나 결과를 받지 못한 작업의 처리 방식은 호스트·SDK 계약에 맞춰 검수하세요. 내부 시스템이 변경됐다면 메시지 처리가 끝났다는 이유로 그 변경도 취소됐다고 보지 않습니다.
Sampling 고정판은 도구 루프의 반복 제한을 권고합니다. 이 글은 조직에 공통인 횟수나 비용 상한을 정하지 않습니다. 실행 한도와 종료 경로, 사람 승인과 민감정보 전달 범위를 실제 업무에 맞춰 합의하세요. 일반 취소 동작의 범위는 AI 에이전트 취소 검수에서 구분합니다.
구축을 의뢰할 때 어떤 흐름을 준비하나요?#
비식별한 Sampling 대화 흐름과 호출·결과 ID, 오류·종료 정책, 호스트·SDK 지원 정보를 준비합니다. 도구 결과 전달 인수표 초안에서 정상 흐름과 누락 표본의 기대 동작을 함께 정할 수 있습니다. 비용과 소요 시간은 자료·접근·연동 범위를 확인한 뒤 합의합니다.
알파카랩스는 공개 온톨로지 개발 서비스에서 공통 식별자·원천 매핑, 기존 통계 대사, 출처·권한을 지키는 AI·MCP 조회와 표본·운영 인수 조건을 협의한다고 설명합니다. 이는 제공 범위에 대한 회사 자기표기이며 Sampling의 기본 탑재나 특정 호스트 지원을 뜻하지 않습니다. 공개 서비스 확인일은 2026-10-31입니다.
사양판·호스트·SDK 지원과 메시지 변환 정책이 바뀌면 표본을 다시 검수합니다. 다음 문서 검토 예정일은 2026-11-30입니다.
Sampling 도구 결과 전달에서 자주 묻는 질문은 무엇인가요?#
- MCP Sampling에서 병렬 도구 결과는 완료 순서대로 붙이면 되나요?
- 완료 순서만으로 호출과 결과를 연결하지 않습니다. 같은 assistant 턴의 각 tool_use ID와 결과의 toolUseId를 대조하세요. 이 글의 가상 예시는 결과 배열의 순서가 바뀌어도 ID 대응을 보존하지만, 실제 호스트와 SDK의 메시지 변환도 별도로 검수해야 합니다.
- 도구 호출과 결과의 개수만 같으면 검수를 통과하나요?
- 개수가 같아도 같은 ID가 중복되거나 다른 호출의 결과가 들어올 수 있습니다. 같은 턴의 호출 목록과 결과 ID를 함께 비교하세요. 이 글의 인수표는 누락·중복·관계없는 ID를 각각 보류 사유로 제안합니다.
- 도구 하나가 실패하면 결과 메시지에서 빼야 하나요?
- 실패한 도구의 결과와 결과 자체의 누락은 구분합니다. ToolResultContent는 isError로 도구 사용의 오류를 나타낼 수 있고, 대응하는 toolUseId를 가집니다. 메시지 구성이 맞아도 업무의 일부가 실패한 상태이므로 전체 작업 성공으로 바꾸지 않습니다.
- tool_result에 설명 텍스트를 넣으면 안 되나요?
- tool_result 내부 content에는 텍스트 결과나 오류 설명을 넣을 수 있습니다. 금지되는 혼합은 도구 결과를 담은 같은 user 메시지의 바깥 content 목록에 일반 text 블록 등을 함께 넣는 경우입니다. 결과 내부의 설명과 메시지 바깥의 형제 블록을 구별하세요.
- 일반 MCP 도구 연결만 되면 Sampling 도구 루프도 지원하나요?
- 일반 tools/call 지원과 Sampling 안의 도구 사용은 별도 확인 대상입니다. 고정판 규격은 클라이언트가 sampling.tools capability를 선언해야 도구 포함 Sampling 요청을 받을 수 있다고 정합니다. 실제 사용하는 호스트·SDK·사양판의 지원 범위를 확인하세요.
호출부터 결과 전달까지 인수표로 연결하세요
비식별 대화 흐름·호출과 결과 ID·오류 및 종료 정책으로 도구 결과 전달 인수표 초안을 협의합니다. 비용과 소요 시간은 자료·접근·연동 범위 확인 후 정합니다.
도구 결과 전달 인수 조건 확인