메인 콘텐츠로 건너뛰기
Claude Code는 AI 도구 통합을 위한 오픈 소스 표준인 Model Context Protocol (MCP)를 통해 수백 개의 외부 도구 및 데이터 소스에 연결할 수 있습니다. MCP 서버는 Claude Code에 도구, 데이터베이스 및 API에 대한 액세스를 제공합니다.

MCP로 할 수 있는 것

MCP 서버가 연결되면 Claude Code에 다음을 요청할 수 있습니다:
  • 이슈 추적기에서 기능 구현: “JIRA 이슈 ENG-4521에 설명된 기능을 추가하고 GitHub에서 PR을 생성하세요.”
  • 모니터링 데이터 분석: “Sentry와 Statsig을 확인하여 ENG-4521에 설명된 기능의 사용 현황을 확인하세요.”
  • 데이터베이스 쿼리: “PostgreSQL 데이터베이스를 기반으로 기능 ENG-4521을 사용한 무작위 사용자 10명의 이메일을 찾으세요.”
  • 디자인 통합: “Slack에 게시된 새로운 Figma 디자인을 기반으로 표준 이메일 템플릿을 업데이트하세요.”
  • 워크플로우 자동화: “이 10명의 사용자를 새로운 기능에 대한 피드백 세션에 초대하는 Gmail 초안을 생성하세요.”

인기 있는 MCP 서버

Claude Code에 연결할 수 있는 일반적으로 사용되는 MCP 서버는 다음과 같습니다:
타사 MCP 서버를 자신의 책임 하에 사용하세요 - Anthropic은 이러한 모든 서버의 정확성이나 보안을 검증하지 않았습니다. 설치하는 MCP 서버를 신뢰하는지 확인하세요. 신뢰할 수 없는 콘텐츠를 가져올 수 있는 MCP 서버를 사용할 때는 특히 주의하세요. 이러한 서버는 프롬프트 주입 위험에 노출될 수 있습니다.
특정 통합이 필요하신가요? GitHub에서 수백 개 이상의 MCP 서버를 찾거나 MCP SDK를 사용하여 자신만의 서버를 구축하세요.

MCP 서버 설치

MCP 서버는 필요에 따라 세 가지 방법으로 구성할 수 있습니다:

옵션 1: 원격 HTTP 서버 추가

HTTP 서버는 원격 MCP 서버에 연결하기 위한 권장 옵션입니다. 이는 클라우드 기반 서비스에 가장 널리 지원되는 전송 방식입니다.
# 기본 구문
claude mcp add --transport http <name> <url>

# 실제 예: Notion에 연결
claude mcp add --transport http notion https://mcp.notion.com/mcp

# Bearer 토큰을 사용한 예
claude mcp add --transport http secure-api https://api.example.com/mcp \
  --header "Authorization: Bearer your-token"

옵션 2: 원격 SSE 서버 추가

SSE (Server-Sent Events) 전송은 더 이상 사용되지 않습니다. 가능한 경우 HTTP 서버를 대신 사용하세요.
# 기본 구문
claude mcp add --transport sse <name> <url>

# 실제 예: Asana에 연결
claude mcp add --transport sse asana https://mcp.asana.com/sse

# 인증 헤더를 사용한 예
claude mcp add --transport sse private-api https://api.company.com/sse \
  --header "X-API-Key: your-key-here"

옵션 3: 로컬 stdio 서버 추가

Stdio 서버는 컴퓨터에서 로컬 프로세스로 실행됩니다. 시스템에 직접 액세스해야 하거나 사용자 정의 스크립트가 필요한 도구에 이상적입니다.
# 기본 구문
claude mcp add [options] <name> -- <command> [args...]

# 실제 예: Airtable 서버 추가
claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \
  -- npx -y airtable-mcp-server
중요: 옵션 순서모든 옵션(--transport, --env, --scope, --header)은 서버 이름 앞에 와야 합니다. -- (이중 대시)는 서버 이름과 MCP 서버에 전달되는 명령 및 인수를 구분합니다.예를 들어:
  • claude mcp add --transport stdio myserver -- npx servernpx server 실행
  • claude mcp add --transport stdio --env KEY=value myserver -- python server.py --port 8080 → 환경에서 KEY=value를 사용하여 python server.py --port 8080 실행
이렇게 하면 Claude의 플래그와 서버의 플래그 간의 충돌을 방지합니다.

서버 관리

