Синтаксис хаоса
о канале

Claude при каждом старте ругался, что не может подключиться к двум MCP-серверам.

05.08.2026, 09:48 · ⏱ 4 мин

Claude при каждом старте ругался, что не может подключиться к двум MCP-серверам. Я матерился, закрывал окно и шёл работать дальше.

Сегодня наконец полез разбираться.

Это те два, через которые он ходит в Битрикс24 и МойСклад. Третий MCP на той же машине работает как ни в чём не бывало.

systemctl is-active бодро отвечает active. Порты при этом не слушает никто. Заебись диагностика.

Сервисы не лежали. Они перезапускались по кругу: systemd поднимает процесс, тот падает через две секунды, systemd поднимает снова. Счётчик рестартов 3503 у одного и 5697 у второго. Тринадцать часов подряд, ровно с момента ночного ребута.

В логах один и тот же ImportError: из mcp.server.lowlevel.server пропал request_ctx. Вышел mcp 2.0.0, мажорный релиз питоновского SDK, эту функцию оттуда выпилили нахуй. А mcp-proxy, через который работали оба сервиса, объявляет зависимость как mcp>=1.4.1. Без верхней границы.

Запускал я их через uvx, а он резолвит пакеты при каждом старте. Пока машина не перезагружалась, процессы жили на старом коде в памяти и в PyPI не заглядывали. Ребут всё поменял: uv честно сходил за свежей версией и притащил несовместимую. Кэш чистить бесполезно, свежая установка подтянет ровно то же самое.

Третий сервис выжил, потому что у него свой venv с прибитыми версиями. Тот же mcp-proxy, та же версия 0.12.0. Разница ровно одна: он не ходит в интернет при старте. Три сервиса на одной машине, собранные тремя разными способами, и ребут пережил тот, который собран аккуратнее.

Развёл всё по изолированным venv с фиксированными версиями, состав закрепил в requirements.txt, из ExecStart выкинул uvx. Заодно вынес секреты в EnvironmentFile с правами 600, закрыл порты прокси на 127.0.0.1 и добавил StartLimitBurst, чтобы systemd после пяти неудач честно вставал в failed. И перезагрузил сервер: проверять надо ровно тот сценарий, который тебя уронил, иначе починка остаётся гипотезой.

Бонусом освободилось 1,8 гигабайта, почти гигабайт из них дали архивы systemd-journal. Обычные суточные архивы там по 4-5 мегабайт, последние шесть, за время крэш-петли, по 76-83. Девять тысяч трейсбеков раздули журнал в двадцать раз.

Дальше письмо от хостера, тем же утром.

Beget пишет: ошибка перевыпуска бесплатного сертификата, поставьте A-запись домена на IP хостинга, иначе HTTPS отвалится третьего сентября. Сделать как написано означало положить рабочий сайт, который давно живёт не на этом хостинге.

Три команды с ноутбука дают всю картину: куда указывает домен, кто держит DNS-зону и какой сертификат сервер отдаёт сейчас. Домен смотрит на мой VPS, сертификат там свежий и действует на месяц дольше того, о котором тревожилось письмо. А на шаред-хостинге остался забытый сайт с включённым автопродлением. Он каждый день пытался пройти валидацию для домена, который на него не указывает, обсирался и генерировал мне письма.

Поддержка Beget удалила лишний сертификат и привязку. DNS не трогали вообще. На своём сервере тоже ничего не чинили, там всё работало.

Попутно вылезло, что сертификат выписан только на голый домен, без www, а A-запись для www существует. Любой, кто наберёт адрес с www, получит предупреждение браузера. Ушло в бэклог.

Что забрал с собой.

uvx и npx в systemd-юните это лотерея: аптайм сервиса зависит от того, что мейнтейнер залил в реестр вчера вечером. Зависимость без верхней границы взрывается не при деплое, а при следующем ребуте, когда связь с причиной уже не прослеживается.

Система сообщает не о своём состоянии, а о том, что она умеет проверить. systemd умеет проверить, что процесс запущен, и он был запущен, пять тысяч раз подряд. Хостер умеет проверить, что валидация не прошла, и она не прошла, только домен к его серверу отношения не имеет.

И главное. Единственный работающий мониторинг тут был мой собственный: раздражение от красной строчки при каждом старте. Он честно орал не первый день, а разгребать я сел только сегодня. Хуёвая система, но других на этой машине не было.

У вас в проде что-нибудь крутится через uvx, npx или pipx без пинов? Проверьте сегодня, иначе узнаете при следующей перезагрузке, и вряд ли в удобный момент.

✍️ Синтаксис хаоса
Подпишись: TG / DZEN / VK
2
Оригинал в Telegram: @syntax_of_chaos
📚 Читать дальше