📋 목차
- MCP란?
- 핵심 개념 및 아키텍처
- MCP의 주요 구성 요소
- 프로토콜 상세
- 서버 기능 (Server Features)
- 클라이언트 기능 (Client Features)
- 전송 계층 (Transport Layer)
- 보안 및 신뢰
- SDK 및 도구
- 참고 자료
1. MCP란?
MCP(Model Context Protocol)는 LLM 애플리케이션과 외부 데이터 소스 및 도구 간의 원활한 통합을 가능하게 하는 개방형 프로토콜입니다. Anthropic이 주도하여 개발되었으며, AI 모델이 다양한 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있도록 합니다.
비유: MCP는 AI 애플리케이션을 위한 USB-C 포트와 같습니다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준화된 방법을 제공합니다.
MCP는 Language Server Protocol (LSP)에서 영감을 받았습니다. LSP가 다양한 개발 도구에서 프로그래밍 언어 지원을 표준화한 것처럼, MCP는 AI 애플리케이션 생태계에서 컨텍스트와 도구 통합을 표준화합니다.
MCP의 목적
- LLM이 실시간 데이터에 접근할 수 있게 함
- AI 모델이 외부 도구를 실행할 수 있게 함
- 표준화된 인터페이스로 다양한 서비스와 통합
- 보안 경계를 유지하면서 컨텍스트 공유
2. 핵심 개념 및 아키텍처
MCP는 클라이언트-호스트-서버 아키텍처를 따릅니다.
┌─────────────────────────────────────┐
│ MCP Host (AI App) │
│ ┌─────────┐ ┌─────────┐ ┌─────┐ │
│ │Client 1 │ │Client 2 │ │Cli 3│ │
│ └────┬────┘ └────┬────┘ └──┬──┘ │
└───────┼─────────────┼──────────┼─────┘
│ │ │
┌────▼──┐ ┌────▼──┐ ┌───▼────┐
│Server A│ │Server B│ │Server C│
│(로컬) │ │(로컬) │ │(원격) │
└────────┘ └────────┘ └────────┘
주요 참여자
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| MCP Host | 여러 MCP 클라이언트를 조정/관리하는 AI 애플리케이션 | Claude Desktop, VS Code, IDE |
| MCP Client | MCP 서버와 1:1 연결을 유지하는 구성 요소 | 호스트 내에서 인스턴스화된 클라이언트 객체 |
| MCP Server | 컨텍스트와 기능을 제공하는 프로그램 | 파일 시스템 서버, DB 서버, GitHub 서버 |
설계 원칙
- 서버는 매우 쉽게 구축 가능해야 함 - 복잡한 오케스트레이션은 호스트가 담당
- 서버는 높은 조합성(composability)을 가져야 함 - 여러 서버를 원활하게 결합 가능
- 서버는 전체 대화를 읽을 수 없음 - 각 서버 연결은 격리되어 유지
- 기능은 점진적으로 추가 가능 - 핵심 프로토콜은 최소 기능만 제공
3. MCP의 주요 구성 요소
MCP는 두 개의 계층(Layer)으로 구성됩니다:
3.1 데이터 계층 (Data Layer)
JSON-RPC 2.0 기반의 프로토콜로, 다음을 포함:
- 생명주기 관리: 연결 초기화, 기능 협상, 종료
- 서버 프리미티브: Tools, Resources, Prompts
- 클라이언트 프리미티브: Sampling, Roots, Elicitation
- 유틸리티: 알림, 진행 추적, 로깅
3.2 전송 계층 (Transport Layer)
통신 채널과 인증 관리:
- Stdio 전송: 표준 입출력 스트림 (로컬 프로세스 간)
- Streamable HTTP 전송: HTTP POST + Server-Sent Events (원격 통신)
4. 프로토콜 상세
메시지 형식
모든 MCP 메시지는 JSON-RPC 2.0 사양을 따릅니다.
요청 (Request)
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
응답 (Response)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [...]
}
}
알림 (Notification) - 응답 불필요
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}
생명주기 (Lifecycle)
- 초기화(Initialize): 클라이언트가
initialize요청을 보내 프로토콜 버전과 지원 기능 협상 - 준비 완료(Initialized): 클라이언트가
notifications/initialized알림 전송 - 활성 세션: 기능 협상 완료 후 실제 데이터 교환
초기화 예시:
// 클라이언트 → 서버
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": { "elicitation": {} },
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}
// 서버 → 클라이언트
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": { "listChanged": true },
"resources": {}
},
"serverInfo": { "name": "example-server", "version": "1.0.0" }
}
}
5. 서버 기능 (Server Features)
MCP 서버는 세 가지 핵심 프리미티브를 제공합니다:
5.1 Tools (도구)
정의: AI 모델이 능동적으로 호출할 수 있는 실행 가능한 함수
| 특징 | 설명 |
|---|---|
| 제어 주체 | AI 모델 (모델이 사용 시점 결정) |
| 용도 | 파일 작업, API 호출, DB 쿼리, 외부 시스템 액션 |
| 프로토콜 | tools/list (발견), tools/call (실행) |
예시:
@mcp.tool()
def search_flights(origin: str, destination: str, date: str) -> str:
"""항공편 검색"""
return f"{origin} → {destination} 항공편 검색 결과"
5.2 Resources (리소스)
정의: AI 애플리케이션에 컨텍스트 정보를 제공하는 읽기 전용 데이터 소스
| 특징 | 설명 |
|---|---|
| 제어 주체 | 애플리케이션 (앱이 데이터 검색 및 처리 결정) |
| 용도 | 파일 내용, DB 스키마, API 문서, 지식 베이스 |
| 프로토콜 | resources/list, resources/read, resources/subscribe |
리소스 템플릿 예시:
{
"uriTemplate": "weather://forecast/{city}/{date}",
"name": "weather-forecast",
"mimeType": "application/json"
}
5.3 Prompts (프롬프트)
정의: 재사용 가능한 템플릿으로, 특정 도메인에 맞춘 상호작용 패턴 제공
| 특징 | 설명 |
|---|---|
| 제어 주체 | 사용자 (명시적 호출 필요) |
| 용도 | 시스템 프롬프트, Few-shot 예제, 워크플로우 템플릿 |
| 프로토콜 | prompts/list, prompts/get |
예시:
{
"name": "plan-vacation",
"arguments": [
{ "name": "destination", "type": "string", "required": true },
{ "name": "duration", "type": "number", "description": "days" }
]
}
6. 클라이언트 기능 (Client Features)
클라이언트(호스트)가 서버에 제공할 수 있는 기능:
Sampling (샘플링)
- 서버가 클라이언트의 LLM 완성(completion)을 요청할 수 있음
- 서버가 모델 SDK를 포함하지 않고도 LLM에 접근 가능
- 메서드:
sampling/createMessage
Roots (루트)
- 서버가 작업할 URI 또는 파일시스템 경계를 질의
- 서버가 접근 가능한 디렉토리 범위를 이해하는 데 사용
Elicitation (정보 요청)
- 서버가 사용자에게 추가 정보를 요청
- 사용자 확인 또는 추가 입력이 필요할 때 사용
- 메서드:
elicitation/create
7. 전송 계층 (Transport Layer)
Stdio Transport
- 표준 입력/출력 스트림 사용
- 로컬 프로세스 간 직접 통신
- 네트워크 오버헤드 없음, 최고 성능
- 주로 로컬 MCP 서버에 사용
Streamable HTTP Transport
- HTTP POST로 클라이언트→서버 메시지
- Server-Sent Events (SSE)로 스트리밍 지원
- 원격 서버 통신 가능
- OAuth, Bearer Token, API Key 등 표준 HTTP 인증 지원
8. 보안 및 신뢰
MCP는 강력한 기능(데이터 접근, 코드 실행)을 제공하므로 보안이 중요합니다:
핵심 원칙
-
사용자 동의 및 통제
- 모든 데이터 접근과 작업에 명시적 동의 필요
- 사용자는 공유되는 데이터와 실행되는 작업을 통제
-
데이터 프라이버시
- 호스트는 사용자 데이터를 서버에 노출하기 전 동의 획득
- 사용자 동의 없이 리소스 데이터를 외부로 전송 금지
-
도구 안전성
- 도구는 임의 코드 실행을 의미하므로 주의 필요
- 도구 호출 전 사용자 동의 필수
-
LLM 샘플링 제어
- 사용자는 샘플링 발생 여부, 실제 프롬프트 내용, 서버가 볼 수 있는 결과를 통제
9. SDK 및 도구
공식 SDK
| 언어 | 저장소 |
|---|---|
| Python | python-sdk |
| TypeScript | typescript-sdk |
| Java | java-sdk |
| Go | go-sdk |
| C# | csharp-sdk |
| Ruby | ruby-sdk |
| Rust | rust-sdk |
| Kotlin | kotlin-sdk |
| Swift | swift-sdk |
| PHP | php-sdk |
Python SDK 예시 (v2)
서버 (15줄):
from mcp.server import MCPServer
mcp = MCPServer("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""두 숫자를 더합니다."""
return a + b
@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
"""이름으로 인사합니다."""
return f"Hello, {name}!"
클라이언트 (10줄):
import asyncio
from mcp import Client
from server import mcp
async def main():
async with Client(mcp) as client:
result = await client.call_tool("add", {"a": 1, "b": 2})
print(result.structured_content) # {'result': 3}
asyncio.run(main())
참조 서버 구현
공식 저장소(servers)에서 제공하는 참조 서버:
- Everything: 테스트/참조 서버
- Filesystem: 안전한 파일 작업
- Git: Git 저장소 읽기/검색/조작
- Memory: 지식 그래프 기반 메모리 시스템
- Sequential Thinking: 단계적 사고 프로세스
- Time: 시간 및 시간대 변환
- Fetch: 웹 콘텐츠 가져오기
10. 참고 자료
공식 문서
- 공식 사이트: modelcontextprotocol.io
- 스펙: spec.modelcontextprotocol.io
- Python SDK 문서: py.sdk.modelcontextprotocol.io
학습 자료
- Hugging Face MCP 코스: huggingface.co/learn/mcp-course
- MCP 서버 레지스트리: registry.modelcontextprotocol.io
GitHub 저장소
- MCP 스펙: github.com/modelcontextprotocol/specification
- MCP 서버: github.com/modelcontextprotocol/servers
- MCP 문서: github.com/modelcontextprotocol/docs
요약: MCP는 AI 애플리케이션이 외부 데이터와 도구에 표준화된 방식으로 연결될 수 있게 하는 개방형 프로토콜입니다. Tools(실행), Resources(데이터), Prompts(템플릿)라는 세 가지 핵심 프리미티브를 통해 LLM이 실제 세계와 상호작용할 수 있게 하며, JSON-RPC 2.0 기반으로 동작합니다. 현재 Anthropic 주도로 개발되고 있으며, 다양한 언어의 SDK와 참조 구현이 제공됩니다.