구성한 후에는 다음 명령으로 MCP 서버를 관리할 수 있습니다:
# 구성된 모든 서버 나열
claude mcp list

# 특정 서버의 세부 정보 가져오기
claude mcp get github

# 서버 제거
claude mcp remove github

# (Claude Code 내에서) 서버 상태 확인
/mcp

동적 도구 업데이트

Claude Code는 MCP list_changed 알림을 지원하므로 MCP 서버가 연결을 끊었다가 다시 연결할 필요 없이 사용 가능한 도구, 프롬프트 및 리소스를 동적으로 업데이트할 수 있습니다. MCP 서버가 list_changed 알림을 보내면 Claude Code는 해당 서버에서 사용 가능한 기능을 자동으로 새로 고칩니다.
팁:
  • --scope 플래그를 사용하여 구성이 저장되는 위치를 지정하세요:
    • local (기본값): 현재 프로젝트에서만 사용 가능 (이전 버전에서는 project라고 불렸음)
    • project: .mcp.json 파일을 통해 프로젝트의 모든 사람과 공유
    • user: 모든 프로젝트에서 사용 가능 (이전 버전에서는 global이라고 불렸음)
  • --env 플래그를 사용하여 환경 변수 설정 (예: --env KEY=value)
  • MCP_TIMEOUT 환경 변수를 사용하여 MCP 서버 시작 시간 초과 구성 (예: MCP_TIMEOUT=10000 claude는 10초 시간 초과 설정)
  • MCP 도구 출력이 10,000 토큰을 초과하면 Claude Code에서 경고를 표시합니다. 이 제한을 늘리려면 MAX_MCP_OUTPUT_TOKENS 환경 변수를 설정하세요 (예: MAX_MCP_OUTPUT_TOKENS=50000)
  • /mcp를 사용하여 OAuth 2.0 인증이 필요한 원격 서버로 인증하세요
Windows 사용자: 기본 Windows (WSL 아님)에서 npx를 사용하는 로컬 MCP 서버는 올바른 실행을 보장하기 위해 cmd /c 래퍼가 필요합니다.
# 이렇게 하면 Windows가 실행할 수 있는 command="cmd"가 생성됩니다
claude mcp add --transport stdio my-server -- cmd /c npx -y @some/package
cmd /c 래퍼가 없으면 Windows가 npx를 직접 실행할 수 없기 때문에 “Connection closed” 오류가 발생합니다. (위의 참고 사항에서 -- 매개변수에 대한 설명을 참조하세요.)

플러그인 제공 MCP 서버

플러그인은 MCP 서버를 번들로 제공할 수 있으며, 플러그인이 활성화되면 자동으로 도구 및 통합을 제공합니다. 플러그인 MCP 서버는 사용자 구성 서버와 동일하게 작동합니다. 플러그인 MCP 서버의 작동 방식:
  • 플러그인은 플러그인 루트의 .mcp.json 또는 plugin.json에 인라인으로 MCP 서버를 정의합니다
  • 플러그인이 활성화되면 MCP 서버가 자동으로 시작됩니다
  • 플러그인 MCP 도구는 수동으로 구성된 MCP 도구와 함께 나타납니다
  • 플러그인 서버는 플러그인 설치를 통해 관리됩니다 (/mcp 명령이 아님)
플러그인 MCP 구성 예: 플러그인 루트의 .mcp.json:
{
  "database-tools": {
    "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
    "args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],
    "env": {
      "DB_URL": "${DB_URL}"
    }
  }
}
또는 plugin.json에 인라인:
{
  "name": "my-plugin",
  "mcpServers": {
    "plugin-api": {
      "command": "${CLAUDE_PLUGIN_ROOT}/servers/api-server",
      "args": ["--port", "8080"]
    }
  }
}
플러그인 MCP 기능:
  • 자동 수명 주기: 플러그인이 활성화되면 서버가 시작되지만 MCP 서버 변경 사항을 적용하려면 Claude Code를 다시 시작해야 합니다 (활성화 또는 비활성화)
  • 환경 변수: 플러그인 상대 경로에 ${CLAUDE_PLUGIN_ROOT} 사용
  • 사용자 환경 액세스: 수동으로 구성된 서버와 동일한 환경 변수에 액세스
  • 여러 전송 유형: stdio, SSE 및 HTTP 전송 지원 (전송 지원은 서버에 따라 다를 수 있음)
