모델 컨텍스트 프로토콜(MCP, Model Context Protocol)은 LLM(Large Language Model) 애플리케이션과 다양한 통합 시스템 간의 원활한 통신을 가능하게 하는 유연하고 확장 가능한 아키텍처를 제공합니다. 이 포스트에서는 MCP의 핵심 아키텍처 및 구성요소에 대해 상세히 설명합니다.
MCP 아키텍처 개요
MCP는 클라이언트-서버 아키텍처를 기반으로 하며, 다음의 세 가지 주요 구성 요소로 구성됩니다.
- 호스트(Host)
- 연결을 시작하는 LLM 애플리케이션(예: Claude Desktop, IDE 등)입니다.
- 클라이언트(Client)
- 호스트 애플리케이션 내부에서 동작하며, 서버와 1:1 연결을 유지합니다.
- 서버와의 통신을 담당하며, 컨텍스트와 요청을 처리합니다.
- 서버(Server)
- 클라이언트에게 컨텍스트, 도구 및 프롬프트를 제공합니다.
- 리소스 관리, 데이터 제공, 인증 및 보안 등의 역할을 수행합니다.

핵심 구성 요소
프로토콜 계층(Protocol Layer)
프로토콜 계층은 메시지 프레이밍, 요청/응답 처리 및 고급 통신 패턴을 관리합니다. 주요 메서드는 다음과 같습니다.
- setRequestHandler: 수신된 요청 처리
- setNotificationHandler: 수신된 알림 처리
- request: 요청 전송 및 응답 대기
- notification: 단방향 알림 전송
class Protocol<Request, Notification, Result> {
setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void
setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void
request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>
notification(notification: Notification): Promise<void>
}
전송 계층(Transport Layer)
전송 계층은 클라이언트와 서버 간의 실제 통신 방식을 정의하며, 다음과 같은 전송 메커니즘을 지원합니다.
- 표준 입출력(Stdio)
- 로컬 프로세스 간 통신에 적합
- HTTP를 통한 서버 전송 이벤트(SSE)
- 서버에서 클라이언트로의 메시지 전달에 SSE 사용
- 클라이언트에서 서버로의 메시지 전달에 HTTP POST 사용
모든 전송은 JSON-RPC 2.0을 기반으로 메시지를 교환합니다.
메시지 유형
MCP는 네 가지 주요 메시지 유형을 정의합니다.
- Request: 요청 메시지로, 응답을 기대합니다.
interface Request { method: string; params?: {...}; }
- Result: 성공적인 요청 처리의 결과입니다.
interface Result { [key: string]: unknown; }
- Error: 요청 처리 실패를 나타내는 메시지입니다.
interface Error { code: number; message: string; data?: unknown; }
- Notification: 응답을 기대하지 않는 일방적 메시지입니다.
interface Notification { method: string; params?: {...}; }
연결 라이프사이클
연결은 다음 단계로 이루어집니다.
1. 초기화
- 클라이언트가
initialize
요청을 보내면 서버가 응답합니다. - 클라이언트는
initialized
알림을 보냅니다.

2. 메시지 교환
- 초기화 후 요청-응답 및 알림 메시지가 교환됩니다.
3. 종료
- 연결은 명시적 종료, 전송 단절 또는 오류 상태에 의해 종료될 수 있습니다.
오류 처리
MCP는 표준 오류 코드를 사용하여 오류를 관리하며, SDK와 애플리케이션에서 커스텀 오류 코드를 추가할 수 있습니다.
enum ErrorCode {
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603
}
MCP 서버 구현 예시
다음은 간단한 MCP 서버 구현 예시입니다.
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "example-server",
version: "1.0.0"
}, {
capabilities: { resources: {} }
});
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: [{ uri: "example://resource", name: "Example Resource" }]
};
});
const transport = new StdioServerTransport();
await server.connect(transport);
이 포스트를 통해 MCP의 아키텍처 및 구성요소에 대한 깊은 이해를 돕고자 했습니다. 다음 포스트에서는 MCP의 개별 구성 요소를 더욱 심도 있게 탐구하겠습니다.
결론
MCP 아키텍처와 구성 요소는 AI 모델이 외부 데이터와 도구를 효율적이고 일관되게 활용할 수 있도록 지원합니다. 다음 포스트부터는 MCP의 개별 구성 요소들을 더욱 심도 있게 탐색하겠습니다.
참고 자료
- https://modelcontextprotocol.io/introduction