FastMCP
카테고리: AI
FastMCP (v2)
1. FastMCP란?
- MCP 프로토콜을 실제 구현한 FastAPI 기반의 MCP 서버
- LLM이 툴을 호출하고, 그 결과를 받아서 다시 응답할 수 있게 도와줌
2. FastMCP v2는 왜 만들어졌을까?
- FastMCP v2는 다음과 같은 목표로 만들어짐
- 툴(Tool)을 코드 없이 JSON 기반 선언으로 등록
- LLM과 연동할 수 있도록 입력/출력 스키마 명확화
- Slack, Notion, DB 등 외부 API와 표준화된 방식으로 통신
- 다양한 실행 방식 지원 (HTTP, Shell, Python function 등)
3. 🚀 FastMCP v1 vs v2 비교
항목 | FastMCP v1 | FastMCP v2 |
---|---|---|
툴 등록 방식 | Python 코드에 직접 Tool 클래스 정의 후 FastAPI에 등록 | JSON 기반 Tool 메타데이터 사용 → 동적으로 툴 등록 |
입출력 처리 방식 | 함수 시그니처 기반, 설명(Description) 수동 작성 | pydantic 모델로 명세 자동화 + description 자동 포함 |
LLM 호출 방식 | 단순 REST API 또는 stdio 기반 호출 |
Tool manifest를 기준으로 호출 구조 자동화 (OpenAI Function-calling/Tool-calling 호환) |
도구 실행 | 함수 실행만 지원 | Shell 명령, HTTP 요청, Python 코드 실행 등 다양한 방식 지원 |
표준화 수준 | 각 툴마다 독립적 정의 | MCP ToolSchema (v2 spec) 기반으로 명확한 표준화 |
확장성 | 도구 추가 시 코드 수정 필요 | 도구를 JSON 파일 하나로 등록 가능 (Hot Reload 준비 중) |
MCP 호환성 | 내부 MCP 구현 중심 | 외부 Agent, LLM Framework (LangChain 등)과의 직접 연동 고려 |
유지보수 | 내부 규칙 이해가 필요함 | 구조와 명세가 분리되어 유지보수 쉬움 |
4. FastMCP v2 구성요소
(1) 🔧 Tools (도구)
LLM이 호출할 수 있는 함수들
- “Slack에 메시지 보내줘”, “캘린더 일정 등록해줘” 같은 작업을 수행하는 실행 단위
tool_name
,input_schema
,run
정보로 구성- JSON으로 선언되며 LLM이 직접 호출 가능
-
예시
{ "name": "send_slack_message", "description": "슬랙 채널에 메시지를 보냅니다.", "input_schema": { "type": "object", "properties": { "channel": {"type": "string"}, "message": {"type": "string"} }, "required": ["channel", "message"] }, "run": { "type": "http", "url": "https://slack.com/api/chat.postMessage", "method": "POST", ... } }
(2) 📚 Resources (리소스)
LLM이 읽을 수 있는 데이터 소스. (툴처럼 ‘실행’하지 않고 ‘참조’만 하는 외부 데이터들)
- 사전 로드된 문서, DB snapshot, 설정 정보 등
- 툴 호출 전에 맥락(Context)을 제공하거나 필터링에 사용됨
- 예: 사용자의 과거 일정, 슬랙 채널 목록, 프로젝트 구성 정보 등
-
예시
{ "channels": [ {"id": "C1234", "name": "#general"}, {"id": "C5678", "name": "#dev-team"} ] }
(3) 💬 Prompts (프롬프트)
재사용 가능한 LLM 메시지 템플릿
- LLM에게 특정 툴을 어떻게 사용해야 할지 역할(Role)을 주거나, 입력값을 정제하기 위한 구조화된 메시지
- Prompt Template에 변수 바인딩 가능 (Jinja2 스타일)
- LangChain의 PromptTemplate과 유사하지만 MCP에 맞춤화됨
-
예시
''' 사용자는 다음 메시지를 전송하고 싶어합니다: 채널: 내용: 다음 Tool을 사용해서 전송하세요: send_slack_message '''
(4) 🧠 Context (컨텍스트)
세션 정보와 기능에 대한 접근
- 대화의 흐름/상태를 저장함으로써 멀티턴 대화나 사용자별 상황 처리 가능
- 예1 : 사용자의 user_id, role, 선택된 프로젝트, 최근 사용한 툴 등
- 예2 : LLM이 tool 호출 시 적절한 리소스를 연결할 수 있도록 도움
-
예시
{ "user_id": "haebin123", "current_project": "EV-charger", "available_tools": ["send_slack_message", "get_calendar_events"], "last_used_channel": "C1234" }
5. 🎯 간단한 예시 : Slack 메시지 보내기
- 사용자가 “팀에게 알림 보내줘”라고 말함
- Prompt가 이 요청을 기반으로 Slack Tool용 입력 템플릿 생성
- Resource를 통해 “#general” 채널의 ID를 확인
- Context에서 현재 사용자가 접근 가능한 채널인지 확인
- Tool (send_slack_message)을 호출
- 결과를 사용자에게 요약해 응답
구성요소와 목적을 예시와 연결지으면…
구성요소 | 목적 | 예시 |
---|---|---|
Tools | 실행 가능한 작업 정의 | 슬랙 메시지 전송 |
Resources | 참조용 데이터 | 채널 목록, 일정 |
Prompts | LLM에 줄 질문 틀 | 메시지 전송 프롬프트 |
Context | 세션/사용자 상태 추적 | 사용자 ID, 이전 대화 |
댓글 남기기