MCP 프로토콜 ·

클라우드 Mac mini에 MCP Server 배포: stdio부터 프로덕션 안정까지 완전 실전 가이드

클라우드 Mac mini에 MCP Server 배포: stdio부터 프로덕션 안정까지 완전 실전 가이드

MCP 아키텍처 / stdio vs SSE / 환경 설정 / 툴 등록 및 권한 / launchd 데몬 / SSH 터널 / SSE 멀티 클라이언트 / 프로덕션 안정성 / FAQ

Cursor, Claude Desktop, OpenClaw를 사용하다 보면 결국 같은 질문에 직면합니다: MCP Server는 어느 기기에서 실행하는 게 좋을까? 메인 기기에서 실행하면 Shell 권한과 파일 시스템이 Agent에 직접 노출됩니다. 원격 Linux에 두면 macOS 생태계와 툴체인이 맞지 않습니다. 클라우드 Mac mini는 이 둘 사이에 딱 맞게 위치합니다 — Unix 환경, 스냅샷 격리, 네이티브 macOS 도구를 모두 갖추고 있습니다. 이 가이드는 stdio 서브프로세스의 기본부터 SSE 멀티 클라이언트, launchd 데몬, 그리고 진정한 24/7 프로덕션 설정까지 단계별로 설명합니다.

MCP 아키텍처 3역할: Host, Client, Server

작업 전에 세 가지 역할의 책임을 명확히 정리합니다.

  • Host — UI를 가진 애플리케이션 (Cursor, Claude Desktop, OpenClaw 등). 하나 이상의 Client 생명주기를 관리합니다.
  • Client — Host 내부에서 실행되는 프로토콜 어댑터 레이어. Server를 발견하고 연결을 유지하며 툴 호출을 전달합니다.
  • Server — 독립적으로 실행되는 프로세스. 표준화된 프로토콜을 통해 툴(Tools), 리소스(Resources), 프롬프트(Prompts)를 외부에 공개합니다.
Host (Cursor)
  └─ Client
       └─ [stdio / SSE] ──── Server (MCP 툴 프로세스)

설계 원칙: Server 프로세스는 최소 권한으로 실행해야 합니다 — 현재 작업에 필요한 툴만 등록하고, '만능 Agent' 안티패턴을 피하세요.


전송 레이어 선택: stdio vs SSE vs WebSocket

전송 방식대표 사용 사례클라우드 Mac 적합성
stdio로컬 서브프로세스, SSH 원격 명령✅ 권장: 공개 포트 없음, 가장 단순한 구성
SSE브라우저 클라이언트, 다중 Host 공유리버스 프록시 + TLS + 인증 필요
WebSocket장기 연결 Gateway 레이어OpenClaw 등 Gateway 용도

과거의 각 통합마다 REST 글루 레이어를 직접 작성하는 방식은 MCP 통합 툴 발견 프로토콜로 대체되었습니다. Host가 시작 시 Server에서 tools/list를 자동으로 가져오므로, 통합마다 커스텀 HTTP 클라이언트를 작성할 필요가 없습니다. 이 변화로 툴 통합이 '매번 처음부터 작성'에서 '선언만 하면 사용 가능'으로 바뀌었고, 개인 개발자도 오후 하나 만에 수십 개의 MCP 툴을 연결할 수 있게 되었습니다.

전송 레이어 용어 정리

stdio 전송
Host가 Server를 서브프로세스로 시작하고 stdin/stdout으로 JSON-RPC 메시지를 교환합니다. 프로세스는 Host가 종료될 때 함께 종료되어 자연스럽게 격리되며 네트워크 노출이 없습니다.
SSE (Server-Sent Events)
Server가 HTTP 포트를 수신 대기하고 Client는 지속 연결을 통해 이벤트 푸시를 수신합니다. 여러 클라이언트가 동시에 연결 가능하지만 네트워크 보안 설정이 필요합니다.
툴 발견 (tools/list)
MCP 핸드셰이크 단계: Host 시작 시 Server에 tools/list를 요청하여 툴 이름, 파라미터 스키마, 설명을 받고 이후 필요에 따라 해당 툴을 호출합니다.
HITL (Human In The Loop)
민감한 작업 전에 툴 호출을 일시 중지하고 인간 확인을 기다리는 패턴. 모델에게 완전한 자율 판단을 맡기지 않습니다.

1단계: 클라우드 Mac 환경 준비

노드 선택

레이턴시와 지역

일본, 싱가포르 노드는 GitHub, npm에 대한 레이턴시가 보통 20–60 ms로, 의존성을 자주 가져오거나 외부 API를 호출하는 MCP 툴에 적합합니다.

