MCP
개요
MCP(Model Context Protocol)는 LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있게 해주는 개방형 프로토콜입니다. Anthropic에서 만들었으며, AI 애플리케이션을 위한 USB-C 포트와 같은 역할을 한다고 비유됩니다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 방법을 제공합니다.
왜 MCP가 필요한가?
M×N 문제 해결
AI 애플리케이션(M)이 다양한 외부 데이터 소스와 도구(N)에 접근해야 하는 상황에서, 표준 프로토콜이 없으면 개발자는 모든 애플리케이션-소스 쌍마다 개별적인 커스텀 통합을 구축해야 합니다(M×N 문제). MCP는 이를 M+N으로 단순화합니다:
- MCP 이전: 각 AI 앱이 각 도구의 API를 개별적으로 학습하고 통합해야 함
- MCP 이후: 한 번의 MCP 서버 구현으로 모든 MCP 호환 클라이언트가 사용 가능
LSP에서 영감을 받음
MCP는 개발 도구 생태계를 표준화한 Language Server Protocol (LSP)에서 영감을 받았습니다. LSP가 하나의 언어 서버로 모든 편집기에서 코드 지원을 가능하게 한 것처럼, MCP는 하나의 MCP 서버로 모든 AI 앱에서 도구/데이터 접근을 가능하게 합니다.
핵심 아키텍처
MCP는 클라이언트-서버 아키텍처를 따릅니다:
┌─────────────────────────────────────┐
│ MCP Host (AI 애플리케이션) │
│ ┌──────────┐ ┌──────────┐ │
│ │ MCP Client 1│ │ MCP Client 2│ ... │
│ └─────┬────┘ └─────┬────┘ │
└────────┼──────────────┼──────────────┘
│ │
┌────▼───┐ ┌────▼───┐
│MCP Server A│ │MCP Server B│
│ (로컬 파일) │ │ (원격 API) │
└─────────┘ └─────────┘
세 가지 주요 참여자
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| MCP Host | 연결을 시작하는 LLM 애플리케이션 | Claude Desktop, VS Code, Cursor |
| MCP Client | 호스트 내에서 서버와 1:1 연결을 유지하는 컴포넌트 | 호스트가 각 서버마다 생성 |
| MCP Server | 특정 기능(도구, 리소스, 프롬프트)을 노출하는 프로그램 | 파일시스템 서버, DB 서버, GitHub 서버 |
핵심 개념 (3가지 프리미티브)
MCP 서버는 세 가지 핵심 기능을 노출할 수 있습니다:
1. 🛠️ Tools (도구)
- LLM이 능동적으로 호출할 수 있는 실행 가능한 함수
- 파일 작업, API 호출, DB 쿼리 등 액션 수행
- 프로토콜 메서드:
tools/list,tools/call - 예:
searchFlights(),sendEmail(),createCalendarEvent()
2. 📄 Resources (리소스)
- AI 애플리케이션에 컨텍스트 정보를 제공하는 데이터 소스
- 읽기 전용 데이터 접근 (파일 내용, DB 스키마, API 문서 등)
- 고유 URI로 식별 (예:
file:///path/to/doc.md) - 프로토콜 메서드:
resources/list,resources/read - 리소스 템플릿 지원: 동적 URI (예:
weather://forecast/{city}/{date})
3. 💬 Prompts (프롬프트)
- 재사용 가능한 템플릿으로 상호작용 구조화
- 사용자가 명시적으로 호출
- 프로토콜 메서드:
prompts/list,prompts/get - 예: "휴가 계획하기" 프롬프트 (목적지, 기간, 예산 입력)
클라이언트 기능 (서버 → 클라이언트)
서버가 클라이언트에 요청할 수 있는 기능:
| 기능 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에게 추론(완성) 요청 |
| Elicitation | 서버가 사용자에게 추가 정보 요청 |
| Logging | 서버가 클라이언트에 로그 메시지 전송 |
통신 방식
전송 계층 (Transport Layer)
| 방식 | 설명 | 사용처 |
|---|---|---|
| STDIO | 표준 입출력 스트림 사용 | 로컬 MCP 서버 (동일 머신) |
| Streamable HTTP | HTTP POST + Server-Sent Events | 원격 MCP 서버 |
메시지 형식
모든 통신은 JSON-RPC 2.0 기반:
// 요청 (Request)
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": { "city": "Seoul" }
}
}
// 응답 (Response)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "Weather in Seoul: Sunny, 22°C" }
]
}
}
생명주기 (Lifecycle)
- 초기화(Initialize): 클라이언트-서버 간 프로토콜 버전 및 기능 협상
- 준비 완료(Initialized): 클라이언트가
notifications/initialized전송 - 운영: 도구 호출, 리소스 읽기, 알림 등 정상 통신
- 종료: 세션 종료
실제 코드 예시
Python SDK로 MCP 서버 만들기 (v2)
from mcp.server import MCPServer
mcp = MCPServer("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""두 숫자를 더합니다."""
return a + b
@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
"""이름으로 인사합니다."""
return f"Hello, {name}!"
Python SDK로 MCP 클라이언트 만들기
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())
보안 원칙
MCP는 강력한 기능(임의 데이터 접근, 코드 실행)을 가능하게 하므로 다음 원칙이 중요합니다:
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터 보호
- 도구 안전성: 도구 호출 전 사용자 승인 필요
- LLM 샘플링 제어: 샘플링 요청 시 사용자 승인 필수
생태계 및 현황
공식 SDK
- Python SDK:
mcp패키지 (PyPI) - TypeScript SDK:
@modelcontextprotocol/sdk(npm)
MCP를 지원하는 주요 클라이언트 (호스트)
- Claude Desktop (Anthropic)
- VS Code (GitHub Copilot)
- Cursor, Windsurf 등 AI IDE
- Continue (VS Code/JetBrains 플러그인)
주요 MCP 서버 예시
- 파일시스템: 로컬 파일 읽기/쓰기
- GitHub: 저장소 관리, 이슈/PR 생성
- Slack: 메시지 전송, 채널 관리
- Elasticsearch: 검색 및 데이터 분석
- Sentry: 에러 모니터링
- PostgreSQL/MySQL: 데이터베이스 쿼리
요약
MCP는 AI 애플리케이션과 외부 도구/데이터 간의 표준화된 통신 프로토콜입니다. USB-C가 다양한 기기를 연결하는 표준이 된 것처럼, MCP는 AI 생태계에서 "AI를 위한 표준 연결 방식"을 목표로 합니다. JSON-RPC 2.0 기반으로 도구(Tools), 리소스(Resources), 프롬프트(Prompts)라는 세 가지 핵심 프리미티브를 통해 LLM이 외부 세계와 상호작용할 수 있게 해줍니다.
더 알아보기: modelcontextprotocol.io | Python SDK | GitHub 저장소