FastMCP

Date:     Updated:

카테고리:

태그:

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 메시지 보내기

  1. 사용자가 “팀에게 알림 보내줘”라고 말함
  2. Prompt가 이 요청을 기반으로 Slack Tool용 입력 템플릿 생성
  3. Resource를 통해 “#general” 채널의 ID를 확인
  4. Context에서 현재 사용자가 접근 가능한 채널인지 확인
  5. Tool (send_slack_message)을 호출
  6. 결과를 사용자에게 요약해 응답



구성요소와 목적을 예시와 연결지으면…

구성요소 목적 예시
Tools 실행 가능한 작업 정의 슬랙 메시지 전송
Resources 참조용 데이터 채널 목록, 일정
Prompts LLM에 줄 질문 틀 메시지 전송 프롬프트
Context 세션/사용자 상태 추적 사용자 ID, 이전 대화

AI 카테고리 내 다른 글 보러가기

첫 번째 글입니다 가장 최근 글입니다

댓글 남기기