개요
MCP(Model Context Protocol)는 LLM(대규모 언어 모델) 애플리케이션과 외부 데이터 소스 및 도구 간의 원활한 통합을 가능하게 하는 개방형 프로토콜입니다. Anthropic이 주도하여 개발되었으며, 2024년 11월에 처음 공개되었습니다.
MCP는 마치 AI 애플리케이션을 위한 USB-C 포트와 같습니다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 표준화된 방식으로 연결합니다.
왜 MCP가 필요한가?
LLM은 종종 외부 데이터와 도구와의 통합이 필요합니다. MCP는 다음을 제공합니다:
- 사전 구축된 통합 — LLM이 바로 연결할 수 있는 다양한 MCP 서버들
- 공급업체 유연성 — LLM 제공자와 벤더 간 전환 가능
- 보안 모범 사례 — 데이터를 인프라 내에서 안전하게 보호
MCP는 Language Server Protocol (LSP) 에서 영감을 받았습니다. LSP가 프로그래밍 언어 지원을 표준화한 것처럼, MCP는 AI 애플리케이션 생태계에 컨텍스트와 도구를 통합하는 방식을 표준화합니다.
아키텍처
MCP는 클라이언트-서버 아키텍처를 따릅니다:
주요 구성 요소
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| MCP Host (호스트) | 연결을 시작하는 LLM 애플리케이션 | Claude Desktop, VS Code, IDE 등 |
| MCP Client (클라이언트) | 호스트 내에서 각 서버와 1:1 연결을 유지하는 프로토콜 클라이언트 | |
| MCP Server (서버) | 특정 기능을 노출하는 경량 프로그램 | 파일시스템 서버, DB 서버, GitHub 서버 등 |
┌─────────────────────────────────┐
│ MCP Host (AI App) │
│ ┌──────────┐ ┌──────────┐ │
│ │ Client 1 │ │ Client 2 │ │
│ └────┬─────┘ └────┬─────┘ │
└───────┼──────────────┼─────────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ Server A │ │ Server B │
│ (로컬) │ │ (원격) │
└───────────┘ └───────────┘
프로토콜 계층
MCP는 두 개의 계층으로 구성됩니다:
1. 데이터 계층 (Data Layer)
JSON-RPC 2.0 기반의 메시지 교환 프로토콜:
- 수명주기 관리: 연결 초기화, 기능 협상, 연결 종료
- 서버 기능: Tools, Resources, Prompts
- 클라이언트 기능: Sampling, Roots, Elicitation
- 유틸리티: 알림, 진행 추적, 로깅
2. 전송 계층 (Transport Layer)
두 가지 전송 메커니즘 지원:
- Stdio Transport: 표준 입출력 스트림을 통한 로컬 프로세스 간 통신
- Streamable HTTP Transport: HTTP POST + Server-Sent Events(SSE)를 통한 원격 통신 (OAuth 인증 지원)
핵심 프리미티브 (Primitives)
서버가 제공하는 기능
| 프리미티브 | 설명 | 예시 |
|---|---|---|
| Tools (도구) | AI 모델이 호출할 수 있는 실행 가능한 함수 | 파일 작업, API 호출, DB 쿼리, 검색 |
| Resources (리소스) | AI 애플리케이션에 컨텍스트를 제공하는 데이터 소스 | 파일 내용, DB 레코드, API 응답 |
| Prompts (프롬프트) | LLM과의 상호작용을 구조화하는 재사용 가능한 템플릿 | 시스템 프롬프트, Few-shot 예제 |
클라이언트가 제공하는 기능
| 프리미티브 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에게 완성(completion)을 요청 |
| Roots | 서버가 작업할 URI/파일시스템 경계를 질의 |
| Elicitation | 서버가 사용자에게 추가 정보를 요청 |
주요 프로토콜 메서드
Tools 관련
tools/list— 사용 가능한 도구 목록 조회tools/call— 특정 도구 실행
Resources 관련
resources/list— 직접 리소스 목록 조회resources/templates/list— 리소스 템플릿 조회resources/read— 리소스 내용 읽기resources/subscribe— 리소스 변경 구독
Prompts 관련
prompts/list— 사용 가능한 프롬프트 목록 조회prompts/get— 프롬프트 상세 정보 조회
생명주기 (Lifecycle)
- 초기화(Initialize): 클라이언트가
initialize요청을 보내 프로토콜 버전과 기능 협상 - 준비 완료(Initialized): 클라이언트가
notifications/initialized알림 전송 - 활성 세션: 기능 협상 완료 후 Tools, Resources, Prompts 사용 가능
- 종료: 연결 종료
SDK 지원 언어
MCP는 다양한 언어의 공식 SDK를 제공합니다:
- Python (
mcp패키지, PyPI) - TypeScript/JavaScript
- C#
- Go
- Java
- Kotlin
- PHP
- Ruby
- Rust
- Swift
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())
보안 원칙
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 사용자의 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터 보호
- 도구 안전성: 도구는 임의 코드 실행으로 간주되어 주의 필요
- LLM 샘플링 통제: 사용자가 샘플링 요청을 승인해야 함
참고 자료
- 공식 문서: modelcontextprotocol.io
- GitHub 저장소: github.com/modelcontextprotocol
- Python SDK: github.com/modelcontextprotocol/python-sdk
- MCP 서버 모음: github.com/modelcontextprotocol/servers
- Hugging Face MCP 코스: huggingface.co/learn/mcp-course
요약: MCP는 AI 애플리케이션이 외부 도구와 데이터에 표준화된 방식으로 접근할 수 있게 해주는 개방형 프로토콜입니다. JSON-RPC 2.0 기반으로 동작하며, Tools(실행), Resources(데이터), Prompts(템플릿)라는 세 가지 핵심 프리미티브를 통해 LLM의 컨텍스트 이해와 작업 수행 능력을 확장합니다.