FastMCP · Python · MCP server · Claude · Codex

FastMCP: как создать свой MCP-сервер на Python для Claude, Codex и AI-агентов

MCP позволяет AI-клиенту вызывать реальные функции, читать данные и использовать внешние сервисы. FastMCP превращает обычные Python-функции в MCP tools, автоматически строит schema из type hints, поддерживает resources, prompts, HTTP/stdio transports, authentication, background tasks и тестирование. Это один из самых прямых способов дать Claude, Codex или собственному агенту доступ к вашему API, БД или автоматизации.

4.0.5 актуальный stable release от 17 сентября 2026 года
Python ≥ 3.10 typed Python framework для MCP servers и clients
Apache-2.0 активно поддерживаемый standalone project
MCP application framework

FastMCP превращает Python API в инструменты, которые понимает LLM-клиент

MCP отделяет AI-модель от внешних возможностей. Модель не должна знать, как напрямую работать с PostgreSQL, Home Assistant, WordPress REST API или внутренним сервисом. Она видит описанные tools/resources и вызывает их через стандартный MCP-протокол.

Claude / CodexMCP client
→
FastMCP serverschemas · auth · routing · validation
→
Python functionsbusiness logic
→
API / DB / devicereal systems
01Pythonic

Обычная функция с type hints превращается в tool schema.

02Typed validation

Arguments валидируются до вызова business logic.

03Transport-independent

Один server можно использовать локально через stdio или удалённо через HTTP.

04Client тоже встроен

FastMCP умеет не только публиковать, но и потреблять MCP servers.

Главное изменение 2026 года

FastMCP 4 уже работает с новой ревизией MCP 2026-07-28

FastMCP 4 стал GA 31 августа 2026 года. Он поддерживает новую protocol revision и одновременно умеет договариваться со старыми MCP-клиентами о совместимой версии.

Stateless HTTP Протокол больше не требует sticky session

Новые HTTP requests несут protocol version/capabilities сами.

Interactive tools Tool может попросить подтверждение/дополнительный input

Полезно для human-in-the-loop actions.

Background tasks Долгая работа выходит из request path

Client может получить task ID и отслеживать status.

Extensions Capabilities расширяются отдельно от core

Tasks реализованы именно как protocol extension.

New auth paths Agents/services и scope-aware authorization

Появились новые механизмы для non-interactive identities.

Backward negotiation Old clients не обязаны обновиться одновременно

FastMCP выбирает общую supported protocol version.

Старые FastMCP 2/3 tutorials нельзя копировать без проверки.

В v4 удалены некоторые deprecated APIs, background tasks вынесены в extension package, а часть поведения server-side sessions и callbacks изменилась вместе с новым MCP protocol.

Stable 4.0.5

Установка

Официальная документация рекомендует uv:

uv init
uv add fastmcp==4.0.5

Или обычный pip:

python -m venv .venv

# Windows PowerShell
.\.venv\Scripts\Activate.ps1

pip install fastmcp==4.0.5

fastmcp version

Current package требует Python 3.10+. Для отдельных возможностей есть extras: например tasks, apps, openai, anthropic, azure и другие integrations.

Минимальный MCP server

Одна Python-функция — уже полноценный tool

from fastmcp import FastMCP

mcp = FastMCP("Workshop Tools")


@mcp.tool
def cable_current(power_w: float, voltage_v: float = 230.0) -> float:
    """Calculate current from active power and voltage."""
    if voltage_v <= 0:
        raise ValueError("voltage_v must be positive")

    return round(power_w / voltage_v, 2)


if __name__ == "__main__":
    mcp.run()

FastMCP читает function name, docstring, arguments и type hints, после чего строит MCP tool definition и JSON Schema автоматически.

mcp.run() — локальный stdio path.

Это хороший вариант для Claude/Codex на том же компьютере: client сам запускает Python process и общается с ним через stdin/stdout.

Tools

Tool — это действие, которое модель может вызвать

from typing import Literal
from fastmcp import FastMCP

mcp = FastMCP("Site Tools")