메모리와 추론

MCP Server와 로컬 소형 모델(Ollama 7B 클래스)을 동시에 실행하려면 M4 + 16GB 이상을 권장합니다.

권장 구성 비교표
시나리오최소 구성권장 구성
단일 MCP Server (툴 호출만)M4 + 8GBM4 + 8GB
MCP + 로컬 7B 모델M4 + 16GBM4 + 24GB
다중 MCP + 병렬 CI 빌드M4 + 24GBM4 Pro + 24GB

환경 초기화

bash
# Homebrew 설치 (미설치 시)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Node.js 설치
brew install node@20
echo 'export PATH="/opt/homebrew/opt/node@20/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc

# 확인
node -v && npm -v

2단계: filesystem MCP Server 배포 (stdio 모드)

bash
# filesystem Server 시작, 작업 공간을 /Users/agent/workspace로 제한
npx -y @modelcontextprotocol/server-filesystem /Users/agent/workspace

Cursor의 MCP 설정 (~/.cursor/mcp.json)에 추가:

json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/agent/workspace"]
    }
  }
}

설정 포인트: Ctrl + C로 로컬 stdio Server를 중지할 수 있습니다. 원격 노드에서는 SSH 세션 종료 후에도 Server가 유지되도록 launchd로 프로세스를 관리하세요 (4단계 참조).


3단계: SSH 터널로 원격 Cursor 연결

bash
# 원격 포트 3000을 로컬에 매핑 (SSE 모드용)
ssh -L 3000:127.0.0.1:3000 user@cloud-mac.zekvps.com

# 원격 기기에 SSH 접속 후 Server 시작 (stdio 모드)
ssh user@cloud-mac.zekvps.com "npx -y @modelcontextprotocol/server-filesystem /workspace"

장기 안정 운영을 위해서는 Tailscale로 Mesh VPN을 구성하여 수동 SSH 포트 포워딩을 대체하는 것을 권장합니다.


4단계: launchd 데몬으로 24/7 운영 실현

~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist 생성:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.zekvps.mcp-filesystem</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/opt/node@20/bin/npx</string>
        <string>-y</string>
        <string>@modelcontextprotocol/server-filesystem</string>
        <string>/Users/agent/workspace</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>
bash
launchctl load ~/Library/LaunchAgents/com.zekvps.mcp-filesystem.plist
launchctl start com.zekvps.mcp-filesystem
launchctl list | grep mcp
자세히 알아보기: launchd와 systemd의 주요 차이점

비교 항목launchd (macOS)systemd (Linux)
설정 파일 형식XML plistINI-style unit
사용자 레벨 서비스 경로~/Library/LaunchAgents/~/.config/systemd/user/
로드 명령launchctl loadsystemctl --user enable
로그 확인log stream / 파일journalctl

macOS에서 MCP 프로세스를 관리하기 위해 systemd 관련 도구를 절대 설치하지 마세요.


보안 경계와 권한 관리

  1. 최소 디렉터리 권한server-filesystem 경로를 필요한 디렉터리로만 제한, ~/ 전체는 전달하지 않음.
  2. 환경 변수로 시크릿 주입 — API 키는 env 주입, plist나 mcp.json에 작성 후 Git 커밋 금지.
  3. SSE 포트 인증 — SSE를 개방하는 경우 Bearer Token + 리버스 프록시 + TLS 필수.
  4. 스냅샷 롤백 — 대규모 변경 전에 수동으로 스냅샷 생성.

정리: 배포 경로 선택

시나리오권장 배포
개인 실험, 단일 Host로컬 stdio (또는 SSH로 클라우드 Mac)
24/7 개인 어시스턴트, 상시 연결클라우드 Mac + launchd 데몬
팀 공유 툴, 다중 Host클라우드 Mac + SSE + 리버스 프록시
고보안 / 컴플라이언스 요구클라우드 Mac + Tailscale + 감사 로그

사이트 내 OpenClaw 칼럼에서 OpenClaw와 MCP Server 협업 배포의 실전 사례를 확인하세요.

클라우드 Mac mini로 MCP 실험 환경과 프로덕션 분리

전용 M4 노드, 일 단위 렌탈, SSH 즉시 사용 가능

싱가포르 · 일본 · 한국 · 홍콩 · 미국 리전 지원

MCP나 Agent를 데모에서 일상 운영으로 옮길 때는 스냅샷 가능한 클라우드 Mac 노드를 먼저 고정하는 편이 낫습니다. ZekVPS 클라우드 Mac mini 플랜 보기 — 실험 환경과 생산 데스크톱을 분리하면 배포가 안정됩니다.

한정 혜택