[MCP] MCP 아키텍처 및 구성요소




모델 컨텍스트 프로토콜(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



Leave a Comment