본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

원격 MCP 서버 호스팅: Fly.io에서 MCP 서버 배포하기

원문 보기 위키 갱신

Fly.io에서 원격 MCP 서버를 호스팅한다는 것은, HTTP를 통해 어떤 MCP 클라이언트든 접근할 수 있고 유휴 상태일 때 멈췄다가 다음 요청이 오면 다시 시작되는 빠른 부팅 격리 VM인 Fly Machine에서 실행한다는 뜻이에요. Model Context Protocol(MCP)은 LLM에 새로운 힘을 부여하며, 원래 Anthropic이 개발했고 이제 대부분의 주요 LLM 클라이언트가 지원합니다. 이 가이드는 Fly.io에서 원격 MCP 서버를 빌드·배포·연결하는 방법을 높은 수준에서 이해하도록 도와줍니다.

출처: 문서

본문

개요 (Overview)

Fly.io에서 원격 MCP 서버를 호스팅한다는 것은 Fly Machine에서 실행한다는 뜻이에요. Fly Machine은 빠르게 부팅되는 격리 VM으로, 어떤 MCP 클라이언트든 HTTP로 접근할 수 있고, 유휴 상태일 때 멈췄다가 다음 요청이 오면 다시 시작될 수 있습니다. Model Context Protocol(MCP)은 LLM에 새로운 힘을 부여해요. 원래 Anthropic이 개발했으며, 이제 대부분의 주요 LLM 클라이언트가 지원합니다.

이 프로토콜은 도구를 연결하고 LLM에 추가 컨텍스트를 제공하는 표준화된 방법을 정의합니다. USB가 컴퓨터를 주변기기와 장치에 연결하는 표준화된 방법을 제공하는 것과 크게 다르지 않죠. Fly Machines은 긴밀하게 격리된 VM으로, MCP 서버를 실행하기에 완벽합니다.

이 가이드는 Fly.io에서 원격 MCP 서버를 빌드, 배포, 연결하는 방법을 매우 높은 수준에서 이해하도록 도와줘요. 이 프로토콜은 아직 초기 단계의 신생 프로토콜이라는 점을 명심하세요. 세부 사항은 변경될 수 있습니다. 구체적인 구현 세부 사항에 대해서는 Model Context Protocol 사이트가 권위 있는 소스입니다(LLM 프롬프팅에 유용한 .txt 버전도 제공해요).

또한 Fly.io에서 MCP 서버를 어떻게 배포할 수 있는지 좀 더 구체적으로 감을 잡을 수 있도록 flyctl에 MCP 도구 통합을 시작했습니다(이 커뮤니티 포럼 게시물에서 자세히 읽어보세요). 저희 MCP 구현은 실험적이며 여전히 거친 부분이 있을 수 있음을 참고하세요!

원격 MCP 서버 (Remote MCP Servers)

지금까지 MCP는 대부분 로컬 전용이었지만, 프로토콜은 원격 MCP 서버를 위한 트랜스포트(transports)도 명세하고 있어요. 원격 MCP 서버는 여러 문제를 해결합니다:

  • 분산된 로컬 패키지 대신 중앙 서버를 업데이트하는 것이 더 쉽습니다
  • 누군가 노트북을 닫아도 사라지지 않는 영구 연결을 MCP 클라이언트에 제공할 수 있어요
  • 로봇이 문제를 일으킬 경우를 대비해 MCP 서버 활동을 안전하게 샌드박싱할 수 있습니다

단일 테넌트 또는 멀티 테넌트

원격 MCP 서버를 Fly.io에 배포할 때 따를 수 있는 패턴은 크게 두 가지입니다:

  1. 멀티 테넌트 MCP 서버 (앱 하나, 사용자 여러 명)
  2. 단일 테넌트 MCP 서버 (사용자당 앱 하나)

저희는 단일 테넌트 패턴을 선호해요. 적절한 격리를 보장하고 Fly.io 비용을 최소화하는 데도 도움이 되기 때문이죠. 사용하지 않는 Machine은 필요에 따라 멈추고 시작할 수 있으므로 유휴 사용자에게 리소스를 낭비하지 않습니다(고객당 앱 하나가 옳은 패턴인 이유는 여기에서 자세히 볼 수 있어요). fly-replay는 요청을 올바른 앱/Fly Machine으로 라우팅하기 쉽게 만들어 줍니다(이 패턴에 대한 자세한 내용은 사용자별 개발 환경 참고).

멀티 테넌트 MCP 서버

