Skip to content

ADR.Z1: выбор мажора FastMCP

  • Статус: принято (этап M1, вертикальный срез)
  • Дата: 2026-10-27
  • Контекст: план .omc/plans/plan-ati-hh-mcp.md, раздел ADR / ADR.Z1

Контекст

Интервью зафиксировало «FastMCP 2», но на момент решения актуальный мажор на PyPI – 4.x (последняя версия 2.x – 2.14.7). Требуется выбрать мажор по итогам спайка M1: создание приложения, регистрация инструментов, stdio- и HTTP-транспорты, клиент для тестов, поддержка Python 3.10–3.14.

Решение

Остаться на FastMCP 4.x, пин fastmcp>=4.1,<5 (фактически 4.1.4).

Спайк на 4.1.4 подтвердил все критерии:

  • FastMCP(name) + @mcp.tool / mcp.tool(fn) – регистрация инструментов, docstring и pydantic-аннотации транслируются в описание и входную схему;
  • run_async(transport=...) поддерживает "stdio", "http", "streamable-http", "sse";
  • в stdio-режиме stdout содержит только протокол MCP (баннер и логи идут в stderr) – ключевой инвариант проекта;
  • fastmcp.Client работает и in-memory, и поверх StdioTransport (подпроцесс) – закрывает потребность e2e-тестов;
  • requires-python >= 3.10 – покрывает всю матрицу 3.10–3.14.

Последствия

Версия зафиксирована в uv.lock; откат на 2.x (пин >=2.14,<3) остаётся запасным путём при обнаружении блокирующих регрессий 4.x – изоляция сборки сервера в server.py/toolkit.py делает замену локальной. Отступление от «FastMCP 2» фиксируется в README (раздел «Стек») на этапе M8.