[MCP] 통신 구조 flow 심층분석

MCP 통신 flow 통신규약 심층분석

Posted by lim.Chuck on April 17, 2025

[MCP]

  1. [DEVELOP] MCP(Model Context Protocol)
  2. [DEVELOP] MCP claude 적용하고 사용해보기
  3. [MCP] 통신 구조 flow 심층분석
  4. [MCP] AI Agent이용한 mcp서버 테스트 환경 구축해보자

통신 프로토콜은 AI와 애플리케이션이 서로 대화하는 언어와 같습니다. 각각의 프로토콜은 저마다의 강점과 특성을 가지고 있으며, 목적에 맞게 선택하는 것이 중요합니다.

🔌 MCP 통신 구조 심층 분석

MCP(Model Context Protocol)는 AI 모델과 어플리케이션 간의 표준화된 통신 방식을 제공합니다. 이 프로토콜의 통신 구조와 메시지 흐름을 살펴보겠습니다.

🏛️ 클라이언트-서버 아키텍처

MCP는 다음과 같은 세 가지 주요 구성 요소로 이루어진 아키텍처를 가집니다:

  • 🖥️ 호스트(Host): LLM 어플리케이션이 주로 해당되며, 연결을 초기화하는 역할을 합니다.
  • 🔄 클라이언트(Client): 서버와 1:1 연결을 유지하며 통신하는 역할로, 호스트 내에 존재합니다.
  • ⚙️ 서버(Server): 컨텍스트, 툴, 프롬프트 등의 정보를 클라이언트에게 전달하는 역할을 담당합니다.

📨 메시지 프로토콜 형식

MCP의 메시지 프로토콜은 JSON-RPC 2.0 구조를 기반으로 하며, 다음 세 가지 형태로 구성됩니다:

  1. 📤 Requests: 명령 실행을 위한 요청 메시지
  2. 📥 Responses: 요청에 대한 응답 메시지
  3. 🔔 Notifications: 응답을 받지 않는 단방향 통지 메시지

🔄 통신 흐름

MCP의 통신 과정은 다음과 같은 순서로 진행됩니다:

  1. 🚀 초기화(Initialization): 서버와 클라이언트 간 연결 설정
  2. ⚡ 실행(Operation): 실제 데이터 및 명령 교환
  3. 🔚 종료(Shutdown): 연결 종료 및 정리

📦 MCP 규격으로 통신할 수 있는 데이터 유형

MCP에서는 다양한 형태의 데이터를 전송할 수 있으며, 각 유형별로 특화된 통신 규격이 있습니다.

📂 리소스(Resources) 통신 규격

리소스 통신은 서버에서 LLM(클라이언트)으로 단순 데이터를 전달하는 데 사용됩니다. 연산이 거의 발생하지 않으며, 데이터 전달이 주된 목적입니다.

💼 리소스 통신 예시:

  • 📄 파일 내용
  • 🗄️ 데이터베이스 레코드
  • 🌐 API 응답
  • 📊 실시간 시스템 데이터
  • 🖼️ 스크린샷, 이미지
  • 📝 로그 파일

🛠️ 툴(Tools) 통신 규격

툴 통신은 서버에서 연산을 처리한 뒤 그 결과를 LLM(클라이언트)으로 전달하는 유형입니다. 데이터 전달도 포함하지만, 주된 목적은 연산 처리입니다.

🧰 툴 통신 예시:

  • 🌤️ 실시간 날씨 정보 조회
  • 📈 데이터 분석 결과
  • 🔍 웹 검색 결과
  • 🐙 깃헙 이슈 생성

💬 프롬프트(Prompts) 통신 규격

프롬프트 통신은 재사용 가능한 프롬프트 템플릿과 워크플로우를 생성하는 데 사용됩니다. LLM에게 특정 작업을 수행하도록 지시하는 명령어 집합을 전달합니다.

🎲 샘플링(Sampling) 통신 규격

샘플링 통신은 LLM(클라이언트)이 서버에게 데이터의 샘플을 요청하는 규격입니다. 서버는 LLM의 요청에 따라 적절한 샘플 데이터를 생성하여 제공합니다.

🧩 샘플링 통신 예시:

  • 🖼️ 이미지 샘플링
  • 📝 텍스트 샘플링
  • 📊 데이터 샘플 생성

🌱 루트(Roots) 통신 규격

루트 통신 규격은 URI의 기본 경로를 반환하는 역할을 합니다. 주로 리소스 위치나 API 엔드포인트의 기본 경로를 확인하는 데 사용됩니다.

