MCP 전송 메커니즘
MCP(Model Context Protocol)는 Cline과 MCP 서버 간의 통신을 위한 두 가지 주요 전송 메커니즘인 표준 입출력(STDIO) 및 서버 전송 이벤트(SSE)를 지원합니다. 각 메커니즘은 고유한 특성, 장점 및 사용 사례를 가집니다.
STDIO 전송
STDIO 전송은 로컬 머신에서 실행되며 표준 입출력 스트림을 통해 통신합니다.
STDIO 전송 작동 방식
- 클라이언트(Caret)는 MCP 서버를 자식 프로세스로 생성합니다.
- 통신은 프로세스 스트림을 통해 이루어집니다. 클라이언트는 서버의 STDIN에 쓰고, 서버는 STDOUT에 응답합니다.
- 각 메시지는 줄 바꿈 문자로 구분됩니다.
- 메시지는 JSON-RPC 2.0으로 서식 지정됩니다.
클라이언트 서버
| |
|<---- JSON 메시지 ----->| (STDIN을 통해)
| | (요청 처리)
|<---- JSON 메시지 ------| (STDOUT을 통해)
| |
STDIO 특성
- 로컬리티: Cline과 동일한 머신에서 실행됩니다.
- 성능: 매우 낮은 지연 시간 및 오버헤드(네트워크 스택 없음)
- 단순성: 네트워크 구성 없이 직접 프로세스 통신
- 관계: 클라이언트와 서버 간의 일대일 관계
- 보안: 네트워크 노출이 없으므로 본질적으로 더 안전합니다.
STDIO 사용 시기
STDIO 전송은 다음을 위해 이상적입니다.
- 동일한 머신에서 실행되는 로컬 통합 및 도구
- 보안에 민감한 작업
- 낮은 지연 시간 요구 사항
- 단일 클라이언트 시나리오(서버당 하나의 Caret 인스턴스)
- 명령줄 도구 또는 IDE 확장
STDIO 구현 예시
import { Server } from "@modelcontextprotocol/sdk/server/index.js"
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
const server = new Server({ name: "local-server", version: "1.0.0" })
// 도구 등록...
// STDIO 전송 사용
const transport = new StdioServerTransport(server)
transport.listen()
SSE 전송
SSE(Server-Sent Events) 전송은 원격 서버에서 실행되며 HTTP/HTTPS를 통해 통신합니다.
SSE 전송 작동 방식
- 클라이언트(Caret)는 HTTP GET 요청을 통해 서버의 SSE 엔드포인트에 연결합니다.
- 이는 서버가 클라이언트에 이벤트를 푸시할 수 있는 영구 연결을 설정합니다.
- 클라이언트-서버 통신의 경우 클라이언트는 별도의 엔드포인트에 HTTP POST 요청을 합니다.
- 통신은 두 채널을 통해 이루어집니다.
- 이벤트 스트림 (GET): 서버-클라이언트 업데이트
- 메시지 엔드포인트 (POST): 클라이언트-서버 요청
클라이언트 서버
| |
|---- HTTP GET /events ----------->| (SSE 연결 설정)
|<---- SSE 이벤트 스트림 -----------| (영구 연결)
| |
|---- HTTP POST /message --------->| (클라이언트 요청)
|<---- 응답이 포함된 SSE 이벤트 ----| (서버 응답)
| |
SSE 특성
- 원격 액세스: Caret 인스턴스와 다른 머신에서 호스팅될 수 있습니다.
- 확장성: 여러 클라이언트 연결을 동시에 처리할 수 있습니다.
- 프로토콜: 표준 HTTP를 통해 작동합니다(특별한 프로토콜 필요 없음).
- 영구성: 서버-클라이언트 메시지에 대한 영구 연결을 유지합니다.
- 인증: 표준 HTTP 인증 메커니즘을 사용할 수 있습니다.
SSE 사용 시기
SSE 전송은 다음을 위해 더 좋습니다.
- 네트워크를 통한 원격 액세스
- 다중 클라이언트 시나리오
- 공개 서비스
- 많은 사용자가 액세스해야 하는 중앙 집중식 도구
- 웹 서비스와의 통합
SSE 구현 예시
import { Server } from "@modelcontextprotocol/sdk/server/index.js"
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"
import express from "express"
const app = express()
const server = new Server({ name: "remote-server", version: "1.0.0" })
// 도구 등록...
// SSE 전송 사용
const transport = new SSEServerTransport(server)
app.use("/mcp", transport.requestHandler())
app.listen(3000, () => {
console.log("MCP 서버가 포트 3000에서 수신 중입니다.")
})
로컬 vs 호스팅: 배포 측면
STDIO 및 SSE 전송 간의 선택은 MCP 서버를 배포하고 관리하는 방식에 직접적인 영향을 미칩니다.
STDIO: 로컬 배포 모델
STDIO 서버는 Cline과 동일한 머신에서 로컬로 실행되며, 이는 몇 가지 중요한 의미를 가집니다.
- 설치: 서버 실행 파일은 각 사용자 머신에 설치되어야 합니다.
- 배포: 다른 운영 체제에 대한 설치 패키지를 제공해야 합니다.
- 업데이트: 각 인스턴스는 별도로 업데이트되어야 합니다.
- 리소스: 로컬 머신의 CPU, 메모리 및 디스크를 사용합니다.
- 액세스 제어: 로컬 머신의 파일 시스템 권한에 의존합니다.
- 통합: 로컬 시스템 리소스(파일, 프로세스)와의 쉬운 통합
- 실행: Cline과 함께 시작 및 중지됩니다(자식 프로세스 수명 주기).
- 종속성: 모든 종속성은 사용자 머신에 설치되어야 합니다.
실제 예시
STDIO를 사용하는 로컬 파일 검색 도구는 다음을 수행합니다.
- 사용자 머신에서 실행
- 로컬 파일 시스템에 직접 액세스
- Cline이 필요할 때 시작
- 네트워크 구성 필요 없음
- Cline과 함께 또는 패키지 관리자를 통해 설치해야 함
SSE: 호스팅 배포 모델
SSE 서버는 원격 서버에 배포되고 네트워크를 통해 액세스할 수 있습니다.
- 설치: 서버에 한 번 설치되고 여러 사용자가 액세스합니다.
- 배포: 단일 배포가 여러 클라이언트에 서비스를 제공합니다.
- 업데이트: 중앙 집중식 업데이트는 모든 사용자에게 즉시 영향을 미칩니다.
- 리소스: 서버 리소스를 사용하며 로컬 머신 리소스를 사용하지 않습니다.
- 액세스 제어: 인증 및 권한 부여 시스템을 통해 관리됩니다.
- 통합: 사용자별 리소스와의 더 복잡한 통합
- 실행: 독립적인 서비스로 실행됩니다(종종 지속적으로).
- 종속성: 서버에서 관리되며 사용자 머신에서는 관리되지 않습니다.
실제 예시
SSE를 사용하는 데이터베이스 쿼리 도구는 다음을 수행합니다.
- 중앙 서버에서 실행
- 서버 측 자격 증명으로 데이터베이스에 연결
- 여러 사용자가 지속적으로 사용 가능
- 적절한 네트워크 보안 구성 필요
- 컨테이너 또는 클라우드 기술을 사용하여 배포
하이브리드 접근 방식
일부 시나리오는 하이브리드 접근 방식의 이점을 얻습니다.
- 네트워크 액세스가 있는 STDIO: 원격 서비스에 대한 프록시 역할을 하는 로컬 STDIO 서버
- 로컬 명령이 있는 SSE: 콜백을 통해 클라이언트 머신에서 작업을 트리거할 수 있는 원격 SSE 서버
- 게이트웨이 패턴: 로컬 작업을 위한 STDIO 서버가 특수 기능을 위해 SSE 서버에 연결
STDIO와 SSE 중에서 선택
고려 사항 | STDIO | SSE |
---|---|---|
위치 | 로컬 머신만 | 로컬 또는 원격 |
클라이언트 | 단일 클라이언트 | 여러 클라이언트 |
성능 | 낮은 지연 시간 | 높은 지연 시간(네트워크 오버헤드) |
설정 복잡성 | 더 간단함 | 더 복잡함(HTTP 서버 필요) |
보안 | 본질적으로 안전함 | 명시적인 보안 조치 필요 |
네트워크 액세스 | 필요 없음 | 필요함 |
확장성 | 로컬 머신으로 제한됨 | 네트워크 전체에 분산 가능 |
배포 | 사용자별 설치 | 중앙 집중식 설치 |
업데이트 | 분산 업데이트 | 중앙 집중식 업데이트 |
리소스 사용량 | 클라이언트 리소스 사용 | 서버 리소스 사용 |
종속성 | 클라이언트 측 종속성 | 서버 측 종속성 |
Caret에서 전송 구성
예시를 포함하여 Cline에서 STDIO 및 SSE 전송을 구성하는 방법에 대한 자세한 내용은 MCP 서버 구성을 참조하십시오.