지난 글에서 Tool + Resource + Prompt를 조합한 완성형 MCP 서버를 만들었다.그런데 만들고 나서 팀원한테 공유하려고 했더니 막혔다. 내 로컬에서만 돌아간다. stdio는 표준 입출력 방식이라 내 터미널이 살아있을 때만 동작한다.
팀원이 쓰려면 각자 코드를 받아서, 각자 실행해야 한다. 이건 사실상 "공유"가 안 된다는 뜻이다.
그래서 이번에는 로컬 stdio → 클라우드 SSE로 전환하는 방법을 정리했다. Railway에 올려서 팀원 누구나 접속할 수 있는 MCP 서버를 만들어볼 것이다.
stdio 방식의 구조는 이렇다.

| 구분 | stdio | SSE (HTTP) |
|---|---|---|
| 통신 방식 | 표준 입출력 (파이프) | HTTP + Server-Sent Events |
| 실행 위치 | 로컬 PC 필수 | 서버 어디든 OK |
| 공유 | 불가 (본인 PC만) | URL 하나면 끝 |
| 상시 가동 | 터미널 열어야 함 | 24시간 운영 가능 |
| 인증 | 없음 (로컬이라 불필요) | Bearer 토큰 등 필요 |
| 적합한 상황 | 개인 개발/테스트 | 팀 공유, 프로덕션 |
stdio는 개발용이다. 팀에 배포하려면 SSE로 바꿔야 한다.
SSE 서버로 전환하기
FastMCP는 transport 인자 하나만 바꾸면 SSE로 전환된다. 코드 대부분은 그대로 쓸 수 있다.
기존 stdio 코드
# mcp_server_full.py (stdio)if __name__ == "__main__":
mcp.run(transport="stdio") # ← 이 부분만 바꾼다
SSE 서버로 바꾼 코드
# mcp_server_sse.pyfrom mcp.server.fastmcp import FastMCP
import os
mcp = FastMCP(
"sales-db-server",
host="0.0.0.0", # 외부 접속 허용
port=int(os.environ.get("PORT", 8000)),
)
# ... Tool / Resource / Prompt 정의는 동일 ...
if __name__ == "__main__":
mcp.run(transport="sse") # stdio → sse
핵심은 딱 두 가지다.
① host="0.0.0.0" — 외부에서 접근 가능하게
② transport="sse" — SSE 방식으로 전환
Railway로 배포
여러 배포 옵션 중 Railway를 골랐다. 이유는 단순하다.
GitHub 연결하면 push할 때마다 자동 배포된다. 설정이 거의 없다.
STEP 1. 프로젝트 구조 정리
# 디렉토리 구조mcp_cloud/
├── mcp_server_sse.py # SSE 서버 (메인)
├── requirements.txt
├── Procfile # Railway 실행 명령
└── sales.db # DB (또는 외부 DB 연결)
STEP 2. requirements.txt
# requirements.txtmcp[cli]
fastapi
uvicorn
STEP 3. Procfile
# Procfileweb: python mcp_server_sse.py
STEP 4. GitHub → Railway 연결
1. railway.app 접속 → New Project → Deploy from GitHub repo
2. 레포 선택하면 자동으로 빌드 시작
3. Settings → Networking → Generate Domain 클릭
4. 생성된 URL이 MCP 서버 주소가 된다
배포되면 이런 URL이 생긴다:
https://sales-mcp-server-production.up.railway.app
주의: Railway 무료 플랜은 월 500시간 제한이 있다. 팀에서 상시 운영하려면 유료 플랜($5/월)이 필요하다. 테스트용은 무료로 충분하다.
Claude Desktop에서 원격 MCP 연결
배포까지 됐으면, 이제 Claude Desktop에서 로컬 stdio 대신 원격 SSE URL을 바라보게 해야 한다.
| OS | 설정 파일 경로 |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
기존 설정 (stdio)
# claude_desktop_config.json (stdio 방식){
"mcpServers": {
"sales-db": {
"command": "python",
"args": ["/Users/me/mcp/mcp_server_full.py"]
}
}
}
SSE 방식으로 변경
# claude_desktop_config.json (SSE 방식){
"mcpServers": {
"sales-db-cloud": {
"url": "https://sales-mcp-server-production.up.railway.app/sse"
}
}
}
Claude Desktop을 재시작하면 끝이다.
이제 팀원 각자가 이 JSON만 복사하면 동일한 MCP 서버를 공유할 수 있다.
보안
URL을 열어두면 누구나 접속할 수 있다. DB에 접근하는 MCP 서버라면 반드시 인증을 달아야 한다.
간단하게 처리하는 방법은 Bearer 토큰이다.
# mcp_server_sse.py — 토큰 검증 추가from fastapi import HTTPException, Request
import os
API_TOKEN = os.environ.get("MCP_API_TOKEN", "changeme")
@app.middleware("http")
async def auth_middleware(request: Request, call_next):
token = request.headers.get("Authorization", "")
if token != f"Bearer {API_TOKEN}":
raise HTTPException(status_code=401, detail="Unauthorized")
return await call_next(request)
# claude_desktop_config.json — 토큰 추가
{
"mcpServers": {
"sales-db-cloud": {
"url": "https://sales-mcp-server-production.up.railway.app/sse",
"headers": {
"Authorization": "Bearer your-secret-token-here"
}
}
}
}
팀 배포 체크리스트
① MCP_API_TOKEN 환경변수 Railway에 설정
② claude_desktop_config.json 팀 내부에만 공유
③ DB는 SQLite 파일 대신 Railway PostgreSQL 연결 권장
전체 흐름 정리
| 단계 | 작업 | 핵심 |
|---|---|---|
| STEP 1 | 코드 수정 | transport="sse", host="0.0.0.0" |
| STEP 2 | 파일 추가 | requirements.txt, Procfile |
| STEP 3 | Railway 배포 | GitHub 연결 → 자동 빌드 |
| STEP 4 | Claude 설정 변경 | URL 방식으로 config 수정 |
| STEP 5 | 인증 추가 | Bearer 토큰으로 접근 제어 |
마치며
사실 MCP 서버 하나 만드는 것보다 팀이 함께 쓸 수 있게 만드는 것이 더 중요하다.
로컬에서 잘 돌아간다고 끝이 아니다. 클라우드에 올라가서, 팀원이 URL 하나로 접속할 수 있어야 진짜로 쓰이는 도구가 된다. 이 글에서 다룬 변경사항은 크지 않다.
코드 3줄, 파일 2개, GitHub 연결. 그런데 이걸로 "나만 쓰는 도구"에서 "팀이 쓰는 도구"가 된다.
Tool은 AI의 손, Resource는 AI의 참고서, Prompt는 AI의 매뉴얼.
그리고 SSE 배포는 — AI의 문을 팀에게 여는 것이다.