Перейти к содержимому

Как мы подключаем ИИ-агентов к внутренней CRM через архитектуру MCP

Безопасное внедрение ИИ в корпоративный контур: как Model Context Protocol позволяет агентам выполнять детерминированные запросы JSON-RPC.

Современные B2B-организации регулярно сталкиваются с прикладной проблемой: заметная часть времени отдела продаж, финансов и комплаенса уходит на ручной поиск истории взаимодействий в CRM перед переговорами, аудитом или согласованием сделки. По сути это проблема доступа к данным, и именно на ней большинство CRM-чатботов ломаются в продакшене.

Рынок часто предлагает упрощённый сценарий: подключить LLM к CRM, загрузить туда историю клиентов и получить умного ассистента. Однако в реальной эксплуатации такие решения быстро упираются в ограничения по нагрузке, безопасности и требованиям комплаенса.

Почему типичный RAG поверх CRM быстро становится проблемой


Рассмотрим обычный запрос коммерческого директора: «Собери краткую сводку по трём последним выигранным сделкам с клиентами из ЕС и покажи ожидаемую выручку по апселлу».

Если под капотом стоит наспех собранный RAG-слой, поведение системы оказывается предсказуемо ненадёжным:

  • в контекст модели уходит слишком много сырого текста;
  • финансовые поля интерпретируются без учёта бизнес-логики;
  • агент получает доступ к большему объёму данных, чем требуется для ответа;
  • стоимость каждого запроса растёт без заметной пользы для бизнеса.

Причина кроется не в самой языковой модели, а в архитектуре интеграции.

Во многих командах до сих пор используют тонкие обёртки над LangChain или самописные Python-скрипты, которые подключаются к Salesforce, HubSpot, Odoo или напрямую к SQL. Затем происходит то, что мы называем RAG-dumping: система выгружает в модель большие объёмы JSON, заметок, комментариев менеджеров, писем и служебных полей без контроля доступа и фильтрации.

Такой подход создаёт три базовые уязвимости:

  1. Контекстное окно перегружается лишними данными: даже при поддержке 200 000+ токенов передача многолетней истории CRM снижает точность итогового ответа.
  2. Операционные расходы растут лавинообразно, когда на каждый запрос отправляются сотни тысяч токенов.
  3. Принцип Zero-Trust нарушается, поскольку скрипт с правами суперпользователя обходит построчное разграничение прав (row-level security) и открывает доступ к персональным данным, суммам контрактов и внутренним комментариям, создавая риск нарушения GDPR Article 32.

Если в вашей CRM хранятся персональные данные клиентов, суммы контрактов, налоговые реквизиты или выгрузки в бухгалтерские контуры, рекомендуем отдельно изучить материал Почему внутренние скрипты автоматизации несут риск штрафов до €20 млн по GDPR.

Почему MCP работает лучше прямого доступа к таблицам


В корпоративной среде ИИ-агенту не нужен полный дамп CRM. Ему нужен контролируемый набор инструментов, через которые он запрашивает только релевантные записи и только в допустимом объёме.

Именно эту задачу решает Model Context Protocol (MCP).

MCP позволяет выстроить предсказуемый слой доступа между языковой моделью и внутренними системами. Вместо передачи всей CRM в контекст вы предоставляете агенту строго ограниченные функции: прочитать записи, получить статус сделки, найти контрагента или проверить счёт по формализованным правилам.

На практике это даёт четыре конкретных преимущества:

  • один и тот же бэкенд используется для Claude, моделей OpenAI или локальных LLM без переписывания бизнес-логики;
  • каждый вызов инструмента валидируется до выполнения запроса к базе;
  • параметры domain, fields, limit и права агента жёстко контролируются сервером;
  • формируется прозрачный журнал аудита: кто, когда и какие именно данные запросил.

О том, как протокол применяется в защищённых корпоративных сценариях, читайте также в статье Безопасная интеграция Claude 3.5 с корпоративными системами через Model Context Protocol.

Безопасный шлюз данных между Odoo и FastMCP


В нашей архитектуре ядро Odoo взаимодействует по XML-RPC (с проверкой ACL, RLS и API-ключа) с сервером FastMCP, который предоставляет JSON-RPC интерфейс для языковой модели. Мы рассматриваем этот шлюз как отдельный периметр безопасности, усиливающий ограничения базовой системы:

  • каждый агент использует выделенный токен и сервисную учётную запись;
  • доступ к моделям ограничен правилами ACL и бизнес-ролями;
  • параметры domain и limit обязательны для каждого инструмента;
  • массовый экспорт блокируется на уровне сервера, а не текстовой инструкцией в промпте;
  • все вызовы журналируются с идентификатором агента, временем и параметрами запроса.

Если компания готовится к проверкам безопасности или выходу на рынок ЕС, полезно параллельно свериться со статьёй Как Zero-Trust ИТ-аудит защищает бизнес-процессы перед выходом на рынок ЕС.

Универсальный инструмент чтения записей Odoo

Ниже показан рабочий паттерн из нашего сервера dlab_mcp.py, который ограничивает выборку на стороне сервера:

# ==========================================
# УНИВЕРСАЛЬНЫЕ CRUD ОПЕРАЦИИ ODOO (dlab_mcp.py)
# ==========================================

@mcp.tool()
def read_odoo_records(model: str, domain_json: str = "[]", fields_json: str = "[]", limit: int = 10) -> str:
"""Чтение записей из любой внутренней модели ERP/CRM через строгий токен агента."""
try:
models, uid = _get_odoo_models()
domain = json.loads(domain_json)
fields = json.loads(fields_json)

