- каждая запись каталога задач получила тип вместо тега kind: и префикса заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок секций канонический - поправлены протухшие факты: нереализованные маршруты Read API, MCP и `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию диффа, периметр перестал дублировать security.md - замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек storage и parsing
3.7 KiB
✨ Поднять MCP-сервер поверх Read API
- Тип: feature
- Категория: Ядро — набор ограничен HTTP-слоем чтения после дробления; адаптер берётся следующим спринтом по той же цели
- Зачем: Агент-медик — первый заказчик проекта, а подключить его сейчас нечем
- Теги: goal:read-api
Агент-медик — первый заказчик проекта. Ему нужна актуальная сводка, а не срез на дату последнего ручного экспорта.
Транспорт — Streamable HTTP, не stdio: сервис живёт на VPS, агент ходит по сети. Отсюда: MCP — маршрут того же процесса и того же порта, аутентификация — тот же токен чтения, что у Read API. Отдельного контура доступа не заводим: MCP не даёт ничего, чего не даёт HTTP, и права обязаны совпадать.
Инструментов три: каталог разрезов, значения за период, значения с разбивкой. Собственной логики в адаптере нет.
Правило размера ответа здесь не украшение, а необходимость: у сетевого агента нет способа «посмотреть поближе» иначе, чем повторным вызовом.
Готово, когда агент подключается по URL и отвечает на «как я спал на прошлой неделе» без промежуточного кода.
Двигает строку «Завершения» цели: «Агент-медик читает то же самое через MCP тем же токеном чтения».
Критерии приёмки
- живой агент подключается по URL и отвечает на «как я спал на прошлой неделе» без промежуточного кода — оракул: подключение реального MCP-клиента к поднятому сервису
- вызов инструмента и соответствующий HTTP-запрос дают одни и те же данные — оракул: тест, сравнивающий выход инструмента с ответом маршрута на тех же параметрах
- запрос без токена чтения отклоняется обоими транспортами одинаково — оракул: тест на паре «MCP без токена / HTTP без токена»
- правило размера ответа действует и в MCP: слишком широкий запрос получает названную сетку или ошибку со списком, а не обрезанный ответ — оракул: тест на запросе за пределом
Рамки
Схема не трогается, данные только читаются, сервис перезапускается. Собственной логики адаптер не несёт — новое поведение здесь признак того, что оно должно было появиться в маршруте чтения. Берётся последней в цели: переводить нечего, пока обработчиков нет.
Связано: docs/architecture.md → «MCP».