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를 지원하는 모든 클라이언트가 수정 없이 그 도구를 씁니다.

📌 핵심
최신 정보 (2026): MCP는 Anthropic이 만들었지만, 2026년 현재 Linux Foundation 산하 AAIF(Agentic AI Foundation)가 거버넌스를 맡습니다(Anthropic·OpenAI·Block 공동 창립, Google·Microsoft·AWS 참여). 주요 변화로 Streamable HTTP가 SSE를 대체해 기본 전송 방식이 되었고, Tasks(장시간 백그라운드 작업), MCP Apps(대화 안에 HTML UI 렌더링)가 추가됐습니다. 2026년 4월 기준 공개 MCP 서버가 2,300개를 넘었습니다.

왜 표준이 중요한가

표준이 없을 때와 있을 때의 차이는 곱셈과 덧셈의 차이입니다. 표준이 없으면 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 기반입니다. 데코레이터로 함수를 도구로 노출합니다.

BASH
pip install fastmcp
PYTHON
# 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 추가

PYTHON
# 읽기 전용 데이터 (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년 기본이 된 전송 방식입니다.
PYTHON
# 로컬 표준 입출력 (같은 머신, 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.

✍️ 확인 문제

  1. 도구 5개를 3개 프레임워크에서 쓸 때, MCP가 없으면 몇 개의 통합 코드가 필요하고 MCP가 있으면 몇 개로 줄어드는가?
  2. MCP의 Tools와 Resources는 각각 무엇을 위한 것이며 어떻게 다른가?
  3. "MCP가 함수 호출을 대체한다"는 설명이 부정확한 이유를 두 개념의 층위 차이로 설명하라.
이전 부: 16. 데이터사이언스 크루
다음 장: 18. MCP 서버를 에이전트에 연결하기