플러그인 MCP 서버 보기:
# Claude Code 내에서 플러그인 서버를 포함한 모든 MCP 서버 보기
/mcp
플러그인 서버는 플러그인에서 나온 것을 나타내는 표시기와 함께 목록에 나타납니다. 플러그인 MCP 서버의 이점:
  • 번들 배포: 도구 및 서버가 함께 패키지됨
  • 자동 설정: 수동 MCP 구성이 필요 없음
  • 팀 일관성: 플러그인이 설치되면 모든 사람이 동일한 도구를 얻음
플러그인과 함께 MCP 서버를 번들로 제공하는 방법에 대한 자세한 내용은 플러그인 구성 요소 참조를 참조하세요.

MCP 설치 범위

MCP 서버는 세 가지 다른 범위 수준에서 구성할 수 있으며, 각각 서버 접근성 및 공유 관리를 위한 고유한 목적을 제공합니다. 이러한 범위를 이해하면 특정 요구 사항에 맞게 서버를 구성하는 최선의 방법을 결정하는 데 도움이 됩니다.

로컬 범위

로컬 범위 서버는 기본 구성 수준을 나타내며 프로젝트 경로 아래 ~/.claude.json에 저장됩니다. 이러한 서버는 사용자에게만 비공개이며 현재 프로젝트 디렉토리 내에서 작업할 때만 액세스할 수 있습니다. 이 범위는 개인 개발 서버, 실험적 구성 또는 공유하면 안 되는 민감한 자격 증명을 포함하는 서버에 이상적입니다.
# 로컬 범위 서버 추가 (기본값)
claude mcp add --transport http stripe https://mcp.stripe.com

# 명시적으로 로컬 범위 지정
claude mcp add --transport http stripe --scope local https://mcp.stripe.com

프로젝트 범위

프로젝트 범위 서버는 프로젝트 루트 디렉토리의 .mcp.json 파일에 구성을 저장하여 팀 협업을 활성화합니다. 이 파일은 버전 제어에 체크인되도록 설계되어 모든 팀 멤버가 동일한 MCP 도구 및 서비스에 액세스할 수 있도록 합니다. 프로젝트 범위 서버를 추가하면 Claude Code는 자동으로 이 파일을 생성하거나 적절한 구성 구조로 업데이트합니다.
# 프로젝트 범위 서버 추가
claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp
결과 .mcp.json 파일은 표준화된 형식을 따릅니다:
{
  "mcpServers": {
    "shared-server": {
      "command": "/path/to/server",
      "args": [],
      "env": {}
    }
  }
}
보안상의 이유로 Claude Code는 .mcp.json 파일의 프로젝트 범위 서버를 사용하기 전에 승인을 요청합니다. 이러한 승인 선택을 재설정해야 하는 경우 claude mcp reset-project-choices 명령을 사용하세요.

사용자 범위

사용자 범위 서버는 ~/.claude.json에 저장되며 크로스 프로젝트 접근성을 제공하므로 컴퓨터의 모든 프로젝트에서 사용할 수 있으면서 사용자 계정에만 비공개로 유지됩니다. 이 범위는 개인 유틸리티 서버, 개발 도구 또는 다양한 프로젝트에서 자주 사용하는 서비스에 적합합니다.
# 사용자 서버 추가
claude mcp add --transport http hubspot --scope user https://mcp.hubspot.com/anthropic

올바른 범위 선택

다음을 기반으로 범위를 선택하세요:
  • 로컬 범위: 개인 서버, 실험적 구성 또는 한 프로젝트에만 해당하는 민감한 자격 증명
  • 프로젝트 범위: 팀 공유 서버, 프로젝트 특정 도구 또는 협업에 필요한 서비스
  • 사용자 범위: 여러 프로젝트에서 필요한 개인 유틸리티, 개발 도구 또는 자주 사용하는 서비스
MCP 서버는 어디에 저장되나요?
  • 사용자 및 로컬 범위: ~/.claude.json (mcpServers 필드 또는 프로젝트 경로 아래)
  • 프로젝트 범위: 프로젝트 루트의 .mcp.json (소스 제어에 체크인됨)
  • 관리됨: 시스템 디렉토리의 managed-mcp.json (관리되는 MCP 구성 참조)

범위 계층 및 우선 순위

MCP 서버 구성은 명확한 우선 순위 계층을 따릅니다. 동일한 이름의 서버가 여러 범위에 존재할 때 시스템은 로컬 범위 서버를 먼저 우선시하고, 그 다음 프로젝트 범위 서버, 마지막으로 사용자 범위 서버를 우선시하여 충돌을 해결합니다. 이 설계는 필요할 때 개인 구성이 공유 구성을 재정의할 수 있도록 합니다.

