회사에서 MCP를 사용한 큰 시스템 구축에 참여할 것 같아서,
같이 작업을 하게 될 한 분과 같이 우선 MCP 스터디를 만들어서 진행해 보기로 했다.
막상 시작하려니 뭘 할까.. 하다가 우선 뭐라도 만들어보기로 했다.
뭐라도 만들어 보려니, MCP의 동작 원리에 대해 이론적으로 아는 게 없어서 주제도 못 정하는 상황.
그래서 우선 MCP에 대해 이론적인 부분부터 공부해 보려고 한다.
MCP 정의
MCP: Model Context Protocol: 2024년 11월 Anthropic이 발표
LLM 기반 AI 애플리케이션과 외부와의 통합을 표준화 하는 프로토콜
- AI와 외부 데이터 간의 USB-C 포트 역할 담당
- JSON-RPC 2.0 기반
MCP 구성 요소
- Host: Claude Desktop, Cursor IDE, Claude Code, …
- Client: 호스트 내부의 프로토콜 커넥터, 서버와 1:1 상태유지 연결
- Server: 특정 기능을 MCP 인터페이스로 노출하는 프로그램
MCP 핵심 설계 원칙
- Protocol-agnostic
- 특정 전송 프로토콜(HTTP, WebSocket 등)에 종속되지 않아 다양한 통신 방식 위에서 동작할 수 있다.
- Stateful Connections
- 상태 기반으로, LLM과 서버 간 맥락을 지속적으로 유지 가능
- Capability-based negotiation
- LLM과 MCP가 서로 제공하는 기능들에서, 필요한 기능을 협상하여 사용 가능한 기능을 동적으로 결정한다.
- Modular Design
- 각 구성요소 (Server, Client, Tool, Authority, etc)가 독립적으로 설계되어 확장, 교체, 테스트에 용이
JSON-RPC 2.0 기반 메시지 시스템
- Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "weather",
"arguments": {"location": "서울"}
}
}
- Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {"temperature": "22°C", "humidity": "65%"},
}
// OR
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid params"
}
}
- Notification
{
"jsonrpc": "2.0",
"method": "initialized",
"params": {}
}
MCP의 3단계 생명주기 관리
- Initialization
- 프로토콜 버전 협상, capability 교환이 이루어짐
- 클라이언트가 initialize 요청 → 서버는 자신의 capabilities와 정보로 응답. 버전 협상 완료됨
- Operation
- 클라이언트가 initialized 알림을 전송한 후 시작
- 협상됨 capabilities에 따른 메시지 교환이 이루어짐
- Shutdown
- 연결의 Graceful Termintation
클라이언트는 initialize 응답 전까지 ping 외 다른 요청을 금지하며,
서버는 initialized 알림 전까지 ping과 logging 외 다른 요청을 금지한다.
MCP의 핵심 구성 요소
- Tools (Model-controlled)
- LLM이 제어하는 함수
- 외부 시스템과의 상호작용 담당
- Resources (Application-controlled)
- 애플리케이션이 제어하는 데이터
- LLM에게 추가 context를 제공하는 읽기 전용 인터페이스
- Prompts (User-controlled)
- 사용자가 제어하는 템플릿
Tool이란?
LLM이 특정 기능을 수행할 수 있도록 해주는 함수형 인터페이스
MCP 서버는 LLM이 호출 가능한 함수들을 노출한다.
(e.g. DB 조회, 외부 API 호출, 파일 시스템 탐색, …)
각 tool은 name, description, inputSchema, outputSchema 등의 metadata로 정의되며,
이를 통해 모델은 해당 tool에 대해 이해하게 된다.
- Tool의 구성 요소
구성 요소 | 설명 |
---|---|
name | tool을 유일하게 식별하는 식별자 |
title | 사람에게 보여줄 수 있는 읽기 쉬운 이름 (optional) |
description | tool의 기능을 설명하는 문장 |
inputSchema | JSON Schema 형식으로 입력 매개변수를 정의 |
outputSchema | (optional) 예상되는 출력 구조를 정의 |
annotations | 추가적 설명이나 행위 관련 메타정보 (예: audience, priority) |
이러한 tool을 통해 LLM이 외부 시스템과 통신하거나, 특정 작업을 위한 맞춤형 기능을 수행할 수 있게 된다.
TypeScript 기반 타입 안정성
MCP는 TypeScript 스키마를 SOT로 사용하여 타입 안정성을 보장한다.
schema.ts
에 정의된 인터페이스들은 JSON Schema로도 자동 생성된다.
Reference
https://modelcontextprotocol.io/specification/2025-06-18
'Study > MCP' 카테고리의 다른 글
MCP를 통한 LLM의 행동 유도 (2) | 2025.08.04 |
---|