← Назад к курсу

Создание MCP сервера с использование FastMCP

FastMCP — это высокоуровневая Python-библиотека для быстрой разработки серверов и клиентов по протоколу Model Context Protocol (MCP). Она избавляет разработчиков от рутинной работы с низкоуровневыми деталями протокола (сериализация, валидация, обработка ошибок), позволяя сосредоточиться на логике ваших инструментов и данных.

Согласно информации из различных источников, FastMCP настолько популярен, что сегодня до 70% всех MCP-серверов работают на основе его кода.

🚀 Быстрый старт: Установка и первый сервер

Установить FastMCP рекомендуется с помощью пакетного менеджера uv, который также потребуется для удобного развертывания через CLI:

uv pip install fastmcp

Создать и запустить ваш первый сервер можно в несколько строк кода. Это простейший "Hello World" пример, демонстрирующий базовую структуру:

# server.py
from fastmcp import FastMCP

# 1. Создаем экземпляр сервера
mcp = FastMCP("My First Server")

# 2. Создаем инструмент с помощью декоратора
@mcp.tool
def greet(name: str) -> str:
    """Приветствует пользователя по имени."""
    return f"Hello, {name}!"

# 3. Запускаем сервер
if __name__ == "__main__":
    mcp.run()  # По умолчанию использует транспорт stdio

Запустить этот сервер можно прямо из командной строки:

fastmcp run server.py

🧱 Основные компоненты FastMCP

FastMCP позволяет создавать три типа компонентов, которые будут доступны LLM. Ключевое требование для всех — качественные докстринги, так как по ним языковая модель понимает, как и когда использовать ваш инструмент.

1. Инструменты (Tools) — функции, которые LLM может вызывать для выполнения действий (аналог POST-запросов). Это основа интерактивности.

from pydantic import BaseModel

# Использование Pydantic для сложных аргументов
class UserData(BaseModel):
    name: str
    email: str

@mcp.tool()
def register_user(user: UserData, is_premium: bool = False) -> dict:
    """Регистрирует нового пользователя в системе.
    
    Args:
        user: Данные нового пользователя.
        is_premium: Флаг премиум-подписки. По умолчанию False.
    """
    # Логика регистрации...
    return {"status": "success", "user_id": 123}

2. Ресурсы (Resources) — предоставляют данные только для чтения (аналог GET-запросов). URI может быть шаблонным.

# Статический ресурс
@mcp.resource("config://app/version")
def get_version() -> str:
    """Возвращает текущую версию приложения."""
    return "2.1.0"

# Динамический ресурс с параметром из URI
@mcp.resource("data://users/{user_id}/profile")
def get_user_profile(user_id: str) -> dict:
    """Возвращает профиль пользователя по его ID."""
    return {"id": user_id, "name": "John Doe"}

3. Промпты (Prompts) — параметризованные шаблоны для взаимодействия с LLM.

@mcp.prompt()
def create_summary(text: str, language: str = "russian") -> str:
    """Создает промпт для суммаризации текста.
    
    Args:
        text: Текст, который нужно суммаризировать.
        language: Язык итогового резюме.
    """
    return f"Пожалуйста, кратко суммируй следующий текст на {language}:\n\n{text}"

💡 Полезные продвинутые примеры

Пример 1: Инструмент с прогрессом и логированием
Для длительных операций можно использовать Context для отправки клиенту промежуточных сообщений о прогрессе.

from fastmcp import Context

@mcp.tool()
async def process_data(file_uri: str, ctx: Context) -> str:
    """Обрабатывает большой файл, отчеты о прогрессе.
    
    Args:
        file_uri: URI ресурса с файлом для обработки.
    """
    await ctx.info(f"Начинаю обработку файла: {file_uri}")
    
    # Чтение файла через контекст
    resource = await ctx.read_resource(file_uri)
    lines = resource[0].content.splitlines()
    
    for i, line in enumerate(lines):
        # ... обработка строки ...
        if (i + 1) % 100 == 0:  # Отчет каждые 100 строк
            await ctx.report_progress(i + 1, len(lines))
    
    return f"Обработано {len(lines)} строк."

Пример 2: Практичный сервис погоды
Этот пример из туториала показывает, как сделать инструмент для работы с внешним API.

import urllib.parse
import urllib.request
from fastmcp import FastMCP

mcp = FastMCP("Weather Service")

@mcp.tool()
def get_weather(city: str) -> str:
    """Получает текущую погоду для указанного города.
    
    Args:
        city (str): Название города (например, 'Moscow').
    """
    try:
        url_city = urllib.parse.quote_plus(city)
        url = f'https://wttr.in/{url_city}?format=%C+%t'
        response = urllib.request.urlopen(url).read()
        return response.decode('utf-8')
    except Exception:
        return "Не удалось получить данные о погоде."

Пример 3: Фильтрация и тегирование инструментов
Вы можете группировать и управлять видимостью инструментов с помощью тегов, что полезно для больших серверов.

@mcp.tool(
    tags={"database", "write", "internal"},
    description="Добавляет запись во внутреннюю БД. Только для админов."
)
def db_insert(query: str) -> str:
    # Только для внутреннего использования
    pass

# При создании сервера можно фильтровать инструменты по тегам
mcp = FastMCP(
    "Admin Server",
    include_tags=["internal"],  # Показывать только internal-инструменты
    exclude_tags=["deprecated"] # Скрывать устаревшие
)

🌐 Транспорты и развертывание сервера

FastMCP поддерживает разные способы связи с клиентами, что определяет, как вы будете использовать сервер:

Транспорт Запуск Использование
STDIO (по умолчанию) mcp.run() или fastmcp run server.py Локальная разработка, Claude Desktop, Cursor
HTTP mcp.run(transport="http", port=8000) Удаленный доступ, несколько клиентов, сетевое развертывание

Для подключения к популярным клиентам, таким как Claude Desktop, потребуется конфигурационный файл:

// Конфигурация для Claude Desktop (mcp-servers.json)
{
  "mcpServers": {
    "my-server": {
      "command": "python",
      "args": ["/полный/путь/к/server.py"]
    }
  }
}

🛣️ Дальнейшие шаги и ресурсы

Чтобы продолжить изучение, рекомендую следующие практические шаги и ресурсы:

  • Сообщество и обучение: Присоединяйтесь к FastMCP Discord-сообществу . Полезные примеры и видео-туториалы собраны в разделе Community Showcase официального сайта .
  • Отладка: Используйте MCP Inspector для тестирования сервера без подключения к полноценному клиенту: npx @modelcontextprotocol/inspector python server.py .
  • Производственное развертывание: Изучите Prefect Horizon — управляемую платформу от создателей FastMCP для хостинга, аутентификации и мониторинга MCP-серверов .
  • Поиск готовых решений: Ознакомьтесь с Contrib Modules — коллекцией готовых модулей от сообщества, которые расширяют возможности FastMCP .

💎 Ключевые выводы

  1. FastMCP — это стандартный и самый популярный фреймворк для создания MCP-серверов на Python, который абстрагирует сложности протокола .
  2. Качество документации (docstrings) ваших функций напрямую влияет на способность LLM правильно их использовать .
  3. Выбор транспорта (stdio/HTTP) зависит от сценария: stdio для локальной интеграции с приложениями, HTTP для сетевого доступа .
  4. Используйте Context для сложных операций, чтобы отправлять логи и прогресс, а Pydantic — для строгой валидации входных данных .

Попробуйте начать с простого сервера с одним инструментом, подключите его к Claude Desktop или MCP Inspector, чтобы увидеть принцип работы вживую, а затем постепенно добавляйте новую функциональность.