Последний месяц ассистент Claude работает не рядом с системой учёта, а внутри неё. Мы написали собственный MCP-сервер для Odoo 19 (MCP — открытый протокол, по которому языковая модель вызывает внешние инструменты). Теперь рутинные операции в ERP можно поручить ассистенту обычной фразой в чате, а результат сразу появляется в системе — с историей изменений и от имени конкретного пользователя.
Главный принцип — всё закрыто, пока не открыто
Сервер не даёт модели «доступ к базе». Он отдаёт ровно те модели, которые администратор включил в настройках модуля, и для каждой отдельно — пять галочек: чтение, создание, изменение, удаление и вызов бизнес-методов. Начинали с одних задач и проектов. Дальше права расширялись по ходу работы: понадобилось создать коммерческое предложение — открыли заказы и налоги, понадобилось завести товар с вариантами — открыли шаблоны и атрибуты. Контакты клиентов, например, долго оставались закрыты сознательно: телефонам и почте нечего делать в чате без необходимости.
Все действия выполняются от имени подключённого пользователя, поэтому штатные права доступа и правила записей Odoo продолжают работать. Ассистент не может сделать больше, чем сотрудник, под которым он вошёл. Сам сервер стоит в отдельном контейнере рядом с Odoo и ходит к нему по внутренней сети, наружу открыт только защищённый HTTPS-адрес.
Как подключается ассистент
- Вход логином Odoo. Сервер сам выступает сервером авторизации OAuth 2.1. Коннектор в Claude открывает страницу входа Odoo, пароль вводится там и в чат не попадает. Вместо паролей и API-ключей в переписке — токен, который можно отозвать.
- Только чтение — по галочке. На странице согласия можно не ставить «разрешить создание и изменение данных». Тогда сессия получает только чтение, а инструменты записи ассистент даже не видит.
- Доступ по группе. Пользоваться MCP может только тот, кого администратор добавил в группу «MCP User». Остальные сотрудники не получают доступ автоматически.
- Журнал и лимиты. Каждый вызов записывается в журнал: кто, какой инструмент, какая модель. Число запросов ограничено и в самом модуле, и на входном веб-сервере.
Что уже делаем через него
- Задачи. Каждое утро ассистент ставит задачи маркетологу и руководителю в проекте «Маркетинг», а потом читает статусы, комментарии и приложенные файлы. Контроль без ручного пересказа.
- Товары и варианты. Новый типоразмер не плодит отдельную карточку: существующий товар превращается в шаблон с атрибутом «Размер», и остатки, себестоимость и история движений старой позиции сохраняются за своим вариантом.
- Коммерческие предложения. Предложение на окончательную оплату по договору собирается по образцу предыдущего заказа того же клиента — тот же менеджер, ставка НДС и служебный товар, а своя формулировка уходит в описание строки. Лишних товаров в каталоге не появляется.
- Разбор лидов. Ассистент проверяет, к той ли компании привязан лид, находит настоящего заказчика по открытым источникам, создаёт карточку контрагента и оставляет внутреннюю заметку с источниками в истории лида.
- Сверка реестра с CRM. Таблицу из 445 объектов сопоставили с активными и архивными лидами и подтверждёнными продажами и раскрасили по статусу: проигран, в работе, материал отгружен. Спорные строки вынесены в отдельный лист с номерами лидов и обоснованием.
Грабли
В первых версиях в заголовке записи пользователя показывался ID связанного контакта, а не самого пользователя, и модель путала их при назначении исполнителя. Теперь оба идентификатора выводятся раздельно. Второе: архивные записи по умолчанию не ищутся, и для сверки их нужно запрашивать явно — иначе половина истории просто не видна.
Не только Odoo 19
Тот же подход перенесли на систему на Flectra 1.7 — это ответвление Odoo 11, которое мигрировать не планируется. Готовый модуль там не встаёт: он написан под Odoo 19 и современный Python. Поэтому рядом с системой работает отдельный шлюз с тем же набором инструментов и тем же входом через OAuth. Он работает от имени вошедшего пользователя через обычную сессию Flectra и не хранит пароль. Список пользователей, которым разрешён вход, и права по моделям лежат в отдельных файлах настроек: по умолчанию — только чтение примерно двух десятков основных моделей. Старая система получила современный интерфейс для ассистента без переписывания самой системы.
И сайт тоже
21 октября тот же модуль подключили к этому сайту. Ассистенту открыты блог, страницы, меню, редиректы и SEO-настройки: читать, создавать и править. Удаление выключено везде — снять пост с публикации можно, удалить нельзя. Разметка страниц доступна только на правку, без создания новых шаблонов. Черновики этого и нескольких соседних постов ассистент завёл через MCP сам, по истории сделанной работы, а человек их проверил и дополнил.
Итог
Модуль работает на рабочей базе. Права выдаются по шагу, под конкретную задачу, — и это оказалось удобнее, чем пытаться заранее угадать, что понадобится. Следующие кандидаты на такой же коннектор — рекламный кабинет, почтовый сервер и телефония.