MCP 서버 트랜스포트
MCP는 Bob Shell과 MCP 서버 간의 통신을 위한 트랜스포트 메커니즘을 지원해요.
개요
MCP는 다양한 배포 시나리오에 적합한 세 가지 트랜스포트 옵션을 제공해요:
- STDIO 트랜스포트 (로컬 서버)
- Streamable HTTP 트랜스포트 (원격 서버를 위한 최신 표준)
- SSE 트랜스포트 (레거시 원격 옵션)
각 트랜스포트는 고유한 특성, 장점 및 사용 사례를 가지고 있어요.
STDIO 트랜스포트
STDIO 트랜스포트는 로컬 머신에서 로컬로 실행되며 표준 입출력 스트림을 통해 통신해요.
STDIO 트랜스포트 작동 방식
- Bob은 MCP 서버를 하위 프로세스로 생성해요
- 프로세스 스트림을 통해 통신이 이루어집니다: Bob이 서버의 STDIN에 쓰면, 서버는 STDOUT으로 응답해요
- 각 메시지는 개행 문자로 구분돼요
- 메시지는 JSON-RPC 2.0 형식으로 지정돼요
Client Server
| |
|---- JSON message ------>| (via STDIN)
| | (processes request)
|<---- JSON message ------| (via STDOUT)
| |STDIO 특성
- 로컬성(Locality): Bob과 동일한 머신에서 실행
- 성능: 매우 낮은 지연 시간 및 오버헤드 (네트워크 스택 관여 없음)
- 단순성: 네트워크 구성 없는 직접 프로세스 통신
- 관계: 클라이언트와 서버 간의 일대일 관계
- 보안: 네트워크 노출이 없어 본질적으로 더 안전함
STDIO를 사용하는 경우
STDIO 트랜스포트는 다음에 이상적이에요:
- 동일한 머신에서 실행되는 로컬 통합 및 도구
- 보안에 민감한 작업
- 짧은 대기 시간이 필요한 환경
- 단일 클라이언트 시나리오 (서버당 하나의 Bob 인스턴스)
- 명령줄 도구 및 스크립트
STDIO 구현 예시
const server = new Server({name: 'local-server', version: '1.0.0'});
// Register tools...
// Use STDIO transport
const transport = new StdioServerTransport(server);
transport.listen();Streamable HTTP 트랜스포트
Streamable HTTP 트랜스포트는 이전의 HTTP+SSE 트랜스포트를 대체하는 원격 MCP 서버 통신의 최신 표준이에요. HTTP/HTTPS를 통해 작동하며 보다 유연한 서버 구현을 가능하게 해요.
Streamable HTTP 트랜스포트 작동 방식
- 서버는 POST 및 GET 메서드를 모두 지원하는 단일 HTTP 엔드포인트(MCP 엔드포인트)를 제공해요
- Bob은 HTTP POST를 사용하여 이 MCP 엔드포인트로 요청을 보내요
- 서버는 요청을 처리하고 응답을 돌려보내요
- 선택적으로 서버는 동일한 연결을 통해 SSE(Server-Sent Events)를 사용하여 여러 메시지나 알림을 Bob으로 스트리밍할 수 있어요
이를 통해 기본 요청-응답 상호작용뿐만 아니라 고급 스트리밍 및 서버 시작 통신이 가능해요.
Client Server
| |
|---- HTTP POST /mcp_endpoint ---->| (client request)
| | (processes request)
|<--- HTTP Response / SSE Stream --| (server response / stream)
| |Streamable HTTP 특성
- 최신 표준: 새로운 원격 MCP 서버 구현을 위해 권장되는 방식
- 원격 액세스: Bob과 다른 머신에 호스팅 가능
- 확장성: 여러 클라이언트 연결을 동시에 처리 가능
- 프로토콜: 표준 HTTP/HTTPS를 통해 작동
- 유연성: 간단한 요청-응답 및 고급 스트리밍 지원
- 단일 엔드포인트: 모든 MCP 통신에 단일 URL 경로 사용
- 인증: 표준 HTTP 인증 메커니즘 사용 가능
- 하위 호환성: 서버가 이전 HTTP+SSE 클라이언트와의 호환성을 유지할 수 있음
Streamable HTTP를 사용하는 경우
Streamable HTTP 트랜스포트는 다음에 이상적이에요:
- 모든 새로운 원격 MCP 서버 개발
- 강력하고 확장 가능하며 유연한 통신이 필요한 서버
- 스트리밍 데이터 또는 서버 전송 알림이 포함될 수 있는 통합
- 퍼블릭 서비스 또는 중앙 집중식 도구
- 레거시 SSE 트랜스포트 구현 대체
Streamable HTTP 구현 예시
~/.bob/mcp_settings.json (전역) 또는 .bob/mcp.json (프로젝트)의 구성:
{
"mcpServers": {
"StreamableHTTPMCPName": {
"httpURL": "http://localhost:8080/mcp"
}
}
}서버 측 구현에 대해서는 StreamableHTTPClientTransport에 대한 MCP SDK 문서를 참조하세요.
HTTP+SSE와의 하위 호환성
클라이언트와 서버는 사용 중단된 HTTP+SSE 트랜스포트와의 하위 호환성을 유지할 수 있어요.
이전 클라이언트를 지원하려는 서버는 Streamable HTTP 트랜스포트에 대해 정의된 새 MCP 엔드포인트와 함께 기존 트랜스포트의 SSE (/events) 및 POST (/message) 엔드포인트를 계속 호스팅해야 해요.
SSE 트랜스포트 (레거시)
Server-Sent Events (SSE) 트랜스포트는 원격 서버에서 실행되며 HTTP/HTTPS를 통해 통신해요. 새로운 원격 서버의 경우 Streamable HTTP 트랜스포트를 대신 사용하세요.
SSE 트랜스포트 작동 방식
- Bob은 HTTP GET 요청을 통해 서버의 SSE 엔드포인트에 연결해요
- 이를 통해 서버가 Bob에 이벤트를 푸시할 수 있는 영구 연결이 설정돼요
- 클라이언트-서버 통신의 경우 Bob은 별도의 엔드포인트로 HTTP POST 요청을 보내요
- 통신은 두 개의 채널을 통해 이루어집니다:
- 이벤트 스트림 (GET): 서버-클라이언트 업데이트
- 메시지 엔드포인트 (POST): 클라이언트-서버 요청
Client Server
| |
|---- HTTP GET /events ----------->| (establish SSE connection)
|<---- SSE event stream -----------| (persistent connection)
| |
|---- HTTP POST /message --------->| (client request)
|<---- SSE event with response ----| (server response)
| |SSE 특성
- 원격 액세스: Bob과 다른 머신에 호스팅 가능
- 확장성: 여러 클라이언트 연결을 동시에 처리 가능
- 프로토콜: 표준 HTTP를 통해 작동 (특수 프로토콜 필요 없음)
- 지속성: 서버-클라이언트 메시지를 위한 영구 연결 유지
- 인증: 표준 HTTP 인증 메커니즘 사용 가능
SSE를 사용하는 경우
SSE 트랜스포트는 다음에 적합해요:
- 네트워크 전반에 걸친 원격 액세스
- 다중 클라이언트 시나리오
- 퍼블릭 서비스
- 많은 사용자가 액세스해야 하는 중앙 집중식 도구
- 웹 서비스와의 통합
SSE 구현 예시
import express from 'express';
const app = express();
const server = new Server({name: 'remote-server', version: '1.0.0'});
// Register tools...
// Use SSE transport
const transport = new SSEServerTransport(server);
app.use('/mcp', transport.requestHandler());
app.listen(3000, () => {
console.log('MCP server listening on port 3000');
});배포 시 고려 사항
STDIO와 원격 트랜스포트(Streamable HTTP 또는 SSE) 간의 선택은 MCP 서버를 배포하고 관리하는 방식에 직접적인 영향을 줘요.
STDIO: 로컬 배포
STDIO 서버는 Bob과 동일한 머신에서 로컬로 실행돼요:
- 설치: 각 사용자의 머신에 서버 실행 파일이 설치되어 있어야 함
- 배포: 다양한 운영 체제에 맞는 설치 패키지를 제공해야 함
- 업데이트: 각 인스턴스를 별도로 업데이트해야 함
- 리소스: 로컬 머신의 CPU, 메모리 및 디스크 사용
- 액세스 제어: 로컬 머신의 파일 시스템 권한에 의존
- 통합: 로컬 시스템 리소스(파일, 프로세스)와 쉽게 통합
- 실행: Bob과 함께 시작 및 중지됨 (하위 프로세스 수명 주기)
- 종속성: 모든 종속 항목이 사용자의 머신에 설치되어 있어야 함
사용 사례 예시:
STDIO를 사용하는 로컬 파일 검색 도구는 다음을 수행해요:
- 로컬 머신에서 실행
- 로컬 파일 시스템에 직접 액세스 가능
- Bob에 필요한 경우 시작됨
- 네트워크 구성이 필요하지 않음
- Bob과 함께 또는 패키지 관리자를 통해 설치해야 함
원격: 호스팅 배포
원격 서버(Streamable HTTP 또는 SSE)는 원격 서버에 배포하여 네트워크를 통해 액세스할 수 있어요:
- 설치: 서버에 한 번 설치하고 여러 사용자가 액세스
- 배포: 단일 배포로 여러 클라이언트에 서비스 제공
- 업데이트: 중앙 집중식 업데이트가 모든 사용자에게 즉시 적용됨
- 리소스: 로컬 머신 리소스가 아닌 서버 리소스 사용
- 액세스 제어: 인증 및 인가 시스템을 통해 관리
- 통합: 사용자별 리소스와의 보다 복잡한 통합
- 실행: 독립적인 서비스로 실행됨 (종종 지속적으로 실행)
- 종속성: 사용자 머신이 아닌 서버에서 관리됨
사용 사례 예시:
원격 트랜스포트를 사용하는 데이터베이스 쿼리 도구는 다음을 수행해요:
- 중앙 서버에서 실행
- 서버 측 자격 증명으로 데이터베이스에 연결
- 여러 사용자가 지속적으로 사용 가능
- 적절한 네트워크 보안 구성 필요
- 컨테이너 또는 클라우드 기술을 사용하여 배포
하이브리드 접근 방식
일부 시나리오에서는 하이브리드 접근 방식이 유용해요:
- 네트워크 액세스가 가능한 STDIO: 원격 서비스에 대한 프록시 역할을 하는 로컬 STDIO 서버
- 로컬 명령이 포함된 원격: 콜백을 통해 클라이언트 머신에서 작업을 트리거할 수 있는 원격 서버
- 게이트웨이 패턴: 전문화된 기능을 위해 원격 서버에 연결하는 로컬 작업용 STDIO 서버
트랜스포트 비교
| 고려 사항 | STDIO | Streamable HTTP / SSE |
|---|---|---|
| 위치 | 로컬 머신 전용 | 로컬 또는 원격 |
| 클라이언트 | 단일 클라이언트 | 다중 클라이언트 |
| 성능 | 더 낮은 지연 시간 | 더 높은 지연 시간 (네트워크 오버헤드) |
| 설정 복잡성 | 더 단순함 | 더 복잡함 (HTTP 서버 필요) |
| 보안 | 본질적으로 안전함 | 명시적인 보안 조치 필요 |
| 네트워크 액세스 | 필요 없음 | 필요함 |
| 확장성 | 로컬 머신으로 제한됨 | 네트워크 전반에 분산 가능 |
| 배포 | 사용자별 설치 | 중앙 집중식 설치 |
| 업데이트 | 분산 업데이트 | 중앙 집중식 업데이트 |
| 리소스 사용량 | 클라이언트 리소스 사용 | 서버 리소스 사용 |
| 종속성 | 클라이언트 측 종속 항목 | 서버 측 종속 항목 |
Bob Shell에서 트랜스포트 구성
구성 예시를 포함하여 Bob Shell에서 트랜스포트를 구성하는 방법에 대한 자세한 내용은 Bob Shell의 MCP를 참조하세요.