Содержание
FastMCP — это Python-фреймворк от Prefect (25 800+ звёзд на GitHub) для сборки MCP-серверов и клиентов. Вместо ручного написания JSON-RPC обработчиков и схем вы просто вешаете декоратор @mcp.tool на обычную Python-функцию — и она становится инструментом, который LLM может вызывать. FastMCP 3.0 (май 2026) добавил провайдеры, трансформы и hot-reload. По данным Prefect, какая-либо версия FastMCP используется в 70% MCP-серверов из всех языков.
MCP (Model Context Protocol) от Anthropic стандартизирует подключение LLM к внешним данным и инструментам. Но писать MCP-сервер вручную — это JSON-RPC, схемы инструментов, транспорт, обработка ошибок и протокол жизненного цикла. FastMCP берёт всё это на себя. Задача этой статьи — показать, как за один вечер собрать рабочий MCP-сервер под свои задачи и не сойти с ума.
Что такое FastMCP и зачем он нужен
FastMCP — это open-source фреймворк на Python, который устраняет разрыв между обычной Python-функцией и MCP-совместимым инструментом для LLM. Без FastMCP разработка MCP-сервера выглядит так: вы пишете обработчик JSON-RPC, вручную описываете JSON Schema для каждого инструмента, реализуете транспорт (STDIO или SSE), обрабатываете протокол инициализации и завершения. С FastMCP — просто функция с декоратором.
История проекта началась в ноябре 2024, когда основатель Prefect Джереми Лоуин выложил первую версию. К середине 2025 FastMCP 1.0 настолько стал стандартом де-факто, что его код был включён в официальный MCP Python SDK от Anthropic. Сейчас самостоятельный проект поддерживается отдельно, скачивается миллион раз в день и версия 3.0 (вышла в мае 2026) — это уже не просто обёртка, а полноценная платформа с провайдерами, трансформами и hot-reload.
Основа FastMCP — три примитива (документация называет их pillars):
- Servers — сервер, который публикует инструменты, ресурсы и промпты для LLM
- Clients — клиент, который подключается к любому MCP-серверу (локальному или удалённому)
- Apps — интерактивные UI, которые рендерятся прямо в диалоге с LLM
Проще всего понять FastMCP на конкретном коде. Дальше — пошаговая инструкция.
Установка и первый сервер за 5 минут
FastMCP требует Python 3.10+. Установка через uv — менеджер пакетов от Astral — самый надёжный способ:
uv pip install fastmcp
Если uv не установлен, подойдёт обычный pip:
pip install fastmcp
Давайте напишем минимальный сервер. Создайте файл server.py:
from fastmcp import FastMCP
mcp = FastMCP("Demo")
@mcp.tool
def add(a: int, b: int) -> int:
\"\"\"Складывает два числа\"\"\"
return a + b
@mcp.tool
def get_weather(city: str) -> str:
\"\"\"Возвращает погоду для города (демо-версия)\"\"\"
return f"Солнечно, +22°C, {city}"
if __name__ == "__main__":
mcp.run()
Запустите сервер:
python server.py
По умолчанию FastMCP использует STDIO-транспорт — данные передаются через стандартный ввод/вывод. Это стандартный режим для интеграции с Claude Desktop, Cursor и другими инструментами, которые запускают MCP-серверы как дочерние процессы. Для тестирования удобно использовать MCP Inspector.
Чтобы запустить сервер с SSE-транспортом (для удалённого доступа):
python -m fastmcp run server.py --transport sse --port 8000
После этого сервер доступен по адресу http://localhost:8000/sse. Подключить его можно из любого MCP-клиента — например, указав URL в конфиге Cursor или в Claude Code.
Tools, Resources, Prompts — три кита FastMCP
FastMCP поддерживает три типа объектов, которые определены в спецификации MCP. Каждый — свой декоратор и своя механика.
Tools — инструменты, которые LLM может вызывать
Инструменты — это функции, которые LLM может вызвать по своей инициативе. FastMCP автоматически генерирует JSON Schema из аннотаций типов и docstring. Это ключевое преимущество перед ручной работой: вы не пишете schema отдельно, она выводится из кода.
@mcp.tool
def search_documents(query: str, limit: int = 5) -> list[dict]:
\"\"\"Ищет документы по текстовому запросу.
Args:
query: Поисковый запрос
limit: Максимум результатов (по умолчанию 5)
\"\"\"
# Здесь может быть RAG-пайплайн, Elasticsearch, что угодно
return [{"title": "Пример", "score": 0.95}]
FastMCP поддерживает асинхронные инструменты:
@mcp.tool
async def fetch_page(url: str) -> str:
\"\"\"Загружает содержимое веб-страницы\"\"\"
import httpx
async with httpx.AsyncClient() as client:
resp = await client.get(url, timeout=10)
return resp.text[:5000]
Resources — данные, которые LLM может читать
Ресурсы — это данные, которые LLM может запросить в любой момент. В отличие от инструментов, ресурсы не выполняют действий — они просто отдают данные. Типичный пример: содержимое файла, строка из базы данных, результат запроса к API.
@mcp.resource("file://{path}")
def get_file(path: str) -> str:
\"\"\"Читает содержимое файла\"\"\"
with open(path, "r") as f:
return f.read()
URI ресурса — это его адрес в пространстве имён MCP. LLM может запросить file://config.yaml или db://users/42 — сервер сам решает, как этот адрес обработать.
Prompts — шаблоны для LLM
Промпты — это готовые шаблоны сообщений, которые LLM может использовать. Полезно для predefined-запросов: «проанализируй код», «напиши тест», «объясни ошибку».
@mcp.prompt
def code_review(code: str) -> str:
\"\"\"Шаблон для код-ревью\"\"\"
return f"Проведи код-ревью следующего кода:\\n\\n```python\\n{code}\\n```"
| Объект | Декоратор | Что делает | Когда использовать |
|---|---|---|---|
| Tool | @mcp.tool |
Выполняет действие, возвращает результат | Запрос к БД, отправка письма, API-вызов |
| Resource | @mcp.resource |
Предоставляет данные по URI | Файлы, документы, строки из БД |
| Prompt | @mcp.prompt |
Формирует шаблон сообщения | Типовые задачи: ревью, рефакторинг, анализ |
Продвинутые возможности: провайдеры и трансформы
FastMCP 3.0 представил архитектуру, которая меняет представление о том, откуда MCP-сервер может брать инструменты. Вместо жёстко зашитых декораторов появились провайдеры (providers) и трансформы (transforms).
Провайдеры — динамические источники инструментов
Провайдер — это компонент, который поставляет инструменты, ресурсы или промпты в сервер. Встроенные провайдеры FastMCP 3.0:
Встроенные провайдеры FastMCP 3.0 включают DecoratorProvider (классические @mcp.tool декораторы), OpenAPIProvider (загружает OpenAPI-спецификацию и автоматически создаёт инструменты для каждого endpoint), FilesystemProvider (читает файлы из директории как ресурсы) и RemoteServerProvider (подключает удалённый MCP-сервер как источник инструментов).
Пример подключения OpenAPI-провайдера:
from fastmcp import FastMCP
from fastmcp.providers import OpenAPIProvider
mcp = FastMCP("API Gateway")
# Все endpoint-ы Petstore становятся инструментами
mcp.add_provider(
OpenAPIProvider("https://petstore.swagger.io/v2/swagger.json")
)
mcp.run()
Это превращает FastMCP в универсальный шлюз: подключили OpenAPI-спецификацию существующего REST API — и LLM может с ним работать без единой строки кода интеграции.
Трансформы — middleware для инструментов
Трансформы — это middleware-цепочки, которые обрабатывают инструменты перед их регистрацией. Типичные сценарии:
Namespace — группировка инструментов по namespace:
from fastmcp.transforms import NamespaceTransform
mcp.add_provider(
OpenAPIProvider("https://api.example.com/openapi.json"),
transforms=[NamespaceTransform("example")]
)
# Все инструменты будут доступны как example_getUser, example_createOrder и т.д.
Auth — проверка прав доступа:
from fastmcp.transforms import AuthTransform
# Только определённые роли могут вызывать определённые инструменты
mcp.add_provider(
internal_provider,
transforms=[AuthTransform({"admin": ["*"], "viewer": ["get_*"]})]
)
Rate limiting — ограничение вызовов:
from fastmcp.transforms import RateLimitTransform
mcp.add_provider(
api_provider,
transforms=[RateLimitTransform(max_calls=100, per_seconds=60)]
)
Hot reload — ещё одна ключевая фича FastMCP 3.0. Сервер автоматически перезагружает инструменты при изменении исходного кода. Запуск:
fastmcp dev server.py
FastMCP следит за файлами через watch-механизм и перезагружает только изменившиеся инструменты без полного переподключения клиентов.
FastMCP vs MCP Python SDK: что выбрать
Главный вопрос, который встаёт перед разработчиком: использовать FastMCP или официальный MCP Python SDK от Anthropic? У обоих подходов есть место, и выбор зависит от задачи.
MCP Python SDK — это низкоуровневая реализация протокола. Вы пишете сервер через класс Server, вручную обрабатываете запросы через handlers, управляете транспортом и сериализацией. Это даёт полный контроль, но требует примерно в 3-5 раз больше кода. SDK подходит, когда нужна нестандартная логика протокола, кастомный транспорт или интеграция в уже существующий сервер на FastAPI/Starlette.
FastMCP — это надстройка, которая делает 80% сценариев тривиальными. Если ваша задача — «сделать MCP-сервер за вечер и подключить к нему Claude/Cursor», FastMCP будет единственным разумным выбором. Если вы пишете собственный MCP-хост или реализуете нестандартный транспорт — смотрите в сторону SDK.
| Критерий | FastMCP | MCP Python SDK |
|---|---|---|
| Строк кода для сервера | 5-10 | 40-80 |
| Генерация JSON Schema | Автоматическая из аннотаций | Ручная |
| OpenAPI-интеграция | Встроенный провайдер | Писать самому |
| Hot reload | Встроен | Нет |
| Транспорт | STDIO + SSE | STDIO + SSE + кастомный |
| Гибкость протокола | Ограничена фреймворком | Полный контроль |
| Кривая обучения | Минимальная | Средняя |
Есть и третий вариант: FastAPI-MCP. Этот пакет превращает существующий FastAPI-сервер в MCP-сервер автоматически. Если у вас уже есть FastAPI-приложение, FastAPI-MCP добавит к нему MCP-слой одной строкой. Но это ниша «уже есть API, нужно добавить MCP» — для нового проекта FastMCP проще.
Как запустить FastMCP в продакшен
Для разработки FastMCP использует STDIO-транспорт — сервер запускается как процесс, и MCP-клиент общается с ним через stdin/stdout. Для продакшена нужен другой подход.
Первый вариант — SSE-транспорт с запуском через systemd или Docker. Сервер работает как HTTP-сервер, клиенты подключаются по SSE. Такой подход подходит для внутренних интеграций внутри одной сети:
python -m fastmcp run server.py --transport sse --host 0.0.0.0 --port 8000
Второй вариант — Prefect Horizon. Это enterprise-платформа от той же команды, что делает FastMCP. Horizon добавляет:
Horizon добавляет деплой с GitHub (push в репозиторий → автоматический деплой MCP-сервера), приватный реестр всех MCP-серверов организации, SSO и RBAC с правами доступа на уровне конкретных инструментов, audit-логи с observability и мониторингом, а также branch previews — тестовую среду для новой версии сервера перед релизом.
Для стартапов и небольших команд хватит связки FastMCP + Docker + reverse proxy (Caddy или Nginx). Dockerfile для MCP-сервера помещается в 5 строк:
FROM python:3.11-slim
RUN pip install fastmcp
COPY server.py .
CMD ["python", "-m", "fastmcp", "run", "server.py", "--transport", "sse", "--port", "8000"]
По данным документации FastMCP, в production-режиме стоит отключить hot reload и настроить health-check endpoint. FastMCP автоматически добавляет /health на SSE-сервер.
Что ещё важно знать
FastMCP бесплатен? Есть ли платные функции?
FastMCP — полностью open-source (Apache 2.0), бесплатен для любых проектов. Платная только enterprise-платформа Prefect Horizon для продакшен-деплоя.
Можно ли использовать FastMCP не с Python?
FastMCP — Python-фреймворк. Для других языков есть официальные SDK от Anthropic (TypeScript, Java, Kotlin) и сторонние (Go, Rust). Но FastMCP остаётся самым популярным именно из-за простоты.
FastMCP 3.0 совместим с серверами на 2.x?
Да. FastMCP 3.0 обратно совместим по протоколу — серверы на FastMCP 2.x работают с клиентами на 3.x и наоборот. Внутренний API изменился (провайдеры вместо прямых декораторов), но для конечного пользователя разницы нет.
Что такое FastMCP Apps и чем они отличаются от Tools?
Apps — это интерактивные UI, которые рендерятся прямо в диалоге с LLM. Например, форма для заполнения данных или дашборд с графиками. Tools — это функции, которые LLM вызывает «за кулисами». Apps видны пользователю, Tools — нет.
Какой минимальный VPS нужен для FastMCP-сервера?
FastMCP-сервер — это лёгкое Python-приложение. 1 vCPU и 512 MB RAM хватит для 5-10 одновременных подключений. Если сервер обращается к базе данных или внешним API, требования определяются уже ими, не FastMCP.