주요 구성 요소가 두 가지 필요해요:

  1. MCP-Remote Shim (선택사항): 로컬 MCP 클라이언트를 원격 서버에 연결하는 작은 클라이언트 측 프록시입니다(MCP 클라이언트가 인증 및/또는 원격 MCP 서버로의 스트리밍 HTTP 요청을 지원하지 않는 경우에만 필요해요). shim과 라우터 앱 간에 공유되는 시크릿으로 인증을 처리합니다(인증은 단순한 API 토큰, 사용자 이름 + 비밀번호, 또는 완전한 OAuth 절차가 될 수 있어요). 필요에 따라 토큰을 안전하게 저장하고 갱신합니다. 예시를 보려면 flyctl의 실험적 fly mcp proxy 명령을 사용해 보세요. 이는 MCP 클라이언트 요청을 원격 URL로 전달하는 로컬 프록시를 설정합니다(자세한 내용은 문서와 커뮤니티 포럼 참고).
  2. MCP 서버 앱: 실제 MCP 기능을 실행하고 MCP 클라이언트의 요청을 인증합니다. MCP 클라이언트 연결을 위한 단일 스트리밍 HTTP 엔드포인트 경로와 특정 비즈니스 로직 또는 기타 통합이 있어야 해요. 저희 구현을 시도하려면 MCP 서버 앱의 Dockerfile에 실험적 fly mcp wrap 명령을 포함하세요. 이는 fly mcp proxy를 통해 로컬 MCP 클라이언트에서 전달된 요청을 받는 경량 HTTP 서버를 인스턴스화합니다(자세한 내용은 문서와 커뮤니티 포럼 참고).

단일 테넌트 MCP 서버

세 가지 주요 구성 요소가 있어요:

  1. 라우터 앱 (Router App): MCP 클라이언트로부터 요청을 받고 인증을 처리한 다음, fly-replay를 사용해 사용자별 앱 및 Fly Machine으로 요청을 라우팅합니다. 라우팅 패턴 구현에 대한 자세한 내용은 사용자 Machine 연결하기를 참고하세요. 선택적으로 사용자 관리와 권한을 처리합니다. 라우터 앱의 Dockerfile에서 실험적 fly mcp wrap 명령을 사용해 로컬 MCP 클라이언트에서 전달된 요청을 받는 경량 HTTP 서버를 인스턴스화할 수 있어요(자세한 내용은 문서와 커뮤니티 포럼 참고). fly mcp wrap은 요청 라우팅을 처리하지 않는다는 점에 유의하세요. 별도로 구현해야 합니다.
  2. MCP 서버 앱: 사용자별(또는 팀별) 앱으로 실제 MCP 기능을 실행합니다. MCP 클라이언트 연결을 위한 단일 스트리밍 HTTP 엔드포인트 경로와 특정 비즈니스 로직 또는 기타 통합이 있어야 해요.
  3. MCP-Remote Shim (선택사항): 로컬 MCP 클라이언트를 원격 서버에 연결하는 작은 클라이언트 측 프록시입니다(MCP 클라이언트가 인증 및/또는 원격 MCP 서버로의 스트리밍 HTTP 요청을 지원하지 않는 경우에만 필요해요). shim과 라우터 앱 간에 공유되는 시크릿으로 인증을 처리합니다(인증은 단순한 API 토큰, 사용자 이름 + 비밀번호, 또는 완전한 OAuth 절차가 될 수 있어요). 필요에 따라 토큰을 안전하게 저장하고 갱신합니다. 예시를 보려면 flyctl의 실험적 fly mcp proxy 명령을 사용해 보세요. 이는 MCP 클라이언트 요청을 원격 URL로 전달하는 로컬 프록시를 설정합니다(자세한 내용은 문서와 커뮤니티 포럼 참고).

사용자 경험 (How Users Experience It)

사용자의 관점에서 경험은 놀라울 만큼 단순해야 해요:

  1. 한 줄짜리 간단한 명령으로 MCP 클라이언트에 새 MCP 서버를 추가합니다
  2. 필요하면 사용자가 인증 절차를 안내받습니다(예: 브라우저 창이 열려 OAuth 절차를 시작하거나 API 키를 제공)
  3. 로그인 후, MCP 클라이언트는 여러분이 노출한 모든 도구에 접근할 수 있어요
  4. 연결은 재인증 없이 재시작 후에도 유지됩니다

더 나아가기 (Taking It Further)

MCP 서버가 API 토큰을 직접 처리하지 않고 타사 OAuth API에 연결하게 하려면 ssokenizer(또는 일반적인 비-OAuth 흐름에는 tokenizer)를 사용하는 것을 고려해 보세요.

  • Model Context Protocol (MCP) 문서 MCP에 대한 참조 자료에서 더 자세히 알아보세요: 그것이 무엇인지, 어떻게 동작하는지, 서버를 배포하는 방법.
  • 사용자 Machine 연결하기 중앙 라우터 앱에서 fly-replay를 통해 사용자별 앱/머신으로 라우팅하는 패턴을 알아보세요. 단일 테넌트 MCP 설정을 구축할 때 유용해요.
  • flyctl로 MCP 서버 시작하기 실험적 fly mcp server 명령에 대해 읽어보세요: 플래그와 사용법을 포함해 flyctl로 로컬 또는 원격 MCP 서버를 시작하는 방법.

더 알아보기 (Learn more)