📌 개요
MCP(Model Context Protocol)는 Anthropic이 주도하여 개발한 오픈 프로토콜로, LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스 및 도구와 원활하게 통합될 수 있도록 표준화된 방법을 제공합니다. 마치 USB-C 포트가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 인터페이스 역할을 합니다.
공식 사이트: modelcontextprotocol.io GitHub: github.com/modelcontextprotocol
🏗️ 아키텍처
MCP는 클라이언트-호스트-서버 아키텍처를 따릅니다.
주요 구성 요소
| 구성 요소 | 설명 |
|---|---|
| MCP Host | AI 애플리케이션 (Claude Desktop, IDE 등). 여러 MCP 클라이언트를 생성하고 관리 |
| MCP Client | 각 MCP 서버와 1:1 연결을 유지하는 프로토콜 클라이언트 |
| 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)
설계 원칙
- 서버는 매우 쉽게 구축 가능해야 함 — 호스트가 복잡한 조정을 담당
- 서버는 높은 조합성(composability)을 가져야 함 — 여러 서버를 원활하게 결합 가능
- 서버는 전체 대화를 읽을 수 없음 — 보안 경계 유지
- 점진적 기능 추가 가능 — 핵심 프로토콜은 최소 기능만 제공
📡 전송 계층 (Transport Layer)
MCP는 두 가지 전송 메커니즘을 지원합니다:
| 전송 방식 | 설명 |
|---|---|
| Stdio | 표준 입출력 스트림 사용. 로컬 프로세스 간 직접 통신. 네트워크 오버헤드 없음 |
| Streamable HTTP | HTTP POST + Server-Sent Events(SSE). 원격 서버 통신 지원. OAuth 인증 권장 |
🧩 데이터 계층 (Data Layer) — 핵심 프리미티브
MCP는 JSON-RPC 2.0을 기반으로 하며, 다음과 같은 핵심 프리미티브를 정의합니다.
서버 측 프리미티브
| 프리미티브 | 설명 | 주요 메서드 |
|---|---|---|
| Tools (도구) | AI 모델이 호출하여 실행할 수 있는 함수 (파일 작업, API 호출, DB 쿼리 등) | tools/list, tools/call |
| Resources (리소스) | AI 애플리케이션에 컨텍스트를 제공하는 데이터 소스 (파일 내용, DB 레코드 등) | resources/list, resources/read, resources/subscribe |
| Prompts (프롬프트) | 언어 모델과의 상호작용을 구조화하는 재사용 가능한 템플릿 | prompts/list, prompts/get |
클라이언트 측 프리미티브
| 프리미티브 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에게 완성(completion)을 요청 |
| Roots | 서버가 작업할 URI/파일시스템 경계를 질의 |
| Elicitation | 서버가 사용자에게 추가 정보를 요청 |
🔄 라이프사이클
- 초기화(Initialize): 클라이언트가 서버에
initialize요청을 보내 프로토콜 버전과 지원 기능(capabilities)을 협상 - 준비 완료(Initialized): 클라이언트가
notifications/initialized알림 전송 - 활성 세션: 기능 협상 완료 후 실제 데이터 교환
- 종료: 세션 종료
🛠️ 공식 SDK
MCP는 다양한 언어로 SDK를 제공합니다:
| 언어 | GitHub |
|---|---|
| Python | python-sdk |
| TypeScript | typescript-sdk |
| Java | java-sdk |
| Go | go-sdk |
| C# | csharp-sdk |
| Kotlin | kotlin-sdk |
| Ruby | ruby-sdk |
| Rust | rust-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)
공식 GitHub 저장소(modelcontextprotocol/servers)에서 제공하는 참조 구현:
| 서버 | 설명 |
|---|---|
| Everything | 테스트용 서버 (프롬프트, 리소스, 도구 모두 포함) |
| Fetch | 웹 콘텐츠 가져오기 및 변환 |
| Filesystem | 설정 가능한 접근 제어로 안전한 파일 작업 |
| Git | Git 저장소 읽기, 검색, 조작 |
| Memory | 지식 그래프 기반 영구 메모리 시스템 |
| Sequential Thinking | 동적이고 반성적인 문제 해결 |
| Time | 시간 및 시간대 변환 |
🔒 보안 원칙
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터 보호
- 도구 안전성: 도구는 임의 코드 실행을 의미하므로 주의 필요
- LLM 샘플링 제어: 사용자가 샘플링 발생 여부와 프롬프트 내용을 통제
🎓 학습 자료
- 공식 문서: modelcontextprotocol.io/docs
- Hugging Face MCP 코스: huggingface.co/learn/mcp-course (Anthropic과 협력, 무료)
- MCP Inspector: 대화형 디버깅 도구
💡 요약
MCP는 AI 애플리케이션과 외부 도구/데이터 간의 표준화된 통신 프로토콜입니다. LSP(Language Server Protocol)가 개발 도구 생태계에 표준화를 가져온 것처럼, MCP는 AI 애플리케이션 생태계에 표준화된 컨텍스트 통합 방식을 제공합니다. Anthropic이 주도하지만 완전한 오픈 소스로 운영되며, 커뮤니티 기여를 환영합니다.