개요
MCP(Model Context Protocol)는 Anthropic이 주도하여 개발한 오픈 프로토콜로, LLM 애플리케이션(호스트)이 외부 데이터 소스와 도구에 안전하고 표준화된 방식으로 연결될 수 있도록 설계되었습니다. JSON-RPC 2.0을 기반으로 하며, 클라이언트-서버 아키텍처를 따릅니다.
1. MCP Server
MCP Server는 AI 애플리케이션(호스트)에 컨텍스트(맥락)를 제공하는 프로그램입니다. 서버는 특정 기능에 집중하며, 독립적으로 실행됩니다.
서버가 제공하는 핵심 기능 (3대 프리미티브)
| 프리미티브 | 설명 | 예시 |
|---|---|---|
| Tools (도구) | LLM이 능동적으로 호출할 수 있는 실행 가능한 함수. 쓰기 작업 가능. | 파일 검색, DB 쿼리, API 호출, 이메일 전송 |
| Resources (리소스) | 읽기 전용 데이터 소스. AI 애플리케이션이 컨텍스트로 활용. | 문서 내용, DB 스키마, API 문서 |
| Prompts (프롬프트) | 재사용 가능한 템플릿. 특정 도구/리소스 사용법을 안내. | "휴가 계획 세우기", "회의 요약하기" |
서버의 주요 프로토콜 메서드
| 메서드 | 목적 |
|---|---|
tools/list |
사용 가능한 도구 목록 조회 |
tools/call |
특정 도구 실행 |
resources/list |
리소스 목록 조회 |
resources/read |
리소스 내용 읽기 |
prompts/list |
프롬프트 목록 조회 |
prompts/get |
특정 프롬프트 내용 조회 |
서버 구현 예시 (Python - FastMCP)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather")
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
"""Get weather forecast for a location."""
# ... API 호출 및 결과 반환
@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
return f"Hello, {name}!"
서버 실행 방식
- STDIO Transport: 로컬 프로세스 간 통신 (표준 입출력 사용)
- Streamable HTTP Transport: 원격 서버 통신 (HTTP POST + SSE)
2. MCP Client
MCP Client는 호스트 애플리케이션 내에서 각 MCP Server와 1:1 연결을 유지하는 컴포넌트입니다. 호스트(예: Claude Desktop, VS Code)는 여러 개의 클라이언트를 생성하여 각각 다른 서버와 통신합니다.
클라이언트가 서버에 제공하는 기능
| 기능 | 설명 | 예시 |
|---|---|---|
| Elicitation (정보 요청) | 서버가 사용자에게 추가 정보를 요청 | "좌석 선호도를 알려주세요" |
| Roots (루트) | 서버가 접근할 파일 시스템 범위 지정 | 작업 디렉토리 경로 전달 |
| Sampling (샘플링) | 서버가 클라이언트의 LLM을 통해 AI 응답 생성 요청 | "이 항공편 중 최적을 골라줘" |
클라이언트 구현 예시 (Python)
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())
3. 전체 아키텍처
┌─────────────────────────────────────┐
│ MCP Host (AI App) │
│ ┌─────────┐ ┌─────────┐ │
│ │Client 1 │ │Client 2 │ ... │
│ └────┬────┘ └────┬────┘ │
└───────┼────────────┼───────────────┘
│ │
┌────▼────┐ ┌────▼────┐
│Server A │ │Server B │ (로컬/원격)
└─────────┘ └─────────┘
연결 수명주기
- 초기화(Initialization): 클라이언트가
initialize요청 → 서버가 프로토콜 버전과 capabilities 응답 - 메시지 교환: 요청-응답(Request-Response) 또는 단방향 알림(Notification)
- 종료(Termination): 연결 종료
4. 주요 SDK 및 언어 지원
| 언어 | SDK 저장소 |
|---|---|
| Python | python-sdk |
| TypeScript | typescript-sdk |
| Java | java-sdk |
| Kotlin | kotlin-sdk |
| Go | go-sdk |
| Rust | rust-sdk |
| C# | csharp-sdk |
| Ruby | ruby-sdk |
5. 참고 서버 (Reference Implementations)
공식 저장소(modelcontextprotocol/servers)에서 제공하는 참조 서버:
- Filesystem — 안전한 파일 작업
- Git — Git 저장소 읽기/검색/조작
- Memory — 지식 그래프 기반 메모리 시스템
- Fetch — 웹 콘텐츠 가져오기
- Time — 시간 및 시간대 변환
- Sequential Thinking — 단계적 사고 프로세스
6. 핵심 설계 원칙
- 서버는 매우 쉽게 구축 가능해야 함 — 복잡한 오케스트레이션은 호스트가 담당
- 서버는 높은 조합성(composability) — 여러 서버를 원활하게 결합 가능
- 서버는 전체 대화를 읽을 수 없음 — 보안 격리 유지
- 점진적 기능 추가 가능 — 핵심 프로토콜은 최소 기능, 추가 기능은 협상
요약
- MCP Server = AI 애플리케이션에 도구(Tools), 데이터(Resources), 템플릿(Prompts)을 제공하는 프로그램
- MCP Client = 호스트 내에서 각 서버와 1:1 연결을 관리하는 프로토콜 컴포넌트
- MCP Host = 사용자가 직접 상호작용하는 AI 애플리케이션 (Claude Desktop, IDE 등)
- MCP는 JSON-RPC 2.0 기반의 상태 저장(stateful) 프로토콜로, capability negotiation을 통해 기능을 협상합니다.