@mcp.tool
def check_page(
    url: str,
    mode: Literal["headers", "status"] = "status",
) -> dict:
    """Check a web page and return diagnostic information."""
    return {
        "url": url,
        "mode": mode,
        "status": "demo",
    }

Чем точнее type hints и docstring, тем меньше модели приходится угадывать назначение arguments.

Read-onlySearch / diagnostics

Лучшие первые tools: риск минимален.

WriteСоздание/изменение данных

Нужны authorization и validation.

DangerousDelete / deploy / payment

Нужны human approval и отдельные permissions.

Long-runningImport / scan / render

Подходят для background tasks.

Resources

Resource нужен, когда клиент читает данные, а не вызывает действие

from fastmcp import FastMCP

mcp = FastMCP("Project Context")


@mcp.resource("project://rules")
def project_rules() -> str:
    return """
    - Python 3.12
    - Use uv
    - Run tests before release
    """


@mcp.resource("device://{device_id}")
def device_info(device_id: str) -> dict:
    return {
        "id": device_id,
        "status": "online",
    }

Resource template с URI-параметрами подходит для данных, которые логично читать по адресу: документ, устройство, запись, config или справочник.

Prompts

Prompt — повторяемый шаблон работы, который MCP-клиент может получить от сервера

from fastmcp import FastMCP

mcp = FastMCP("Review Server")


@mcp.prompt
def review_python(code: str) -> str:
    return f"""
    Проверь код на:
    1. ошибки;
    2. security;
    3. лишнюю сложность;
    4. проблемы типов.

    Код:
    {code}
    """

В современных agent systems prompts используются реже, чем tools, но полезны для стандартизированных review/analysis workflows.

Remote server

Для сети используется HTTP transport вместо локального stdio

Через CLI можно запустить server с HTTP transport, указав host/port/path. В production такой endpoint обычно помещают за TLS/reverse proxy и обязательно добавляют authentication.

fastmcp run server.py \
  --transport http \
  --host 127.0.0.1 \
  --port 8000

FastMCP 4 использует новый stateless protocol path для современных клиентов, но способен согласовать старый protocol с legacy client.

Localhost и remote internet — разные threat models.

Для локального stdio auth обычно не нужен. Для HTTP endpoint, доступного другим машинам, authorization уже обязательная часть architecture.

FastMCP Client

Тем же framework можно программно подключаться к MCP servers

import asyncio
from fastmcp import Client


async def main():
    async with Client("https://example.com/mcp") as client:
        tools = await client.list_tools()

        for tool in tools:
            print(tool.name)


asyncio.run(main())

Client берёт на себя transport negotiation, protocol lifecycle и auth. В FastMCP 4 появился ClientGroup для работы сразу с несколькими servers с namespacing и routing.

В v4 строка означает URL.

Старый shortcut Client("server.py") для stdio deprecated. Для local Python file current docs рекомендуют передавать Path, а строки оставлять для URLs.

Background tasks

Долгий импорт или scan не должен держать MCP request открытым

import asyncio
from fastmcp import FastMCP

mcp = FastMCP("Jobs")


@mcp.tool(task=True)
async def scan_files(count: int) -> str:
    for _ in range(count):
        await asyncio.sleep(1)

    return f"Processed {count} files"

Для tasks нужен optional package/extras. Current task system использует Docket. In-memory backend удобен для development, а Redis/Valkey нужен для persistence и horizontal workers.

memory://Development

Ноль инфраструктуры, но tasks теряются при restart.

Redis/ValkeyProduction

Persistent queue и дополнительные workers.

Background task не делает функцию idempotent.

Если job может повториться после retry/restart, business logic должна сама корректно обрабатывать повторное выполнение.

Существующий REST API → MCP

OpenAPI Provider превращает endpoints в MCP tools/resources

Это один из самых сильных сценариев: вместо ручного написания десятков wrappers FastMCP может построить MCP components по OpenAPI schema.

OpenAPI schema/users · /orders · /devices
→
FastMCP OpenAPI Providerrouting + schema mapping
→
MCP tools/resourcesдоступны agent
Не публикуйте весь internal OpenAPI как tools автоматически.

Лучше expose только нужные операции, а destructive/admin endpoints исключить или защищать отдельными scopes.

