MCP(Model Context Protocol) 완벽 실전 가이드: 2026년 개발자가 반드시 익혀야 할 AI 도구 연결 표준
제로부터 MCP 서버를 구축하는 완벽 튜토리얼. Anthropic의 Model Context Protocol을 마스터하여 AI 에이전트가 데이터베이스, GitHub, Slack 등 수천 개의 도구와 원클릭 연결되도록 만들어보세요. 반복적인 통합 코드는 이제 그만.
- MIT
- 업데이트 2026-05-15
{</* resource-info */>}
서론: 2026년 가장 주목할 만한 기술 투자, MCP #
아직도 각 LLM마다 맞춤형 도구 호출 코드를 작성하고 있다면, 이미 시대에 뒤처진 것입니다.
2024년 11월, Anthropic이 **Model Context Protocol(MCP)**을 공개했습니다. 이 단순해 보이는 개방형 프로토콜은 AI와 외부 세계를 연결하는 방식을 놀라운 속도로 재편하고 있습니다. 불과 반 년 만에 OpenAI, Google DeepMind, Microsoft가 전면 지원을 선언했고, 커뮤니티에서는 10,000개 이상의 MCP 서버가 탄생했으며, Python과 JavaScript SDK의 주간 다운로드 수는 2,000만 회를 돌파했습니다.
더욱 중요한 것은 2025년 12월 Linux Foundation이 MCP를 인수하여 Agentic AI Foundation을 설립, 독립적으로 운영한다고 밝힌 점입니다. 이는 MCP가 더 이상 특정 기업의 자산이 아니라, 전 산업의 공공 인프라임을 의미합니다.
이 글은 개념 소개가 아닙니다. 첫 번째 코드 라인부터 직접 프로덕션급 MCP 서버를 구축하고, Claude, Cursor, VS Code Copilot 등 주요 클라이언트에 연결하는 과정을 안내합니다. 글을 다 읽고 나면, 실제로 동작하는 서버 모니터링 MCP 도구를 갖게 될 것입니다. AI 대화창에서 자연어로 웹사이트 상태를 조회하고, SSL 인증서 만료일을 확인할 수 있습니다.
목차 #
- MCP의 본질: AI 세상의 USB-C 포트
- 아키텍처 분석: 클라이언트와 서버의 협업
- 개발 환경 구축: 5분 완료
- 실전: 사이트 모니터링 MCP 서버 구축
- Claude Desktop 및 Cursor 연동
- 심화: 리소스, 프롬프트, 스트리밍 HTTP
- 보안 및 프로덕션 모범 사례
- 에코시스템 가이드: 지금 당장 써볼 15개 MCP 서버
- 자주 묻는 질문 FAQ
1. MCP의 본질: AI 세상의 USB-C 포트 #
MCP가 등장하기 전, 개발자들은 고전적인 M×N 딜레마에 직면했습니다.
- M개의 대형 언어 모델(GPT-4, Claude, Gemini, Llama…)
- N개의 외부 도구(GitHub API, 데이터베이스, Slack, 브라우저, 파일시스템…)
- 새로운 도구를 추가할 때마다 각 모델별로 어댑터 코드를 작성
MCP는 이 복잡도를 M+N으로 낮추었습니다.
- 도구 개발자는 MCP 표준으로 한 번만 노출(Server)
- 모델 업체는 MCP 클라이언트를 한 번만 구현(Client)
- 서로 자연스럽게 연동되며, 추가적인 접착제 코드가 불필요
MCP가 해결하는 세 가지 핵심 문제 #
| 고통 지점 | 기존 방안 | MCP 방안 |
|---|---|---|
| 도구 통합 파편화 | 플랫폼마다 어댑터 작성 | 한 번 작성, 어디서나 사용 |
| 컨텍스트 전달 혼란 | 플랫폼별 형식 불일치 | JSON-RPC 2.0 표준 프로토콜 |
| 동적 발견 어려움 | 하드코딩된 도구 목록 | 런타임 핸드셰이크 + 능력 협상 |
MCP를 지원하는 플랫폼 (2026년 5월 기준) #
- Claude Desktop / Claude Code: 네이티브 지원, 최초 출시
- ChatGPT (Plus/Pro): 2025년 9월 전면 도입
- Google Gemini: Demis Hassabis 공식 로드맵 발표
- Cursor / Windsurf / Zed: 주요 AI IDE 전원 지원
- GitHub Copilot Agent Mode: VS Code v1.99부터 내장 MCP
- Sourcegraph Cody: 엔터프라이즈 MCP 배포
2. 아키텍처 분석: 클라이언트와 서버의 협업 #
MCP는 JSON-RPC 2.0 기반의 클래식 클라이언트-서버 아키텍처를 채택합니다. 네 가지 핵심 개념만 이해하면 MCP의 80%를 파악한 것입니다.
핵심 구성 요소 #
┌─────────────┐ JSON-RPC 2.0 ┌─────────────┐
│ MCP Host │ ◄──────────────────► │ MCP Server │
│ (AI Agent) │ stdio / HTTP+SSE │ (Tool Box) │
└─────────────┘ └─────────────┘
Host: AI 모델을 실행하는 주 프로그램(예: Claude Desktop).
Client: Host 내부에서 Server와 통신을 담당하는 모듈.
Server: 도구, 리소스, 프롬프트 템플릿을 노출하는 독립 프로세스.
세 가지 상호작용 원시 요소 #
- Tools(도구): AI가 호출할 수 있는 함수, 매개변수와 반환값 포함
- Resources(리소스): AI가 읽을 수 있는 데이터 소스(파일, DB 레코드 등)
- Prompts(프롬프트): AI가 직접 참조할 수 있는 미리 정의된 프롬프트 템플릿
전송 계층 옵션 #
| 전송 방식 | 적합한 상황 | 특징 |
|---|---|---|
| stdio | 로컬 개발, 데스크톱 앱 | 낮은 지연, 네트워크 노출 제로, 가장 안전 |
| HTTP + SSE | 원격 서비스, 서버리스 | 스트리밍 응답 지원, 기기 간 통신 |
| Streamable HTTP | 프로덕션 환경 | 장기 연결 + 상태 없는 폴백 |
개발 권장사항: 로컬 프로토타입은 stdio로, 프로덕션은 HTTP/SSE로 마이그레이션.
3. 개발 환경 구축: 5분 완료 #
MCP 공식 SDK는 Python과 TypeScript/JavaScript를 지원하며, 커뮤니티에서는 Go, C#, Java/Kotlin, Rust 구현체가 존재합니다. 본문은 Python(가장 빠른 학습 곡선)을 기준으로 하며, 마지막에 TypeScript 동등 코드를 첨부합니다.
uv 설치(권장 패키지 관리자) #
curl -LsSf https://astral.sh/uv/install.sh | sh
프로젝트 생성 #
mkdir mcp-site-monitor && cd mcp-site-monitor
uv init
uv add "mcp[cli]" httpx
프로젝트 구조 #
mcp-site-monitor/
├── .env # API 키(.gitignore에 추가)
├── .gitignore
├── pyproject.toml
└── server.py # MCP 서버 메인 파일
4. 실전: 사이트 모니터링 MCP 서버 구축 #
SiteMonitor라는 이름의 MCP 서버를 생성하여 두 가지 도구를 노출합니다.
check_site_status: 웹사이트 온라인 여부와 응답 시간 확인check_ssl_expiry: 도메인 SSL 인증서 잔여 유효기간 확인
완성된 코드(server.py) #
import asyncio
import ssl
import socket
from datetime import datetime
from urllib.parse import urlparse
import httpx
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("SiteMonitor")
@mcp.tool()
async def check_site_status(url: str, timeout: int = 10) -> str:
"""지정된 URL의 웹사이트 가용성을 확인합니다.
Args:
url: 확인할 웹사이트 주소, 예: https://example.com
timeout: 요청 타임아웃(초), 기본값 10초
"""
try:
async with httpx.AsyncClient(follow_redirects=True, timeout=timeout) as client:
start = asyncio.get_event_loop().time()
response = await client.get(url)
elapsed = asyncio.get_event_loop().time() - start
status = "✅ 온라인" if response.status_code < 400 else "⚠️ 이상"
return (
f"{status}\n"
f"• URL: {url}\n"
f"• HTTP 상태 코드: {response.status_code}\n"
f"• 응답 시간: {elapsed:.2f}초\n"
f"• 서버: {response.headers.get('server', '알 수 없음')}\n"
)
except httpx.TimeoutException:
return f"❌ 타임아웃: {url}이 {timeout}초 내에 응답하지 않음"
except Exception as e:
return f"❌ 오류: {type(e).__name__}: {str(e)}"
@mcp.tool()
async def check_ssl_expiry(hostname: str, port: int = 443) -> str:
"""도메인 SSL 인증서의 잔여 유효기간을 확인합니다.
Args:
hostname: 도메인 이름, 예: example.com
port: HTTPS 포트, 기본값 443
"""
try:
context = ssl.create_default_context()
with socket.create_connection((hostname, port), timeout=10) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
expiry = datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z")
days_left = (expiry - datetime.utcnow()).days
status = "🟢 정상" if days_left > 30 else "🟡 곧 만료" if days_left > 7 else "🔴 긴급"
return (
f"{status}\n"
f"• 도메인: {hostname}\n"
f"• 발급자: {cert.get('issuer', '알 수 없음')}\n"
f"• 만료 시간: {expiry.strftime('%Y-%m-%d %H:%M UTC')}\n"
f"• 잔여 일수: {days_left}일\n"
)
except Exception as e:
return f"❌ SSL 확인 실패: {type(e).__name__}: {str(e)}"
if __name__ == "__main__":
mcp.run(transport="stdio")
코드 핵심 해설 #
@mcp.tool()데코레이터: 일반 Python 함수를 MCP 도구로 등록. 함수의 docstring은 도구 설명으로 자동 추출되며, AI가 언제 호출할지 결정하는 근거가 됩니다.- 타입 어노테이션: 매개변수 타입(str, int)이 JSON Schema로 자동 변환되어 AI가 입력을 검증합니다.
transport="stdio": 표준 입출력으로 통신하며, Claude Desktop이 Server를 자식 프로세스로 시작합니다.- 오류 처리: 모든 예외를 포착하여 친화적인 텍스트로 반환, JSON-RPC 메시지 흐름이 파괴되지 않도록 합니다.
로컬 테스트 #
uv run server.py
# 이 시점에서 Server는 stdin 입력을 대기합니다. MCP Inspector로 먼저 테스트할 수 있습니다.
5. Claude Desktop 및 Cursor 연동 #
Claude Desktop(macOS) #
설정 파일을 편집합니다.
~/Library/Application\ Support/Claude/claude_desktop_config.json
Server 설정을 추가합니다.
{
"mcpServers": {
"site-monitor": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/mcp-site-monitor",
"server.py"
]
}
}
}
Claude Desktop을 재시작한 후 대화창에서 사용합니다.
“https://github.com의 상태를 확인하고 SSL 인증서가 얼마나 남았는지 알려줘.”
Claude는 자동으로 check_site_status와 check_ssl_expiry를 호출하고 결과를 정리하여 답변합니다.
Cursor #
프로젝트 루트에 .cursor/mcp.json을 생성합니다.
{
"mcpServers": {
"site-monitor": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/mcp-site-monitor",
"server.py"
]
}
}
}
Cursor의 AI Chat이 도구를 직접 인식하고 사용합니다.
VS Code Copilot Agent Mode #
VS Code v1.99+ Copilot Agent Mode는 MCP를 네이티브 지원합니다. settings.json에 설정합니다.
{
"github.copilot.chat.mcpServers": {
"site-monitor": {
"command": "uv",
"args": ["run", "server.py"],
"cwd": "/absolute/path/to/mcp-site-monitor"
}
}
}
6. 심화: 리소스, 프롬프트, 스트리밍 HTTP #
리소스 노출(읽기 전용 데이터) #
AI가 서버의 설정 파일이나 로그를 읽을 수 있도록 합니다.
@mcp.resource("config://app")
def get_app_config() -> str:
"""현재 애플리케이션 설정을 가져옵니다."""
import json
return json.dumps({"version": "1.0.0", "check_interval": 300})
@mcp.resource("log://latest")
def get_latest_log() -> str:
"""최신 모니터링 로그를 읽습니다."""
return "[2026-05-15 08:00:00] github.com: OK (23ms)"
프롬프트 노출(재사용 가능한 템플릿) #
@mcp.prompt()
def debug_site_issue(url: str, error_code: int) -> str:
"""사이트 장애 진단 프롬프트를 생성합니다."""
return f"""웹사이트 {url}이 HTTP {error_code}를 반환합니다. 다음 단계로 조사하세요:
1. DNS 해결이 정상인지 확인
2. 서버 프로세스가 살아있는지 확인
3. 최근 10분간의 애플리케이션 로그 확인
4. CDN 대시보드에서 트래픽 급증 패턴 분석
"""
HTTP + SSE로 마이그레이션(프로덕션) #
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import Route
sse = SseServerTransport("/messages/")
async def handle_sse(request):
async with sse.connect_sse(request.scope, request.receive, request._send) as streams:
await mcp.run(streams[0], streams[1], mcp.create_initialization_options())
app = Starlette(routes=[Route("/sse", endpoint=handle_sse)])
ASGI를 지원하는 모든 플랫폼(Vercel, Railway, 자체 서버)에 배포하고 원격 URL로 AI 클라이언트를 연결합니다.
7. 보안 및 프로덕션 모범 사례 #
AI를 외부 세계와 연결하는 것은 강력하면서도 위험합니다. 보안은 선택 사항이 아닙니다.
반드시 준수해야 할 7가지 규칙 #
- stdio 전송 시 절대 stdout에 로그를 남기지 마세요 — stdio 전송 계층은 stdout으로 JSON-RPC를 전달합니다. 추가 출력은 프로토콜을 파괴합니다. 로그는 stderr나 파일에만 기록하세요.
- 최소 권한 원칙 — Server는 필요한 최소 도구와 최소 범위의 데이터만 노출하세요. AI에게 전체 파일시스템 읽기 권한을 주지 마세요.
- 입력 검증 — Pydantic/Zod로 모든 매개변수를 엄격히 검증하고 잘못된 입력은 거부하세요.
- 민감 작업 이중 확인 — 데이터 삭제, 송금, 이메일 발송 등의 작업은 Server가 직접 실행하지 말고 확인 요청을 반환하세요.
- 환경 변수 관리 — API 키는
.env파일에 작성하고 절대 하드코딩하지 마세요. Git에 커밋하지 마세요. - 프로덕션에서는 HTTPS — HTTP 전송에는 반드시 TLS를 적용하여 중간자 공격을 방지하세요.
- 모니터링 및 감사 — 모든 도구 호출 로그를 기록하고 이상 행위를 알림으로 전달하세요. 2025년 7월에 공개된 MCP Inspector RCE 취약점(CVE-2025-49596, CVSS 9.4)이 바로 경고입니다.
8. 에코시스템 가이드: 지금 당장 써볼 15개 MCP 서버 #
| 이름 | 기능 | 활용 상황 |
|---|---|---|
| filesystem | 로컬 파일시스템 읽기/쓰기 | 코드 분석, 문서 처리 |
| github | PR, Issue, 코드 검색 | 자동화 코드 리뷰 |
| postgres / sqlite | 데이터베이스 쿼리 | 데이터 분석, BI |
| slack | 메시지 전송, 채널 관리 | 알림, 온콜 |
| brave-search | 웹 검색 | 실시간 정보 수집 |
| puppeteer | 브라우저 자동화 | 크롤링, 스크린샷 |
| memory | 지식 그래프 영구 저장 | 장기 기억 |
| google-drive | Google Drive 파일 조작 | 문서 협업 |
| notion | Notion 페이지/데이터베이스 | 지식 관리 |
| fetch | 임의 URL 콘텐츠 가져오기 | 웹페이지 요약 |
| sequential-thinking | 사고 연쇄 추론 보조 | 복잡한 문제 분석 |
| playwright | E2E 테스트 자동화 | 테스트 생성 |
| redis | Redis 데이터 조작 | 캐시 관리 |
| docker | 컨테이너 관리 | DevOps 자동화 |
| kubernetes | K8s 리소스 조작 | 운영 자동화 |
전체 목록은 Smithery.ai와 MCP.so에서 확인하세요.
9. 자주 묻는 질문 FAQ #
Q1: MCP와 Function Calling/Tool Use의 차이는 무엇인가요?
Function Calling은 모델 레벨의 능력(예: GPT-4의 tools 매개변수)이며 플랫폼마다 형식이 다릅니다. MCP는 프로토콜 레벨의 표준으로, Server가 도구를 어떻게 노출하고 Client가 어떻게 발견·호출할지를 정의합니다. 둘은 상호 보완적입니다 — MCP Server는 Function Calling의 하위 구현체가 될 수 있습니다.
Q2: MCP Server는 로컬에서만 실행할 수 있나요?
아닙니다. stdio는 로컬에 적합하고, HTTP/SSE는 원격 서버, Docker 컨테이너, 심지어 서버리스에도 배포할 수 있습니다(MCP의 상태 저장 특성이 서버리스에 제약을 줄 수 있음).
Q3: 하나의 Server는 몇 개의 도구를 노출할 수 있나요?
기술적으로 상한은 없지만, 10개 이내를 권장합니다. 도구가 너무 많으면 AI의 선택 정확도가 떨어지고(모든 도구 정의가 대화마다 로드되어 토큰을 소모) 컨텍스트 윈도우가 부담을 받습니다. 기능별로 여러 Server로 분리하세요.
Q4: MCP와 LangChain의 관계는 무엇인가요?
LangChain은 프레임워크로, 체인 호출, 기억 관리, 에이전트 오케스트레이션을 제공합니다. MCP는 프로토콜로, 도구 연결 방식을 표준화합니다. LangChain은 langchain-mcp-adapters를 통해 MCP를 지원하며, 둘은 협력적으로 사용할 수 있습니다.
Q5: 기업에서 MCP를 사용할 때 추가 고려사항은 무엇인가요?
- 내부 Server 관리를 위한 프라이빗 Registry 배포
- OAuth 2.1 + RBAC 접근 통제 시행
- 버전 잠금으로 무단 업데이트 방지
- 신뢰 도메인 격리(Trust Domain Isolation)
- 모든 도구 호출 로그 감사
마무리: 지금 바로 시작하세요 #
MCP는 미래 기술이 아닙니다. 2026년에 이미 활발히 사용되는 표준입니다. MCP Server를 구축하는 방법을 모른다면, 마치 2010년에 REST API를 작성할 줄 모르는 개발자와 같은 상황입니다.
오늘 이 글의 코드는 바로 복사해서 실행할 수 있습니다. 다음 단계를 권장합니다.
- 지금
uv로 SiteMonitor를 실행해보세요 - Claude Desktop에 연결하여 자연어 기반 운영 조회를 경험해보세요
- 팀에서 가장 자주 사용하는 내부 API를 MCP Server로 포장하세요
- GitHub에 오픈소스로 공개하고 MCP 생태계의 10,000+에 참여하세요
참고 자료
🔌 JSON Schema 보일러플레이트 건너뛰기 #
모든 tool에 JSON Schema를 손으로 쓰는 것은 MCP 개발에서 가장 지루한 부분입니다. dibi8의 무료 **MCP Tool Builder**를 사용하세요 — Python 또는 TypeScript 함수 시그니처를 붙여넣으면 표준 준수 tool 정의 + 완전한 server 보일러플레이트(FastMCP / TypeScript SDK) + cURL 테스트 명령을 자동 생성. 보일러플레이트 작업 80% 절약.
2026년 5월 15일 발행. MCP 프로토콜 스펙 2025-11-25 주년 버전을 기준으로 작성.
자체 호스팅 추천 인프라 #
24/7 안정 운영을 위해 인프라 선택이 중요하다:
- DigitalOcean — 신규 가입 시 60일 $200 크레딧, 글로벌 14+ 리전. 오픈소스 AI 도구 자체 호스팅에 적합.
- HTStack — 홍콩 VPS, 중국 본토 접근 시 저지연. dibi8.com 자체가 호스팅된 검증된 IDC.
추천 링크입니다. 추가 비용 없이 dibi8.com 운영에 도움이 됩니다.
💬 댓글 토론