MCP를 공용 인터넷에 노출하기
MCP를 공용 인터넷에 노출하기 (Exposing MCPs on the Public Internet)
어떤 MCP 서버를 외부 호출자(예: ChatGPT, Claude Desktop)에게 보이게 할지, 내부 전용으로 할지 제어해요. 일부 MCP 서버를 공개하면서 민감한 서버는 사설 네트워크로 제한하고 싶을 때 유용하죠.
출처: 문서
본문
개요 (Overview)
| 속성 | 세부 |
|---|---|
| 설명 | MCP 서버용 IP 기반 접근 제어 — 외부 호출자는 public으로 표시된 서버만 봄니다 |
| 설정 | 각 MCP 서버의 available_on_public_internet |
| 네트워크 구성 | general_settings의 mcp_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 주소를 확인해 내부 호출자인지 외부 호출자인지 판단해요:
- 들어오는 요청에서 클라이언트 IP 추출(리버스 프록시 뒤에서 구성하면
X-Forwarded-For지원). - 구성된 사설 IP 범위(기본값 RFC 1918:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.0/8)와 대조해 IP를 내부/외부로 분류. - 서버 목록 필터링:
- 내부 호출자는 모든 MCP 서버(public·private)를 봅니다.
- 외부 호출자는
available_on_public_internet: true인 서버만 봅니다.
이 필터링은 MCP 레지스트리, 도구 목록, 도구 호출, 동적 서버 라우트, OAuth 디스커버리 엔드포인트 등 모든 MCP 접근 지점에 적용돼요.
워크스루 (Walkthrough)
이 워크스루는 두 흐름을 다룹니다:
- 공용 MCP 서버 추가(DeepWiki) 및 ChatGPT에서 연결
- 기존 서버를 비공개로 전환(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_internet과 MCP 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)
- MCP 개요 — LiteLLM의 MCP 알아보기
- MCP 배포 가이드 — 게이트웨이 배포 토폴로지