📌 MCP(Model Context Protocol)란?
MCP는 Anthropic이 2024년 11월에 공개한 오픈소스 표준 프로토콜로, AI 애플리케이션(LLM)이 외부 시스템(데이터베이스, 파일 시스템, API 등)과 표준화된 방식으로 통신할 수 있게 해줍니다.
비유: MCP는 "AI를 위한 USB-C 포트"와 같습니다. USB-C 하나로 다양한 주변기기를 연결하듯, MCP 하나로 모든 AI 도구를 표준 방식으로 연결할 수 있습니다.
왜 MCP가 필요한가? (N×M 문제 해결)
MCP 이전에는 각 AI 서비스(Claude, GPT, Cursor 등)마다 외부 도구를 연결하는 방식이 제각각이었습니다. 예를 들어:
- Claude용 DB 플러그인, GPT용 DB 플러그인을 각각 개발해야 했음
- AI 서비스를 바꾸면 연동 코드를 전면 재작성해야 했음
MCP 도입 후: 하나의 MCP 서버만 만들면 MCP를 지원하는 모든 AI 호스트에서 즉시 사용 가능 → N×M 문제가 N+M으로 해결됩니다.
🏗️ MCP 아키텍처: 3계층 구조
MCP는 Host - Client - Server의 3계층 구조로 이루어집니다.
┌─────────────────────────────────────────────────────┐
│ MCP Host │
│ (Claude Desktop, VS Code, Cursor, Claude Code) │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ MCP Client #1 │ │ MCP Client #2 │ │
│ └──────┬───────┘ └──────┬───────┘ │
└──────────┼─────────────────────┼─────────────────────┘
│ 1:1 연결 │ 1:1 연결
▼ ▼
┌──────────────┐ ┌──────────────┐
│ MCP Server A │ │ MCP Server B │
│ (파일 시스템) │ │ (GitHub) │
└──────────────┘ └──────────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 로컬 파일 │ │ GitHub API │
└──────────────┘ └──────────────┘
🔍 각 구성 요소 상세 설명
1️⃣ MCP Host (호스트)
| 항목 | 설명 |
|---|---|
| 정의 | 사용자가 직접 상호작용하는 AI 애플리케이션 |
| 역할 | 여러 MCP Client를 조정/관리하는 오케스트레이터 |
| 예시 | Claude Desktop, Claude Code, VS Code(Copilot), Cursor, Amazon Q Developer, Zed |
- Host는 사용자의 입력을 받아 MCP Client를 구동하고 MCP Server와 연결합니다.
- 하나의 Host는 여러 개의 MCP Client를 동시에 가질 수 있습니다.
2️⃣ MCP Client (클라이언트)
| 항목 | 설명 |
|---|---|
| 정의 | Host 내부에서 MCP Server와 1:1 연결을 유지하는 컴포넌트 |
| 역할 | JSON-RPC 2.0 메시지를 생성/해석하여 Server와 통신 |
| 특징 | Host 내부에 내장되어 있으며, Server마다 별도의 Client가 생성됨 |
MCP Client의 주요 기능:
- Server와의 연결 수립 및 세션 관리 (초기화, 기능 협상, 종료)
- Server가 제공하는 도구(Tool) 목록 조회 (
tools/list) - Server에 도구 실행 요청 (
tools/call) - Server의 응답을 LLM(모델)에 전달
⚠️ 혼동 주의: MCP Client는 "요청만 하는 존재"가 아닙니다. Server가 Client에게 Sampling(LLM 호출 요청)이나 로깅을 요청할 수도 있어 양방향 통신이 가능합니다.
3️⃣ MCP Server (서버)
| 항목 | 설명 |
|---|---|
| 정의 | MCP Client에게 컨텍스트(데이터, 도구, 프롬프트)를 제공하는 프로그램 |
| 역할 | 실제 데이터 소스(파일, DB, API)에 접근하여 기능 노출 |
| 실행 위치 | 로컬(같은 머신) 또는 원격(클라우드) 모두 가능 |
MCP Server가 노출하는 3가지 핵심 기능:
| 기능 | 설명 | 제어 주체 | 예시 |
|---|---|---|---|
| Tools (도구) | 모델이 능동적으로 호출하는 실행 가능한 함수 | 모델 | 파일 읽기/쓰기, DB 쿼리, API 호출 |
| Resources (리소스) | 모델이 읽을 수 있는 데이터 (읽기 전용) | 애플리케이션 | 파일 내용, DB 스키마, 문서 |
| Prompts (프롬프트) | 재사용 가능한 프롬프트 템플릿 | 사용자 | 코드 리뷰 템플릿, 회의 요약 템플릿 |
🔄 MCP 통신 방식
JSON-RPC 2.0 기반
MCP의 모든 통신은 JSON-RPC 2.0 형식을 따릅니다.
요청 예시 (Client → Server):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}
응답 예시 (Server → Client):
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "get_weather",
"description": "특정 도시의 현재 날씨를 조회합니다",
"inputSchema": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "도시 이름" }
},
"required": ["city"]
}
}
]
}
}
도구 실행 요청:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": { "city": "Seoul" }
}
}
전송 계층 (Transport Layer)
| 방식 | 설명 | 사용 환경 |
|---|---|---|
| STDIO | 표준 입출력으로 JSON-RPC 메시지 교환 | 로컬 프로세스 간 통신 |
| Streamable HTTP | 단일 HTTP 엔드포인트로 양방향 통신 | 원격 서버 (권장) |
🎯 전체 동작 흐름
1. 사용자: "서울 날씨 알려줘"
↓
2. Host (Claude Desktop)가 질문을 LLM에 전달
↓
3. LLM이 사용 가능한 Tool 목록 확인 (tools/list)
↓
4. LLM이 "get_weather" 도구가 필요하다고 판단
↓
5. MCP Client가 Server에 tools/call 요청 전송
↓
6. MCP Server가 실제 날씨 API 호출 후 결과 반환
↓
7. LLM이 결과를 바탕으로 최종 응답 생성
↓
8. 사용자: "서울의 현재 날씨는 22°C, 맑음입니다."
📊 핵심 요약
| 구성 요소 | 역할 | 예시 |
|---|---|---|
| MCP Host | 사용자와 상호작용하는 AI 앱 전체 | Claude Desktop, VS Code |
| MCP Client | Host 내부에서 Server와 1:1 통신 담당 | Host에 내장된 통신 모듈 |
| MCP Server | 실제 데이터/기능을 표준 방식으로 노출 | 파일시스템 서버, DB 서버 |
MCP의 핵심 가치:
- ✅ 표준화: 한 번 만든 서버를 모든 AI 도구에서 재사용
- ✅ 확장성: 로컬/원격 모두 지원
- ✅ 보안: OAuth 2.1 기반 인증, 최소 권한 원칙
- ✅ 양방향 통신: Server도 Client에게 LLM 호출 요청 가능 (Sampling)
💡 참고 자료: MCP 공식 문서 | MCP Python SDK | MCP TypeScript SDK