MCP (Model Context Protocol)
개요
MCP(Model Context Protocol)는 AI 애플리케이션(특히 대규모 언어 모델, LLM)이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있도록 하는 개방형 프로토콜이다. 2024년 말 Anthropic이 발표했으며, "AI를 위한 USB-C 포트"라는 비유로 자주 설명된다. 즉, 다양한 AI 모델과 외부 시스템 간의 연결을 하나의 표준으로 통일하는 것이 핵심 목표다.
MCP는 JSON-RPC 2.0을 기반으로 하며, 클라이언트-서버 아키텍처를 따른다. AI 애플리케이션(호스트)이 MCP 클라이언트를 통해 MCP 서버에 연결하면, 서버가 제공하는 도구(Tools), 리소스(Resources), 프롬프트(Prompts) 등을 활용할 수 있다.
배경과 필요성
LLM은 본질적으로 훈련 데이터에 기반한 정적 지식을 가지며, 실시간 데이터 접근이나 외부 시스템과의 상호작용이 불가능하다. 기존에는 각 AI 애플리케이션이 외부 도구와 연결하기 위해 개별적인 커스텀 통합(Custom Integration) 을 개발해야 했다. 이는 M×N 문제(M개의 AI 앱 × N개의 도구 = M×N개의 통합 필요)를 야기했다.
MCP는 이 문제를 M+N(M개의 클라이언트 + N개의 서버) 구조로 단순화한다. 즉, 한 번 MCP 서버를 만들면 모든 MCP 호환 클라이언트에서 재사용할 수 있다.
MCP는 Language Server Protocol(LSP) 에서 영감을 받았다. LSP가 프로그래밍 언어 지원을 표준화한 것처럼, MCP는 AI 컨텍스트 통합을 표준화한다.
아키텍처
MCP는 세 가지 주요 참여자로 구성된다.
1. 호스트 (Host)
- LLM 애플리케이션 자체 (예: Claude Desktop, Visual Studio Code, Cursor, Windsurf 등)
- 여러 MCP 클라이언트를 생성하고 관리
- 사용자 인증, 보안 정책, 컨텍스트 집계 등을 담당
2. 클라이언트 (Client)
- 호스트 내부에서 각 MCP 서버와 1:1 연결을 유지하는 프로토콜 계층
- 서버와의 핸드셰이크, 기능 협상(Capability Negotiation), 메시지 라우팅 수행
- 하나의 호스트가 여러 클라이언트를 가질 수 있음
3. 서버 (Server)
- 특정 기능(파일시스템, 데이터베이스, GitHub API 등)을 노출하는 경량 프로그램
- 도구(Tools), 리소스(Resources), 프롬프트(Prompts) 를 제공
- 로컬 프로세스(stdio) 또는 원격 서비스(HTTP)로 실행 가능
+----------------------------------------------------------+
| Host (호스트) |
| Claude Desktop, IDE, 커스텀 에이전트 앱 등 |
| |
| +------------------+ +------------------+ |
| | MCP Client #1 | | MCP Client #2 | |
| +--------+---------+ +--------+---------+ |
+-----------|--------------------------|-------------------+
| 1:1 연결 | 1:1 연결
v v
+------------------+ +------------------+
| MCP Server A | | MCP Server B |
| (파일시스템) | | (GitHub API) |
+------------------+ +------------------+
핵심 개념
데이터 계층 (Data Layer)
JSON-RPC 2.0 기반의 메시지 교환 프로토콜. 다음을 포함한다.
- 생명주기 관리(Lifecycle Management): 연결 초기화, 기능 협상, 종료
- 서버 기능: 도구, 리소스, 프롬프트 노출
- 클라이언트 기능: 샘플링(Sampling), 근원(Roots), 유발(Elicitation)
- 유틸리티: 알림(Notifications), 진행 추적(Progress), 취소(Cancellation), 로깅(Logging)
전송 계층 (Transport Layer)
두 가지 표준 전송 방식이 있다.
| 전송 방식 | 통신 채널 | 적합한 용도 | 인증 |
|---|---|---|---|
| STDIO | 표준 입출력(stdin/stdout) | 로컬 프로세스 간 통신 | 환경변수 |
| Streamable HTTP | HTTP POST + 선택적 SSE | 원격 서버, 다중 클라이언트 | OAuth 2.1 |
세 가지 핵심 프리미티브 (Primitives)
1. 도구 (Tools)
- LLM이 능동적으로 호출할 수 있는 실행 가능한 함수
- 파일 쓰기, API 호출, 데이터베이스 쿼리, 이메일 전송 등 동작(Action) 수행
- JSON Schema로 입력 정의, 실행 결과 반환
- 프로토콜 메서드:
tools/list,tools/call
2. 리소스 (Resources)
- 읽기 전용 데이터 소스로, AI 애플리케이션이 컨텍스트로 활용
- 파일 내용, 데이터베이스 스키마, API 응답 등
- 고유 URI로 식별 (예:
file:///path/to/doc.md) - 프로토콜 메서드:
resources/list,resources/read,resources/subscribe
3. 프롬프트 (Prompts)
- 재사용 가능한 템플릿으로 사용자나 모델의 상호작��을 구조화
- 특정 작업(예: "휴가 계획", "코드 리뷰")을 위한 미리 작성된 워크플로우
- 프로토콜 메서드:
prompts/list,prompts/get
보안 원칙
MCP는 프로토콜 수준에서 보안을 강제할 수 없으므로, 구현체가 다음 원칙을 따라야 한다.
- 사용자 동의와 통제: 모든 데이터 접근과 도구 실행에 명시적 동의 필요
- 데이터 프라이버시: 호스트는 사용자 데이터를 서버에 무단 전송 금지
- 도구 안전성: 도구 호출은 임의 코드 실행으로 간주, 사용자 승인 필수
- LLM 샘플링 통제: 서버의 샘플링 요청은 사용자 승인 필요
SDK 및 구현 언어
MCP는 다양한 언어로 SDK를 제공한다.
| 언어 | SDK 저장소 | 상태 |
|---|---|---|
| Python | python-sdk | v1.x 안정, v2.0.0b1 프리릴리스 |
| TypeScript | typescript-sdk | 안정 |
| Java | java-sdk | Spring AI 기반 |
| Kotlin | kotlin-sdk | 안정 |
| Go | go-sdk | 안정 |
| Rust | rust-sdk | 안정 |
| C# (.NET) | csharp-sdk | 안정 |
| Ruby | ruby-sdk | 안정 |
| Swift | swift-sdk | 안정 |
| PHP | php-sdk | 안정 |
주요 사용 사례
파일시스템 접근
AI가 로컬 파일을 읽고, 쓰고, 검색할 수 있게 한다. @modelcontextprotocol/server-filesystem 패키지 사용.
GitHub 통합
리포지토리 관리, 이슈 생성/조회, PR 관리, 파일 푸시 등. @modelcontextprotocol/server-github 사용.
데이터베이스 쿼리
SQLite, PostgreSQL 등 데이터베이스의 스키마 조회 및 쿼리 실행. 읽기 전용 또는 쓰기 가능.
웹 검색 및 콘텐츠 페치
웹 페이지 콘텐츠를 가져와 LLM 컨텍스트로 제공.
사내 시스템 연동
위키, Jira, Confluence, Slack 등 사내 도구를 MCP 서버로 래핑하여 AI 에이전트가 활용.
생태계와 현황
- 공식 레퍼런스 서버: modelcontextprotocol/servers 저장소 (약 88,000 스타)에 파일시스템, Git, 메모리, 순차적 사고 등 참조 구현 제공
- MCP 레지스트리: registry.modelcontextprotocol.io에서 공개 서버 검색 및 설치 가능
- 지원 클라이언트: Claude Desktop, Claude Code, Visual Studio, VS Code, Cursor, Windsurf, Zed, GitHub Copilot 등
- Hugging Face MCP 코스: Hugging Face와 Anthropic 협력으로 무료 MCP 교육 과정 제공
- Linux Foundation 참여: MCP는 오픈 표준으로 Linux Foundation과 협력 중
간단한 서버 예제 (Python)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather")
@mcp.tool()
async def get_forecast(city: str) -> str:
"""Get weather forecast for a city."""
return f"Weather in {city}: Sunny, 72°F"
if __name__ == "__main__":
mcp.run(transport="stdio")
참고 자료
- 공식 사이트: modelcontextprotocol.io
- 공식 명세: specification
- Python SDK 문서: py.sdk.modelcontextprotocol.io
- GitHub 조직: github.com/modelcontextprotocol
- MCP Inspector (디버깅 도구): github.com/modelcontextprotocol/inspector