MCP를 공용 인터넷에 노출하기

MCP를 공용 인터넷에 노출하기 (Exposing MCPs on the Public Internet)

어떤 MCP 서버를 외부 호출자(예: ChatGPT, Claude Desktop)에게 보이게 할지, 내부 전용으로 할지 제어해요. 일부 MCP 서버를 공개하면서 민감한 서버는 사설 네트워크로 제한하고 싶을 때 유용하죠.

출처: 문서

본문

개요 (Overview)

속성 세부
설명 MCP 서버용 IP 기반 접근 제어 — 외부 호출자는 public으로 표시된 서버만 봄니다
설정 각 MCP 서버의 available_on_public_internet
네트워크 구성 general_settingsmcp_internal_ip_ranges
지원 클라이언트 ChatGPT, Claude Desktop, Cursor, OpenAI API, 모든 MCP 클라이언트

delegate_auth_to_upstream과의 상호작용 — MCP 서버가 available_on_public_internet: false(IP 기반 디스커버리용 내부)이면서 **delegate_auth_to_upstream: true**와 auth_type: oauth2(상호작용 PKCE, M2M 아님)이면, 익명 호출자가 LiteLLM 세션 없이 업스트림 OAuth /authorize 경로를 여전히 사용할 수 있어요. 세부 사항과 완화책은 MCP OAuth Passthrough: Delegate Auth to Upstream을 참고하세요.

동작 방식 (How It Works)

요청이 LiteLLM의 MCP 엔드포인트에 도달하면 LiteLLM은 호출자 IP 주소를 확인해 내부 호출자인지 외부 호출자인지 판단해요:

  1. 들어오는 요청에서 클라이언트 IP 추출(리버스 프록시 뒤에서 구성하면 X-Forwarded-For 지원).
  2. 구성된 사설 IP 범위(기본값 RFC 1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8)와 대조해 IP를 내부/외부로 분류.
  3. 서버 목록 필터링:
    • 내부 호출자는 모든 MCP 서버(public·private)를 봅니다.
    • 외부 호출자available_on_public_internet: true인 서버만 봅니다.

이 필터링은 MCP 레지스트리, 도구 목록, 도구 호출, 동적 서버 라우트, OAuth 디스커버리 엔드포인트 등 모든 MCP 접근 지점에 적용돼요.

워크스루 (Walkthrough)

이 워크스루는 두 흐름을 다룹니다:

  1. 공용 MCP 서버 추가(DeepWiki) 및 ChatGPT에서 연결
  2. 기존 서버를 비공개로 전환(Exa) 및 ChatGPT가 더 이상 보지 못하는지 확인

흐름 1: 공용 MCP 서버 추가 (DeepWiki) (Add a Public MCP Server)

DeepWiki는 무료 MCP 서버로, AI 게이트웨이 사용자가 ChatGPT에서 접근할 수 있도록 공개하기 좋은 후보예요.

1단계: MCP 서버 생성

MCP Servers 페이지로 이동해 "+ Add New MCP Server" 클릭. 대화상자가 열리면 서버 이름 "DeepWiki" 입력. 전송 타입 드롭다운에서 DeepWiki가 Streamable HTTP 전송을 사용하므로 HTTP 선택. MCP Server URL 필드에 https://mcp.deepwiki.com/mcp 입력.

2단계: "Available on Public Internet" 활성화

생성 전에 아래로 스크롤해 Permission Management / Access Control 섹션을 펼치세요. "Available on Public Internet" 을 켜세요. 이것이 외부 호출자(ChatGPT처럼 공용 인터넷에서 연결)가 이 서버를 발견·사용할 수 있게 하는 핵심 설정이에요. 토글을 켠 후 "Create" 클릭해 저장하세요.

3단계: ChatGPT에서 연결

ChatGPT를 열고 MCP 서버 아이콘을 찾아 새 연결을 추가하세요. 사용할 엔드포인트는 <your-litellm-url>/mcp예요. 드롭다운에서 "Add an MCP server" 선택. 서버 라벨로 "LiteLLM" 같은 알아보기 쉬운 이름 입력. Server URL에 LitellM 프록시의 MCP 엔드포인트 <your-litellm-url>/mcp 입력. 인증 필드에 LiteLLM API 키 입력 후 "Connect" 클릭.

ChatGPT가 연결되어 사용 가능한 도구를 보여줘요. DeepWiki와 Exa가 모두 public으로 표시되어 있으므로 ChatGPT는 두 서버의 도구를 볼 수 있어요.

흐름 2: 기존 서버를 비공개로 만들기 (Exa) (Make an Existing Server Private)

