MCP · ARCHITECTURE

3계층 아키텍처

📐 상태 기계 다이어그램 📋 메시지 포맷 레퍼런스 🔧 메서드 목록

Host · Client · Server 세 레이어의 역할과 책임, 연결 생명주기, Capability 협상, JSON-RPC 2.0 메시지 구조를 정확히 이해합니다.

Host · Client · Server 역할 분리

MCP는 세 레이어를 명확히 분리하여 각 컴포넌트의 책임을 제한합니다.

HOST AI Model Claude / GPT / Gemini MCP Client ① 서버 A 전용 핸들러 MCP Client ② 서버 B 전용 핸들러 1 Host : N Clients MCP SERVER A Tools: [search, fetch] Resources: [file://...] 독립 프로세스 / 원격 MCP SERVER B Tools: [db_query] 독립 프로세스 / 원격 External APIs DB · Web · Files 그림 1. MCP 3계층 구조 — 1 Host가 여러 Client를 통해 여러 Server에 연결
레이어누가책임예시
Host AI 애플리케이션 AI 모델을 실행하고, 여러 MCP Client를 관리. 사용자 권한 승인 게이트 Claude Desktop, Cursor, 자체 개발 앱
Client Host 내부 컴포넌트 특정 Server 1개와 1:1 연결 유지. JSON-RPC 직렬화/역직렬화, Capability 협상 Host 애플리케이션의 내부 모듈
Server 도구 제공자 Tool · Resource · Prompt 구현 및 노출. 독립 프로세스로 격리. 상태 비저장 권장 직접 구현한 Python MCP 서버

연결 생명주기

Client Server initialize(protocolVersion, caps) result(serverInfo, caps) initialized (notification) ⬅ 연결 준비 완료 tools/call, resources/read… result / error 연결 종료 (프로세스 kill 또는 연결 해제) 그림 2. MCP 연결 생명주기 — initialize → 협상 → 운영 → 종료

Capability 협상

Client가 initialize를 보낼 때 자신이 지원하는 기능을 선언하고, Server가 응답할 때 서버가 지원하는 기능을 선언합니다. 이후 쌍방이 선언한 기능만 사용할 수 있습니다.

json initialize 요청 페이로드
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "clientInfo": { "name": "my-client", "version": "1.0" },
    "capabilities": {
      "sampling": {},        // Client가 LLM 샘플링 제공 가능
      "roots": { "listChanged": true }  // 루트 디렉터리 변경 알림 지원
    }
  }
}
json initialize 응답 — 서버 Capabilities
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "serverInfo": { "name": "my-mcp-server", "version": "2.1.0" },
    "capabilities": {
      "tools": { "listChanged": true },      // Tool 목록 변경 알림
      "resources": { "subscribe": true }, // Resource 변경 구독 지원
      "prompts": {},                        // Prompt 제공
      "logging": {}                         // 로그 스트리밍 지원
    }
  }
}

표준 메서드 레퍼런스

메서드방향타입설명
initializeC→SRequest연결 초기화 및 Capability 협상
initializedC→SNotification클라이언트가 준비 완료 신호
pingC↔SRequest연결 헬스체크
tools/listC→SRequest제공 Tool 목록 조회 (페이지네이션 지원)
tools/callC→SRequestTool 실행 요청
resources/listC→SRequestResource URI 목록 조회
resources/readC→SRequest특정 URI Resource 내용 읽기
resources/subscribeC→SRequestResource 변경 이벤트 구독
prompts/listC→SRequestPrompt 템플릿 목록 조회
prompts/getC→SRequest특정 Prompt 렌더링 (인수 전달)
sampling/createMessageS→CRequestServer가 Host LLM에게 추론 요청
notifications/tools/list_changedS→CNotificationTool 목록 변경 알림
notifications/messageS→CNotification로그 메시지 전송

JSON-RPC 2.0 메시지 타입

타입id 필드특징
Request필수응답을 기다림. method + params
Response필수 (요청과 동일)result 또는 error 중 하나
Notification없음단방향 알림. 응답 없음
Error요청 idcode, message, 선택적 data