17. MCP 입문: AI를 위한 USB-C
- MCP가 무엇이고 왜 "표준"이 중요한지 이해한다
- 호스트·클라이언트·서버 구조와 Tools·Resources·Prompts를 안다
- FastMCP로 첫 MCP 서버를 만들어 실행한다
- 함수 호출(function calling)과 MCP의 차이·관계를 안다
비유로 시작하기: 충전기 단자의 악몽
스마트폰·노트북·이어폰마다 충전 단자가 다르던 시절을 기억하시나요? 기기마다 전용 케이블이 필요해 서랍이 케이블로 가득했습니다. USB-C가 이를 끝냈습니다. 단자 하나로 모든 기기를 연결합니다.
AI 도구 연결도 비슷한 문제를 겪었습니다. 5장에서 봤듯, 도구를 붙이려면 프레임워크마다 다른 방식으로 일일이 코딩해야 했습니다. OpenAI SDK용, LangChain용, CrewAI용 통합 코드를 따로 짜야 했죠. (LangChain은 LLM 앱을 만들 때 쓰는 대표적인 파이썬 프레임워크로, LangGraph도 여기서 파생됐습니다.) MCP(Model Context Protocol)는 이 혼란을 끝내는 AI용 USB-C입니다. 서버를 한 번 만들면, ChatGPT·Claude·Gemini·Cursor·VS Code 등 MCP를 지원하는 모든 클라이언트가 수정 없이 그 도구를 씁니다.
왜 표준이 중요한가
표준이 없을 때와 있을 때의 차이는 곱셈과 덧셈의 차이입니다. 표준이 없으면 M개 도구 × N개 프레임워크 = M×N개의 통합 코드가 필요합니다. MCP가 있으면 M개 서버 + N개 클라이언트 = M+N으로 줄어듭니다. 도구 제작자는 한 번만 만들고, 클라이언트는 한 번만 지원하면 서로 자유롭게 연결됩니다.
flowchart TB
classDef server fill:#90CAF9,stroke:#1565C0,color:#000
classDef client fill:#80DEEA,stroke:#00838F,color:#000
classDef proto fill:#FFE082,stroke:#F9A825,color:#000
S1[GitHub MCP 서버]:::server
S2[DB MCP 서버]:::server
S3[Slack MCP 서버]:::server
P{{MCP 표준 프로토콜}}:::proto
C1[Claude]:::client
C2[ChatGPT]:::client
C3[내 에이전트]:::client
S1 --- P
S2 --- P
S3 --- P
P --- C1
P --- C2
P --- C3
구조: 호스트·클라이언트·서버
MCP는 세 역할로 구성됩니다. 호스트(Host)는 사용자가 쓰는 AI 앱입니다(Claude Desktop, 내 에이전트 등). 클라이언트(Client)는 호스트 안에서 특정 서버와의 연결을 관리합니다. 서버(Server)는 도구·데이터를 표준 방식으로 노출합니다.
서버가 노출하는 세 가지: Tools·Resources·Prompts
MCP 서버는 세 종류의 기능을 제공합니다.
| 종류 | 역할 | 비유 | 예시 |
|---|---|---|---|
| Tools | 모델이 호출해 행동하는 함수 | 동사(하다) | 검색, 티켓 생성, 계산 |
| Resources | 모델이 읽는 읽기 전용 데이터 | 명사(자료) | 문서, 설정값, 프로필 |
| Prompts | 상호작용을 안내하는 템플릿 | 양식 | 요약 프롬프트 템플릿 |
📌 핵심: Tools는 5장에서 배운 도구와 같은 개념입니다. MCP는 그 도구를 "표준 규격으로 포장해 누구나 꽂을 수 있게" 만든 것입니다.
FastMCP로 첫 서버 만들기
MCP 서버는 공식 SDK로도 만들 수 있지만, FastMCP가 가장 간편합니다. 2026년 현재 전체 MCP 서버의 약 70%가 FastMCP 기반입니다. 데코레이터로 함수를 도구로 노출합니다.
pip install fastmcp
# server.py from fastmcp import FastMCP mcp = FastMCP("Demo Server 🚀") @mcp.tool def add(a: int, b: int) -> int: """두 수를 더해 반환한다.""" return a + b @mcp.tool def multiply(a: float, b: float) -> float: """두 수를 곱해 반환한다.""" return a * b if __name__ == "__main__": mcp.run() # 기본 실행
7장의 @function_tool과 똑같은 느낌이죠? FastMCP도 타입 힌트와 독스트링을 읽어 스키마를 자동 생성합니다. 차이는 이 도구가 특정 프레임워크가 아니라 MCP 표준으로 노출된다는 점입니다.
Resources와 Prompts 추가
# 읽기 전용 데이터 (Resource) @mcp.resource("config://version") def get_version() -> str: return "1.0.0" # 동적 리소스 — URI에 파라미터 @mcp.resource("user://{user_id}/profile") def get_profile(user_id: int) -> dict: return {"name": f"User {user_id}", "status": "active"}
리소스는 도구와 달리 "행동"이 아니라 "데이터 제공"입니다. 모델이 필요할 때 읽어 갑니다.
전송 방식(transport)
MCP 서버는 여러 방식으로 통신합니다. 용도에 맞게 고릅니다.
용어 정리: HTTP는 웹에서 데이터를 주고받는 표준 통신 규약입니다. stdio(standard input/output, 표준 입출력)는 같은 컴퓨터 안에서 두 프로그램이 직접 입력·출력으로 대화하는 방식이고, 이때 호스트가 서버를 서브프로세스(자기가 띄워 거느리는 하위 프로그램)로 실행합니다. SSE(Server-Sent Events)는 서버가 클라이언트로 데이터를 계속 흘려보내는 HTTP 기반 방식이며, Streamable HTTP는 이를 개선해 2026년 기본이 된 전송 방식입니다.
# 로컬 표준 입출력 (같은 머신, Claude Desktop 등이 서브프로세스로 실행) mcp.run() # 기본 stdio # HTTP — 네트워크로 노출 (원격 클라이언트가 접속) mcp.run(transport="http", port=8000)
| 전송 | 용도 |
|---|---|
| stdio | 로컬, 호스트가 서버를 서브프로세스로 띄움 |
| Streamable HTTP | 원격·프로덕션 (2026 기본 권장) |
| SSE | 구형, Streamable HTTP로 대체되는 중 |
⚠️ 흔한 실수: 원격에서 쓸 서버를 stdio로 띄우는 것. 다른 머신의 클라이언트가 접속하려면 HTTP 전송이 필요합니다. 반대로 로컬 개인 도구를 굳이 HTTP로 공개하면 보안 표면만 넓어집니다.
MCP vs 함수 호출: 대체가 아니라 보완
흔한 오해를 짚고 갑니다. MCP는 5장의 함수 호출을 대체하지 않습니다. 둘은 다른 층위입니다. 함수 호출은 "모델이 도구를 호출하는 메커니즘"이고, MCP는 "그 도구를 표준 규격으로 배포·발견·연결하는 프로토콜"입니다. 실제로 클라이언트는 MCP 서버에 list_tools로 도구 목록을 받아, 그것을 모델의 함수 호출로 노출합니다. 즉 MCP 위에서 함수 호출이 돕니다.
📌 핵심: "도구를 어떻게 호출하나"는 함수 호출, "도구를 어떻게 공유·연결하나"는 MCP. MCP의 가치는 한 번 만들어 모든 클라이언트에서 재사용하는 상호운용성입니다.
💡 팁: 개발 중에는 fastmcp dev server.py로 인스펙터를 띄우면 도구 목록·호출·에러를 시각적으로 확인할 수 있습니다. 디버깅 1순위 도구입니다.
💡 실습 아이디어(강의의 MCP 서버 구축 대응): 고객 서비스 서버를 만들어 보세요. get_recent_customers(리소스/도구), create_support_ticket(도구), calculate_account_value(도구) 세 가지를 노출하면, 어떤 MCP 클라이언트에서도 이 고객 지원 기능을 쓸 수 있습니다.
이 장에서 배운 것
- MCP는 "AI용 USB-C"로, 서버를 한 번 만들면 모든 MCP 클라이언트가 쓰는 상호운용 표준이다.
- 구조는 호스트·클라이언트·서버이며, 서버는 Tools(행동)·Resources(데이터)·Prompts(템플릿)를 노출한다.
- FastMCP는 데코레이터로 함수를 도구로 노출하며, 타입·독스트링으로 스키마를 자동 생성한다.
- MCP는 함수 호출을 대체하지 않고 그 위에서 표준 배포·연결을 담당한다. 2026 기본 전송은 Streamable HTTP.
✍️ 확인 문제
- 도구 5개를 3개 프레임워크에서 쓸 때, MCP가 없으면 몇 개의 통합 코드가 필요하고 MCP가 있으면 몇 개로 줄어드는가?
- MCP의 Tools와 Resources는 각각 무엇을 위한 것이며 어떻게 다른가?
- "MCP가 함수 호출을 대체한다"는 설명이 부정확한 이유를 두 개념의 층위 차이로 설명하라.
이전 부: 16. 데이터사이언스 크루
다음 장: 18. MCP 서버를 에이전트에 연결하기