프로토콜 원리 · Tools / Resources / Prompts · 디버깅·배포 · 개인 지식베이스 실전
Python 또는 TypeScript 기초가 있는 백엔드/AI 개발자가 자주 겪는 문제는 Claude·GPT는 똑똑하지만 자사 DB·내부 API·로컬 파일에는 직접 접근할 수 없다는 점입니다. 모델에 외부 도구를 연결하는표준화된 통로가 없기 때문입니다.Model Context Protocol(MCP)는 Anthropic이 오픈소스로 공개한 프로토콜로, AI Client(Cursor, Claude Desktop)와 직접 작성한 Server가 JSON-RPC로 대화합니다. 이 글을 끝까지 읽으면 프로덕션에 투입 가능한 MCP Server를 독립적으로 개발·배포할 수 있습니다. 프로토콜 아키텍처 → 환경 구축 → Hello World → Tools/Resources/Prompts 3대 역량 → HTTP 원격 전송 → 디버깅·테스트 → Docker 배포 → 개인 지식베이스 실전 → 2026 생태 전망까지 다룹니다.
대규모 언어 모델이 아무리 강해도 학습 데이터에는 컷오프가 있으며, CRM 고객·어젯밤 로그·사내 API 실시간 상태를 허공에서 알 수 없습니다. 업계 진화 경로는 분명합니다: Function Calling → Plugins → MCP. 앞의 두 방식은 벤더 고유 형식이 많아 모델을 바꿀 때마다 통합층을 다시 작성해야 합니다. MCP는 「AI가 어떤 도구를 발견하고 어떻게 호출하는지」를 개방 프로토콜로 표준화해, 한 번 작성하면 여러 Client에서 재사용할 수 있습니다.
과제: Claude/GPT가 DB 조회·API 호출·파일 조작을 하게 하고 싶지만 형식이 제각각입니다.
시나리오: Cursor에서 Markdown 노트를 읽게 하거나, Claude Desktop에서 GitHub Issue를 조회합니다.
약속: 빈 디렉터리에서 배포 가능한 Server까지, 완전한 코드와 트러블슈팅 표와 함께 안내합니다.
Anthropic은 2024년 11월 MCP를 공개해 AI와 외부 도구 통신을 표준화하고, N개 모델 × M개 도구 = N×M 맞춤 어댑터 파편화를 해소하려 했습니다. 프로토콜 관점은 사이트 MCP와 HTTP 비유 글도 참고하세요.
MCP는 Client ↔ Server 모델입니다. Client는 AI 측(Claude Desktop, Cursor), Server는 여러분이 개발하는 역량 제공자로 JSON-RPC로 3대 핵심 역량을 노출합니다:
Tools(도구): AI가 호출하는 함수——검색, 계산, DB 쿼리.
Resources(리소스): AI가 읽는 데이터——파일, URL, 설정 스트림.
Prompts(프롬프트 템플릿): 사전 정의·매개변수화 가능한 프롬프트 조각.
JSON-RPC 2.0 기반이며, 전송 계층은 stdio(로컬 자식 프로세스, Cursor/Claude Desktop 기본)와 HTTP + SSE / Streamable HTTP(원격 서비스)를 지원합니다. 수명 주기: 초기화 핸드셰이크 → 역량 협상(initialize) → 요청/응답 → 종료.
| 관점 | MCP | OpenAI Function Calling | LangChain Tools |
|---|---|---|---|
| 표준화 | 개방 프로토콜 | 벤더 전용 | 프레임워크 종속 |
| 전송 | stdio / HTTP | HTTP | HTTP |
| 크로스 모델 | 가능 | 불가 | 일부 |
| Resources / Prompts | 네이티브 지원 | 미지원 | 미지원 |
| 생태 | 2026년 10,000+ Server | 성숙 | 성숙 |
Python(공식 SDK mcp, FastMCP 데코레이터가 간결)은 초보자 추천. TypeScript(@modelcontextprotocol/sdk)는 프론트엔드/풀스택에 적합합니다. 본 글은 Python 위주, TS는 대조용으로 진행합니다.
# Python python -m venv .venv && source .venv/bin/activate pip install mcp httpx pydantic # TypeScript(대조) npm init -y && npm install @modelcontextprotocol/sdk
my-mcp-server/ ├── server.py # 메인 진입점 ├── tools/ # calculator.py, web_search.py ├── resources/ # file_reader.py ├── prompts/ # templates.py ├── tests/test_tools.py ├── pyproject.toml └── README.md
MCP Inspector: npx @modelcontextprotocol/inspector python server.py
Claude Desktop: claude_desktop_config.json을 편집해 Server를 등록합니다.
Cursor: Settings → MCP → command + args 추가.
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-first-server")
@mcp.tool()
def say_hello(name: str) -> str:
"""지정한 사람에게 인사한다"""
return f"Hello, {name}! 이것이 첫 MCP 도구입니다."
if __name__ == "__main__":
mcp.run()python server.py 실행 후 Inspector 또는 Cursor 설정에 {"command":"python","args":["/path/to/server.py"]}를 입력하고 도구 목록을 새로고침하면 say_hello가 보여야 합니다.
server.py와 가상환경 Python에 절대 경로를 사용합니다.
코드 변경 후 MCP 연결 재시작 또는 Cursor 창 재오픈이 필요합니다.
대화에서 도구 호출을 명시적으로 요청해 AI 컨텍스트에 등록됐는지 확인합니다.
함수 시그니처가 곧 문서입니다. 매개변수 타입·반환 타입·docstring은 모델의 도구 선택에 노출됩니다. 이름은 snake_case, 동사로 시작(search_web, read_file)하는 것이 좋습니다. 오류는 예외를 그대로 던지기보다 구조화 JSON을 반환하면 모델이 자기 수정하기 쉽습니다.
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="검색 키워드")
max_results: int = Field(default=5, description="최대 반환 건수")
language: str = Field(default="ko", description="결과 언어")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
"""웹 검색을 실행하고 관련 결과 목록을 반환한다"""
...| 도구 | 용도 | 주의점 |
|---|---|---|
| 계산기 | 수식 평가 | ast.literal_eval 또는 안전 파서 사용, eval 금지 |
| 파일 읽기/쓰기 | 로컬 파일 조작 | 화이트리스트 디렉터리, 경로 정규화로 디렉터리 트래versal 방지 |
| HTTP 요청 | 외부 API 호출 | 타임아웃, 재시도, 응답 크기 상한 |
| DB 쿼리 | 읽기 전용 SQL | 매개변수화 쿼리, DDL 금지 |
| 시간 도구 | 현재 시각, 타임존 변환 | ISO 8601 반환으로 모델 파싱 용이 |
@mcp.tool()
async def fetch_url(url: str) -> str:
"""지정 URL의 내용을 가져온다"""
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(url)
return response.text네트워크/IO 작업에 타임아웃 설정(15–30초 권장).
민감 작업에 권한 검증(API Key, 허용 경로).
{"error": "...", "hint": "..."} 반환으로 모델 재시도 유도.
Resource와 Tool의 차이: Resource는 데이터 제공자(주로 읽기), Tool은 액션 실행자입니다. URI로 주소 지정: file://, http://, custom://.
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
"""앱 설정을 반환한다"""
return json.dumps({"version": "1.0", "env": "production"})
@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""사용자 ID에 따라 프로필을 반환한다"""
return json.dumps(db.query_user(user_id))리소스 유형: 텍스트(text/plain, application/json), 바이너리(이미지, PDF), 스트리밍(실시간 시세). 실전에서는 파일시스템 Server로 디렉터리 나열, 파일 읽기, 변경 구독도 가능합니다.
MCP Prompt는 사전 정의된 프롬프트 조각으로 동적 매개변수 주입을 지원해 팀 프롬프트 일관성과 유지보수성을 높입니다.
from mcp.types import PromptMessage, TextContent
@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
"""코드 리뷰 프롬프트 템플릿"""
return [PromptMessage(
role="user",
content=TextContent(type="text", text=f"""다음 {language} 코드를 리뷰해 주세요:
1. 품질과 가독성 2. Bug와 보안 3. 성능 최적화
```{language}
{code}
```""")
)]user + assistant 다중 턴 템플릿도 정의할 수 있어 면접 시뮬레이션, 디버깅 어시스턴트 등에 쓰입니다. Client는 prompts/get으로 채워진 메시지 체인을 가져옵니다.
| 특성 | stdio | HTTP + SSE |
|---|---|---|
| 배포 | 로컬 프로세스 | 원격 서버 |
| 지연 | 매우 낮음 | 네트워크 의존 |
| 다중 클라이언트 | 미지원 | 지원 |
| 시나리오 | IDE 로컬 도구 | SaaS / 팀 공유 |
mcp = FastMCP("remote-server", transport="streamable-http")
if __name__ == "__main__":
mcp.run(host="0.0.0.0", port=8000)프로덕션에는 Bearer Token / API Key 미들웨어, CORS 화이트리스트, 요청 빈도 제한을 추가하세요. 미인증 HTTP MCP를 공网에 직접 노출하지 마세요.
Inspector 실행으로 tools/list, tools/call을 그래픽으로 테스트하고 JSON-RPC 로그 확인, 오류 시나리오 시뮬레이션이 가능합니다.
@pytest.mark.asyncio
async def test_calculator_tool():
server_params = StdioServerParameters(command="python", args=["server.py"])
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("calculate", {"expression": "2 + 2"})
assert result.content[0].text == "4"| 오류 | 원인 | 해결 |
|---|---|---|
| 도구가 안 보임 | 설정 경로 오류 | config.json 절대 경로 확인 |
| JSON 직렬화 실패 | 미지원 반환 타입 | str 또는 dict로 변환 |
| 타임아웃 끊김 | 도구 실행 느림 | 비동기 + 타임아웃 제어 |
| 권한 거부 | 파일 경로 제한 | 허용 디렉터리 설정 / VNC로 TCC 허용 |
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "server.py"]
Railway / Render: 개인 프로젝트 원클릭 배포.
AWS Lambda / Cloud Run: Serverless. 콜드 스타트와 stdio 제한 주의.
자체 VPS + Nginx: 리버스 프록시 + TLS + 속도 제한.
구조화 요청 로그, Prometheus 도구 호출 지표, Sentry 오류 알림, /health 헬스 체크. MCP 프로토콜 버전을 선언하고 도구 업그레이드는 하위 호환을 유지합니다.
요구사항: AI가 로컬 Markdown 노트 검색, 의미 검색, 생성/업데이트. Cursor에서 「지난주 MCP에 대해 뭐라고 메모했지?」라고 물을 수 있게 합니다.
| 컴포넌트 | 추천 |
|---|---|
| 벡터 DB | ChromaDB / Qdrant(로컬) |
| 임베딩 모델 | text-embedding-3-small |
| 파일 감시 | watchfiles 증분 인덱스 |
index_notes: 디렉터리를 스캔해 벡터 인덱스를 구축합니다.
semantic_search: 의미 기반으로 관련 조각을 반환합니다.
write_note: Markdown을 생성하거나추가합니다.
Resource: notes://{path}로 단일 노트 직접 읽기.
효과: AI가 semantic_search로 조각을가져온한 뒤 답을 종합하므로, 노트 전체를 컨텍스트에 넣는 것보다 Token을 절약하고 정확도가 올라갑니다.
mcp-server-filesystem — 파일시스템 조작
mcp-server-github — GitHub 저장소
mcp-server-brave-search — 웹 검색
mcp-server-postgres — DB 쿼리
mcp-server-slack — Slack 메시지
2026년 Cursor, Claude Desktop, OpenAI, Google Gemini, Microsoft가 MCP 연동을 완료하거나 추진 중입니다. MCP Marketplace와 엔터프라이즈 보안 표준(OAuth 2.1, 감사)도 정비 중입니다. 공식 문서: modelcontextprotocol.io; Python SDK: github.com/modelcontextprotocol/python-sdk.
Host(Cursor / Claude Desktop)를 정하고 2026 버전이 MCP를 네이티브 지원하는지 확인합니다.
로컬 stdio로 Server를 개발하고 Inspector로 tools/list를 검증합니다.
Cursor MCP 설정에 등록하고 Hello World 도구로 스모크 테스트합니다.
브라우저·키체인·화면 녹화 Server는 macOS 그래픽 세션에서 TCC 허용을 완료합니다(SSH만으로는 클릭 불가).
HTTP 모드를 Docker 배포하고 인증·모니터링 추가 후 상용 투입; Agent Skill, 브라우저 MCP 글과 상호 링크.
Python(mcp + FastMCP)이 가장 빠르게 시작하기 좋습니다. TypeScript(@modelcontextprotocol/sdk)는 Node 스택 팀에 적합합니다. 프로토콜 계층은 동등합니다.
IDE 로컬 개발은 stdio 우선. 다중 사용자 공유·SaaS 제공은 HTTP + SSE / Streamable HTTP를 선택하고 반드시 인증을 추가하세요.
Tools는 액션을 실행합니다(DB 쓰기, 요청 전송). Resources는 읽기 전용 데이터(설정, 파일 내용)를 URI 템플릿으로 제공합니다.
브라우저 DevTools MCP, 고권한 파일 작업, 키체인·화면 녹화는 macOS TCC 팝업을 띄웁니다. SSH만으로는 「항상 허용」을 클릭할 수 없어 VNC 그래픽 세션에서 Host와 동일 기기 검수가 필요합니다.
MCP는 AI 도구화의 표준 프로토콜입니다. Hello World에서 프로덕션 배포까지 전 과정을 익히는 것은 2026년 AI 엔지니어의 핵심 역량 중 하나입니다. MCP로 어떤 도구를 만들 계획인가요? 실습 후 Server 설계를 돌아보면 좋습니다.
숨은 비용은 코드 작성보다 실행 환경에 있습니다. Windows 주력 + 클라우드 Mac에서 Cursor MCP를 혼합 운영하면 권한 팝업, Python 가상환경, Inspector 로그를 동일 머신의 데스크톱 세션에서 대조해야 합니다. Mac mini를 직접 구매하면 슬립, OS 업데이트, 감가상각을 떠안고, 8GB 메모리는 벡터 인덱스 + 다중 Server 동시 실행에 쉽게 포화됩니다.
시간 과금으로 MCP 도구체인을 검증하고 Cursor와 동일 기기 그래픽 UI에서 TCC·Inspector 검수를 마치려면 VNCMac 원격 Mac 임대를 이용하세요. 아래 주 버튼에서 요금 플랜으로, 플랜 비교는 홈을 참고하세요.