작은 도구 연결 실습
관련 기초 개념
개요
조회·계산·검증을 분리한 처리 흐름을 검증한다.
먼저 권한·승인·멱등성·재시도, 문서·PDF·Excel 추출과 대사의 핵심 개념을 확인하세요.
핵심 개요
작은 도구 연결은 모델 없이도 실행 계약부터 검증할 수 있습니다. 도구 이름과 인수를 허용 목록으로 제한하고, 검증된 인수만 실제 함수에 전달합니다. 자유 텍스트를 임의 코드로 실행하지 않습니다.
조회 도구와 변경 도구는 부작용이 다릅니다. 우선 읽기 전용 예제로 성공·없는 대상·잘못된 인수를 구분한 뒤 변경 작업에 승인과 멱등성을 더합니다.
필요한 용어
- Dispatcher: 허용된 도구 이름을 실제 함수에 연결하는 실행기
- 부작용: 함수 반환값 외에 저장·삭제·전송 등 외부 상태가 변하는 효과
작동 과정
- 단일 목적의 함수와 입력·오류 계약을 작성합니다.
- 허용 목록과 인수 검사를 거쳐 함수를 호출합니다.
- 정상·없는 대상·형식 오류를 자동 검사합니다.
풀이 예제
아래 입력과 기록은 직접 만든 교육용 가상 자료입니다.
입력·조건
get_stock 도구는 상품 ID만 받아 재고 수를 돌려줍니다. 상품 B의 재고는 7입니다.
판단·결과
B 조회는 7, 없는 상품은 명시적인 not_found 결과로 처리합니다.
이렇게 판단한 이유
오류를 정상 값 0으로 바꾸면 재고 없음과 상품 없음이 섞입니다. 모델이 후속 판단을 하려면 상태를 구분해야 합니다.
로컬 실행 예제
Python 3.12. python tool_dispatch.py
python tool_dispatch.py"""Allowlist, argument contract, authorization, and explicit not-found."""
def dispatch(name, args, *, allowed):
if name != 'order_status':
return {'status': 'unknown_tool'}
if type(args) is not dict or set(args) != {'order_id'} or type(args['order_id']) is not str:
return {'status': 'invalid_arguments'}
if not allowed:
return {'status': 'forbidden'}
orders = {'A1': 'shipped'}
value = orders.get(args['order_id'])
return {'status': 'ok', 'value': value} if value is not None else {'status': 'not_found'}
assert dispatch('order_status', {'order_id':'A1'}, allowed=True) == {'status':'ok','value':'shipped'}
assert dispatch('delete_order', {}, allowed=True)['status'] == 'unknown_tool'
assert dispatch('order_status', {'order_id':0}, allowed=True)['status'] == 'invalid_arguments'
for malformed in (None, 42, ['order_id']):
assert dispatch('order_status', malformed, allowed=True)['status'] == 'invalid_arguments'
assert dispatch('order_status', {'order_id':'A1'}, allowed=False)['status'] == 'forbidden'
assert dispatch('order_status', {'order_id':'X'}, allowed=True)['status'] == 'not_found'
print('PASS: success, allowlist, invalid arguments, forbidden, not found')기대 결과: 정상·알 수 없는 도구·잘못된 인수·권한 거절·없는 주문 검사
2026-10-22 Python 3.12.14에서 정상·허용 목록·인수·권한·없는 대상 경로를 다시 실행했습니다. None·숫자·배열 등 잘못된 JSON 인수 13개가 예외 없이 invalid_arguments로 거절되는 회귀검사도 통과했습니다. 실제 모델이나 외부 API를 호출하지 않습니다.
흔한 실패와 복구
알 수 없는 도구 이름을 eval 같은 임의 실행으로 연결하지 않습니다. 등록된 함수 외에는 거절합니다.
확인 문제
작은 도구 실행기를 검증할 때 필요한 사례는?
- 정상 요청 한 건만
- 정상·없는 대상·잘못된 인수·권한 오류
- 모델이 설명한 예상 결과만
풀이 기록 기능을 불러오는 중…
해설 보기
정답: B. 정상·없는 대상·잘못된 인수·권한 오류
정상·없는 대상·잘못된 인수·권한 오류 알 수 없는 도구 이름을 eval 같은 임의 실행으로 연결하지 않습니다. 등록된 함수 외에는 거절합니다.
참고 자료
- MCP: Architecture — host·client·server 및 세션 경계.
- Python: json — JSON의 직렬화·파싱과 자료형.
자료 확인: 2026-10-21. 사례·문항·실습은 자체 제작했습니다. 외부 서비스 호출과 실제 모델 품질 측정은 학습자가 별도 환경에서 수행합니다.
직접 적용하기
교육용 가상 상황
주문 상태 조회기를 구현할 때 허용 도구·인수·없는 주문·권한 오류를 어떻게 구분할지 정의하세요.
조회·계산·검증을 분리한 처리 흐름을 검증한다. 판단 근거와 검증할 결과를 적으세요.
답안 저장 기능을 불러오는 중…
검증 기준과 해설 보기
- 조회 전용 계약을 작성한다
- 임의 함수 실행을 막는다
- 정상·오류 응답을 각각 시험한다
get_order_status만 허용하고 주문 ID 형식·사용자 소유권을 검사합니다. 응답 상태를 ok·not_found·forbidden으로 구분하되 타인의 주문 존재를 노출하지 않는 정책을 적용합니다. 함수 호출 전후 입력과 결과를 검증하는 테스트를 작성합니다.
복습하기
- Dispatcher는 무엇을 하나요?
- 없는 상품을 0으로 반환하면 왜 곤란한가요?
- 모델 없이 검사할 수 있나요?
답변 확인 기준
- Dispatcher는 무엇을 하나요?
허용 이름을 실제 함수에 연결합니다.
- 없는 상품을 0으로 반환하면 왜 곤란한가요?
상품 없음과 재고 0의 의미가 섞입니다.
- 모델 없이 검사할 수 있나요?
실행 계약과 함수는 직접 호출해 검사할 수 있습니다.