MCP · ARCHITECTURE
3계층 아키텍처
Host · Client · Server 세 레이어의 역할과 책임, 연결 생명주기, Capability 협상, JSON-RPC 2.0 메시지 구조를 정확히 이해합니다.
Host · Client · Server 역할 분리
MCP는 세 레이어를 명확히 분리하여 각 컴포넌트의 책임을 제한합니다.
그림 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 서버 |
연결 생명주기
그림 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": {} // 로그 스트리밍 지원
}
}
}
표준 메서드 레퍼런스
| 메서드 | 방향 | 타입 | 설명 |
|---|---|---|---|
| initialize | C→S | Request | 연결 초기화 및 Capability 협상 |
| initialized | C→S | Notification | 클라이언트가 준비 완료 신호 |
| ping | C↔S | Request | 연결 헬스체크 |
| tools/list | C→S | Request | 제공 Tool 목록 조회 (페이지네이션 지원) |
| tools/call | C→S | Request | Tool 실행 요청 |
| resources/list | C→S | Request | Resource URI 목록 조회 |
| resources/read | C→S | Request | 특정 URI Resource 내용 읽기 |
| resources/subscribe | C→S | Request | Resource 변경 이벤트 구독 |
| prompts/list | C→S | Request | Prompt 템플릿 목록 조회 |
| prompts/get | C→S | Request | 특정 Prompt 렌더링 (인수 전달) |
| sampling/createMessage | S→C | Request | Server가 Host LLM에게 추론 요청 |
| notifications/tools/list_changed | S→C | Notification | Tool 목록 변경 알림 |
| notifications/message | S→C | Notification | 로그 메시지 전송 |
JSON-RPC 2.0 메시지 타입
| 타입 | id 필드 | 특징 |
|---|---|---|
| Request | 필수 | 응답을 기다림. method + params |
| Response | 필수 (요청과 동일) | result 또는 error 중 하나 |
| Notification | 없음 | 단방향 알림. 응답 없음 |
| Error | 요청 id | code, message, 선택적 data |