[MCP]
- [DEVELOP] MCP(Model Context Protocol)
- [DEVELOP] MCP claude 적용하고 사용해보기
- [MCP] 통신 구조 flow 심층분석
- [MCP] AI Agent이용한 mcp서버 테스트 환경 구축해보자
통신 프로토콜은 AI와 애플리케이션이 서로 대화하는 언어와 같습니다. 각각의 프로토콜은 저마다의 강점과 특성을 가지고 있으며, 목적에 맞게 선택하는 것이 중요합니다.
🔌 MCP 통신 구조 심층 분석
MCP(Model Context Protocol)는 AI 모델과 어플리케이션 간의 표준화된 통신 방식을 제공합니다. 이 프로토콜의 통신 구조와 메시지 흐름을 살펴보겠습니다.
🏛️ 클라이언트-서버 아키텍처
MCP는 다음과 같은 세 가지 주요 구성 요소로 이루어진 아키텍처를 가집니다:
- 🖥️ 호스트(Host): LLM 어플리케이션이 주로 해당되며, 연결을 초기화하는 역할을 합니다.
- 🔄 클라이언트(Client): 서버와 1:1 연결을 유지하며 통신하는 역할로, 호스트 내에 존재합니다.
- ⚙️ 서버(Server): 컨텍스트, 툴, 프롬프트 등의 정보를 클라이언트에게 전달하는 역할을 담당합니다.
📨 메시지 프로토콜 형식
MCP의 메시지 프로토콜은 JSON-RPC 2.0
구조를 기반으로 하며, 다음 세 가지 형태로 구성됩니다:
- 📤 Requests: 명령 실행을 위한 요청 메시지
- 📥 Responses: 요청에 대한 응답 메시지
- 🔔 Notifications: 응답을 받지 않는 단방향 통지 메시지
🔄 통신 흐름
MCP의 통신 과정은 다음과 같은 순서로 진행됩니다:
- 🚀 초기화(Initialization): 서버와 클라이언트 간 연결 설정
- ⚡ 실행(Operation): 실제 데이터 및 명령 교환
- 🔚 종료(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에서 사용하는 통신 방식
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 메시지 예시
-
초기화 요청 예시 (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 } } }
-
리소스 요청 예시 (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" } }
-
툴 실행 요청 예시 (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": "현재 서울의 날씨" } } }
-
알림 메시지 예시 (Notification)
1 2 3 4 5 6 7 8
{ "jsonrpc": "2.0", "method": "notifications/log", "params": { "level": "info", "message": "사용자가 새 파일을 열었습니다" } }
-
종료 요청 예시 (Shutdown Request)
1 2 3 4 5 6
{ "jsonrpc": "2.0", "id": 10, "method": "shutdown", "params": {} }