Claude Code에 MCP 서버 연결하기: local·project·user 범위와 .mcp.json 관리
claude mcp add 명령 형식, 세 가지 범위의 저장 위치와 우선순위, .mcp.json 환경 변수 확장, 프로젝트 서버 승인과 타임아웃 설정

핵심 요약
- --scope를 생략하면 local로 등록되며, 팀 공유는 project 범위(.mcp.json)로 한다.
- 같은 이름이면 local → project → user → 플러그인 → claude.ai 커넥터 순으로 적용된다.
- .mcp.json에는 ${VAR}, ${VAR:-기본값}으로 비밀값을 환경 변수에서 읽게 하고 토큰을 커밋하지 않는다.
- 프로젝트 서버는 대화형 세션에서 승인이 필요하지만 claude -p·CI 등에서는 생략되므로 .mcp.json 변경을 리뷰 대상으로 둔다.
- 도구 출력 한도 기본값은 25,000토큰이며 MAX_MCP_OUTPUT_TOKENS로 조정한다.
Claude Code에 MCP 서버를 하나 붙이는 일은 명령 한 줄이면 끝나지만, 팀에서 쓰기 시작하면 질문이 생긴다. 이 설정이 내 컴퓨터에만 있는지 저장소에 공유되는지, 토큰은 어디에 두는지, 팀원이 받은 설정이 왜 바로 동작하지 않는지. 이 글은 Claude Code MCP 문서를 기준으로 범위 세 가지의 차이와 .mcp.json을 팀 저장소에서 관리하는 방법을 정리한다. 읽고 나면 개인용·팀 공유용·전역 서버를 구분해 등록하고 비밀값을 커밋하지 않는 구성을 만들 수 있다.
전송 방식별 등록 명령
# 원격 HTTP 서버
claude mcp add --transport http notion https://mcp.notion.com/mcp
# 헤더가 필요한 HTTP 서버
claude mcp add --transport http internal-api https://mcp.example.com/mcp \
--header "Authorization: Bearer $INTERNAL_TOKEN"
# 로컬 stdio 서버: -- 뒤가 실행 명령
claude mcp add --transport stdio airtable --env AIRTABLE_API_KEY=$AIRTABLE_API_KEY \
-- npx -y airtable-mcp-server
# 확인·조회·삭제
claude mcp list
claude mcp get airtable
claude mcp remove airtable
stdio 서버에서 --는 생략할 수 없다. 이 구분자가 없으면 서버 명령의 -y 같은 옵션을 Claude Code가 자기 옵션으로 해석한다. 이미 Claude Desktop에 등록한 서버가 있다면 claude mcp add-from-claude-desktop으로 가져올 수 있고, JSON 한 덩어리로 넣으려면 claude mcp add-json을 쓴다.
세 가지 범위와 우선순위
--scope(-s)를 생략하면 local로 등록된다.
| 범위 | 적용 대상 | 공유 | 저장 위치 | 맞는 용도 |
|---|---|---|---|---|
local(기본) | 현재 프로젝트 | 아니오 | ~/.claude.json의 프로젝트별 항목 | 개인 토큰이 필요한 서버, 실험 중인 서버 |
project | 현재 프로젝트 | 예 | 프로젝트 루트 .mcp.json | 팀 전체가 쓰는 서버 |
user | 내 모든 프로젝트 | 아니오 | ~/.claude.json의 전역 항목 | 어느 저장소에서나 쓰는 개인 도구 |
같은 이름의 서버가 여러 범위에 있으면 local → project → user → 플러그인 제공 서버 → claude.ai 커넥터 순으로 앞의 것이 쓰인다. 이 순서를 이용하면 팀 공용 .mcp.json의 설정을 개인 local 설정으로 덮어써 테스트할 수 있다. 반대로 팀원이 예전에 같은 이름으로 local 등록해 둔 서버가 있으면 저장소의 새 설정이 무시되므로, "나만 안 된다"는 문의가 오면 claude mcp get <이름>으로 어느 범위 설정이 적용됐는지부터 확인한다.
팀 공유용 .mcp.json 작성하기
project 범위로 등록하면 .mcp.json이 생기고 이 파일을 커밋한다. 토큰을 파일에 직접 쓰지 않도록 문서가 지원하는 환경 변수 확장을 쓴다. ${VAR}는 환경 변수 값으로, ${VAR:-기본값}은 변수가 없을 때 기본값으로 바뀐다. 확장은 stdio 서버의 command·args·env, HTTP 서버의 url·headers에서 동작한다.
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": { "Authorization": "Bearer ${GITHUB_PAT}" }
},
"internal-docs": {
"type": "http",
"url": "${DOCS_MCP_URL:-https://docs-mcp.internal.example.com}/mcp",
"timeout": 600000
},
"db-readonly": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@example/postgres-mcp", "--read-only"],
"env": { "DATABASE_URL": "${READONLY_DATABASE_URL}" }
}
}
}
문서에는 보안상 원격 서버의 url·headers에서 빈 값으로 처리되는 변수 목록도 있다. ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, HTTPS_PROXY, NPM_TOKEN 등은 원격 서버로 새어 나가지 않도록 확장되지 않는다. 헤더에 이런 이름의 변수를 쓰고 인증이 안 된다면 전용 변수 이름으로 바꾼다.
저장소 README에는 필요한 환경 변수 이름과 발급 방법을 적어 둔다. 데이터베이스 서버를 공유한다면 읽기 전용 계정을 쓰는 이유와 설정은 데이터베이스 MCP 서버 보안을, 저장소의 다른 비밀값을 AI 도구가 읽지 못하게 막는 방법은 시크릿·.env 차단 설정을 참고한다.
팀원이 처음 받았을 때의 승인 절차
.mcp.json의 서버는 대화형 세션에서 처음 쓰기 전에 승인을 요구한다. 저장소에 누군가 추가한 서버가 사용자 모르게 실행되지 않게 하는 장치다. 승인 선택을 되돌리려면 다음을 실행한다.
claude mcp reset-project-choices
문서에 따르면 claude -p 비대화형 실행, Agent SDK 세션, 클라우드 세션, --strict-mcp-config 세션 등에서는 이 승인 단계가 생략된다. CI에서 Claude Code를 돌린다면 저장소의 .mcp.json 서버가 승인 없이 실행된다는 뜻이므로, PR에서 .mcp.json 변경을 CODEOWNERS 리뷰 대상으로 지정해 두는 것이 안전하다.
느린 서버와 큰 응답 다루기
| 설정 | 위치 | 기본값·동작 |
|---|---|---|
MCP_TIMEOUT | 환경 변수 | 서버 시작 대기 시간(ms). 예: MCP_TIMEOUT=10000 claude |
timeout | .mcp.json 서버 항목 | 서버별 시간 제한(ms), 1000 미만은 무시 |
MAX_MCP_OUTPUT_TOKENS | 환경 변수 | 도구 출력 최대 토큰, 기본 25,000(10,000부터 경고) |
CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT | 환경 변수 | 응답 없는 도구 호출 중단 시간. 기본 HTTP·SSE·WS 5분, stdio 30분 |
출력 한도를 무작정 올리기보다 도구가 반환하는 양을 줄이는 쪽이 컨텍스트 사용량에도 유리하다. 문서에 따르면 5만 자를 넘는 텍스트 결과는 파일로 저장되고, 1만1천 자를 넘는 오류 메시지는 앞뒤 5천 자만 남는다.
연결이 안 될 때 확인 순서
- 세션 안에서
/mcp로 서버 상태와 오류 메시지를 본다. claude mcp get <이름>으로 어느 범위 설정이 적용됐는지, 명령·URL이 의도대로 확장됐는지 확인한다.- 환경 변수가 Claude Code를 실행한 셸에 실제로 있는지 확인한다. 토큰 끝에 줄바꿈이 섞이면 Claude Code가 공백 경고를 띄운다.
- stdio 서버라면 등록한 명령을 터미널에서 직접 실행해 본다. 서버 자체 문제는 MCP Inspector로 분리해 확인한다.
GitHub 서버를 예로 한 전체 연결 과정은 GitHub MCP 서버로 이슈·PR·코드 검색 연결하기에서 볼 수 있다.
초보자가 자주 실수하는 포인트
- stdio 서버 등록 시 -- 구분자를 빼서 서버 옵션이 Claude Code 옵션으로 해석되는 경우
- 팀 공용 서버를 기본 local 범위로 등록하고 팀원에게 공유됐다고 생각하는 경우
- .mcp.json에 토큰을 직접 적어 커밋하는 경우
- 예전 local 설정이 저장소 .mcp.json을 덮어쓰고 있는 것을 모르고 원인을 찾는 경우
체크리스트
- 서버마다 범위(local·project·user)를 의도대로 골랐는가
- .mcp.json에 비밀값이 없고 환경 변수 참조만 있는가
- README에 필요한 환경 변수와 발급 방법을 적었는가
- .mcp.json이 CODEOWNERS 리뷰 대상인가
- /mcp에서 모든 서버가 연결 상태로 보이는가
자주 묻는 질문
Claude Code 자체를 MCP 서버로 쓸 수도 있나요?
문서에 claude mcp serve 명령이 있어 Claude Code를 다른 MCP 클라이언트에 서버로 노출할 수 있습니다. 노출되는 도구 범위와 권한은 해당 문서 항목에서 확인한 뒤 사용합니다.
OAuth를 쓰는 원격 서버는 토큰을 어디에 넣나요?
OAuth 서버는 claude mcp login <이름>으로 인증 흐름을 진행하며 헤더에 토큰을 직접 넣지 않습니다. 콜백 포트를 고정해야 하는 환경이면 --callback-port, 미리 등록한 클라이언트를 써야 하면 --client-id 옵션을 씁니다.
참고 자료 · 검증 기준
위 자료와 내용을 대조한 날짜: . 도구·서비스 정책은 이후 바뀔 수 있으므로 적용 전 공식 문서를 다시 확인하세요.
이 글은 실제 실무 환경 테스트 및 검증된 기술 자료를 바탕으로 작성되었으며, 환경 변화에 따라 지속적으로 갱신됩니다.