byteforce

CPN 한국어 자습서 · 외부 문서 한국어 미러

MCP 문서 · Learn

아키텍처 개요

Architecture overview · 원문: modelcontextprotocol.io/docs/learn/architecture

아래는 원문을 한국어로 옮긴 미러입니다. 코드·명령은 원문 그대로이며, 가장 최신 정보는 하단 원문 링크에서 확인하세요.

이 문서는 MCP(Model Context Protocol)의 범위핵심 개념을 설명하고, 각 핵심 개념을 보여 주는 예시를 제공합니다.

MCP SDK는 많은 세부 사항을 추상화하므로, 대부분의 개발자는 데이터 계층 프로토콜 섹션이 가장 유용할 것입니다. 이 섹션은 MCP 서버가 AI 애플리케이션에 컨텍스트를 제공하는 방법을 다룹니다.

특정 구현 세부 사항은 언어별 SDK 문서를 참조하세요.

범위

Model Context Protocol은 다음 프로젝트를 포함합니다:

참고: MCP는 컨텍스트 교환을 위한 프로토콜에만 집중합니다. AI 애플리케이션이 LLM을 사용하거나 제공된 컨텍스트를 관리하는 방법은 규정하지 않습니다.

MCP의 개념

참여자

MCP는 클라이언트-서버 아키텍처를 따릅니다. MCP 호스트 — Claude CodeClaude Desktop 같은 AI 애플리케이션 — 가 하나 이상의 MCP 서버에 연결을 수립합니다. MCP 호스트는 MCP 서버마다 MCP 클라이언트를 하나씩 생성하여 이를 수행합니다. 각 MCP 클라이언트는 대응하는 MCP 서버와 전용 연결을 유지합니다.

STDIO 트랜스포트를 사용하는 로컬 MCP 서버는 일반적으로 단일 MCP 클라이언트를 담당하며, Streamable HTTP 트랜스포트를 사용하는 원격 MCP 서버는 일반적으로 여러 MCP 클라이언트를 담당합니다.

MCP 아키텍처의 핵심 참여자는 다음과 같습니다:

예시: Visual Studio Code가 MCP 호스트 역할을 합니다. Visual Studio Code가 Sentry MCP 서버에 연결하면, Visual Studio Code 런타임이 Sentry MCP 서버와의 연결을 유지하는 MCP 클라이언트 객체를 생성합니다. Visual Studio Code가 이후에 로컬 파일시스템 서버에 연결하면, 이 연결을 유지하기 위한 추가 MCP 클라이언트 객체를 생성합니다.

코드 · 명령
graph TB
    subgraph "MCP Host (AI Application)"
        Client1["MCP Client 1"]
        Client2["MCP Client 2"]
        Client3["MCP Client 3"]
        Client4["MCP Client 4"]
    end

    ServerA["MCP Server A - Local<br/>(e.g. Filesystem)"]
    ServerB["MCP Server B - Local<br/>(e.g. Database)"]
    ServerC["MCP Server C - Remote<br/>(e.g. Sentry)"]

    Client1 ---|"Dedicated<br/>connection"| ServerA
    Client2 ---|"Dedicated<br/>connection"| ServerB
    Client3 ---|"Dedicated<br/>connection"| ServerC
    Client4 ---|"Dedicated<br/>connection"| ServerC

MCP 서버는 실행 위치에 관계없이 컨텍스트 데이터를 제공하는 프로그램을 의미합니다. MCP 서버는 로컬 또는 원격으로 실행될 수 있습니다.

계층

MCP는 두 계층으로 구성됩니다:

개념적으로 데이터 계층이 내부 계층이고, 트랜스포트 계층이 외부 계층입니다.

데이터 계층

데이터 계층은 메시지 구조와 의미를 정의하는 JSON-RPC 2.0 기반 교환 프로토콜을 구현합니다. 이 계층은 다음을 포함합니다:

트랜스포트 계층

트랜스포트 계층은 클라이언트와 서버 간 통신 채널과 인증을 관리합니다.

MCP는 두 가지 트랜스포트 메커니즘을 지원합니다:

트랜스포트 계층은 프로토콜 계층으로부터 통신 세부 사항을 추상화하여, 모든 트랜스포트 메커니즘에서 동일한 JSON-RPC 2.0 메시지 형식을 사용할 수 있게 합니다.

데이터 계층 프로토콜

MCP의 핵심은 MCP 클라이언트와 MCP 서버 간의 스키마(schema)와 의미를 정의하는 것입니다. 개발자들은 특히 프리미티브 집합인 데이터 계층에 가장 관심을 가질 것입니다.

MCP는 기저 RPC 프로토콜로 JSON-RPC 2.0을 사용합니다. 클라이언트와 서버는 서로 요청을 보내고 응답합니다. 응답이 필요하지 않은 경우에는 알림(notification)을 사용할 수 있습니다.

수명 주기 관리

MCP는 수명 주기 관리가 필요한 상태 기반 프로토콜입니다. 수명 주기 관리의 목적은 클라이언트와 서버가 모두 지원하는 기능을 협상하는 것입니다. 자세한 내용은 사양을 참조하세요.

프리미티브

MCP 프리미티브는 MCP 내에서 가장 중요한 개념입니다. 클라이언트와 서버가 서로에게 제공할 수 있는 것을 정의합니다.

MCP는 서버가 노출할 수 있는 세 가지 핵심 프리미티브를 정의합니다:

각 프리미티브 유형에는 탐색(*/list), 조회(*/get), 경우에 따라 실행(tools/call)을 위한 연관 메서드가 있습니다.

MCP는 클라이언트가 노출할 수 있는 프리미티브도 정의합니다:

서버 및 클라이언트 프리미티브 외에, 프로토콜은 요청 실행 방식을 보강하는 횡단 관심사(cross-cutting) 유틸리티 프리미티브를 제공합니다:

알림

프로토콜은 서버와 클라이언트 간 동적 업데이트를 위한 실시간 알림을 지원합니다. 알림은 JSON-RPC 2.0 알림 메시지로 전송됩니다(응답 없음).

예시

데이터 계층

이 섹션은 데이터 계층 프로토콜에 집중하여 MCP 클라이언트-서버 상호작용을 단계별로 안내합니다.

1단계: 초기화 (수명 주기 관리)

MCP는 기능 협상 핸드셰이크를 통한 수명 주기 관리로 시작합니다. 클라이언트가 연결을 수립하고 지원 기능을 협상하기 위해 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"
    }
  }
}

초기화 과정은 다음과 같은 중요한 목적을 수행합니다:

  1. 프로토콜 버전 협상: protocolVersion 필드는 클라이언트와 서버가 호환 가능한 프로토콜 버전을 사용하도록 보장합니다.
  2. 기능 탐색: capabilities 객체는 각 측이 지원하는 기능을 선언할 수 있게 합니다.
  3. ID 교환: clientInfoserverInfo 객체는 식별 및 버전 정보를 제공합니다.

이 예시에서 기능 협상은 다음을 보여 줍니다:

클라이언트 기능: * "elicitation": {} — 클라이언트가 사용자 상호작용 요청을 처리할 수 있음을 선언

서버 기능: * "tools": {"listChanged": true} — 서버가 도구 프리미티브를 지원하고 tools/list_changed 알림을 전송할 수 있음 * "resources": {} — 서버가 리소스 프리미티브도 지원함

초기화 성공 후 클라이언트는 준비 완료를 알리는 알림을 전송합니다:

코드 · 명령
{
  "jsonrpc": "2.0",
  "method": "notifications/initialized"
}
코드 · 명령
# Pseudo Code
async with stdio_client(server_config) as (read, write):
    async with ClientSession(read, write) as session:
        init_response = await session.initialize()
        if init_response.capabilities.tools:
            app.register_mcp_server(session, supports_tools=True)
        app.set_server_ready(session)

2단계: 도구 탐색 (프리미티브)

클라이언트는 tools/list 요청을 전송해 사용 가능한 도구를 탐색할 수 있습니다.

도구 목록 요청:

코드 · 명령
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/list"
}

도구 목록 응답:

코드 · 명령
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "tools": [
      {
        "name": "calculator_arithmetic",
        "title": "Calculator",
        "description": "Perform mathematical calculations including basic arithmetic, trigonometric functions, and algebraic operations",
        "inputSchema": {
          "type": "object",
          "properties": {
            "expression": {
              "type": "string",
              "description": "Mathematical expression to evaluate (e.g., '2 + 3 * 4', 'sin(30)', 'sqrt(16)')"
            }
          },
          "required": ["expression"]
        }
      },
      {
        "name": "weather_current",
        "title": "Weather Information",
        "description": "Get current weather information for any location worldwide",
        "inputSchema": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "City name, address, or coordinates (latitude,longitude)"
            },
            "units": {
              "type": "string",
              "enum": ["metric", "imperial", "kelvin"],
              "description": "Temperature units to use in response",
              "default": "metric"
            }
          },
          "required": ["location"]
        }
      }
    ]
  }
}

각 도구 객체는 다음을 포함합니다: * name: 도구의 고유 식별자 * title: 사람이 읽을 수 있는 표시 이름 * description: 도구가 하는 일에 대한 상세 설명 * inputSchema: 예상 입력 파라미터를 정의하는 JSON 스키마

코드 · 명령
# Pseudo-code using MCP Python SDK patterns
available_tools = []
for session in app.mcp_server_sessions():
    tools_response = await session.list_tools()
    available_tools.extend(tools_response.tools)
conversation.register_available_tools(available_tools)

3단계: 도구 실행 (프리미티브)

클라이언트는 tools/call 메서드를 사용해 도구를 실행할 수 있습니다.

도구 호출 요청:

코드 · 명령
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "weather_current",
    "arguments": {
      "location": "San Francisco",
      "units": "imperial"
    }
  }
}

도구 호출 응답:

코드 · 명령
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Current weather in San Francisco: 68°F, partly cloudy with light winds from the west at 8 mph. Humidity: 65%"
      }
    ]
  }
}

요청 구조의 주요 구성 요소: 1. name: 탐색 응답의 도구 이름과 정확히 일치해야 합니다 (weather_current). 2. arguments: 도구의 inputSchema에 정의된 입력 파라미터를 포함합니다. 3. JSON-RPC 구조: 요청-응답 연관을 위한 고유 id와 함께 표준 JSON-RPC 2.0 형식을 사용합니다.

코드 · 명령
# Pseudo-code for AI application tool execution
async def handle_tool_call(conversation, tool_name, arguments):
    session = app.find_mcp_session_for_tool(tool_name)
    result = await session.call_tool(tool_name, arguments)
    conversation.add_tool_result(result.content)

4단계: 실시간 업데이트 (알림)

MCP는 서버가 명시적인 요청 없이 클라이언트에 변경 사항을 알릴 수 있는 실시간 알림을 지원합니다.

서버의 사용 가능한 도구가 변경되면 서버는 연결된 클라이언트에 능동적으로 알릴 수 있습니다:

코드 · 명령
{
  "jsonrpc": "2.0",
  "method": "notifications/tools/list_changed"
}

MCP 알림의 주요 특징: 1. 응답 불필요: id 필드가 없습니다. JSON-RPC 2.0 알림 의미론에 따라 응답이 기대되지 않습니다. 2. 기능 기반: 초기화 시 "listChanged": true를 선언한 서버만 이 알림을 전송합니다. 3. 이벤트 기반: 서버는 내부 상태 변화에 따라 알림 전송 시점을 결정합니다.

이 알림을 받으면 클라이언트는 일반적으로 업데이트된 도구 목록을 요청합니다:

코드 · 명령
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/list"
}
코드 · 명령
# Pseudo-code for AI application notification handling
async def handle_tools_changed_notification(session):
    tools_response = await session.list_tools()
    app.update_available_tools(session, tools_response.tools)
    if app.conversation.is_active():
        app.conversation.notify_llm_of_new_capabilities()

원문(영어): https://modelcontextprotocol.io/docs/learn/architecture · 본 문서는 학습용 한국어 번역이며 원본의 권리는 원저작자(Model Context Protocol)에게 있습니다.

원문(영어): https://modelcontextprotocol.io/docs/learn/architecture