.mcp.json의 환경 변수 확장

Claude Code는 .mcp.json 파일의 환경 변수 확장을 지원하므로 팀이 구성을 공유하면서 머신 특정 경로 및 API 키와 같은 민감한 값에 대한 유연성을 유지할 수 있습니다. 지원되는 구문:
  • ${VAR} - 환경 변수 VAR의 값으로 확장
  • ${VAR:-default} - 설정된 경우 VAR로 확장되고, 그렇지 않으면 default 사용
확장 위치: 환경 변수는 다음에서 확장될 수 있습니다:
  • command - 서버 실행 파일 경로
  • args - 명령줄 인수
  • env - 서버에 전달되는 환경 변수
  • url - HTTP 서버 유형의 경우
  • headers - HTTP 서버 인증의 경우
변수 확장을 사용한 예:
{
  "mcpServers": {
    "api-server": {
      "type": "http",
      "url": "${API_BASE_URL:-https://api.example.com}/mcp",
      "headers": {
        "Authorization": "Bearer ${API_KEY}"
      }
    }
  }
}
필수 환경 변수가 설정되지 않았고 기본값이 없으면 Claude Code는 구성을 구문 분석하지 못합니다.

실제 예

예: Sentry로 오류 모니터링

# 1. Sentry MCP 서버 추가
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp

# 2. /mcp를 사용하여 Sentry 계정으로 인증
> /mcp

# 3. 프로덕션 문제 디버깅
> "지난 24시간 동안 가장 일반적인 오류는 무엇입니까?"
> "오류 ID abc123의 스택 추적을 보여주세요"
> "어느 배포에서 이러한 새로운 오류가 발생했습니까?"

예: 코드 검토를 위해 GitHub에 연결

# 1. GitHub MCP 서버 추가
claude mcp add --transport http github https://api.githubcopilot.com/mcp/

# 2. Claude Code에서 필요한 경우 인증
> /mcp
# GitHub에 대해 "인증" 선택

# 3. 이제 Claude에 GitHub 작업을 요청할 수 있습니다
> "PR #456을 검토하고 개선 사항을 제안하세요"
> "방금 발견한 버그에 대한 새 이슈를 생성하세요"
> "나에게 할당된 모든 열린 PR을 보여주세요"

예: PostgreSQL 데이터베이스 쿼리

# 1. 연결 문자열을 사용하여 데이터베이스 서버 추가
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \
  --dsn "postgresql://readonly:[email protected]:5432/analytics"

# 2. 자연스럽게 데이터베이스 쿼리
> "이번 달 총 수익은 얼마입니까?"
> "주문 테이블의 스키마를 보여주세요"
> "지난 90일 동안 구매하지 않은 고객을 찾으세요"

원격 MCP 서버로 인증

많은 클라우드 기반 MCP 서버는 인증이 필요합니다. Claude Code는 보안 연결을 위해 OAuth 2.0을 지원합니다.
1

인증이 필요한 서버 추가

예를 들어:
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
2

Claude Code 내에서 /mcp 명령 사용

Claude Code에서 다음 명령을 사용하세요:
> /mcp
그런 다음 브라우저에서 로그인 단계를 따르세요.
팁:
  • 인증 토큰은 안전하게 저장되고 자동으로 새로 고쳐집니다
  • /mcp 메뉴에서 “Clear authentication”을 사용하여 액세스 권한을 취소하세요
  • 브라우저가 자동으로 열리지 않으면 제공된 URL을 복사하세요
  • OAuth 인증은 HTTP 서버에서 작동합니다

JSON 구성에서 MCP 서버 추가

MCP 서버에 대한 JSON 구성이 있는 경우 직접 추가할 수 있습니다:
1

JSON에서 MCP 서버 추가

# 기본 구문
claude mcp add-json <name> '<json>'

# 예: JSON 구성을 사용하여 HTTP 서버 추가
claude mcp add-json weather-api '{"type":"http","url":"https://api.weather.com/mcp","headers":{"Authorization":"Bearer token"}}'

# 예: JSON 구성을 사용하여 stdio 서버 추가
claude mcp add-json local-weather '{"type":"stdio","command":"/path/to/weather-cli","args":["--api-key","abc123"],"env":{"CACHE_DIR":"/tmp"}}'
2

서버가 추가되었는지 확인

