모델 컨텍스트 프로토콜(MCP) 서버 구축 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인프라/DevOps/보안
대상자
- DevOps 엔지니어 및 클라우드 개발자
- AWS EC2, Docker, Nginx, SSL 인증서 구성에 익숙한 중급 이상 개발자
- AI/LLM과 외부 도구 통합이 필요한 프로젝트 개발자
핵심 요약
- MCP 프로토콜의 핵심: Server-Sent Events(SSE) 기반의 비동기 실시간 통신 제공 (
GET /sse
,POST /messages
) - AWS EC2 배포 필수 조건: Docker 이미지 빌드(
docker build -t mcp-server:latest .
), ECR 저장소 생성(aws ecr create-repository
), Nginx SSL 설정(ssl_certificate /etc/letsencrypt/live/...
) - 보안/성능 고려사항: Nginx에서 SSE 엔드포인트 분리(
location = /sse
), HTTPS 강제 전환(301 리디렉션), 자동 인증서 갱신(crontab 설정)
섹션별 세부 요약
1. MCP 프로토콜 개요
- MCP 정의: AI 애플리케이션이 외부 데이터 소스, DB, 도구와 보안 연결을 위한 표준 인터페이스
- SSE 장점:
- HTTP 기반으로 로드 밸런서/프록시 호환성 보장
- 자동 재연결 기능 지원
- HTTP/HTTPS 포트(80,443) 사용으로 방화벽 우회 가능
- 프로토콜 흐름:
GET /sse
→ SSE 스트림 연결POST /messages
→ MCP 명령 전송SSE Stream
→ 응답 전달
2. AWS EC2 서버 배포
- 환경 요구사항:
- AWS CLI, Docker, Ubuntu 22.04 LTS, 도메인 DNS 관리 권한
- EC2 인스턴스 설정:
- AMI: Ubuntu Server 22.04 LTS
- 인스턴스 타입: t3.small (테스트: t2.micro)
- 보안 그룹: SSH(22), HTTP(80), HTTPS(443), 커스텀(8000)
- Docker 이미지 배포:
```bash
docker build -t mcp-server:latest .
docker tag mcp-server:latest
docker push
```
3. Nginx 및 SSL 구성
- 필수 구성 파일:
```nginx
server {
listen 443 ssl;
server_name mcp-server.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/mcp-server.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mcp-server.yourdomain.com/privkey.pem;
location = /sse {
if ($request_method != GET) { return 405; }
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
location /messages {
proxy_pass http://localhost:8000;
proxy_set_header Content-Type $content_type;
}
}
```
- SSL 인증서 자동 갱신:
```bash
sudo certbot --nginx -d mcp-server.yourdomain.com --email your@email.com --agree-tos --non-interactive
echo "0 12 * /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab > /dev/null
```
4. 흔한 실수 및 해결 방안
- 오류 사례:
- RuntimeError: Expected ASGI message 'http.response.body'
- 원인: POST
요청이 /sse
엔드포인트로 잘못 전송
- 해결: POST /messages
엔드포인트 사용
- 구성 오류:
- location /sse
대신 location = /sse
사용하여 엔드포인트 분리
- proxy_pass
누락 시 Nginx 설정 오류 발생
5. MCP 프로토콜 요구사항
- 필수 엔드포인트:
- GET /sse
: 장기 연결 유지(최대 1시간 타임아웃)
- POST /messages
: JSON-RPC 형식의 MCP 명령 전송
- 세션 관리:
- POST /messages/?session_id=xxx
형식으로 세션 ID 포함
결론
- 실무 팁:
- Nginx 구성 파일에서 location = /sse
사용하여 엔드포인트 분리 필수
- Let's Encrypt 자동 갱신(crontab)으로 SSL 인증서 유지보수 자동화
- 테스트 시 t2.micro 인스턴스 사용 후 확장성 필요 시 t3.small으로 업그레이드
- 핵심 구현 요약:
```bash
# Nginx 구성 시 반드시 분리된 엔드포인트 사용
location = /sse { ... }
location /messages { ... }
```