📌 개요
Model Context Protocol (MCP) 는 Anthropic이 2024년 11월에 발표한 개방형 프로토콜로, AI 애플리케이션(특히 LLM)이 외부 데이터 소스 및 도구와 표준화된 방식으로 통합될 수 있도록 설계되었습니다. 흔히 "AI를 위한 USB-C 포트" 라고 비유됩니다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 인터페이스를 제공합니다.
2025년 12월, Anthropic은 MCP를 Agentic AI Foundation (AAIF) — Linux Foundation 산하의 기금 — 에 기부했으며, Block, OpenAI 등이 공동 창립자로 참여했습니다.
🏗️ 아키텍처
MCP는 클라이언트-서버 아키텍처를 따릅니다.
┌─────────────────────────────────┐
│ MCP Host (AI Application) │
│ ┌──────────┐ ┌──────────┐ │
│ │Client 1 │ │Client 2 │ ... │
│ └────┬─────┘ └────┬─────┘ │
└───────┼────────────┼───────────┘
│ │
┌────▼──┐ ┌────▼──┐
│Server A│ │Server B│
│(로컬) │ │(원격) │
└────────┘ └────────┘
주요 구성 요소
| 구성 요소 | 설명 |
|---|---|
| MCP Host | AI 애플리케이션 (Claude Desktop, VS Code, IDE 등). 여러 MCP Client를 생성하고 관리 |
| MCP Client | 각 MCP Server와 1:1 연결을 유지하는 프로토콜 클라이언트 |
| MCP Server | 특정 기능(도구, 리소스, 프롬프트)을 노출하는 경량 프로그램 |
전송 계층 (Transport Layer)
MCP는 두 가지 전송 메커니즘을 지원합니다:
- Stdio Transport — 로컬 프로세스 간 표준 입출력 통신 (성능 최적)
- Streamable HTTP Transport — HTTP POST + Server-Sent Events (SSE) 기반 원격 통신, OAuth 인증 지원
📋 핵심 개념
데이터 계층 (Data Layer)
MCP는 JSON-RPC 2.0을 기반으로 메시지를 교환합니다. 세 가지 주요 메시지 유형이 있습니다:
| 유형 | 설명 |
|---|---|
| Request | 요청 (ID 포함, 응답 필요) |
| Response | 응답 (Result 또는 Error) |
| Notification | 알림 (ID 없음, 응답 불필요) |
서버 프리미티브 (Server Primitives)
MCP 서버는 세 가지 핵심 기능을 노출할 수 있습니다:
1. 🛠️ Tools (도구)
- AI 모델이 능동적으로 호출할 수 있는 실행 가능한 함수
- 파일 작업, API 호출, 데이터베이스 쿼리 등 동작 수행
tools/list로 발견 →tools/call로 실행- JSON Schema 기반 입력 검증
예시:
{
"name": "searchFlights",
"description": "항공편 검색",
"inputSchema": {
"type": "object",
"properties": {
"origin": {"type": "string"},
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"}
},
"required": ["origin", "destination", "date"]
}
}
2. 📄 Resources (리소스)
- 읽기 전용 데이터 소스 — 파일 내용, DB 스키마, API 문서 등
- 고유 URI로 식별 (예:
file:///path/to/doc.md) - 직접 리소스와 동적 템플릿 리소스 지원
resources/list→resources/read
템플릿 예시:
weather://forecast/{city}/{date}
travel://flights/{origin}/{destination}
3. 💬 Prompts (프롬프트)
- 재사용 가능한 템플릿 — 사용자가 명시적으로 호출
- 도메인별 워크플로우나 상호작용 패턴 정의
prompts/list→prompts/get
클라이언트 프리미티브 (Client Primitives)
서버가 클라이언트에 요청할 수 있는 기능:
| 기능 | 설명 |
|---|---|
| Sampling | 서버가 호스트 LLM에 언어 모델 완성 요청 (sampling/createMessage) |
| Roots | 서버가 URI/파일시스템 경계 탐색 |
| Elicitation | 서버가 사용자에게 추가 정보 요청 |
유틸리티
- Tasks (실험적) — 지속적 실행 래퍼, 지연된 결과 검색 및 상태 추적
- Notifications — 실시간 업데이트 (예:
notifications/tools/list_changed) - Progress tracking, Cancellation, Error reporting, Logging
🔄 라이프사이클
MCP 연결은 상태 기반(stateful) 이며, 다음 단계를 거칩니다:
1. 초기화 (Initialize)
클라이언트가 initialize 요청을 보내 프로토콜 버전 협상 및 기능 협상(Capability Negotiation) 을 수행합니다.
// 클라이언트 → 서버
{
"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" }
}
}
2. 준비 완료 알림
{ "jsonrpc": "2.0", "method": "notifications/initialized" }
3. 활성 세션
- 클라이언트가 도구/리소스/프롬프트 요청
- 서버가 샘플링 요청 가능
- 양방향 알림
4. 종료
🔒 보안 및 신뢰 원칙
MCP는 강력한 기능을 제공하지만, 그만큼 보안이 중요합니다:
- 사용자 동의 및 통제 — 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시 — 사용자 데이터는 동의 없이 외부로 전송 금지
- 도구 안전성 — 도구는 임의 코드 실행을 의미하므로 주의 필요
- LLM 샘플링 통제 — 사용자가 프롬프트 내용과 결과 가시성 통제
⚠️ 2025년 4월, 보안 연구원들은 MCP의 프롬프트 인젝션 및 중독된 도구를 통한 데이터 유출 가능성을 보고했습니다.
🚀 실제 사용 예시
여행 계획 시나리오
세 개의 MCP 서버가 협력하는 예시:
- Travel Server — 항공편, 호텔, 여정 관리
- Weather Server — 기후 데이터 및 예보
- Calendar/Email Server — 일정 및 커뮤니케이션
흐름:
- 사용자가
plan-vacation프롬프트 호출 (목적지: 바르셀로나, 기간: 7일) - AI가 캘린더 리소스, 여행 선호도, 과거 여행 기록 읽기
- AI가
searchFlights(),checkWeather()도구 실행 bookHotel(),createCalendarEvent(),sendEmail()실행- 사용자 승인 후 전체 여행 예약 완료
📦 SDK 및 구현
MCP는 다양한 언어로 SDK를 제공합니다:
| 언어 | 저장소 |
|---|---|
| Python | python-sdk |
| TypeScript | typescript-sdk |
| Java | java-sdk |
| Kotlin | kotlin-sdk |
| C# | csharp-sdk |
| Go | go-sdk |
| Rust | rust-sdk |
| Swift | swift-sdk |
| PHP | php-sdk |
| Ruby | ruby-sdk |
Python SDK 예제 (v2)
서버 (15줄):
from mcp.server import MCPServer
mcp = MCPServer("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers."""
return a + b
@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
"""Greet someone by name."""
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())
🌐 채택 현황
| 기관/기업 | 내용 |
|---|---|
| OpenAI | 2025년 3월 MCP 채택, ChatGPT 데스크톱 앱에 통합 |
| Google DeepMind | 2025년 4월 MCP 채택 발표 |
| Microsoft | Semantic Kernel 및 Azure OpenAI와 통합 |
| Cloudflare | MCP 서버 배포 지원 |
| Replit, Sourcegraph | AI 코딩 도우미에 MCP 통합 |
| AAIF | 2026년 4월 MCP Dev Summit North America 개최 (약 1,200명 참석) |
📚 참고 자료
- 공식 사이트: modelcontextprotocol.io
- 명세서: spec.modelcontextprotocol.io
- GitHub 저장소: github.com/modelcontextprotocol
- 참조 서버: github.com/modelcontextprotocol/servers
- MCP 레지스트리: registry.modelcontextprotocol.io
💡 요약
MCP는 AI 애플리케이션과 외부 데이터/도구 간의 표준화된 통신 프로토콜입니다. JSON-RPC 2.0 기반으로, 서버는 Tools(실행), Resources(데이터), Prompts(템플릿)를 노출하고, 클라이언트는 Sampling, Roots, Elicitation 기능을 제공합니다. LSP(Language Server Protocol)에서 영감을 받았으며, Anthropic이 시작하여 현재는 Linux Foundation 산하 AAIF에서 관리하는 개방형 표준입니다.