claude mcp get weather-api
팁:
  • JSON이 셸에서 올바르게 이스케이프되었는지 확인하세요
  • JSON은 MCP 서버 구성 스키마를 준수해야 합니다
  • --scope user를 사용하여 프로젝트 특정 구성 대신 사용자 구성에 서버를 추가할 수 있습니다

Claude Desktop에서 MCP 서버 가져오기

Claude Desktop에서 MCP 서버를 이미 구성한 경우 가져올 수 있습니다:
1

Claude Desktop에서 서버 가져오기

# 기본 구문 
claude mcp add-from-claude-desktop 
2

가져올 서버 선택

명령을 실행한 후 가져올 서버를 선택할 수 있는 대화형 대화 상자가 표시됩니다.
3

서버가 가져와졌는지 확인

claude mcp list 
팁:
  • 이 기능은 macOS 및 Windows Subsystem for Linux (WSL)에서만 작동합니다
  • Claude Desktop 구성 파일을 해당 플랫폼의 표준 위치에서 읽습니다
  • --scope user 플래그를 사용하여 사용자 구성에 서버를 추가하세요
  • 가져온 서버는 Claude Desktop과 동일한 이름을 가집니다
  • 동일한 이름의 서버가 이미 존재하면 숫자 접미사가 붙습니다 (예: server_1)

Claude Code를 MCP 서버로 사용

Claude Code 자체를 다른 애플리케이션이 연결할 수 있는 MCP 서버로 사용할 수 있습니다:
# Claude를 stdio MCP 서버로 시작
claude mcp serve
claude_desktop_config.json에 다음 구성을 추가하여 Claude Desktop에서 이를 사용할 수 있습니다:
{
  "mcpServers": {
    "claude-code": {
      "type": "stdio",
      "command": "claude",
      "args": ["mcp", "serve"],
      "env": {}
    }
  }
}
실행 파일 경로 구성: command 필드는 Claude Code 실행 파일을 참조해야 합니다. claude 명령이 시스템의 PATH에 없으면 실행 파일의 전체 경로를 지정해야 합니다.전체 경로를 찾으려면:
which claude
그런 다음 구성에서 전체 경로를 사용하세요:
{
  "mcpServers": {
    "claude-code": {
      "type": "stdio",
      "command": "/full/path/to/claude",
      "args": ["mcp", "serve"],
      "env": {}
    }
  }
}
올바른 실행 파일 경로가 없으면 spawn claude ENOENT와 같은 오류가 발생합니다.
팁:
  • 서버는 View, Edit, LS 등과 같은 Claude의 도구에 대한 액세스를 제공합니다
  • Claude Desktop에서 Claude에 디렉토리의 파일을 읽고, 편집 등을 수행하도록 요청해 보세요
  • 이 MCP 서버는 Claude Code의 도구만 MCP 클라이언트에 노출하므로 클라이언트가 개별 도구 호출에 대한 사용자 확인을 구현할 책임이 있습니다.

MCP 출력 제한 및 경고

MCP 도구가 큰 출력을 생성할 때 Claude Code는 토큰 사용을 관리하여 대화 컨텍스트가 압도되지 않도록 합니다:
  • 출력 경고 임계값: MCP 도구 출력이 10,000 토큰을 초과하면 Claude Code에서 경고를 표시합니다
  • 구성 가능한 제한: MAX_MCP_OUTPUT_TOKENS 환경 변수를 사용하여 최대 허용 MCP 출력 토큰을 조정할 수 있습니다
  • 기본 제한: 기본 최대값은 25,000 토큰입니다
큰 출력을 생성하는 도구의 제한을 늘리려면:
# MCP 도구 출력에 대한 더 높은 제한 설정
export MAX_MCP_OUTPUT_TOKENS=50000
claude
이는 다음을 수행하는 MCP 서버로 작업할 때 특히 유용합니다:
  • 대규모 데이터 세트 또는 데이터베이스 쿼리
  • 상세한 보고서 또는 문서 생성
  • 광범위한 로그 파일 또는 디버깅 정보 처리
특정 MCP 서버에서 자주 출력 경고가 발생하면 제한을 늘리거나 서버를 구성하여 응답을 페이지 매김하거나 필터링하는 것을 고려하세요.

MCP 리소스 사용

MCP 서버는 파일을 참조하는 방식과 유사하게 @ 멘션을 사용하여 참조할 수 있는 리소스를 노출할 수 있습니다.

MCP 리소스 참조

1

사용 가능한 리소스 나열

