Создание 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 .
💎 Ключевые выводы
- FastMCP — это стандартный и самый популярный фреймворк для создания MCP-серверов на Python, который абстрагирует сложности протокола .
- Качество документации (docstrings) ваших функций напрямую влияет на способность LLM правильно их использовать .
- Выбор транспорта (stdio/HTTP) зависит от сценария: stdio для локальной интеграции с приложениями, HTTP для сетевого доступа .
- Используйте Context для сложных операций, чтобы отправлять логи и прогресс, а Pydantic — для строгой валидации входных данных .
Попробуйте начать с простого сервера с одним инструментом, подключите его к Claude Desktop или MCP Inspector, чтобы увидеть принцип работы вживую, а затем постепенно добавляйте новую функциональность.