개요
Model Context Protocol (MCP)는 LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있도록 하는 개방형 프로토콜입니다. Anthropic이 주도하여 개발되었으며, AI 애플리케이션을 위한 USB-C 포트와 같은 역할을 합니다. 즉, 다양한 데이터 소스와 도구를 LLM에 표준화된 방식으로 연결해줍니다.
핵심 아키텍처
MCP는 클라이언트-호스트-서버 아키텍처를 따릅니다:
┌─────────────────────────────────┐
│ MCP Host (AI App) │
│ ┌────────┐ ┌────────┐ ┌───────┐ │
│ │Client 1│ │Client 2│ │Client3│ │
│ └───┬────┘ └───┬────┘ └───┬───┘ │
└──────┼──────────┼──────────┼──────┘
│ │ │
┌────▼──┐ ┌────▼──┐ ┌────▼──┐
│Server │ │Server │ │Server │
│ A │ │ B │ │ C │
└───────┘ └───────┘ └───────┘
구성 요소
| 구성 요소 | 설명 |
|---|---|
| MCP Host | Claude Desktop, IDE, AI 도구 등 MCP를 통해 데이터에 접근하려는 프로그램 |
| MCP Client | 서버와 1:1 연결을 유지하는 프로토콜 클라이언트 (호스트가 각 서버마다 생성) |
| MCP Server | 표준화된 MCP를 통해 특정 기능을 노출하는 경량 프로그램 |
주요 개념 (Primitives)
MCP는 세 가지 핵심 서버 프리미티브를 정의합니다:
1. 🛠️ Tools (도구)
- 정의: AI 애플리케이션이 호출하여 실행할 수 있는 함수
- 제어 주체: AI 모델 (모델이 필요에 따라 호출)
- 예시: 파일 검색, DB 쿼리, API 호출, 이메일 전송
- 프로토콜 메서드:
tools/list,tools/call
2. 📄 Resources (리소스)
- 정의: AI 애플리케이션에 컨텍스트 정보를 제공하는 데이터 소스
- 제어 주체: 애플리케이션 (앱이 가져와서 모델에 전달)
- 예시: 파일 내용, DB 스키마, API 문서, 달력 데이터
- 프로토콜 메서드:
resources/list,resources/read,resources/subscribe - URI 기반 접근: 예)
file:///path/to/doc.md,weather://forecast/{city}
3. 💬 Prompts (프롬프트)
- 정의: 재사용 가능한 템플릿으로, 특정 도구/리소스와 함께 작업하도록 모델에 지시
- 제어 주체: 사용자 (명시적 호출 필요)
- 예시: "휴가 계획 세우기", "회의 요약하기"
- 프로토콜 메서드:
prompts/list,prompts/get
클라이언트 프리미티브
| 기능 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에게 완성 요청 (서버가 모델 SDK 없이도 LLM 활용 가능) |
| Roots | 서버가 URI/파일시스템 경계를 탐색할 수 있도록 안내 |
| Elicitation | 서버가 사용자에게 추가 정보 요청 |
통신 계층
데이터 계층 (Data Layer)
- JSON-RPC 2.0 기반 메시지 교환
- 생명주기 관리: 초기화 → 기능 협상 → 연결 종료
- 알림(Notifications): 실시간 업데이트 (예: 도구 목록 변경 시
notifications/tools/list_changed)
전송 계층 (Transport Layer)
| 전송 방식 | 설명 |
|---|---|
| STDIO | 표준 입출력 스트림 사용, 로컬 프로세스 간 직접 통신 (고성능) |
| Streamable HTTP | HTTP POST + Server-Sent Events, 원격 서버 통신 지원, OAuth 인증 가능 |
보안 원칙
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 사용자 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터 보호
- 도구 안전성: 도구 호출 전 사용자 승인 필요
- LLM 샘플링 제어: 사용자가 샘플링 발생 여부와 프롬프트 내용 통제
SDK 지원 언어
MCP는 다양한 언어로 SDK를 제공합니다:
| 언어 | 저장소 |
|---|---|
| Python | python-sdk |
| TypeScript | typescript-sdk |
| Java | java-sdk |
| Go | go-sdk |
| C# | csharp-sdk |
| Rust | rust-sdk |
| Swift | swift-sdk |
| Kotlin | kotlin-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() -> 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 - 시간/시간대 변환
요약
MCP는 AI 애플리케이션과 외부 데이터/도구 간의 표준화된 연결 프로토콜입니다. LSP(Language Server Protocol)가 프로그래밍 언어 지원을 표준화한 것처럼, MCP는 AI 애플리케이션의 컨텍스트 통합을 표준화합니다. Tools(실행), Resources(데이터), Prompts(템플릿)라는 세 가지 핵심 프리미티브를 통해 LLM이 안전하고 표준화된 방식으로 외부 세계와 상호작용할 수 있게 해줍니다.
공식 문서: modelcontextprotocol.io