이 페이지는 Agent SDK에 대한 MCP 구성을 다룹니다. Claude Code CLI에 MCP 서버를 추가하여 모든 프로젝트에서 로드되도록 하려면 MCP 설치 범위를 참조하세요.
빠른 시작
이 예제는 HTTP 전송을 사용하여 Claude Code 문서 MCP 서버에 연결하고allowedTools를 와일드카드와 함께 사용하여 서버의 모든 도구를 허용합니다.
MCP 서버 추가
query() 호출 시 코드에서 MCP 서버를 구성하거나, settingSources를 통해 로드되는 .mcp.json 파일에서 구성할 수 있습니다.
코드에서 서버 추가
mcpServers 옵션에서 MCP 서버를 직접 전달합니다. 이 예제는 /Users/me/projects에 대한 로컬 파일시스템 MCP 서버를 시작합니다. 해당 경로를 머신의 디렉토리로 바꾸세요:
구성 파일에서 서버 추가
프로젝트 루트에.mcp.json 파일을 생성합니다. 이 파일은 project 설정 소스가 활성화되어 있을 때 선택되며, 기본 query() 옵션에서는 활성화되어 있습니다. settingSources를 명시적으로 설정하는 경우, 이 파일이 로드되도록 "project"를 포함하세요. /Users/me/projects를 머신의 디렉토리로 바꾸세요:
연결 타이밍
Claude Code는options.mcpServers에 전달한 서버를 시작 시 등록하고, 첫 번째 턴 대기(있는 경우)가 해결되면 init 메시지를 내보냅니다. 각 options.mcpServers 서버가 첫 번째 턴을 지연시키는지 여부와 연결 시기는 해당 서버의 유형에 따라 달라집니다:
설정 파일(예:
.mcp.json)이나 플러그인에서 로드된 서버는 일반적으로 init 메시지에서 pending 상태를 표시합니다. options.mcpServers가 stdio, HTTP 또는 SSE 서버를 포함할 때, 첫 번째 턴은 이러한 보류 중인 서버도 기다리며, MCP_TIMEOUT까지 대기합니다. options.mcpServers가 비어 있거나 SDK 서버만 포함할 때, 첫 번째 턴은 대신 최대 2초까지 대기합니다:
- 도구 검색(기본값): 대기는
alwaysLoad: true로 구성된 여전히 보류 중인 서버를 포함하고 나머지는 포함하지 않습니다. 나머지는 백그라운드에서 계속 연결됩니다. 도구 가용성은 Claude가 연결된 후 해당 도구에 어떻게 도달하는지 설명합니다. - 도구 검색 없음: 대기는 모든 보류 중인 서버를 포함합니다. 도구 검색 구성은 도구 검색을 끄는 방법을 다룹니다. 예를 들어
disallowedTools를 통해 세션에서ToolSearch도구를 제외하면, 세션도 도구 검색 없이 실행됩니다.
permissionPromptToolName을 설정하면, 첫 번째 턴은 모든 경우에 해당 도구의 서버도 기다리며, MCP_TIMEOUT까지 대기합니다.
첫 번째 턴 대기를 직접 설정하려면, env 옵션에 CLAUDE_CODE_MCP_STARTUP_WAIT_MS를 추가합니다(예: CLAUDE_CODE_MCP_STARTUP_WAIT_MS: "5000"). 그러면 첫 번째 턴은 도구 검색 가용 여부와 관계없이 모든 보류 중인 서버를 기다리며 최대 그 많은 밀리초까지 대기합니다. 이 기한은 또한 options.mcpServers의 stdio, HTTP 및 SSE 서버에 대한 MCP_TIMEOUT 첫 번째 턴 대기를 대체합니다. CLAUDE_CODE_MCP_STARTUP_WAIT_MS는 Claude Code v2.1.274 이상이 필요합니다.
대기가 끝날 때 여전히 보류 중인 서버는 백그라운드에서 계속 연결됩니다. 변수를 0으로 설정하여 대기를 건너뜁니다. permissionPromptToolName 서버는 값에 관계없이 자체 MCP_TIMEOUT 대기를 유지합니다.
init 메시지가 전송되기 전에 첫 번째 턴 대기보다 별도의 이전 단계에서 시작 자체를 차단하려면:
MCP_CONNECTION_NONBLOCKING을0으로 설정하여 전체 연결 배치에서 차단합니다. Claude Code는 기본적으로 해당 대기를 5초로 제한합니다.MCP_CONNECT_TIMEOUT_MS환경 변수를 밀리초 단위로 조정하여 제한을 조정합니다. 해당 기한에 보류 중인 서버는 백그라운드에서 계속 연결됩니다.- 서버의 구성에서
alwaysLoad: true를 설정하여 해당 도구를 첫 번째 턴에서 전체 스키마로 사용 가능하게 하고, 도구 검색 지연에서 제외합니다. Claude Code는 시작 시 해당 서버의 도구를 기다리며, 같은 기한으로 제한되고, 다른 서버는 백그라운드에서 계속 연결됩니다. 캐시된 도구 목록이 있는 원격 서버는 위의 표에 따라 연결 없이 도구를 제공합니다.
init 서브타입이 있는 system 메시지는 내보낼 때 각 서버의 상태를 보고합니다. 해당 상태를 읽으려면 오류 처리를 참조하세요.
MCP 도구 허용하기
MCP 도구는 Claude가 사용하기 전에 명시적인 권한이 필요합니다. 권한이 없으면 Claude는 도구가 존재한다는 것은 인식하지만 해당 도구를 호출할 수는 없습니다.도구 이름 지정 규칙
MCP 도구의 이름은mcp__<server-name>__<tool-name> 형식이며, 여기서 <server-name>은 mcpServers의 키처럼 서버를 등록할 때 사용한 이름입니다.
서버 이름에 포함된 .이나 공백 같은 문자는 _로 대체됩니다. 다음 표는 두 가지 서버 키에 대한 list_issues 도구의 전체 이름을 보여 줍니다.
allowedTools와 MCP 권한 규칙에서는 전체 도구 이름을 사용합니다. 플러그인이 제공하는 서버의 경우 <server-name>은 플러그인 범위 형식을 따르며 plugin_으로 시작합니다.
allowedTools로 자동 승인하기
allowedTools를 사용하면 특정 MCP 도구를 자동 승인하여 Claude가 권한 프롬프트 없이 해당 도구를 사용할 수 있습니다.
*)를 사용하면 각 도구를 개별적으로 나열하지 않고도 서버의 모든 도구를 허용할 수 있습니다.
MCP 접근에는 권한 모드보다
allowedTools를 사용하는 것이 좋습니다. permissionMode: "acceptEdits"는 MCP 도구를 자동 승인하지 않습니다(파일 편집과 파일 시스템 Bash 명령만 자동 승인합니다). permissionMode: "bypassPermissions"는 MCP 도구를 자동 승인하지만 다른 대부분의 안전 프롬프트도 비활성화하므로 필요 이상으로 범위가 넓습니다. 남아 있는 프롬프트는 권한 평가 방식을 참조하세요. allowedTools의 와일드카드는 원하는 MCP 서버에만 정확히 권한을 부여하며 그 이상은 허용하지 않습니다. 전체 비교는 권한 모드를 참조하세요.사용 가능한 도구 확인하기
MCP 서버가 제공하는 도구를 확인하려면 서버의 문서를 확인하거나system init 메시지의 tools 배열을 검사합니다. MCP 도구 이름은 mcp__로 시작합니다.
Claude Code는 options.mcpServers로 전달된 서버에 대해 첫 번째 턴의 연결 대기 이후에 init 메시지를 내보냅니다. 따라서 tools 배열에는 그 시점까지 연결된 각 서버의 mcp__ 도구와, 처음 사용할 때 연결되는 캐시된 도구 목록을 가진 서버의 도구가 나열됩니다. 연결되지 않은 다른 서버의 도구는 포함되지 않습니다. 각 서버의 상태를 확인하는 방법은 오류 처리를 참조하세요.
다음 필터는 MCP 도구 이름을 출력합니다.
전송 유형
MCP 서버는 다양한 전송 프로토콜을 사용하여 에이전트와 통신합니다. 서버의 문서를 확인하여 지원하는 전송 방식을 확인하세요:- 문서에 실행할 명령어가 제시된 경우(예:
npx @modelcontextprotocol/server-filesystem), stdio를 사용하세요 - 문서에 URL이 제시된 경우, HTTP 또는 SSE를 사용하세요
- 코드에서 자체 도구를 구축하는 경우, SDK MCP 서버를 사용하세요
stdio 서버
stdin/stdout을 통해 통신하는 로컬 프로세스입니다. 동일한 머신에서 실행하는 MCP 서버에 이를 사용하세요..mcp.json 형식의 경우, 설정 파일에서 서버 추가에 표시된 동일한 필드를 사용하세요. 코드에서는 명령과 해당 인수를 전달하세요. /Users/me/projects를 머신의 디렉터리로 바꾸세요:
HTTP/SSE 서버
클라우드 호스팅 MCP 서버 및 원격 API에 HTTP 또는 SSE를 사용하세요..mcp.json 형식의 경우, HTTP 원격 서버 헤더의 예시와 동일한 필드를 사용하고, SSE 서버의 경우 "type": "sse"를 사용하세요. 코드에서는 서버의 URL을 전달하세요:
"type": "http"을 사용하세요. .mcp.json 및 기타 JSON 설정 파일에서는 "streamable-http"이 "http"의 별칭으로 허용됩니다. SDK의 McpHttpServerConfig 유형은 "http"만 선언하므로, 코드에서 전달하는 서버의 경우 "http"를 사용하세요.
SDK MCP 서버
별도의 서버 프로세스를 실행하는 대신 애플리케이션 코드에서 직접 사용자 정의 도구를 정의하세요. 구현 세부 사항은 사용자 정의 도구 가이드를 참조하세요.initialize 제어 요청으로 등록된 SDK MCP 서버는 Claude Code가 요청을 처리하는 즉시 연결을 시작합니다.
MCP 도구 검색
많은 MCP 도구가 구성되어 있을 때, 도구 정의가 컨텍스트 윈도우의 상당한 부분을 차지할 수 있습니다. 도구 검색은 컨텍스트에서 도구 정의를 보류하고 각 턴에서 Claude가 필요로 하는 도구만 로드하여 이 문제를 해결합니다. 도구 검색은 기본적으로 활성화되어 있습니다. 구성 옵션, 모범 사례 및 사용자 정의 SDK 도구와 함께 도구 검색을 사용하는 방법에 대해서는 도구 검색을 참조하십시오.인증
대부분의 MCP 서버는 외부 서비스에 접근하기 위해 인증이 필요합니다. 서버 구성에서 환경 변수를 통해 자격 증명을 전달합니다.환경 변수를 통해 자격 증명 전달
env 필드를 사용하여 API 키, 토큰 및 기타 자격 증명을 MCP 서버에 전달합니다:
- 코드에서
- .mcp.json
원격 서버용 HTTP 헤더
HTTP 및 SSE 서버의 경우 서버 구성에서 직접 인증 헤더를 전달합니다:- 코드에서
- .mcp.json
OAuth2 인증
MCP 사양은 OAuth 2.1을 지원합니다. SDK는 브라우저를 열거나 대화형 OAuth 흐름을 실행하지 않습니다. 구성된 서버가 인증 챌린지를 반환하고 저장된 토큰이 없을 때, 에이전트 실행은 해당 서버의 도구 없이 계속되며, 서버는needs-auth 상태를 보고합니다. 시스템 초기화 메시지의 mcp_servers 배열은 내보낼 때 해당 서버에 대해 여전히 pending을 표시할 수 있습니다. 서버에 자격 증명이 필요한지 확인하려면 TypeScript SDK에서 mcpServerStatus()를 폴링하거나 Python에서 get_mcp_status()를 폴링합니다.
자격 증명을 제공하려면 자신의 애플리케이션에서 OAuth 흐름을 완료하고 결과 액세스 토큰을 서버의 headers에 전달합니다:
예제
저장소에서 이슈 나열
이 예제는 원격 GitHub MCP 서버에 연결하여 최근 이슈를 나열합니다. 이 예제에는 MCP 연결 및 도구 호출을 확인하기 위한 디버그 로깅이 포함되어 있습니다. 실행하기 전에 쿼리하려는 저장소에 대한 읽기 액세스 권한이 있는 GitHub 개인 액세스 토큰을 생성하고 환경 변수로 설정합니다:MCP servers: 줄에서 github에 대한 status가 connected이면 토큰이 작동함을 확인합니다. Claude Code가 서버에 대한 캐시된 도구 목록을 가지고 있으면 상태가 pending으로 표시될 수 있으며 서버는 첫 번째 도구 호출 시 연결됩니다. 상태가 failed 또는 needs-auth이면 결과를 신뢰하기 전에 오류 처리를 참조하십시오. Claude는 서버를 사용할 수 없을 때 기본 제공 도구로 폴백할 수 있기 때문입니다.
데이터베이스 쿼리
이 예제는 DBHub를 사용하여 Postgres 데이터베이스를 쿼리합니다. 에이전트는 자동으로 데이터베이스 스키마를 검색하고 SQL 쿼리를 작성하며 결과를 반환합니다. DBHub의execute_sql 도구는 제한하지 않는 한 에이전트가 내보내는 모든 SQL(쓰기 포함)을 실행합니다. DBHub 구성 파일에서 readonly = true를 설정하면 DBHub는 INSERT, UPDATE, DELETE 및 DDL 문을 거부하므로 에이전트가 쓰기를 내보내더라도 예제는 데이터를 수정할 수 없습니다. DBHub는 구성을 로드할 때 프로세스 환경에서 ${DATABASE_URL}을 확인하므로 연결 문자열이 파일 외부에 유지됩니다. 스크립트 옆에 이 dbhub.toml을 생성합니다:
dbhub.toml
DATABASE_URL 환경 변수를 연결 문자열로 설정합니다. 자리 표시자 값을 자신의 데이터베이스 세부 정보로 바꿉니다:
오류 처리
MCP 서버는 여러 가지 이유로 연결에 실패할 수 있습니다. 서버 프로세스가 설치되지 않았거나, 자격 증명이 유효하지 않거나, 원격 서버에 도달할 수 없을 수 있습니다. Claude Code는 각 쿼리의 시작 부분에서 서브타입이init인 system 메시지를 내보냅니다. 이 메시지에는 각 MCP 서버의 연결 상태가 포함됩니다. status 필드는 "pending", "connected", "failed", "needs-auth" 또는 "disabled"일 수 있습니다. Claude Code는 options.mcpServers에 전달된 서버에 대해 첫 번째 턴 연결 대기 후에 init 메시지를 내보내므로, 대기 시간 내에 연결된 서버는 "connected"를 표시합니다.
init 메시지에서 "pending"을 그 자체로 실패로 취급하지 마십시오. 다음 중 하나를 의미할 수 있습니다.
- 서버가 아직 연결되지 않았습니다. Claude Code가 첫 번째 턴 전에 얼마나 오래 기다리는지 참조하십시오.
- 서버의 도구 목록이 캐시에서 제공되었으며, 첫 사용 시 연결이 이루어졌습니다.
- 연결 기한이 만료되었습니다. 이러한 서버는 타이밍에 따라
"pending"또는"failed"를 보고합니다.
"failed" 또는 "needs-auth"를 확인하십시오.
"connected"를 보고한 후에도 변경될 수 있습니다. 세션 중간에 연결이 끊어지면 Claude Code는 서버를 다시 "pending"으로 이동하면서 재연결합니다. 나중에 TypeScript에서 mcpServerStatus() 호출 또는 Python에서 ClaudeSDKClient.get_mcp_status()를 호출하면 이전에 연결된 것으로 본 서버에 대해 "pending"을 보고할 수 있으며, 사용자 측에서 구성 변경이 없습니다.
5번의 재연결 시도가 실패한 후 서버는 "failed"를 보고하거나, 다시 인증이 필요할 때 "needs-auth"를 보고합니다. "failed" 상태의 HTTP 또는 SSE 서버는 사용자가 호출하지 않아도 "connected"로 돌아올 수 있습니다. Claude Code가 일시적인 오류 후 백그라운드에서 계속 재시도하기 때문입니다. 수동으로 다시 시도하려면 TypeScript에서 reconnectMcpServer()를 호출하거나 Python에서 ClaudeSDKClient.reconnect_mcp_server()를 호출하십시오.
문제 해결
서버가 “failed” 상태를 표시함
init 메시지를 확인하여 어떤 서버가 연결에 실패했는지 확인하세요:
"pending" 상태는 서버가 실패했다는 의미가 아닙니다. 초기화 시 적용되는 경우는 오류 처리를 참조하세요. 세션 후반부에 업데이트된 상태를 얻으려면 TypeScript SDK에서 쿼리의 mcpServerStatus() 메서드를 호출하거나, Python에서 ClaudeSDKClient.get_mcp_status()를 호출하세요.
일반적인 원인:
- 누락된 환경 변수: 필수 토큰과 자격 증명이 설정되어 있는지 확인하세요. stdio 서버의 경우
env필드가 서버가 예상하는 것과 일치하는지 확인하세요. - 서버가 설치되지 않음:
npx명령의 경우 패키지가 존재하고 Node.js가 PATH에 있는지 확인하세요. - 잘못된 연결 문자열: 데이터베이스 서버의 경우 연결 문자열 형식을 확인하고 데이터베이스에 액세스할 수 있는지 확인하세요.
- 네트워크 문제: 원격 HTTP/SSE 서버의 경우 URL에 도달할 수 있는지 확인하고 방화벽이 연결을 허용하는지 확인하세요.
도구가 호출되지 않음
Claude가 도구를 보지만 사용하지 않는 경우allowedTools로 권한을 부여했는지 확인하세요:
SDK MCP 서버에서 도구가 누락됨
TypeScript SDK에서 도구의 입력 스키마를 JSON Schema로 변환할 수 없는 경우,createSdkMcpServer()로 생성한 서버는 도구 목록을 나열할 때 해당 도구를 제외합니다. 이 시점에 SDK는 경고를 내보냅니다. Node.js에서 이 경고는 코드가 CLAUDE_SDK_MCP_TOOL_SCHEMA_UNCONVERTIBLE인 프로세스 경고이며, 다음 텍스트로 시작합니다:
연결 시간 초과
MCP 서버 연결은 기본적으로 30초 후 시간 초과됩니다. 실행 중인 도구 호출이 걸릴 수 있는 시간을 변경하려면MCP_TOOL_TIMEOUT을 설정하세요. 서버가 시작하는 데 더 오래 걸리면 연결이 실패합니다. MCP_TIMEOUT 환경 변수(밀리초 단위)로 연결 제한을 높이세요. 더 많은 시작 시간이 필요한 서버의 경우 다음도 고려하세요:
- 사용 가능한 경우 더 가벼운 서버 사용
- 에이전트를 시작하기 전에 서버 사전 준비
- 느린 초기화 원인에 대한 서버 로그 확인
timeout을 createSdkMcpServer()에 전달하여 단일 SDK MCP 서버에 대한 도구 호출 제한을 설정할 수 있습니다.
도구 출력이 최대 허용 토큰을 초과함
SDK는 Claude Code와 동일한 MCP 출력 제한을 적용합니다. 이미지 콘텐츠가 없는 성공한 도구 결과가 25,000 토큰보다 크면 Claude Code는 출력을 파일에 저장하고 도구 결과를 파일 경로의 이름을 지정하는 오류 메시지로 바꾸므로 에이전트가 출력을 부분적으로 다시 읽을 수 있습니다. 토큰 제한을 변경하려면MAX_MCP_OUTPUT_TOKENS 환경 변수를 설정하세요. 도구가 anthropic/maxResultSizeChars를 선언하지 않는 한, 50,000자보다 긴 성공한 텍스트 결과는 토큰 제한과 관계없이 파일에 저장됩니다. 서버가 해당 주석을 선언하는 방법을 포함한 전체 동작은 MCP 출력 제한 및 경고를 참조하세요.
관련 리소스
- 사용자 정의 도구 가이드: SDK 애플리케이션과 함께 인프로세스로 실행되는 자신만의 MCP 서버를 구축합니다
- 권한:
allowedTools및disallowedTools를 사용하여 에이전트가 사용할 수 있는 MCP 도구를 제어합니다 - TypeScript SDK 참조: MCP 구성 옵션을 포함한 전체 API 참조
- Python SDK 참조: MCP 구성 옵션을 포함한 전체 API 참조
- MCP 서버 디렉토리: 데이터베이스, API 등을 위한 사용 가능한 MCP 서버를 찾아봅니다