Шесть модулей подряд инструменты писались в расчёте на то, что аргументы придут правильные. Иногда проверка вставлялась — рост больше нуля, город найден, — но делалось это по наитию, без системы. Пора навести порядок: в MCP-сервере проверка входных данных значит больше, чем в обычной программе, и причина вполне конкретная: аргументы присылает не программист, а языковая модель.
Отсюда две темы модуля, и связаны они теснее, чем кажется. Первая — как отсеять негодные аргументы минимальными усилиями, не перегружая каждый инструмент проверками. Здесь помогает библиотека Pydantic: она устанавливается в окружение вместе с SDK и умеет проверять границы чисел, длину строк, формат телефона и перекрёстные правила, причём всё это попадает в схему, которую видит модель. Вторая тема — что сообщать, когда аргумент не подошёл. Текст ошибки в MCP-сервере читает не программист в журнале, а модель, которая в этот момент решает, что делать дальше. Значит, сообщение об ошибке — не запись для отладки, а интерфейс.
Вторая тема важнее первой, и запомнить из модуля стоит прежде всего её: инструмент, который отказал внятно, полезнее инструмента, который отказал без пояснения, — даже если код у них одинаковый. Мы проверим это на живой модели: возьмём один и тот же инструмент, поменяем в нём единственную строку — текст отказа — и посмотрим, как меняется поведение модели.
Три темы в модуле не рассматриваются. Хранение данных между запусками и защита от SQL-инъекций — модуль 8. Секреты, лимиты и логирование как отдельная тема безопасности — модуль 9. Сетевые отказы разобраны в модуле 6 и здесь не повторяются, хотя одна находка оттуда — таймауты с пустым текстом — станет в этом модуле главным доводом.