WIPIVERSE

발기

개요

MCP(Model Context Protocol)는 LLM(대규모 언어 모델) 애플리케이션이 외부 데이터 소스와 도구에 표준화된 방식으로 연결될 수 있게 해주는 개방형 프로토콜이다. Anthropic이 주도하여 개발되었으며, AI 애플리케이션을 위한 USB-C 포트에 비유된다. USB-C가 다양한 주변기기를 표준화된 방식으로 연결하듯, MCP는 AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 인터페이스를 제공한다.


핵심 아키텍처

MCP는 클라이언트-서버 아키텍처를 따르며, 세 가지 주요 참여자로 구성된다:

1. MCP 호스트 (Host)

  • AI 애플리케이션 (예: Claude Desktop, VS Code, IDE 등)
  • 여러 MCP 클라이언트를 생성하고 관리
  • 보안 정책 및 사용자 승인 처리
  • 컨텍스트 집계 조정

2. MCP 클라이언트 (Client)

  • 호스트 내에서 각 MCP 서버와 1:1 연결을 유지하는 컴포넌트
  • 프로토콜 협상 및 기능 교환 처리
  • 메시지 양방향 라우팅

3. MCP 서버 (Server)

  • 특정 기능(도구, 리소스, 프롬프트)을 제공하는 프로그램
  • 로컬 프로세스 또는 원격 서비스로 실행 가능
  • 각 서버는 독립적으로 동작하며 격리된 보안 경계 유지
MCP Host (AI Application)
    ├── MCP Client 1 ──── MCP Server A (로컬: 파일시스템)
    ├── MCP Client 2 ──── MCP Server B (로컬: 데이터베이스)
    └── MCP Client 3 ──── MCP Server C (원격: Sentry API)

계층 구조

MCP는 두 개의 계층으로 구성된다:

데이터 계층 (Data Layer)

  • JSON-RPC 2.0 기반 메시지 교환 프로토콜
  • 생명주기 관리: 연결 초기화, 기능 협상, 종료 처리
  • 서버 프리미티브: Tools, Resources, Prompts
  • 클라이언트 프리미티브: Sampling, Roots, Elicitation
  • 유틸리티: 알림(Notifications), 진행 추적(Progress tracking)

전송 계층 (Transport Layer)

  • Stdio 전송: 표준 입출력 스트림 사용, 로컬 프로세스 간 통신 (최적 성능)
  • Streamable HTTP 전송: HTTP POST + Server-Sent Events(SSE), 원격 서버 통신 지원, OAuth 인증 권장

핵심 프리미티브 (Primitives)

서버가 제공하는 기능

프리미티브 설명 예시
Tools AI 모델이 호출할 수 있는 실행 가능한 함수 파일 검색, DB 쿼리, API 호출
Resources 읽기 전용 컨텍스트 데이터 소스 문서 내용, DB 스키마, API 문서
Prompts 재사용 가능한 템플릿 (상호작용 구조화) 시스템 프롬프트, Few-shot 예제

클라이언트가 제공하는 기능

프리미티브 설명
Sampling 서버가 클라이언트의 LLM에 완성(completion) 요청
Roots 서버가 URI/파일시스템 경계 탐색
Elicitation 서버가 사용자에게 추가 정보 요청

프로토콜 동작 방식

1. 초기화 (Initialization)

클라이언트가 서버에 initialize 요청을 보내 프로토콜 버전과 지원 기능을 협상한다.

// 클라이언트 → 서버
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": { "elicitation": {} },
    "clientInfo": { "name": "example-client", "version": "1.0.0" }
  }
}

// 서버 → 클라이언트 (응답)
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": { "tools": { "listChanged": true }, "resources": {} },
    "serverInfo": { "name": "example-server", "version": "1.0.0" }
  }
}

2. 도구 발견 (Tool Discovery)

tools/list 요청으로 서버가 제공하는 도구 목록을 조회한다.

3. 도구 실행 (Tool Execution)

tools/call 요청으로 특정 도구를 호출하고 결과를 받는다.

4. 알림 (Notifications)

서버가 도구 목록 변경 등 실시간 업데이트를 클라이언트에 전송한다.


SDK 지원 언어

MCP는 다양한 언어의 공식 SDK를 제공한다:

언어 GitHub 저장소
Python python-sdk
TypeScript typescript-sdk
Java java-sdk
Go go-sdk
C# csharp-sdk
Ruby ruby-sdk
Rust rust-sdk
Kotlin kotlin-sdk
Swift swift-sdk
PHP php-sdk

Python SDK 예제 (v2)

서버 (15줄)

from mcp.server import MCPServer

mcp = MCPServer("Demo")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

클라이언트 (10줄)

import asyncio
from mcp import Client
from server import mcp

async def main() -> None:
    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())

참조 서버 (Reference Servers)

공식 저장소(modelcontextprotocol/servers)에서 제공하는 참조 구현:

서버 설명
Everything 테스트용 (프롬프트, 리소스, 도구 모두 포함)
Fetch 웹 콘텐츠 가져오기 및 변환
Filesystem 보안 파일 시스템 접근
Git Git 저장소 읽기/검색/조작
Memory 지식 그래프 기반 영구 메모리
Sequential Thinking 순차적 사고 프로세스
Time 시간 및 시간대 변환

보안 원칙

  1. 사용자 동의 및 통제: 모든 데이터 접근과 작업에 명시적 동의 필요
  2. 데이터 프라이버시: 사용자 데이터 노출 전 명시적 동의 획득
  3. 도구 안전성: 도구 호출 전 사용자 승인 필요
  4. LLM 샘플링 통제: 샘플링 요청 시 사용자 승인 필수

활용 사례

  • AI 비서: 파일 시스템, 데이터베이스, 이메일, 캘린더 통합
  • IDE: 코드 저장소, 이슈 트래커, CI/CD 파이프라인 연동
  • 여행 플래너: 항공편 검색, 호텔 예약, 날씨 확인, 캘린더 일정 관리
  • 고객 지원: CRM, 지식 베이스, 티켓 시스템 연동

참고 자료

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기