# Жесткий серверный лимит, даже если агент запросил больше
limit = min(max(limit, 1), 50)

kwargs = {"limit": limit}
if fields:
kwargs["fields"] = fields

record_ids = models.execute_kw(
ODOO_DB,
uid,
ODOO_API_KEY,
model,
"search",
[domain],
{"limit": limit},
)
if not record_ids:
return f"В модели {model} не найдено записей, соответствующих домену."

records = models.execute_kw(
ODOO_DB,
uid,
ODOO_API_KEY,
model,
"read",
[record_ids],
kwargs,
)
return json.dumps(records, indent=2, ensure_ascii=False)
except Exception as e:
return f"Ошибка при чтении записей: {str(e)}"

Ключевые особенности этой реализации:

  • верхний лимит записей принудительно задаётся сервером;
  • агент запрашивает и получает только перечисленные поля;
  • аутентификация проходит через API-ключ, который можно мгновенно отозвать без остановки всей системы;
  • логика чтения остаётся полностью детерминированной.

В боевом контуре поверх этого кода добавляются ещё три слоя защиты:

  1. Белый список разрешённых моделей (например, crm.lead, res.partner, sale.order).
  2. Белый список полей для каждой модели, исключающий чтение внутренних заметок или персональных идентификаторов.
  3. Неизменяемый журнал аудита с корреляционным идентификатором запроса.

Это особенно важно при работе со сценариями, подпадающими под требования EU AI Act, а также с данными, участвующими в формировании отчётности SAF-T и RO e-Factura.

Пример записи аудита JSON-RPC-запроса

{
"jsonrpc": "2.0",
"id": "req_8f7b2c9a",
"method": "tools/call",
"params": {
"name": "read_odoo_records",
"arguments": {
"model": "crm.lead",
"domain_json": "[[\"stage_id.name\", \"=\", \"Won\"], [\"partner_id.country_id.code\", \"in\", [\"DE\", \"FR\", \"IT\"]]]",
"fields_json": "[\"id\", \"name\", \"expected_revenue\"]",
"limit": 10
}
}
}

Такой журнал необходим для расследования инцидентов, внутреннего аудита и проверки ответов модели: вы всегда можете точно установить, какие записи запросил агент и с какими фильтрами.

Где именно MCP даёт выигрыш бизнесу


MCP делает интеграцию управляемой, что выражается в трёх практических результатах.

1. Снижение стоимости каждого запроса

Вместо передачи в LLM всего массива CRM-данных передаётся только результат точечного вызова инструмента. Это кратно снижает расход токенов и уменьшает сетевую нагрузку.

2. Повышение точности ответов

Получая строго типизированные записи по конкретному запросу вместо хаотичного дампа, модель перестаёт путать суммы, стадии сделок и историю клиента при подготовке сводок по воронке продаж или проверке статуса оплаты.

3. Прозрачное прохождение аудита безопасности

Наличие журнала вызовов, отзывных ключей и ролевых ограничений превращает интеграцию из «чёрного ящика» в понятный для CISO и комплаенс-команды сервисный слой.

О том, как перевести разрозненные внутренние скрипты на промышленную архитектуру, подробно рассказано в статье Перевод хрупких Python-скрейперов на типизированные корпоративные бэкенды FastMCP.

Практические ограничения, которые нужно учитывать заранее


При проектировании CRM-интеграции стоит заранее учесть пять технических нюансов:

  • Протокол XML-RPC чувствителен к тяжёлым выборкам и неоптимальным доменным фильтрам, поэтому длинные запросы быстро приводят к таймаутам.
  • Нативные правила Odoo ACL не заменяют архитектурных ограничений шлюза: если сервисный пользователь имеет избыточные права, агент унаследует их.
  • Языковая модель не знает внутреннюю семантику ваших полей автоматически, поэтому различия между expected_revenue, recurring_revenue и amount_total необходимо явно фиксировать в описании инструментов.
  • Персональные данные (PII) не должны передаваться во внешнюю модель без прямой необходимости даже при наличии корпоративных соглашений с провайдером.
  • Процедуры верификации и отката нужны как для операций записи, так и для бизнес-решений, принимаемых на основе аналитических выборок агента.

Поэтому начинать внедрение лучше с узких, чётко очерченных сценариев:

  • подготовка краткой карточки клиента перед звонком;
  • выборка последних закрытых сделок по региону;
  • проверка статуса счёта или заказа;
  • поиск контрагента по налоговому номеру с минимальным набором полей.

Итоги


Попытка заменить продуманную архитектуру огромным контекстным окном в корпоративной CRM неизбежно приводит к перерасходу бюджета и рискам безопасности.

Надёжный инженерный подход строится вокруг предоставления модели узких MCP-инструментов с жёстким контролем доступа, журналированием и возможностью мгновенного отзыва прав.

Управляемая ERP, омниканальный ИИ и White-Label поставка dlab.md Engineering Advisory

Внедрение Odoo 19, MCP-агентов и серверной атрибуции за 6 недель

Масштабируете собственный бизнес на едином контуре CRM, ERP и диалогового ИИ или ищете надёжного White-Label инженерного партнёра для сложных проектов Odoo 19 и Meta CAPI в Европе — мы поставляем управляемую инфраструктуру с фиксированным бюджетом и сроком.