MCP 서버 트랜스포트

MCP는 Bob Shell과 MCP 서버 간의 통신을 위한 트랜스포트 메커니즘을 지원해요.

개요

MCP는 다양한 배포 시나리오에 적합한 세 가지 트랜스포트 옵션을 제공해요:

각 트랜스포트는 고유한 특성, 장점 및 사용 사례를 가지고 있어요.

STDIO 트랜스포트

STDIO 트랜스포트는 로컬 머신에서 로컬로 실행되며 표준 입출력 스트림을 통해 통신해요.

STDIO 트랜스포트 작동 방식

  1. Bob은 MCP 서버를 하위 프로세스로 생성해요
  2. 프로세스 스트림을 통해 통신이 이루어집니다: Bob이 서버의 STDIN에 쓰면, 서버는 STDOUT으로 응답해요
  3. 각 메시지는 개행 문자로 구분돼요
  4. 메시지는 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 트랜스포트 작동 방식

  1. 서버는 POST 및 GET 메서드를 모두 지원하는 단일 HTTP 엔드포인트(MCP 엔드포인트)를 제공해요
  2. Bob은 HTTP POST를 사용하여 이 MCP 엔드포인트로 요청을 보내요
  3. 서버는 요청을 처리하고 응답을 돌려보내요
  4. 선택적으로 서버는 동일한 연결을 통해 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 트랜스포트 작동 방식

  1. Bob은 HTTP GET 요청을 통해 서버의 SSE 엔드포인트에 연결해요
  2. 이를 통해 서버가 Bob에 이벤트를 푸시할 수 있는 영구 연결이 설정돼요
  3. 클라이언트-서버 통신의 경우 Bob은 별도의 엔드포인트로 HTTP POST 요청을 보내요
  4. 통신은 두 개의 채널을 통해 이루어집니다:
    • 이벤트 스트림 (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)는 원격 서버에 배포하여 네트워크를 통해 액세스할 수 있어요:

  • 설치: 서버에 한 번 설치하고 여러 사용자가 액세스
  • 배포: 단일 배포로 여러 클라이언트에 서비스 제공
  • 업데이트: 중앙 집중식 업데이트가 모든 사용자에게 즉시 적용됨
  • 리소스: 로컬 머신 리소스가 아닌 서버 리소스 사용
  • 액세스 제어: 인증 및 인가 시스템을 통해 관리
  • 통합: 사용자별 리소스와의 보다 복잡한 통합
  • 실행: 독립적인 서비스로 실행됨 (종종 지속적으로 실행)
  • 종속성: 사용자 머신이 아닌 서버에서 관리됨

사용 사례 예시:

원격 트랜스포트를 사용하는 데이터베이스 쿼리 도구는 다음을 수행해요:

  • 중앙 서버에서 실행
  • 서버 측 자격 증명으로 데이터베이스에 연결
  • 여러 사용자가 지속적으로 사용 가능
  • 적절한 네트워크 보안 구성 필요
  • 컨테이너 또는 클라우드 기술을 사용하여 배포

하이브리드 접근 방식

일부 시나리오에서는 하이브리드 접근 방식이 유용해요:

  1. 네트워크 액세스가 가능한 STDIO: 원격 서비스에 대한 프록시 역할을 하는 로컬 STDIO 서버
  2. 로컬 명령이 포함된 원격: 콜백을 통해 클라이언트 머신에서 작업을 트리거할 수 있는 원격 서버
  3. 게이트웨이 패턴: 전문화된 기능을 위해 원격 서버에 연결하는 로컬 작업용 STDIO 서버

트랜스포트 비교

고려 사항STDIOStreamable HTTP / SSE
위치로컬 머신 전용로컬 또는 원격
클라이언트단일 클라이언트다중 클라이언트
성능더 낮은 지연 시간더 높은 지연 시간 (네트워크 오버헤드)
설정 복잡성더 단순함더 복잡함 (HTTP 서버 필요)
보안본질적으로 안전함명시적인 보안 조치 필요
네트워크 액세스필요 없음필요함
확장성로컬 머신으로 제한됨네트워크 전반에 분산 가능
배포사용자별 설치중앙 집중식 설치
업데이트분산 업데이트중앙 집중식 업데이트
리소스 사용량클라이언트 리소스 사용서버 리소스 사용
종속성클라이언트 측 종속 항목서버 측 종속 항목

Bob Shell에서 트랜스포트 구성

구성 예시를 포함하여 Bob Shell에서 트랜스포트를 구성하는 방법에 대한 자세한 내용은 Bob Shell의 MCP를 참조하세요.

이 주제는 어떤가요?