Model Context Protocol(MCP) 자세하게 알아보기

MCP는 Anthropic에 의해 오픈소스로 공개된 Model Context Protocol입니다. 여러 플랫폼들과 통합 및 다양한 데이터 소스와 도구에 연결하는 표준화된 방법을 제공하고 있으며 이를 활용하여 사용하는 AI 서비스와 통합하는 방법을 알아봅니다.

Model Context Protocol(MCP) 자세하게 알아보기
Photo by Solen Feyissa / Unsplash

개요

AI Agent에 대한 개발을 진행하며, 이를 수행하기 위한 여러가지 방법들을 확인해보고 있습니다.

그 중 Anthropic에 의해 오픈소스로 공개된 Model Context Protocol에 대해 알게되었고 여러 플랫폼들과 통합 및 다양한 데이터 소스와 도구에 연결하는 표준화된 방법을 제공한다는 것을 알게되었습니다.

해당 문서에서는 Model Context Protocol에 대한 개념을 정리하고 간단하게 테스트 한 내용들을 정리하였습니다.

Model Context Protocol란?

모델 컨텍스트 프로토콜(Model Context Protocol, MCP)은 애플리케이션이 LLM(대규모 언어 모델)에 컨텍스트를 제공하는 방식을 표준화하는 오픈 프로토콜입니다.

MCP는 AI 애플리케이션을 위한 "USB-C 포트"와 같다고 할 수 있습니다. USB-C가 다양한 주변기기와 액세서리에 연결하는 표준화된 방법을 제공하듯이, AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준화된 방법을 제공하여 AI 모델의 성능과 활용도를 높히기 위해 사용하는 방식입니다.

구조

MCP는 호스트와 클라이언트-서버라는 3티어 아키텍쳐로 구성되며, 통신을 위해 JSON-RPC 메시지 포맷을 사용합니다. 각 계층 별 역할은 다음과 같습니다.

1. MCP 호스트 (Host)

  • Claude Desktop, IDE, AI 도구 등 MCP를 통해 데이터에 접근하고자 하는 애플리케이션
  • 사용자와 직접 상호작용하는 인터페이스 제공
  • 여러 MCP 서버에 동시에 연결 가능

사용자 인터페이스, 클라이언트, 권한 및 인증 등 보안 관리가 필요합니다.

2. MCP 클라이언트 (Client)

  • 서버와 1:1 전용 연결을 유지하는 프로토콜 클라이언트
  • 호스트 애플리케이션이 서버와 통신할 수 있도록 함
  • 프로토콜 명세에 따라 서버와 메시지 교환 및 라우팅 처리
  • 서버 리소스에 대한 구독을 유지하고 변경될 때 이벤트를 처리할 수 있습니다.

서버 메시지를 처리하며 통신을 수행합니다.

3. MCP 서버 (Server)

  • 표준화된 모델 컨텍스트 프로토콜을 통해 특정 기능을 노출하는 경량 프로그램으로 리소스(읽기 전용), 도구, 프롬프트를 탐색합니다.
  • 각 서버는 특정 데이터 소스나 도구에 대한 접근 제공
  • 로컬 데이터 소스와 원격 서비스로 구성됩니다.
    • 사용자의 로컬 환경 내에 있는 정보 소스
      • 파일시스템, 설치된 소프트웨어 등..
    • 인터넷을 통해 사용 가능한 외부 시스템(예시: API)
      • Google Drive MCP 서버, GitHub MCP 서버, Postgres MCP 서버 등

기능 및 리소스를 제공하는 컴포넌트로 AI 모델이 주어진 컨텍스트에 따라 서버에 연결된 도구를 자동으로 발견하고 호출할 수 있게 해줍니다.

MCP 유형 및 세부 사항

JSON-RPC 2.0을 메시징 형식으로 사용하며 기본 메시지 유형을 정의하고 있습니다. 이를 통해 동기 요청(응답 포함) 및 비동기 알림/이벤트가 모두 지원됩니다.

  • Request, Response, Notifications…