프롬프트에 @를 입력하여 연결된 모든 MCP 서버에서 사용 가능한 리소스를 확인하세요. 리소스는 자동 완성 메뉴의 파일과 함께 나타납니다.
2

특정 리소스 참조

@server:protocol://resource/path 형식을 사용하여 리소스를 참조하세요:
> @github:issue://123을 분석하고 수정 사항을 제안할 수 있나요?
> @docs:file://api/authentication의 API 문서를 검토해 주세요
3

여러 리소스 참조

단일 프롬프트에서 여러 리소스를 참조할 수 있습니다:
> @postgres:schema://users와 @docs:file://database/user-model을 비교하세요
팁:
  • 리소스는 참조될 때 자동으로 가져와지고 첨부 파일로 포함됩니다
  • 리소스 경로는 @ 멘션 자동 완성에서 퍼지 검색 가능합니다
  • Claude Code는 서버가 지원할 때 MCP 리소스를 나열하고 읽을 수 있는 도구를 자동으로 제공합니다
  • 리소스는 MCP 서버가 제공하는 모든 유형의 콘텐츠를 포함할 수 있습니다 (텍스트, JSON, 구조화된 데이터 등)

MCP 프롬프트를 슬래시 명령으로 사용

MCP 서버는 Claude Code에서 슬래시 명령으로 사용 가능해지는 프롬프트를 노출할 수 있습니다.

MCP 프롬프트 실행

1

사용 가능한 프롬프트 발견

/를 입력하여 MCP 서버의 프롬프트를 포함한 모든 사용 가능한 명령을 확인하세요. MCP 프롬프트는 /mcp__servername__promptname 형식으로 나타납니다.
2

인수 없이 프롬프트 실행

> /mcp__github__list_prs
3

인수를 사용하여 프롬프트 실행

많은 프롬프트는 인수를 허용합니다. 명령 뒤에 공백으로 구분된 인수를 전달하세요:
> /mcp__github__pr_review 456
> /mcp__jira__create_issue "로그인 흐름의 버그" high
팁:
  • MCP 프롬프트는 연결된 서버에서 동적으로 발견됩니다
  • 인수는 프롬프트의 정의된 매개변수를 기반으로 구문 분석됩니다
  • 프롬프트 결과는 대화에 직접 주입됩니다
  • 서버 및 프롬프트 이름은 정규화됩니다 (공백은 밑줄이 됨)

관리되는 MCP 구성

MCP 서버에 대한 중앙 집중식 제어가 필요한 조직의 경우 Claude Code는 두 가지 구성 옵션을 지원합니다:
  1. managed-mcp.json을 사용한 독점 제어: 사용자가 수정하거나 확장할 수 없는 고정된 MCP 서버 세트 배포
  2. 허용 목록/거부 목록을 사용한 정책 기반 제어: 사용자가 자신의 서버를 추가할 수 있지만 허용되는 서버를 제한
이러한 옵션을 통해 IT 관리자는 다음을 수행할 수 있습니다:
  • 직원이 액세스할 수 있는 MCP 서버 제어: 조직 전체에 승인된 MCP 서버의 표준화된 세트 배포
  • 승인되지 않은 MCP 서버 방지: 사용자가 승인되지 않은 MCP 서버를 추가하지 못하도록 제한
  • MCP 완전히 비활성화: 필요한 경우 MCP 기능을 완전히 제거

옵션 1: managed-mcp.json을 사용한 독점 제어

managed-mcp.json 파일을 배포하면 모든 MCP 서버에 대한 독점 제어가 됩니다. 사용자는 이 파일에 정의된 서버 이외의 MCP 서버를 추가, 수정 또는 사용할 수 없습니다. 이는 완전한 제어를 원하는 조직을 위한 가장 간단한 방법입니다. 시스템 관리자는 구성 파일을 시스템 전체 디렉토리에 배포합니다:
  • macOS: /Library/Application Support/ClaudeCode/managed-mcp.json
  • Linux 및 WSL: /etc/claude-code/managed-mcp.json
  • Windows: C:\Program Files\ClaudeCode\managed-mcp.json
이는 시스템 전체 경로입니다 (~/Library/...와 같은 사용자 홈 디렉토리가 아님). 관리자 권한이 필요하며 IT 관리자가 배포하도록 설계되었습니다.
managed-mcp.json 파일은 표준 .mcp.json 파일과 동일한 형식을 사용합니다:
{
  "mcpServers": {
    "github": {
      "type": "http",
      "url": "https://api.githubcopilot.com/mcp/"
    },
    "sentry": {
      "type": "http",
      "url": "https://mcp.sentry.dev/mcp"
    },
    "company-internal": {
      "type": "stdio",
      "command": "/usr/local/bin/company-mcp-server",
      "args": ["--config", "/etc/company/mcp-config.json"],
      "env": {
        "COMPANY_API_URL": "https://internal.company.com"
      }
    }
  }
}