이제 반대로 현재 public인 기존 MCP 서버(Exa)를 내부 전용으로 제한해요. 이 변경 후 ChatGPT는 Exa의 도구를 더 이상 보지 못해요.

1단계: 서버 편집

MCP Servers 표에서 Exa 서버를 클릭해 상세 보기를 열고 "Settings" 탭으로 전환해 편집 폼에 접근하세요.

2단계: "Available on Public Internet" 끄기

아래로 스크롤해 Permission Management / Access Control 섹션을 펼치고 "Available on Public Internet" 을 끄세요. 이렇게 하면 사설 네트워크 밖의 모든 호출자에게 Exa가 숨겨져요. "Save Changes" 클릭해 적용하세요. 프록시 재시작 없이 즉시 적용돼요.

3단계: ChatGPT에서 확인

ChatGPT로 돌아가 Exa가 더 이상 보이지 않는지 확인하세요. ChatGPT가 도구 목록을 다시 가져오도록 재연결해야 해요. 이번에는 DeepWiki의 도구만 나타나고 Exa는 사라져요. LiteLLM이 ChatGPT가 공용 IP에서 호출한다는 것을 감지하고 Exa가 더 이상 public이 아니므로 필터링했기 때문이에요. 사설 네트워크의 내부 사용자는 여전히 두 서버를 모두 봅니다.

구성 참조 (Configuration Reference)

서버별 설정 (Per-Server Setting)

UI: MCP 서버를 생성·편집할 때 Permission Management 섹션에서 "Available on Public Internet" 토글.

config.yaml:

mcp_servers:
  deepwiki:
    url: https://mcp.deepwiki.com/mcp
    available_on_public_internet: true   # visible to external callers

  exa:
    url: https://exa.ai/mcp
    auth_type: api_key
    auth_value: os.environ/EXA_API_KEY
    available_on_public_internet: false  # internal only (default)

API — 공용 MCP 서버 생성:

curl -X POST <your-litellm-url>/v1/mcp/server \
  -H "Authorization: Bearer ***" \
  -H "Content-Type: application/json" \
  -d '{
    "server_name": "DeepWiki",
    "url": "https://mcp.deepwiki.com/mcp",
    "transport": "http",
    "available_on_public_internet": true
  }'

API — 기존 서버 업데이트:

curl -X PUT <your-litellm-url>/v1/mcp/server \
  -H "Authorization: Bearer ***" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "<server-id>",
    "available_on_public_internet": false
  }'

사용자 지정 사설 IP 범위 (Custom Private IP Ranges)

기본적으로 LiteLLM은 RFC 1918 사설 범위를 내부로 취급해요. MCP Servers 아래 Network Settings 탭 또는 config로 이걸 커스터마이징할 수 있어요:

config.yaml:

general_settings:
  mcp_internal_ip_ranges:
    - "10.0.0.0/8"
    - "172.16.0.0/12"
    - "192.168.0.0/16"
    - "100.64.0.0/10"    # Add your VPN/Tailscale range

비어 있으면 표준 사설 범위(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8)가 사용돼요.


공용 인터넷 vs MCP Hub 가시성 (Public Internet vs MCP Hub Visibility)

available_on_public_internetMCP Hub(GET /public/mcp_hub)는 혼동하기 쉬운 두 개의 별도 메커니즘이에요:

우려 제어 기본값
외부(비사설 CIDR) 호출자가 MCP 도구 엔드포인트(list/call)에서 이 서버를 볼 수 있나요? 서버의 available_on_public_internet True(기본으로 보임. 사설 CIDR로 제한하려면 false로 토글)
이 서버가 인증 없는 GET /public/mcp_hub 광고에 나타나나요? litellm.public_mcp_servers 목록, litellm.public_mcp_hub_strict_whitelist로 게이팅 Hub strict whitelist는 기본 켜짐public_mcp_servers에 명시적으로 나열된 서버만 광고됨

기본 strict-whitelist 모드에서 available_on_public_internet: true(기본값)는 서버가 허브에 나타나게 하지 않아요. 허브에 서버를 광고하려면 public_mcp_servers에도 추가해야 해요:

허브와 외부 호출자 모두에게 보이는 서버(기본값):

litellm_settings:
  public_mcp_servers:
    - deepwiki
  # public_mcp_hub_strict_whitelist defaults to true

mcp_servers:
  deepwiki:
    url: https://mcp.deepwiki.com/mcp
    # available_on_public_internet defaults to true

litellm.public_mcp_hub_strict_whitelist: false로 설정하면 허브는 available_on_public_internet: true인 모든 서버를 광고하는 것으로 폴백해요. 이 페이지의 IP 기반 접근 필터는 실제 도구 엔드포인트에 대해 여전히 독립적으로 적용되요.

더 알아보기 (Learn more)