이러한 연결을 시작하고 지속적으로 통신하기 위한 방법은 두 가지로 분류됩니다.

1. 로컬(stdio) 전송

MCP 서버가 로컬 프로세스 (예: CLI 프로그램 또는 호스트가 실행한 하위 프로세스)로 실행되는 경우, 클라이언트와 서버는 해당 프로세스의 표준 입력/출력 스트림을 통해 통신할 수 있습니다. 이는 Language Server Protocol(개발 환경 - IDE)이 종종 언어 서버인 stdio를 통해 통신하는 Child Process(Python…)를 실행하는 방식과 유사합니다.

  • 부모 프로세스는 자식 프로세스의 표준 입력을 통해 데이터 입력
  • 자식 프로세스의 표준 출력에서 데이터를 출력하고 부모가 읽으검

이를 통해 효율적이고 로컬 도구에 대한 네트워크 오버헤드를 피할 수 있습니다.

2. 원격(HTTP + SSE) 전송

서버가 원격 서비스이거나 별도로 실행되는 경우(예: 서버 또는 클라우드에서) MCP는 HTTP를 통해 작동할 수 있습니다. 이 모드에서 요청은 HTTP POST로 전송될 수 있으며 SSE(Server-Sent Events)를 통해서 버가 응답 또는 이벤트를 클라이언트로 다시 푸시하는 데 사용할 수 있습니다.

SSE(Server-Sent Events)는 서버가 HTTP 연결을 통해 데이터를 스트리밍할 수 있게 해주는데, 이는 도구의 결과가 크거나 서버가 점진적 업데이트를 보낼 때 특히 유용합니다(스트리밍, 진행 상황 업데이트 등). 어느 경우든, 전송 계층(transport layer)을 통해 JSON-RPC 메시지를 안정적으로 전달할 수 있습니다.

Notion Image

이러한 초기화를 거쳐 클라이언트는 호스트 및 추론 중 요청에 따라 서버가 무엇을 할 수 있는지 확인하고 요청을 수행하는 작업을 반복하게 됩니다. MCP에서는 이를 수행하기 위해 각 서버가 어떤 기능을 할 수 있는지 정리하기 위한 표준 방법을 정의하고 있으며 간략하게 정리해보면 다음과 같습니다.

  • tools/list
    • 서버에서 제공하는 모든 도구 목록과 각 도구의 이름, 설명, 입력 스키마와 같은 세부 정보를 가져옵니다.
  • Tools
    • list를 통해 도구를 호출하고자 한다면 클라이언트에서 tools/call 과 사용할 인수를 입력하여 서버에 요청을 보내고 받습니다.
  • resources/read
    • 요청에 따라 context가 더 필요한 경우엔 마찬가지로 MCP Client가 MCP Server로 요청을 전송합니다. resources/read 식별자와 함께 관련 요청을 보내고 컨텐츠를 반환받습니다.
  • prompts/get
    • 호스트, 사용자에게 대화를 안내하기 위해 특정 템플릿을 선택할 때 Prompt를 활용할 수 있습니다.

세션 및 상태 관리

단순히 일회성 연결이 아닌 클라이언트 - 서버 구조상에서 상태를 유지하며 지속적인 연결을 위해 설계됐습니다. 수명 주기를 클라이언트에서 관리하며, 이를 통해 애플리케이션이 실행 중인 동안 계속 실행하거나 서버가 알림이나 이벤트를 제공하는 경우 비동기로 처리할 수 있게 됩니다. 또한 MCP는 stateful하여 서버 호출간 context 데이터를 유지할 수 있습니다.

