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-сервер под свои задачи и не сойти с ума.

25 811 звёзд на GitHub
70% MCP-серверов на FastMCP
1 млн загрузок в день
Apache 2.0 открытая лицензия
Архитектура FastMCP: LLM-клиенты (Claude Code, Cursor) через MCP-протокол подключаются к FastMCP-серверу, который предоставляет Tools, Resources, Prompts через провайдеры и трансформы к внешним системам

Архитектура FastMCP: LLM → MCP Client → FastMCP Server → Tools/Resources/Prompts → Backend

Что такое 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.