개요
MCP(Model Context Protocol)는 Anthropic이 주도하여 개발한 오픈 프로토콜로, LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있게 해줍니다. 흔히 "AI 애플리케이션을 위한 USB-C 포트" 라고 비유됩니다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 인터페이스를 제공합니다.
왜 MCP가 필요한가? (배경)
LLM은 본질적으로 정적인 지식을 가지고 있으며(학습 시점에 고정됨), 외부 시스템에 접근하거나 실시간 데이터를 가져오는 기능이 없습니다. 전통적으로는 각 애플리케이션이 각 도구의 API를 직접 통합하는 M×N 문제가 있었습니다:
- M개의 AI 애플리케이션 × N개의 데이터 소스/도구 = M×N개의 개별 커스텀 통합 필요
- 이는 중복 개발, 유지보수 부담, 벤더 종속으로 이어짐
MCP는 이 문제를 M+N으로 단순화합니다. 즉, M개의 클라이언트와 N개의 서버만 만들면 모든 조합이 가능해집니다.
핵심 아키텍처
MCP는 클라이언트-서버 아키텍처를 따릅니다:
┌─────────────────────────────────┐
│ MCP Host (AI 애플리케이션) │
│ ┌─────────┐ ┌─────────┐ │
│ │Client 1 │ │Client 2 │ ... │
│ └────┬────┘ └────┬────┘ │
└───────┼───────────┼────────────┘
│ │
┌────▼──┐ ┌─────▼───┐
│Server A│ │Server B │ ...
│(로컬) │ │(원격) │
└────────┘ └─────────┘
주요 구성 요소
| 구성 요소 | 설명 |
|---|---|
| MCP Host | Claude Desktop, VS Code, IDE 등 AI 애플리케이션. 여러 MCP 클라이언트를 생성하고 관리 |
| MCP Client | 호스트 내에서 각 서버와 1:1 연결을 유지하는 컴포넌트 |
| MCP Server | 특정 기능(도구, 리소스, 프롬프트)을 노출하는 경량 프로그램. 로컬 또는 원격으로 실행 가능 |
전송 계층 (Transport Layer)
MCP는 두 가지 전송 메커니즘을 지원합니다:
- Stdio Transport: 표준 입출력 스트림을 통한 로컬 프로세스 간 통신 (성능 최적)
- Streamable HTTP Transport: HTTP POST + Server-Sent Events를 통한 원격 통신 (OAuth 인증 지원)
3가지 핵심 프리미티브 (Primitives)
MCP 서버는 다음 세 가지 기능을 노출할 수 있습니다:
1. 🛠️ Tools (도구)
- 기능: LLM이 실행할 수 있는 함수 (실행 가능한 액션)
- 비유: POST/PUT 엔드포인트
- 예시: 파일 검색, DB 쿼리, API 호출, 이메일 전송
- 제어권: 모델이 언제 사용할지 결정
- 프로토콜 메서드:
tools/list,tools/call
2. 📄 Resources (리소스)
- 기능: 읽기 전용 데이터 소스 (컨텍스트 제공)
- 비유: GET 엔드포인트
- 예시: 파일 내용, DB 스키마, API 문서, 날씨 정보
- 제어권: 애플리케이션이 검색 및 제공
- 프로토콜 메서드:
resources/list,resources/read,resources/subscribe
3. 💬 Prompts (프롬프트)
- 기능: 재사용 가능한 템플릿 (상호작용 가이드)
- 비유: 워크플로우 레시피
- 예시: "휴가 계획 세우기", "회의 요약하기"
- 제어권: 사용자가 명시적으로 호출
- 프로토콜 메서드:
prompts/list,prompts/get
클라이언트 기능 (선택 사항)
서버가 클라이언트에 요청할 수 있는 기능:
| 기능 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM을 통해 추론 요청 (에이전트 워크플로우) |
| Roots | 서버가 URI/파일시스템 경계 탐색 |
| Elicitation | 서버가 사용자에게 추가 정보 요청 |
통신 프로토콜
MCP는 JSON-RPC 2.0을 기반으로 합니다:
| 메시지 타입 | 설명 |
|---|---|
| Request | 고유 ID를 가진 요청 (작업 시작) |
| Response | 요청에 대한 응답 (결과 또는 에러) |
| Notification | ID 없는 단방향 메시지 (응답 불필요) |
생명주기 (Lifecycle)
- 초기화(Initialize): 클라이언트-서버 간 capability 협상
- 프로토콜 버전 확인
- 지원 기능 선언 (tools, resources, prompts 등)
- ID 교환
- 운영(Operation): 기능 사용 (도구 호출, 리소스 읽기 등)
- 종료(Termination): 연결 종료
보안 원칙
MCP는 프로토콜 수준에서 다음 원칙을 강조합니다:
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터는 동의 없이 서버에 전송 금지
- 도구 안전성: 도구 호출은 임의 코드 실행으로 간주, 주의 필요
- LLM 샘플링 통제: 사용자가 샘플링 요청을 승인해야 함
실제 사용 예시
Python SDK로 서버 만들기 (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}!"
클라이언트에서 사용하기
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}
공식 SDK 및 리소스
| 리소스 | 링크 |
|---|---|
| 공식 문서 | modelcontextprotocol.io |
| Python SDK | github.com/modelcontextprotocol/python-sdk |
| TypeScript SDK | github.com/modelcontextprotocol/typescript-sdk |
| 명세서 | spec.modelcontextprotocol.io |
| MCP Inspector | 디버깅 도구 |
| Hugging Face MCP Course | huggingface.co/learn/mcp-course |
요약
MCP는 AI 애플리케이션과 외부 도구/데이터 간의 표준화된 연결 프로토콜입니다. LSP(Language Server Protocol)가 개발 도구 생태계에 표준화를 가져온 것처럼, MCP는 AI 도구 생태계에 동일한 역할을 합니다. 이를 통해 개발자는 각 도구의 개별 API를 학습할 필요 없이, 표준화된 방식으로 AI 애플리케이션에 기능을 추가할 수 있습니다.