보안 MCP 터널
보안 MCP 터널 (Secure MCP Tunnel)
Secure MCP Tunnel은 인바운드 방화벽 포트를 열거나 공개 인터넷에 서버를 노출하지 않고, 사설 MCP 서버를 지원되는 OpenAI 제품에 연결하게 해요. 이미 MCP 서버에 도달할 수 있는 네트워크 안에서 tunnel-client를 실행해요. 이 클라이언트가 OpenAI로 나가는 HTTPS 경로를 열고, 큐에 대기된 MCP 작업을 가져와 로컬로 요청을 전달하고, 응답을 같은 터널로 돌려보내요.
출처: 문서
본문
Secure MCP Tunnel은 개발자 모드 테스트를 포함한 사설 MCP 연결을 지원해요. 공개 플러그인 제출·배포는 지원하지 않아요. 공개 플러그인은 안정적이고 공개적으로 도달 가능한 HTTPS MCP 엔드포인트가 필요해요. MCP 서버를 사설로 유지해야 한다면 요청을 그쪽으로 전달하는 공개 HTTPS 프록시를 노출하세요. 엔드포인트·인증 요구사항은 공개 플러그인 제출을 참고하세요.
MCP 터널이란 무엇인가요
MCP 터널은 네트워크 안의 호스트에서 OpenAI 호스팅 MCP 엔드포인트로의 나가기 전용(outbound-only) 연결이에요. MCP 서버가 사설·온프레미스·방화벽 뒤에 있지만 ChatGPT, Codex, Responses API나 다른 지원 OpenAI 표면이 여전히 호출해야 할 때 써요. Secure MCP Tunnel은 MCP 서버를 사설로 유지하면서 지원 OpenAI 제품에 정상적인 MCP 요청 경로를 제공해요. tunnel-client가 OpenAI에서 작업을 폴링하고, MCP 요청을 로컬로 전달하며, 같은 터널로 응답을 돌려보내요.
언제 써야 하나요
- MCP 서버가 사설 네트워크, 온프레미스, 개발자 머신 또는 기존 접근 제어 뒤에서 실행될 때.
- ChatGPT, Codex, Responses API 또는 다른 지원 OpenAI 표면이 MCP 서버를 공개로 만들지 않고 그 서버를 쓰게 하려 할 때.
- 네트워크가
tunnel-client를 실행하는 호스트가 기본적으로api.openai.com:443로, 제어 플레인 mTLS가 구성되면mtls.api.openai.com:443로 나가는 HTTPS 요청을 하고 사설 MCP 서버에 도달하게 할 때. - 일반적인 MCP 개념은 MCP servers 가이드에서 시작하세요.
동작 방식
- Platform 터널 설정에서 OpenAI 호스팅 MCP 터널 엔드포인트를 만들거나 관리해요.
- 사설 MCP 서버에 도달할 수 있는 네트워크 안에서
tunnel-client를 실행해요. - 터널 ID와 사설 MCP 서버 주소로
tunnel-client를 구성해요. - OpenAI 제품이 OpenAI 호스팅 터널 엔드포인트로 MCP 요청을 보내요.
tunnel-client가 대기 중인 작업을 long-poll로 가져오고, 각JSON-RPC요청을 사설 MCP 서버로 전달하며, 같은 터널로 응답을 돌려보내요.
사설 MCP 서버에는 공개 리스너가 필요 없어요. OpenAI 호스팅 엔드포인트가 지원 제품에 정상적인 MCP 요청 경로를 주면서, 네트워크 시작 지점은 여러분 경계 안에 남아요. 커넥터가 스트리밍 결과를 요청하면 터널 경로가 중간 server-sent events를 전달할 수 있어요.
시작하기 전에
필요한 것:
- Platform 터널 설정의
tunnel_id tunnel-client용 런타임 API 키tunnel-client가 네트워크 안에서 stdio 또는 HTTP로 도달할 수 있는 MCP 서버
권한과 접근
Platform 터널 권한과 ChatGPT 개발자 모드 접근은 별개예요.
- 터널 생성·편집에는 Tunnels Read + Manage가 필요해요.
tunnel-client를 실행하거나 앱을 만들 때 터널을 선택하려면 Tunnels Read + Use가 필요해요.- 터널 권한은 Platform organization에 적용돼요. Platform organization 소유자나 RBAC 관리자가 터널 역할을 부여해요.
- ChatGPT 개발자 모드는 별도 워크스페이스 권한이에요. Enterprise/Edu에서는 워크스페이스 관리자가 개발자 모드 접근을 부여하고, 사용자는 Settings → Security and login에서 활성화해요. 계획별 정책은 개발자 모드 Help Center 기사를 참고하세요.
대상 ChatGPT 워크스페이스 관리자에게 개발자 모드 접근을, 대상 Platform organization 소유자/RBAC 관리자에게 터널 권한을 요청하세요.
터널을 올바른 조직·워크스페이스와 연결하기
터널은 하나 이상의 Platform organization이나 ChatGPT 워크스페이스와 연결할 수 있어요. 이 연결로 터널을 찾거나 사용할 수 있게 해야 하는 모든 OpenAI 컨텍스트를 정의해요. 터널을 소유·관리하는 Platform organization을 포함하고, 앱을 만들 때 터널을 나열해야 하는 ChatGPT 워크스페이스를 포함하고, Codex·Responses API·다른 지원 제품이 그 organization에서 사설 MCP 서버를 호출할 다른 Platform organization도 포함하세요. tunnel-client에는 같은 tunnel_id를 써요. organization·워크스페이스를 추가해도 두 번째 터널이 생기거나 사설 MCP 서버 엔드포인트가 바뀌지 않아요.
개인 계정은 그 계정에 속한 개인 Platform organization을 쓰세요. ChatGPT·Codex 테스트에서는 터널을 대상 ChatGPT 워크스페이스와 Codex가 쓸 Platform organization에 연결하세요. 개인 Platform organization에만 연결된 터널은 Enterprise/Edu 워크스페이스에 자동으로 나타나지 않아요. Platform organization과 ChatGPT 워크스페이스가 이미 연결돼 있다면 Platform 터널 설정에서 빠진 organization·워크스페이스를 추가할 수 있어요. 엔터프라이즈 설정을 자동으로 검증할 수 없다면(예: Platform organization에 대응하는 ChatGPT 워크스페이스가 없을 때) OpenAI 계정 팀에 연락해 수동 연결 오버라이드를 요청하세요.
네트워크 요구사항
tunnel-client는 인바운드 인터넷 접근이 필요 없어요. OpenAI로 나가는 HTTPS와 사설 MCP 서버에 대한 로컬 도달만 필요해요.
| From | To | 용도 |
|---|---|---|
tunnel-client 실행 호스트 |
api.openai.com:443 위 HTTPS /v1/tunnel/* |
기본 폴링·응답 게시. |
tunnel-client 실행 호스트 |
mtls.api.openai.com:443 위 HTTPS /v1/tunnel/* |
제어 플레인 mTLS 구성 시 폴링·응답 게시. |
tunnel-client 실행 호스트 |
구성된 stdio 명령 또는 MCP 서버 URL | 네트워크 안에서 MCP 요청 전달. |
tunnel-client 설정하기
Platform 터널 설정을 열고 거기 다운로드 링크나 openai/tunnel-client의 최신 공개 릴리스를 사용하세요. runbook은 특정 릴리스 URL을 하드코딩하지 말고 최신 릴리스 URL을 가리키게 유지하세요.
이미 바이너리가 있다면 tunnel-client help quickstart로 시작하세요. 명명된 로컬 stdio 프로필:
export CONTROL_PLANE_API_KEY="sk-..."
tunnel-client init \
--sample sample_mcp_stdio_local \
--profile local-stdio \
--tunnel-id tunnel_0123456789abcdef0123456789abcdef \
--mcp-command "python /path/to/server.py"
tunnel-client doctor --profile local-stdio --explain
tunnel-client run --profile local-stdio
HTTP MCP 서버에는 --mcp-command 대신 --mcp-server-url https://mcp.internal.example.com/mcp를 쓰세요. 앱을 만들거나 테스트하는 동안 tunnel-client run ...을 정상 상태로 유지하세요. 앱 발견(app discovery)과 MCP 도구 호출이 실행 중인 클라이언트에 의존해요. /ui의 로컬 관리 UI는 ChatGPT·Codex·API 흐름에서 테스트하기 전에 실행 중인 클라이언트가 정상이고 준비됐으며 연결됐는지 보여줘요.
tunnel-client 실행 위치 고르기
tunnel-client를 이미 사설 MCP 서버에 도달할 수 있는 같은 신뢰 경계(trust boundary)에서 실행하세요. 일반적인 배포 패턴:
- Kubernetes sidecar: MCP 서버와 같은 Pod에서
tunnel-client를 실행하고localhost로 연결. - 전용 Kubernetes 배포: MCP 서버가 이미 사설 Service로 도달 가능하면
tunnel-client를 별도로 실행. - VM 또는 systemd 서비스: 사설 네트워킹으로 MCP 서버에 도달할 수 있는 호스트에서 실행.
ChatGPT에서 연결하기
ChatGPT Plugins로 가서 더하기 버튼으로 개발자 모드 앱을 만들고, Connection 아래 Tunnel을 선택하세요. ChatGPT가 나열할 때 사용 가능한 터널을 선택하거나, 이미 있다면 유효한 tunnel_id를 붙여넣으세요. 터널이 ChatGPT에 나타나지 않으면, 터널이 Platform organization뿐 아니라 대상 ChatGPT 워크스페이스와 연결돼 있고 앱 생성자가 Tunnels Read + Use가 있는지 확인하세요.
Responses API에서 연결하기
MCP 도구 정의에서 터널 식별자를 tunnel_id로 전달하세요. OpenAI 호스팅 터널 엔드포인트를 server_url로 전달하지 마세요. server_url은 Responses API가 직접 도달할 수 있는 MCP 서버에만 써요.
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ***" \
-d '{
"model": "gpt-6-astra",
"input": "Use the private MCP server to answer my request.",
"tools": [
{
"type": "mcp",
"server_label": "private_mcp",
"tunnel_id": "tunnel_0123456789abcdef0123456789abcdef"
}
]
}'
보안과 네트워킹
- MCP 서버 주소는 사설로 유지되고
tunnel-client가 실행되는 환경 안에서만 사용돼요. tunnel-client는 OpenAI 터널 제어 플레인에 인증하고, 지원 OpenAI 제품은 OpenAI 호스팅 터널 엔드포인트를 사용해요.- 터널 접근은 별도 공개 인그레스 경로를 도입하는 대신 기존 organization·워크스페이스 컨텍스트를 따라요.
tunnel-client는 outbound 프록시, 커스텀 CA 번들, 제어 플레인 클라이언트 인증서, MCP 측mTLS같은 엔터프라이즈 네트워킹 요구사항을 지원해요.
로깅 경계
Secure MCP Tunnel은 터널 전송과 앱 수준 제품 로깅을 분리해요. 터널 제어 플레인 인증, long-poll/응답 트래픽, 개별 터널 전송 요청은 터널 경로가 ChatGPT Compliance Platform 앱 이벤트로 내보내지 않아요. 터널 메타데이터 변경은 API Platform Audit logs 표면에 tunnel.created, tunnel.updated, tunnel.deleted로 노출돼요. ChatGPT가 Secure MCP Tunnel로 커스텀 앱에 도달할 때 터널은 전송 경로일 뿐이며, 앱 호출 로그와 앱 연결·해제 시 APP_AUTH_LOG 같은 정상적인 앱 수준 규정 준수 로깅은 앱 경로에 계속 적용돼요.
고급: 허용 목록 HTTP 콜아웃
Secure MCP Tunnel은 지원되는 에이전트·API 흐름에서 고객 네트워크로의 좁게 범위가 정해진 HTTP 콜아웃도 지원할 수 있어요. tunnel-client에는 임베디드 MCP 서버인 Harpoon이 포함되어, 라벨로 구성된 HTTP 대상을 노출하고 호출자가 경계 있는 요청/응답 한도로 터널을 통해 호출하게 해요. 소수의 사설 REST 엔드포인트에 공개하지 않고 도달해야 할 때 써요. Harpoon은 일반 목적 프록시가 아니에요. 호출자가 임의 호스트를 고를 수 없고, 요청은 고객이 구성한 대상·메서드로 제한돼요.
트러블슈팅
- Platform 터널 설정에서 "Tunnels access required": 터널 권한은 organization 수준이고 프로젝트 수준이 아니에요. 의도한 Platform organization을 선택하고, organization 소유자·RBAC 관리자에게 터널을 보려면 Read, 생성·편집·삭제하려면 Read + Manage 역할·그룹에 추가해 달라고 요청하세요.
tunnel-client를 실행하거나 커넥터 설정에서 터널을 선택하려면 Use도 필요해요. 새 역할 할당 전파에 최대 30분 걸릴 수 있어요. - ChatGPT에 터널이 보이지 않음: 터널이 Platform organization뿐 아니라 대상 ChatGPT 워크스페이스를 포함하는지 확인한 다음, 커넥터 운영자의 Tunnels Use 권한을 확인하세요.
- 커넥터 발견 또는 도구 호출 실패:
tunnel-client run ...이 여전히 실행 중인지 확인한 뒤tunnel-client doctor --profile <name> --explain을 다시 실행하세요. - 터널을 검사할 수는 있지만 편집할 수 없음: 운영자가 Tunnels Read는 있지만 Manage가 없을 가능성이 높아요.
tunnel-client는/healthz,/readyz,/metrics와/ui의 로컬 관리 UI를 노출해요. 관리 UI는 기본적으로 loopback 전용이에요. 운영자 네트워크가 의도적으로 도달해야 할 때만 원격으로 노출하세요. ChatGPT·Codex·API 흐름에서 테스트하기 전에 이 표면들로 클라이언트가 정상·준비·폴링 중인지 확인하세요. 클라이언트가 연결되어 있지 않으면tunnel-client가 재연결될 때까지 터널 요청이 실패해요. 원시 HTTP 로깅은 기본적으로 비활성화되고 지원 내보내기는 편집됩니다(redacted).
OAuth
- OAuth 발견(discovery)은 터널 경로를 통해 이어질 수 있어서 MCP 서버 자체는 사설로 유지할 수 있어요.
- 터널은 브라우저 대상 OAuth 흐름에 필요한 업스트림 인증 서버 메타데이터를 보존해요.
- 인증 서버 자체는 자동으로 터널되지 않아요. 공개 인터넷과
tunnel-client호스트에서 모두 도달할 수 없다면, MCP 서버가 도달 가능해도 OAuth 흐름이 여전히 실패할 수 있어요.
어디서 구성하나요
- Platform 터널 설정에서 OpenAI 호스팅 MCP 터널 엔드포인트를 관리하세요.
- ChatGPT Plugins에서 개발자 모드 앱을 만들 때 터널을 사용하세요.
- Codex·API 흐름에서는 지원 제품 표면이 노출하는 터널 기반 MCP 대상을 사용하세요.