개요
MCP(Model Context Protocol)는 LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있게 해주는 개방형 프로토콜이다. Anthropic이 주도하여 개발되었으며, AI 애플리케이션을 위한 USB-C 포트에 비유된다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 인터페이스를 제공한다.
핵심 아키텍처
MCP는 클라이언트-서버 아키텍처를 따르며, 세 가지 주요 참여자로 구성된다:
1. MCP 호스트 (Host)
- AI 애플리케이션 (예: Claude Desktop, VS Code, IDE 등)
- 여러 MCP 클라이언트를 생성하고 관리
- 보안 정책 및 사용자 승인 처리
- 컨텍스트 집계 조정
2. MCP 클라이언트 (Client)
- 호스트 내에서 각 MCP 서버와 1:1 연결을 유지하는 컴포넌트
- 프로토콜 협상 및 기능 교환 처리
- 메시지 양방향 라우팅
3. MCP 서버 (Server)
- 특정 기능(도구, 리소스, 프롬프트)을 제공하는 프로그램
- 로컬 프로세스 또는 원격 서비스로 실행 가능
- 각 서버는 독립적으로 동작하며 격리된 보안 경계 유지
MCP Host (AI Application)
├── MCP Client 1 ──── MCP Server A (로컬: 파일시스템)
├── MCP Client 2 ──── MCP Server B (로컬: 데이터베이스)
└── MCP Client 3 ──── MCP Server C (원격: Sentry API)
계층 구조
MCP는 두 개의 계층으로 구성된다:
데이터 계층 (Data Layer)
- JSON-RPC 2.0 기반 메시지 교환 프로토콜
- 생명주기 관리: 연결 초기화, 기능 협상, 종료 처리
- 서버 프리미티브: Tools, Resources, Prompts
- 클라이언트 프리미티브: Sampling, Roots, Elicitation
- 유틸리티: 알림(Notifications), 진행 추적(Progress tracking)
전송 계층 (Transport Layer)
- Stdio 전송: 표준 입출력 스트림 사용, 로컬 프로세스 간 통신 (최적 성능)
- Streamable HTTP 전송: HTTP POST + Server-Sent Events(SSE), 원격 서버 통신 지원, OAuth 인증 권장
핵심 프리미티브 (Primitives)
서버가 제공하는 기능
| 프리미티브 | 설명 | 예시 |
|---|---|---|
| Tools | AI 모델이 호출할 수 있는 실행 가능한 함수 | 파일 검색, DB 쿼리, API 호출 |
| Resources | 읽기 전용 컨텍스트 데이터 소스 | 문서 내용, DB 스키마, API 문서 |
| Prompts | 재사용 가능한 템플릿 (상호작용 구조화) | 시스템 프롬프트, Few-shot 예제 |
클라이언트가 제공하는 기능
| 프리미티브 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에 완성(completion) 요청 |
| Roots | 서버가 URI/파일시스템 경계 탐색 |
| Elicitation | 서버가 사용자에게 추가 정보 요청 |
프로토콜 동작 방식
1. 초기화 (Initialization)
클라이언트가 서버에 initialize 요청을 보내 프로토콜 버전과 지원 기능을 협상한다.
// 클라이언트 → 서버
{
"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. 도구 발견 (Tool Discovery)
tools/list 요청으로 서버가 제공하는 도구 목록을 조회한다.
3. 도구 실행 (Tool Execution)
tools/call 요청으로 특정 도구를 호출하고 결과를 받는다.
4. 알림 (Notifications)
서버가 도구 목록 변경 등 실시간 업데이트를 클라이언트에 전송한다.
SDK 지원 언어
MCP는 다양한 언어의 공식 SDK를 제공한다:
| 언어 | GitHub 저장소 |
|---|---|
| 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:
"""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() -> None:
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())
참조 서버 (Reference Servers)
공식 저장소(modelcontextprotocol/servers)에서 제공하는 참조 구현:
| 서버 | 설명 |
|---|---|
| Everything | 테스트용 (프롬프트, 리소스, 도구 모두 포함) |
| Fetch | 웹 콘텐츠 가져오기 및 변환 |
| Filesystem | 보안 파일 시스템 접근 |
| Git | Git 저장소 읽기/검색/조작 |
| Memory | 지식 그래프 기반 영구 메모리 |
| Sequential Thinking | 순차적 사고 프로세스 |
| Time | 시간 및 시간대 변환 |
보안 원칙
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터 노출 전 명시적 동의 획득
- 도구 안전성: 도구 호출 전 사용자 승인 필요
- LLM 샘플링 통제: 샘플링 요청 시 사용자 승인 필수
활용 사례
- AI 비서: 파일 시스템, 데이터베이스, 이메일, 캘린더 통합
- IDE: 코드 저장소, 이슈 트래커, CI/CD 파이프라인 연동
- 여행 플래너: 항공편 검색, 호텔 예약, 날씨 확인, 캘린더 일정 관리
- 고객 지원: CRM, 지식 베이스, 티켓 시스템 연동
참고 자료
- 공식 문서: modelcontextprotocol.io
- 스펙: spec.modelcontextprotocol.io
- GitHub 조직: github.com/modelcontextprotocol
- Hugging Face MCP 코스: huggingface.co/learn/mcp-course