이러한 모든 세부 정보(메서드, 메시지 형식, 오류 처리 등)는 MCP 사양 에 정의되어 있습니다 . 목표는 모든 MCP 호환 클라이언트와 서버가 이러한 동일한 메서드와 메시지 유형을 구현하여 상호 운용할 수 있도록 하는 것입니다. 따라서 목적은 개발자가 네트워킹 같은 세부정보를 확인할 필요없이 도구와 데이터에 집중할 수 있도록 만들어주는 것이며, MCP를 통해 여러 AI(Open AI GPT-4(Function calling) 등)을 간 통합을 목적으로 합니다.

MCP 테스트

  1. conda를 사용하여 가상 환경을 생성합니다.
conda create -n mcp_test python=3.8
conda activate mcp_test
  1. 패키지 설치
pip install uv
pip install "mcp[cli]"
  1. 도구와 리소스 기능을 각각 정의하며 어떻게 사용되는지 확인합니다.
# Initialize an MCP server instance with a name
# FastMCP는 MCP 서버를 쉽게 구축할 수 있는 클래스입니다.
mcp = FastMCP("Demo Server")

# Define a tool function (simple addition)
# 데코레이터는 함수를 MCP Tool로 변환합니다.
# 기본적으로 도구의 이름은 함수 이름(add)이 되며, SDK는 type hint와 docstring을 사용하여 입력 스키마와 설명을 자동으로 생성합니다
@mcp.tool() 
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b


# Define a resource function (personalized greeting)
# resource는 URI 패턴으로 등록합니다.
# 동적 경로(이름)가 있는 URI 체계를 통해 액세스할 수 있으며 docstring을 통해 함수를 설명합니다.
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a greeting message for the given name."""
    return f"Hello, {name}!"
mcp dev server.py                 
Starting MCP inspector...
Proxy server listening on port 3000

🔍 MCP Inspector is up and running at http://localhost:5173 🚀

접속해보면 각 툴과 리소스를 확인할 수 있으며 좌측 Arguments 등을 통해 Cursor 혹은 Cluade Desktop과 통합이 가능합니다.

Notion Image
Notion Image

OpenSource MCP Server

Glama, Smithery 같은 잘 알려진 MCP Server들이 존재합니다.

잘 알려진 도구들이 존재하며 이를 Cursor와 통합도 가능합니다.

Notion Image
Notion Image
Notion Image

Cursor에 MCP를 연결하였습니다.

Notion Image

Cursor Chat에서 Agent를 사용합니다.

Notion Image

프롬프트를 입력해보면 해당 MCP 프로토콜을 읽어오게 되며 다양한 정보를 스스로 검색하며 출력합니다.

사용자의 승인 과정이 필요하지만 Yolo를 통해 스스로 판단하고 행동하게 설정할 수 있습니다.

“You can enable Yolo mode to allow Agent to automatically run MCP tools without requiring approval, similar to how terminal commands are executed. Read more about Yolo mode and how to enable it here.”

Notion Image
Notion Image

Cursor에서는 한 번의 추론 진행 중 처음 25번의 도구 호출만 하나의 쿼타를 사용하는 것으로 파악됩니다. 이후 추가적인 도구 호출에는 쿼타가 소모되는 것으로 파악되기 때문에 꼭 필요한 도구 개수만 설정하는 것도 중요합니다. 추가적으로 MCP Resource의 경우엔 사용이 불가능하며, 최대 등록 가능한 tools 개수는 40개입니다.

“도구는 현재 Cursor에서 사용할 수 있으며, Cursor가 MCP 서버에서 제공하는 도구를 실행하고 추가 단계에서 출력을 사용할 수 있도록 합니다. 그러나 리소스는 아직 Cursor에서 지원되지 않습니다. 향후 릴리스에서 리소스 지원을 추가하고자 합니다.”

정리

MCP는 앞으로 AI Agent 구성에 있어 매우 중요하게 사용될 것으로 생각됩니다. 표준 프로토콜과 구조, 실제 테스트를 진행해보며 다양한 방식으로 사용할 수 있다는 것을 확인했습니다. 앞으로의 발전이 기대되며 여러 방면으로 써보고 추가 글을 작성하겠습니다.

Reference