빠른 참조
사용자 정의 도구 만들기
도구는 TypeScript의tool() 헬퍼 또는 Python의 @tool 데코레이터에 인수로 전달되는 네 가지 부분으로 정의됩니다:
- 이름: Claude가 도구를 호출할 때 사용하는 고유 식별자입니다.
- 설명: 도구가 수행하는 작업입니다. Claude는 이를 읽고 도구를 호출할 시기를 결정합니다.
- 입력 스키마: 도구가 받는 인수이며, 언어별로 다음과 같이 선언합니다:
- TypeScript: Zod 스키마입니다. 핸들러의
args는 이 스키마에서 타입을 가져옵니다. 필드에.describe()를 호출하면 Claude가 보는 설명을 필드에 부여할 수 있습니다. - Python:
{"latitude": float}와 같이 이름을 타입에 매핑하는 딕셔너리이며, SDK가 이를 JSON 스키마로 변환합니다.{"latitude": Annotated[float, "Latitude coordinate"]}와 같이 타입을Annotated로 감싸면 Claude가 보는 설명을 필드에 부여할 수 있습니다. 열거형, 범위, 선택적 필드 또는 중첩된 객체가 필요할 때는 데코레이터에 전체 JSON 스키마 딕셔너리를 직접 전달할 수도 있습니다.
- TypeScript: Zod 스키마입니다. 핸들러의
- 핸들러: Claude가 도구를 호출할 때 실행되는 비동기 함수입니다. 검증된 인수를 받으며 다음을 포함하는 객체를 반환해야 합니다:
content(필수): 각각"text","image","audio","resource"또는"resource_link"의type을 가진 결과 블록의 배열입니다. 텍스트가 아닌 블록은 이미지 및 리소스 반환을 참조하세요.structuredContent(선택사항): 결과를 기계 판독 가능한 데이터로 보유하는 JSON 객체이며,content와 함께 반환됩니다. 구조화된 데이터 반환을 참조하세요.isError(선택사항): 도구 실패를 신호하려면true로 설정하여 Claude가 이에 반응할 수 있도록 합니다. 오류 처리를 참조하세요.
createSdkMcpServer (TypeScript) 또는 create_sdk_mcp_server (Python)를 사용하여 서버에 래핑합니다. 서버는 별도의 프로세스가 아닌 애플리케이션 내에서 인프로세스로 실행됩니다.
이 페이지에서 HTTP 요청을 수행하는 Python 예제는 httpx를 사용합니다. 프로젝트에서 사용하는 패키지 관리자로 추가하세요:
- Python (uv)
- Python (pip)
날씨 도구 예제
이 예제는get_temperature 도구를 정의하고 MCP 서버에 래핑하며, 서버를 query에 전달하지는 않습니다. 도구를 실행하려면 아래의 사용자 정의 도구 호출을 참조하세요.
tool() TypeScript 참조 또는 @tool Python 참조를 참조하세요.
매개변수를 선택사항으로 만들기
매개변수를 선택사항으로 만들려면 스키마에서 선택사항으로 선언하고 핸들러에서 기본값을 적용합니다:- TypeScript: Zod 필드에
.optional()을 추가합니다. - Python: 딕셔너리 스키마는 모든 키를 필수로 요구합니다. JSON 스키마 형식을 사용하고, 매개변수를
required에서 제외한 뒤args.get()으로 읽습니다. 선택적 키가 있는 타입 지정 스키마는 TypedDict 클래스를 참조하세요.
get_precipitation_chance 도구는 두 패턴을 모두 보여줍니다.
사용자 정의 도구 호출
mcpServers 옵션을 통해 생성한 MCP 서버를 query에 전달합니다. 각 도구의 정규화된 이름은 mcp__{server_name}__{tool_name}이며, 여기서 {server_name}은 mcpServers에서 서버에 지정한 키입니다. 키에 .이나 공백과 같은 문자가 포함되어 있으면 {server_name}을 작성할 때 해당 문자를 _로 바꿉니다. 도구가 권한 프롬프트 없이 실행되도록 allowedTools에 정규화된 이름을 나열합니다.
이 스니펫들은 날씨 도구 예제의 weatherServer를 재사용하여 Claude에게 특정 위치의 날씨를 묻습니다.
weather.py 또는 weather.ts 한 파일에 결합한 후 터미널에서 실행합니다:
- TypeScript
- Python (uv)
- Python (pip)
get_temperature를 호출하고 스크립트는 샌프란시스코의 현재 온도를 포함한 한 줄 답변을 출력합니다.
더 많은 도구 추가
서버는tools 배열에 나열한 만큼 많은 도구를 보유합니다. 서버에 둘 이상의 도구가 있으면 allowedTools에서 각각을 개별적으로 나열하거나 와일드카드 mcp__weather__*를 사용하여 서버가 노출하는 모든 도구를 포함할 수 있습니다.
아래 예제는 두 번째 도구 get_precipitation_chance를 정의하고 날씨 도구 예제의 weatherServer 정의를 배열의 두 도구를 모두 나열하는 것으로 바꿉니다.
tool()의 extras 인수 또는 createSdkMcpServer()의 옵션에서 alwaysLoad: true를 전달하여 도구의 전체 스키마를 초기 프롬프트에 유지합니다.
도구 주석 추가
도구 주석은 도구의 동작을 설명하는 선택사항 메타데이터입니다. TypeScript의tool() 헬퍼에 다섯 번째 인수로 또는 Python의 @tool 데코레이터에 대해 annotations 키워드 인수로 전달합니다. 모든 힌트 필드는 부울입니다.
주석은 메타데이터이지 강제 사항이 아닙니다.
readOnlyHint: true로 표시된 도구도 핸들러가 그렇게 하면 디스크에 쓸 수 있습니다. 주석을 핸들러와 정확하게 유지하세요.
이 예제는 날씨 도구 예제의 get_temperature 도구에 readOnlyHint를 추가합니다.
ToolAnnotations를 참조하세요.
도구 접근 제어
날씨 도구 예제에서 등록한 서버는allowedTools에 도구를 나열했습니다. 이 섹션에서는 여러 도구가 있거나 기본 제공 도구를 제한하려는 경우 접근 범위를 지정하는 방법을 다룹니다. 도구 이름이 구성되는 방식에 대해서는 사용자 정의 도구 호출을 참조하십시오.
허용된 도구 구성
tools 옵션과 허용/거부 목록은 두 가지 계층에 영향을 미칩니다. 가용성은 Claude의 컨텍스트에 도구가 표시되는지 여부를 제어하고, 권한은 Claude가 호출을 시도한 후 호출이 승인되는지 여부를 제어합니다. tools와 단순 이름 disallowedTools 항목은 가용성을 변경합니다. allowedTools와 범위가 지정된 disallowedTools 규칙은 권한을 변경합니다. 작업 추적 도구 중 하나를 allowedTools에 이름 지정하면 Claude Code도 세션을 옵트인합니다.
기본 제공 도구를 완전히 제거하려면
tools에서 생략하거나 disallowedTools(Python: disallowed_tools)에 단순 이름을 나열하십시오. 둘 다 도구를 컨텍스트 밖에 유지하므로 Claude는 절대 시도하지 않습니다. 범위가 지정된 disallowedTools 규칙은 일치하는 호출을 차단하지만 도구를 표시된 상태로 유지하므로 Claude가 시도하는 데 턴을 낭비할 수 있습니다. 전체 평가 순서는 권한 구성을 참조하십시오.
오류 처리
핸들러 오류는 에이전트 루프를 중단하지 않습니다. SDK의 인프로세스 MCP 서버는 포착되지 않은 예외를 캐치하고 오류 결과로 반환하므로, 오류를 보고하는 방식이 Claude가 읽는 내용을 결정하며, 쿼리 실패 여부는 결정하지 않습니다.
두 경우 모두 Claude는 재시도하거나, 다른 도구를 시도하거나, 실패를 설명할 수 있습니다. 원본 예외 메시지가 Claude가 작용하기에 충분하지 않을 때 오류를 직접 캐치합니다.
아래 예제는 핸들러 내에서 두 가지 종류의 실패를 캐치하고 Claude가 읽는 오류 메시지를 작성합니다. 200이 아닌 HTTP 상태는 응답에서 캐치되어 오류 결과로 반환됩니다. 네트워크 오류 또는 잘못된 JSON은 주변
try/except (Python) 또는 try/catch (TypeScript)에 의해 캐치되어 오류 결과로도 반환됩니다. 두 경우 모두 Claude는 단순한 예외 문자열 대신 실패를 설명하는 메시지를 받습니다.
이미지 및 리소스 반환
도구 결과의content 배열은 text, image, audio, resource, resource_link 블록을 허용합니다. 동일한 응답에서 이들을 혼합할 수 있습니다. TypeScript에서 SDK는 오디오 블록을 디스크에 저장하고 Claude는 저장된 파일 경로가 포함된 텍스트 블록을 수신합니다. Python에서는 SDK가 도구 결과에서 오디오 블록을 제거하고 경고를 기록합니다.
Claude는 각 리소스 링크 블록을 링크의 이름, URI, 설명이 포함된 텍스트 블록으로 수신합니다. TypeScript에서 애플리케이션은 사용자 메시지의 tool_use_result에서 resourceLinks로 링크 자체를 수신합니다. Python에서는 SDK가 CLI에서 결과를 보기 전에 이들을 텍스트로 평탄화하므로, Python resourceLinks 키는 프로세스 내 도구에 대해 생성되지 않습니다.
이미지
이미지 블록은 이미지 바이트를 인라인으로 base64로 인코딩하여 전달합니다. URL 필드는 없습니다. URL에 있는 이미지를 반환하려면 핸들러에서 이를 가져오고, 응답 바이트를 읽은 후 base64로 인코딩하여 반환합니다. PNG, JPEG, GIF 또는 WebP 이미지는 Claude에 시각적 입력으로 도달합니다. 다른 유형의 이미지는 디스크에 저장되고 Claude는 파일 경로를 텍스트로 수신합니다.리소스
리소스 블록은 URI로 식별되는 콘텐츠를 포함합니다. 실제 콘텐츠는 블록의text 또는 blob 필드에 있습니다. 도구가 생성된 파일이나 외부 시스템의 레코드를 생성할 때 이를 사용합니다.
이 예제는 도구 핸들러 내부에서 반환된 리소스 블록을 보여줍니다. SDK는 예제의 URI인
file:///tmp/report.md에서 읽지 않습니다.
CallToolResult 유형에서 나옵니다. 전체 정의는 MCP 사양을 참조하십시오.
구조화된 데이터 반환
structuredContent는 결과의 선택적 JSON 객체로, content 배열과 별도입니다. Claude가 텍스트 문자열이나 이미지에서 구문 분석하는 대신 정확한 필드로 읽을 수 있는 원본 값을 반환하는 데 사용합니다.
structuredContent가 설정되면 Claude는 JSON과 content의 모든 이미지 또는 리소스 블록을 수신합니다. content의 텍스트 블록은 구조화된 데이터를 복제한다고 가정하므로 전달되지 않습니다. 아래 예제는 차트를 이미지 블록으로 렌더링하고 동일한 핸들러의 structuredContent에서 뒤에 있는 데이터 포인트를 반환합니다. 스니펫에서 chartPngBuffer는 렌더링된 PNG 바이트를 보유하는 Buffer입니다.
TypeScript
Python
@tool 데코레이터는 핸들러의 반환 딕셔너리에서 content와 is_error만 전달합니다. Python에서 structuredContent를 반환하려면 in-process SDK 서버 대신 독립형 MCP 서버를 실행합니다.예제: 단위 변환기
이 도구는 길이, 온도, 무게 단위 간의 값을 변환합니다. 사용자가 “100킬로미터를 마일로 변환해줘” 또는 “72°F는 섭씨온도로 몇 도야?”라고 물어보면, Claude가 요청에서 올바른 단위 유형과 단위를 선택합니다. 두 가지 패턴을 보여줍니다:- Enum 스키마:
unit_type은 고정된 값 집합으로 제한됩니다. TypeScript에서는z.enum()을 사용합니다. Python에서는 dict 스키마가 enum을 지원하지 않으므로 전체 JSON Schema dict가 필요합니다. - 지원되지 않는 입력 처리: 변환 쌍을 찾을 수 없을 때, 핸들러는
isError: true를 반환하므로 Claude가 실패를 일반적인 결과로 취급하는 대신 사용자에게 무엇이 잘못되었는지 알려줄 수 있습니다.
query에 전달합니다. 이 예제는 동일한 도구가 다양한 단위 유형을 처리하는 것을 보여주기 위해 루프에서 세 가지 다른 프롬프트를 보냅니다. 각 응답에 대해 AssistantMessage 객체(Claude가 해당 턴 동안 수행한 도구 호출을 포함)를 검사하고 최종 ResultMessage 텍스트를 출력하기 전에 각 ToolUseBlock을 출력합니다. 이를 통해 Claude가 도구를 사용하는 시점과 자체 지식에서 답변하는 시점을 볼 수 있습니다.
도구 검색이 기본적으로 활성화되어 있으므로, 출력에는 Claude가 지연된 도구 스키마를 로드할 때 ToolSearch 호출도 포함될 수 있습니다.