옵션 2: 허용 목록 및 거부 목록을 사용한 정책 기반 제어

독점 제어를 하는 대신 관리자는 사용자가 자신의 MCP 서버를 구성할 수 있도록 허용하면서 허용되는 서버에 제한을 적용할 수 있습니다. 이 방법은 관리되는 설정 파일allowedMcpServersdeniedMcpServers를 사용합니다.
옵션 선택: 사용자 사용자 정의 없이 고정된 서버 세트를 배포하려면 옵션 1 (managed-mcp.json)을 사용하세요. 사용자가 정책 제약 내에서 자신의 서버를 추가할 수 있도록 하려면 옵션 2 (허용 목록/거부 목록)를 사용하세요.

제한 옵션

허용 목록 또는 거부 목록의 각 항목은 세 가지 방법으로 서버를 제한할 수 있습니다:
  1. 서버 이름으로 (serverName): 서버의 구성된 이름과 일치
  2. 명령으로 (serverCommand): stdio 서버를 시작하는 데 사용되는 정확한 명령 및 인수와 일치
  3. URL 패턴으로 (serverUrl): 와일드카드 지원을 사용하여 원격 서버 URL과 일치
중요: 각 항목은 serverName, serverCommand 또는 serverUrl 중 정확히 하나를 가져야 합니다.

구성 예

