개요
MCP(Model Context Protocol)는 Anthropic이 2024년 11월에 발표한 개방형 프로토콜(open protocol)로, AI 애플리케이션(특히 LLM)이 외부 데이터 소스 및 도구와 표준화된 방식으로 연결될 수 있게 해주는 규격입니다. 흔히 "AI를 위한 USB-C 포트"에 비유됩니다.
2025년 12월, Anthropic은 MCP를 Linux Foundation 산하의 Agentic AI Foundation(AAIF)에 기부했습니다.
배경 및 필요성
LLM은 강력하지만, 외부 데이터(파일, DB, API 등)에 접근하거나 실제 행동(코드 실행, 메일 발송 등)을 수행하는 데 한계가 있습니다. MCP 이전에는 각 데이터 소스마다 맞춤형 커넥터를 개발해야 하는 N×M 데이터 통합 문제가 존재했습니다. MCP는 이 문제를 해결하기 위해 Language Server Protocol(LSP)의 메시지 흐름 아이디어를 차용하여 만들어졌습니다.
아키텍처
MCP는 클라이언트-서버 아키텍처를 따릅니다.
┌─────────────────────────────────┐
│ MCP Host (AI App) │
│ ┌──────────┐ ┌──────────┐ │
│ │Client 1 │ │Client 2 │ ... │
│ └────┬─────┘ └────┬─────┘ │
└───────┼──────────────┼───────────┘
│ │
┌────▼────┐ ┌────▼────┐
│Server A │ │Server B │ ...
│(로컬) │ │(원격) │
└─────────┘ └─────────┘
주요 구성 요소
| 구성 요소 | 설명 |
|---|---|
| MCP Host | AI 애플리케이션 (예: Claude Desktop, VS Code, IDE 등). 여러 MCP 클라이언트를 생성하고 관리 |
| MCP Client | 호스트 내에서 각 MCP 서버와 1:1 연결을 유지하는 프로토콜 클라이언트 |
| MCP Server | 특정 기능(도구, 리소스, 프롬프트)을 노출하는 프로그램. 로컬 또는 원격으로 실행 가능 |
전송 계층 (Transport Layer)
MCP는 두 가지 전송 방식을 지원합니다:
- Stdio Transport: 표준 입출력을 통한 로컬 프로세스 간 통신 (성능 우수)
- Streamable HTTP Transport: HTTP POST + Server-Sent Events(SSE)를 통한 원격 통신 (OAuth 인증 지원)
핵심 프리미티브 (Primitives)
MCP 서버는 세 가지 핵심 기능을 제공합니다:
1. Tools (도구)
- 정의: AI 모델이 능동적으로 호출할 수 있는 실행 가능한 함수
- 예시: 파일 검색, DB 쿼리, API 호출, 이메일 전송, 비행기 검색
- 제어 주체: AI 모델 (모델이 필요에 따라 호출 결정)
- 프로토콜 메서드:
tools/list,tools/call
2. Resources (리소스)
- 정의: AI 애플리케이션이 컨텍스트로 활용할 수 있는 읽기 전용 데이터 소스
- 예시: 파일 내용, DB 스키마, API 문서, 날씨 정보
- 제어 주체: 애플리케이션 (앱이 리소스를 선택하여 모델에 제공)
- 프로토콜 메서드:
resources/list,resources/read,resources/subscribe - 특징: URI 기반 접근 (
file://,weather://forecast/{city}등), 템플릿 지원
3. Prompts (프롬프트)
- 정의: 재사용 가능한 템플릿. 특정 도메인 작업을 위한 구조화된 상호작용 패턴
- 예시: "휴가 계획 세우기", "회의 요약하기"
- 제어 주체: 사용자 (명시적 호출 필요)
- 프로토콜 메서드:
prompts/list,prompts/get
클라이언트 측 프리미티브
서버가 클라이언트에 요청할 수 있는 기능도 있습니다:
| 기능 | 설명 |
|---|---|
| Sampling | 서버가 클라이언트의 LLM에게 메시지 생성을 요청 |
| Roots | 서버가 작업할 URI/파일시스템 경계를 문의 |
| Elicitation | 서버가 사용자에게 추가 정보 입력 요청 |
프로토콜 상세
메시지 형식
MCP는 JSON-RPC 2.0을 기반으로 합니다.
- Request:
id,method,params포함 - Response:
id,result또는error포함 - Notification:
id없음 (응답 불필요)
생명주기 (Lifecycle)
- 초기화(Initialize): 클라이언트가 서버에
initialize요청을 보내 프로토콜 버전과 지원 기능(capabilities)을 협상 - 준비 완료(Initialized): 클라이언트가
notifications/initialized전송 - 활성 세션: 기능 협상 완료 후 실제 데이터 교환
- 종료: 연결 종료
기능 협상 (Capability Negotiation)
초기화 단계에서 클라이언트와 서버는 서로 지원하는 기능을 선언합니다:
- 서버: tools, resources, prompts, listChanged 등
- 클라이언트: sampling, elicitation 등
보안 및 신뢰 원칙
MCP는 강력한 기능(데이터 접근, 코드 실행)을 제공하므로 다음과 같은 보안 원칙을 강조합니다:
- 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
- 데이터 프라이버시: 사용자 데이터는 동의 없이 외부로 전송 금지
- 도구 안전성: 도구 호출 전 사용자 승인 필요
- LLM 샘플링 통제: LLM 샘플링 요청 시 사용자 승인 필수
SDK 지원 언어
| 언어 | 저장소 |
|---|---|
| Python | modelcontextprotocol/python-sdk |
| TypeScript | modelcontextprotocol/typescript-sdk |
| Java/Kotlin | modelcontextprotocol/java-sdk |
| C# | modelcontextprotocol/csharp-sdk |
| Go | modelcontextprotocol/go-sdk |
채택 현황
- OpenAI (2025년 3월): MCP 공식 채택, ChatGPT 데스크톱 앱에 통합
- Google DeepMind (2025년 4월): MCP 채택 발표
- Microsoft: Semantic Kernel, Azure OpenAI와 통합
- Cloudflare: MCP 서버 배포 지원
- Salesforce: Headless 360 플랫폼에서 MCP 활용
- IDE/코딩 도구: VS Code, Replit, Sourcegraph 등에서 채택
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())
요약
MCP는 AI 애플리케이션이 외부 세계와 소통하는 표준화된 인터페이스입니다. USB-C가 다양한 주변기기를 하나의 포트로 연결하듯, MCP는 다양한 데이터 소스와 도구를 하나의 프로토콜로 AI에 연결합니다. JSON-RPC 2.0 기반의 상태 저장 프로토콜로, 도구(Tools), 리소스(Resources), 프롬프트(Prompts)라는 세 가지 핵심 프리미티브를 통해 AI의 컨텍스트 접근과 행동 실행을 가능하게 합니다.