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, БД или автоматизации.
FastMCP превращает Python API в инструменты, которые понимает LLM-клиент
MCP отделяет AI-модель от внешних возможностей. Модель не должна знать, как напрямую работать с PostgreSQL, Home Assistant, WordPress REST API или внутренним сервисом. Она видит описанные tools/resources и вызывает их через стандартный MCP-протокол.
Обычная функция с type hints превращается в tool schema.
Arguments валидируются до вызова business logic.
Один server можно использовать локально через stdio или удалённо через HTTP.
FastMCP умеет не только публиковать, но и потреблять MCP servers.
FastMCP 4 уже работает с новой ревизией MCP 2026-07-28
FastMCP 4 стал GA 31 августа 2026 года. Он поддерживает новую protocol revision и одновременно умеет договариваться со старыми MCP-клиентами о совместимой версии.
Новые HTTP requests несут protocol version/capabilities сами.
Полезно для human-in-the-loop actions.
Client может получить task ID и отслеживать status.
Tasks реализованы именно как protocol extension.
Появились новые механизмы для non-interactive identities.
FastMCP выбирает общую supported protocol version.
В v4 удалены некоторые deprecated APIs, background tasks вынесены в extension package, а часть поведения server-side sessions и callbacks изменилась вместе с новым MCP protocol.
Установка
Официальная документация рекомендует 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.
Одна 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.
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.
Лучшие первые tools: риск минимален.
Нужны authorization и validation.
Нужны human approval и отдельные permissions.
Подходят для background tasks.
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 или справочник.
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.
Для сети используется 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.
Для локального stdio auth обычно не нужен. Для HTTP endpoint, доступного другим машинам, authorization уже обязательная часть architecture.
Тем же 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.
Старый shortcut Client("server.py") для stdio deprecated.
Для local Python file current docs рекомендуют передавать Path,
а строки оставлять для URLs.
Долгий импорт или 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.
Ноль инфраструктуры, но tasks теряются при restart.
Persistent queue и дополнительные workers.
Если job может повториться после retry/restart, business logic должна сама корректно обрабатывать повторное выполнение.
OpenAPI Provider превращает endpoints в MCP tools/resources
Это один из самых сильных сценариев: вместо ручного написания десятков wrappers FastMCP может построить MCP components по OpenAPI schema.
Лучше expose только нужные операции, а destructive/admin endpoints исключить или защищать отдельными scopes.
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.
Client запускает процесс локально.
Нужна полноценная remote authentication.
Даже authenticated user не обязан видеть admin tool.
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.
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 менять для каждого клиента не требуется.
Главная задача — не дать AI больше полномочий, чем нужно
Начинайте с tools без destructive side effects.
Не полагайтесь на system prompt как permission boundary.
DB/API token MCP-процесса должен иметь минимально необходимые права.
Tool arguments приходят от модели и считаются недоверенными.
Delete, deploy, transfer и другие irreversible actions требуют отдельного шага.
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.
FastMCP быстро развивается вместе с MCP protocol, OAuth и provider integrations. Pin version в production и обновляйте её контролируемо с regression tests.
FastMCP упрощает protocol layer, но не проектирует ваш API и permissions за вас
Плохой гигантский tool остаётся плохим даже с идеальной schema.
Нужны хорошие descriptions и agent evals.
Protocol connectivity ≠ право на действие.
TLS, OAuth/JWT, monitoring и secret management.
V4 появился только в конце августа 2026 года.
Не все REST endpoints должны быть доступны LLM.
3–5 узких read-only tools проще проверить, описать и защитить, чем сразу давать agent полный CRUD над production API.
Что можно сделать своим первым FastMCP server
Read-only tools: version, cron status, plugin state, selected options.
Search metadata и безопасное чтение разрешённых каталогов.
Получение sensor state и ограниченные approved actions.
Обернуть existing OpenAPI в curated MCP tools.
Ping, DNS, device inventory и read-only checks.
Search drafts, read metadata и запуск безопасных проверок.
FastMCP 4.0.5, новый MCP protocol и security advisories
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.
Частые вопросы про 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.
Есть API, NAS, WordPress, Home Assistant или внутренняя система, которую хочется дать Claude/Codex без полного shell-доступа?
Правильный путь — сделать небольшой MCP server с узкими typed tools, read-only по умолчанию, затем добавить auth и только потом destructive actions.