{
  "allowedMcpServers": [
    // 서버 이름으로 허용
    { "serverName": "github" },
    { "serverName": "sentry" },

    // 정확한 명령으로 허용 (stdio 서버의 경우)
    { "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },
    { "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },

    // URL 패턴으로 허용 (원격 서버의 경우)
    { "serverUrl": "https://mcp.company.com/*" },
    { "serverUrl": "https://*.internal.corp/*" }
  ],
  "deniedMcpServers": [
    // 서버 이름으로 차단
    { "serverName": "dangerous-server" },

    // 정확한 명령으로 차단 (stdio 서버의 경우)
    { "serverCommand": ["npx", "-y", "unapproved-package"] },

    // URL 패턴으로 차단 (원격 서버의 경우)
    { "serverUrl": "https://*.untrusted.com/*" }
  ]
}

명령 기반 제한이 작동하는 방식

정확한 일치:
  • 명령 배열은 정확히 일치해야 합니다 - 명령과 올바른 순서의 모든 인수
  • 예: ["npx", "-y", "server"]["npx", "server"] 또는 ["npx", "-y", "server", "--flag"]와 일치하지 않습니다
Stdio 서버 동작:
  • 허용 목록에 어떤 serverCommand 항목이 포함되어 있으면 stdio 서버는 해당 명령 중 하나와 일치해야 합니다
  • Stdio 서버는 명령 제한이 있을 때 이름만으로는 통과할 수 없습니다
  • 이렇게 하면 관리자가 실행할 수 있는 명령을 적용할 수 있습니다
비 stdio 서버 동작:
  • 원격 서버 (HTTP, SSE, WebSocket)는 허용 목록에 serverUrl 항목이 있을 때 URL 기반 일치를 사용합니다
  • URL 항목이 없으면 원격 서버는 이름 기반 일치로 돌아갑니다
  • 명령 제한은 원격 서버에 적용되지 않습니다

URL 기반 제한이 작동하는 방식

URL 패턴은 *를 사용한 와일드카드를 지원하여 문자의 모든 시퀀스와 일치합니다. 이는 전체 도메인 또는 하위 도메인을 허용하는 데 유용합니다. 와일드카드 예:
  • https://mcp.company.com/* - 특정 도메인의 모든 경로 허용
  • https://*.example.com/* - example.com의 모든 하위 도메인 허용
  • http://localhost:*/* - localhost의 모든 포트 허용
원격 서버 동작:
  • 허용 목록에 어떤 serverUrl 항목이 포함되어 있으면 원격 서버는 해당 URL 패턴 중 하나와 일치해야 합니다
  • 원격 서버는 URL 제한이 있을 때 이름만으로는 통과할 수 없습니다
  • 이렇게 하면 관리자가 허용되는 원격 끝점을 적용할 수 있습니다
{
  "allowedMcpServers": [
    { "serverUrl": "https://mcp.company.com/*" },
    { "serverUrl": "https://*.internal.corp/*" }
  ]
}
결과:
  • https://mcp.company.com/api의 HTTP 서버: ✅ 허용됨 (URL 패턴과 일치)
  • https://api.internal.corp/mcp의 HTTP 서버: ✅ 허용됨 (와일드카드 하위 도메인과 일치)
  • https://external.com/mcp의 HTTP 서버: ❌ 차단됨 (URL 패턴과 일치하지 않음)
  • 모든 명령을 사용하는 Stdio 서버: ❌ 차단됨 (일치할 이름 또는 명령 항목 없음)
{
  "allowedMcpServers": [
    { "serverCommand": ["npx", "-y", "approved-package"] }
  ]
}
결과:
  • ["npx", "-y", "approved-package"]를 사용하는 Stdio 서버: ✅ 허용됨 (명령과 일치)
  • ["node", "server.js"]를 사용하는 Stdio 서버: ❌ 차단됨 (명령과 일치하지 않음)
  • “my-api”라는 이름의 HTTP 서버: ❌ 차단됨 (일치할 이름 항목 없음)
{
  "allowedMcpServers": [
    { "serverName": "github" },
    { "serverCommand": ["npx", "-y", "approved-package"] }
  ]
}
결과:
  • ["npx", "-y", "approved-package"]를 사용하는 “local-tool”이라는 Stdio 서버: ✅ 허용됨 (명령과 일치)
  • ["node", "server.js"]를 사용하는 “local-tool”이라는 Stdio 서버: ❌ 차단됨 (명령 항목이 있지만 일치하지 않음)
  • ["node", "server.js"]를 사용하는 “github”이라는 Stdio 서버: ❌ 차단됨 (명령 제한이 있을 때 stdio 서버는 명령과 일치해야 함)
  • “github”이라는 이름의 HTTP 서버: ✅ 허용됨 (이름과 일치)
  • “other-api”라는 이름의 HTTP 서버: ❌ 차단됨 (이름이 일치하지 않음)
{
  "allowedMcpServers": [
    { "serverName": "github" },
    { "serverName": "internal-tool" }
  ]
}
결과:
  • 모든 명령을 사용하는 “github”이라는 Stdio 서버: ✅ 허용됨 (명령 제한 없음)
  • 모든 명령을 사용하는 “internal-tool”이라는 Stdio 서버: ✅ 허용됨 (명령 제한 없음)
  • “github”이라는 이름의 HTTP 서버: ✅ 허용됨 (이름과 일치)
  • “other”라는 이름의 모든 서버: ❌ 차단됨 (이름이 일치하지 않음)

허용 목록 동작 (allowedMcpServers)

  • undefined (기본값): 제한 없음 - 사용자는 모든 MCP 서버를 구성할 수 있습니다
  • 빈 배열 []: 완전한 잠금 - 사용자는 MCP 서버를 구성할 수 없습니다
  • 항목 목록: 사용자는 이름, 명령 또는 URL 패턴과 일치하는 서버만 구성할 수 있습니다

거부 목록 동작 (deniedMcpServers)

  • undefined (기본값): 차단된 서버 없음
  • 빈 배열 []: 차단된 서버 없음
  • 항목 목록: 지정된 서버는 모든 범위에서 명시적으로 차단됩니다

중요 참고 사항

  • 옵션 1과 옵션 2를 결합할 수 있습니다: managed-mcp.json이 존재하면 독점 제어가 되고 사용자는 서버를 추가할 수 없습니다. 허용 목록/거부 목록은 여전히 관리되는 서버 자체에 적용됩니다.
  • 거부 목록이 절대적 우선 순위를 가집니다: 서버가 거부 목록 항목과 일치하면 (이름, 명령 또는 URL로) 허용 목록에 있어도 차단됩니다
  • 이름 기반, 명령 기반 및 URL 기반 제한이 함께 작동합니다: 서버는 이름 항목, 명령 항목 또는 URL 패턴 중 하나와 일치하면 통과합니다 (거부 목록으로 차단되지 않는 한)
managed-mcp.json 사용 시: 사용자는 claude mcp add 또는 구성 파일을 통해 MCP 서버를 추가할 수 없습니다. allowedMcpServersdeniedMcpServers 설정은 여전히 실제로 로드되는 관리되는 서버를 필터링하기 위해 적용됩니다.