Authentication + Authorization

Remote MCP server нельзя защищать одной «секретной ссылкой»

FastMCP поддерживает bearer/JWT, OAuth providers и middleware authorization. Можно фильтровать tools/resources/prompts по scopes и tags.

from fastmcp import FastMCP
from fastmcp.server.auth import require_scopes, restrict_tag
from fastmcp.server.middleware import AuthMiddleware

mcp = FastMCP(
    "Protected Server",
    middleware=[
        AuthMiddleware(
            auth=restrict_tag(
                "admin",
                scopes=["admin"],
            )
        )
    ],
)


@mcp.tool(tags={"admin"})
def delete_record(record_id: int) -> str:
    return f"Would delete {record_id}"

Current authorization middleware не применяется к stdio transport: OAuth-модель относится к HTTP/network path.

Local stdioOS/user boundary

Client запускает процесс локально.

HTTP serviceBearer/OAuth

Нужна полноценная remote authentication.

Tool-levelScopes/tags

Даже authenticated user не обязан видеть admin tool.

MCP server — обычный production code

Tools нужно тестировать без LLM

import pytest
from fastmcp import Client

from server import mcp


@pytest.mark.asyncio
async def test_add_tool():
    async with Client(mcp) as client:
        result = await client.call_tool(
            "add",
            {
                "a": 2,
                "b": 3,
            },
        )

        assert result.data == 5

Такой тест проверяет MCP schema/call path напрямую и не зависит от того, решила ли конкретная LLM вызвать tool правильно.

Разделяйте два класса ошибок.

Если tool сам возвращает неправильные данные — это server test. Если модель не выбрала правильный tool — это уже agent/evaluation problem.

Claude Code / Codex

FastMCP server для клиента выглядит как любой другой MCP endpoint

Для local stdio client configuration указывает команду, которая запускает ваш Python server. Для remote server client получает HTTP URL.

Conceptual stdio configuration

{
  "mcpServers": {
    "workshop": {
      "command": "python",
      "args": [
        "D:/mcp/workshop/server.py"
      ]
    }
  }
}

Remote HTTP

https://mcp.example.com/mcp

Конкретный формат config зависит от клиента: Claude Code, Codex, Cursor и другие hosts хранят MCP settings по-разному, но server-side код FastMCP менять для каждого клиента не требуется.

MCP server фактически расширяет права модели

Главная задача — не дать AI больше полномочий, чем нужно

1Read-only по умолчанию

Начинайте с tools без destructive side effects.

2Authorization внутри server

Не полагайтесь на system prompt как permission boundary.

3Минимальные credentials

DB/API token MCP-процесса должен иметь минимально необходимые права.

4Validate every argument

Tool arguments приходят от модели и считаются недоверенными.

5Human approval

Delete, deploy, transfer и другие irreversible actions требуют отдельного шага.

6Patch promptly

MCP auth/OpenAPI — активно развивающаяся attack surface.

Критическая OpenAPI SSRF/path traversal была исправлена в 3.2.0

CVE-2026-32871 затрагивала FastMCP до 3.2.0. Уязвимый OpenAPI Provider недостаточно безопасно подставлял path parameters, что могло позволить уйти за ожидаемый API path и обратиться к другим backend endpoints. Fixed version — 3.2.0; current 4.0.5 значительно новее.

OAuth confused-deputy issue также закрыта в 3.2.0

CVE-2026-27124 касалась OAuth Proxy consent verification. Атакующий MCP client мог злоупотребить authorization flow, если upstream IdP пропускал повторный consent screen. Patched version — 3.2.0.

Windows install command injection

Старые FastMCP до 3.2.0 также имели command-injection issue в install commands для Claude Code/Gemini CLI на Windows, если server name содержал shell metacharacters. Это ещё одна причина не использовать старые 2.x/ранние 3.x tutorials как production baseline.

Current 4.0.5 закрывает эти опубликованные старые диапазоны, но обновления всё равно нужно отслеживать.

FastMCP быстро развивается вместе с MCP protocol, OAuth и provider integrations. Pin version в production и обновляйте её контролируемо с regression tests.

Ограничения