🚚 전송(Transports) 통신 규격

전송 통신 규격은 MCP가 통신하는 메시지 프로토콜Requests, Responses, Notifications를 처리합니다. 이는 MCP의 통신 계층을 담당하는 규격입니다.

1
2
3
4
5
6
7
┌─────────────────────────────────────────────┐
│           🚚 전송(Transports) 통신          │
├─────────────────────────────────────────────┤
│ 📤 Requests  → 명령 실행을 위한 요청        │
│ 📥 Responses → 요청에 대한 응답             │
│ 🔔 Notifications → 단방향 통지 메시지       │
└─────────────────────────────────────────────┘

🔌 Model Context Protocol에서 사용하는 통신 방식

WEB 통신 규약 종류 stdio, sse가 궁금하다면!!!!!

Model Context Protocol(MCP)은 다양한 통신 프로토콜을 활용할 수 있도록 설계되었지만, 실제 구현에서는 주로 두 가지 통신 방식이 가장 많이 사용됩니다:

1. 🔄 stdio(표준 입출력) - 가장 많이 사용되는 통신 방식

  • 주요 용도: 로컬 MCP 서버와 통신할 때 기본적으로 사용됨
  • 장점:
    • ✅ 구현이 단순하고 직관적
    • ✅ 별도의 네트워크 설정 없이 프로세스 간 통신 가능
    • ✅ 로컬 시스템 리소스에 직접 접근 가능
  • 사용 사례:
    • 💼 Claude Desktop에서 로컬 파일 시스템 접근
    • 💻 Cursor IDE에서 코드 분석 및 편집
    • 🛠️ 로컬 개발 환경에서의 MCP 서버 통합

2. 📢 SSE(Server-Sent Events) - 두 번째로 많이 사용되는 통신 방식

  • 주요 용도: 서버에서 클라이언트로 이벤트를 실시간으로 전달할 때 사용
  • 장점:
    • ✅ 단방향 스트림으로 간단하게 구현 가능
    • ✅ HTTP 표준 기반으로 대부분의 환경에서 지원됨
    • ✅ 자동 재연결 메커니즘 내장
  • 사용 사례:
    • 📊 실시간 데이터 스트리밍이 필요한 MCP 서버
    • 🔍 지속적인 모니터링 정보를 LLM에게 제공해야 하는 경우
    • 🌐 웹 기반 MCP 클라이언트 구현

🔧 기타 활용되는 통신 방식

  • WebSocket: 복잡한 양방향 통신이 필요한 고급 MCP 서버 구현에서 사용
  • HTTP API: 외부 서비스와 통합되는 MCP 서버에서 API와 통신할 때 사용
  • SSH: 원격 서버에 접속하여 명령을 실행하는 특수한 경우에 사용

💡 참고: MCP의 모든 메시지는 JSON-RPC 2.0 형식을 따르지만, 이는 통신 프로토콜이 아닌 메시지 구조화 형식입니다.

📝 MCP 메시지 예시

  1. 초기화 요청 예시 (Initialization Request)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "initialize",
      "params": {
        "clientInfo": {
          "name": "claude-desktop",
          "version": "1.0.0"
        },
        "capabilities": {
          "resources": true,
          "tools": true,
          "prompts": true,
          "sampling": true
        }
      }
    }
    
  2. 리소스 요청 예시 (Resource Request)

    1
    2
    3
    4
    5
    6
    7
    8
    
    {
      "jsonrpc": "2.0",
      "id": 2,
      "method": "resources/get",
      "params": {
        "uri": "file:///home/user/documents/example.txt"
      }
    }
    
  3. 툴 실행 요청 예시 (Tool Execution Request)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    {
      "jsonrpc": "2.0",
      "id": 3,
      "method": "tools/execute",
      "params": {
        "name": "search",
        "arguments": {
          "query": "현재 서울의 날씨"
        }
      }
    }
    
  4. 알림 메시지 예시 (Notification)

    1
    2
    3
    4
    5
    6
    7
    8
    
    {
      "jsonrpc": "2.0",
      "method": "notifications/log",
      "params": {
        "level": "info",
        "message": "사용자가 새 파일을 열었습니다"
      }
    }
    
  5. 종료 요청 예시 (Shutdown Request)

    1
    2
    3
    4
    5
    6
    
    {
      "jsonrpc": "2.0",
      "id": 10,
      "method": "shutdown",
      "params": {}
    }