FastMCP упрощает protocol layer, но не проектирует ваш API и permissions за вас

01Tool design остаётся вашей задачей

Плохой гигантский tool остаётся плохим даже с идеальной schema.

02LLM может вызвать не тот tool

Нужны хорошие descriptions и agent evals.

03MCP не заменяет authorization

Protocol connectivity ≠ право на действие.

04Remote deployment требует инфраструктуры

TLS, OAuth/JWT, monitoring и secret management.

05Protocol меняется быстро

V4 появился только в конце августа 2026 года.

06OpenAPI auto-exposure требует фильтрации

Не все REST endpoints должны быть доступны LLM.

Лучший первый MCP server — маленький.

3–5 узких read-only tools проще проверить, описать и защитить, чем сразу давать agent полный CRUD над production API.

Практические идеи

Что можно сделать своим первым FastMCP server

01WordPress diagnostics

Read-only tools: version, cron status, plugin state, selected options.

02NAS / files

Search metadata и безопасное чтение разрешённых каталогов.

03Home Assistant

Получение sensor state и ограниченные approved actions.

04Internal REST API

Обернуть existing OpenAPI в curated MCP tools.

05Network diagnostics

Ping, DNS, device inventory и read-only checks.

06Content workflow

Search drafts, read metadata и запуск безопасных проверок.

Первоисточники

FastMCP 4.0.5, новый MCP protocol и security advisories

Материал проверен 21 сентября 2026 года.

Latest stable package — FastMCP 4.0.5 от 17 сентября 2026 года. FastMCP 4 GA вышел 31 августа и поддерживает MCP protocol revision 2026-07-28.

Вывод

FastMCP полезен, когда AI должен безопасно работать с вашей инфраструктурой через чёткий API

Вместо того чтобы давать агенту shell и надеяться, что он правильно вызовет curl/sql, можно описать маленький набор строго типизированных tools. Это проще тестировать, ограничивать и переносить между Claude, Codex и другими MCP hosts.

Особенно сильный сценарий — существующий Python/REST backend: FastMCP становится тонким controlled layer между AI и реальной системой, а permissions остаются в обычном application code.

FAQ

Частые вопросы про FastMCP

Что такое FastMCP простыми словами?

Python framework для создания и подключения MCP servers: обычные Python functions можно публиковать как tools/resources/prompts для Claude, Codex и других MCP clients.

Нужен ли отдельный web server?

Нет для локального stdio. Для remote deployment используется HTTP transport, reverse proxy/TLS и authentication.

Можно ли подключить к Claude Code?

Да. Локальный FastMCP server можно запустить как stdio command, а remote — подключить как HTTP MCP endpoint.

Можно ли подключить к Codex?

Да. Codex поддерживает MCP servers; FastMCP со стороны server использует стандартный protocol, поэтому отдельный server implementation под Codex не нужен.

Можно ли сделать MCP из существующего REST API?

Да. FastMCP имеет OpenAPI Provider для генерации tools/resources из OpenAPI specification. Destructive/admin endpoints нужно фильтровать и защищать отдельно.

Есть ли background tasks?

Да. В FastMCP 4 tasks реализованы через protocol extension; для production queue можно использовать Redis/Valkey backend.

Есть ли OAuth?

Да. Есть OAuth/JWT providers и scope/tag-based authorization middleware для HTTP deployments.

FastMCP и Pydantic AI — конкуренты?

Нет напрямую. FastMCP в первую очередь публикует/потребляет MCP tools и данные. Pydantic AI — agent framework, который может использовать MCP servers как один из источников tools.

Безопасно ли публиковать FastMCP в интернет?

Только с нормальной auth/TLS/network policy и минимальными tool permissions. Неавторизованный remote MCP с write/delete tools — плохая архитектура.

Какая версия актуальна?

На 21 сентября 2026 года latest stable release — FastMCP 4.0.5.

Свой MCP для AI

Есть API, NAS, WordPress, Home Assistant или внутренняя система, которую хочется дать Claude/Codex без полного shell-доступа?

Правильный путь — сделать небольшой MCP server с узкими typed tools, read-only по умолчанию, затем добавить auth и только потом destructive actions.