Автор: Alexandr Balas (CEO & Chief System Architect, dlab.md) | Актуализация: март 2026
Интеграция Model Context Protocol (MCP) в 2026 году перестала быть экспериментом. Для зрелой корпоративной архитектуры это уже не «интересная опция», а нормальный способ подключать AI-агентов к внутренним системам без хаоса в доступах, логике и ответственности.
Когда компания переходит от простого LLM-чата к агентам, которые читают ERP, CRM, документы и операционные данные, вопрос упирается не в качество промпта. Вопрос в другом: как дать модели доступ к нужному контексту так, чтобы не сломать безопасность, не нарушить GDPR Article 32, не создать проблемы для RO e-Factura, SAF-T и не получить неконтролируемый канал доступа к финансовым или персональным данным.
В этом материале я разберу, почему локальное и защищённое подключение Claude 3.5 через MCP к корпоративной базе данных — это базовый архитектурный слой, а не дополнительная надстройка.
Почему кастомные API-интеграции LLM быстро упираются в потолок
Последние два года многие ИТ-команды закрывали задачу «подключить LLM к внутренним данным» самым прямым способом: писали REST-эндпоинты, добавляли middleware на LangChain, оборачивали внутренние сервисы в Python и передавали payload во внешний LLM API.
На пилоте это часто работает. В production — уже нет.
Любая интеграция, построенная на кастомных REST API без стандартизированного протокола обмена, становится уязвимой к изменениям схемы, плохо переносит рост числа инструментов и быстро обрастает техническим долгом.
Проблема не только в поддержке кода. Самописные интеграции обычно ломаются в трёх местах:
- нет строгой схемы tool-calling;
- нет понятной модели разграничения доступа на уровне инструментов и ресурсов;
- нет нормального способа масштабировать несколько агентов без дублирования логики.
В результате один агент умеет читать CRM, второй — бухгалтерские документы, третий — склад. Но каждый делает это по-своему, через отдельный слой кода, с разными правилами аутентификации и логирования. Для CISO это плохая новость. Для CTO — тоже.
Если у вас уже есть внутренние Python-скрипты и вы пытаетесь превратить их в управляемый слой для AI-агентов, полезно посмотреть, как мы подходим к этому в статье От Script-Kiddie к Enterprise: Рефакторинг Python-скрейперов в масштабируемые бекенды FastMCP. Там как раз разобран переход от «работает у одного разработчика на ноутбуке» к нормальной серверной архитектуре.
Контекстное окно LLM не заменяет доступ к данным
Одна из самых частых ошибок в интеграциях «до MCP» — попытка загрузить весь релевантный контекст в модель через RAG или прямую сериализацию больших JSON-объектов в prompt.
На практике это быстро упирается в ограничения:
- размер context window;
- рост стоимости inference;
- задержки на сериализацию и передачу;
- Out-Of-Memory на больших выборках;
-
таймауты при работе через
XML-RPCили промежуточные API-шлюзы.
Для payload'ов свыше 500k строк используйте асинхронные
queue_job-процессы и не пытайтесь передавать массивные JSON-объекты напрямую в prompt. В Odoo-сценариях это почти гарантированно закончится таймаутами или перерасходом памяти.
Поэтому зрелая архитектура строится иначе. Модель не должна «тащить» весь массив данных в контекст. Она должна уметь делать точечные вызовы к структурированным источникам данных в реальном времени и получать только то, что нужно для текущей задачи.
Это и есть практический смысл MCP.
MCP как стандартный слой между LLM и корпоративными системами
Model Context Protocol (MCP) — это открытый протокол, который стандартизирует обмен контекстом, инструментами и ресурсами между AI-клиентом и сервером доступа к данным.
Если говорить без лишней теории, MCP решает простую, но важную задачу: отделяет AI-модель от внутренней бизнес-логики. Благодаря этому вы не завязываете архитектуру на одного LLM-провайдера и не переписываете интеграции каждый раз, когда меняется SDK, формат tool-calling или политика доступа.
На практике внедрение MCP даёт три понятных эффекта:
- снижает зависимость от конкретной LLM-платформы;
- вводит предсказуемую схему вызова инструментов;
- позволяет строить Zero-Trust доступ на уровне каждого запроса.
Если вы хотите глубже посмотреть на саму механику MCP в корпоративной CRM-среде, рекомендую статью Подключение ИИ-Агентов к Внутренней CRM: Разбор Архитектуры MCP. Она хорошо дополняет тему этого материала.
MCP и JSON-RPC 2.0: почему строгая схема важнее «гибкости»
В основе MCP лежит модель обмена, близкая по духу к JSON-RPC 2.0: клиент вызывает инструмент, сервер возвращает строго структурированный ответ, а не произвольный текстовый поток.
Для enterprise-сценариев это критично. Когда AI-агент запрашивает выписку для RO e-Factura, ищет документы по контрагенту или читает данные из Odoo, вам нужен не «примерно правильный» ответ, а предсказуемый контракт:
- какой инструмент вызван;
- с какими параметрами;
- кто инициировал запрос;
- что именно было возвращено;
- можно ли это аудировать и воспроизвести.
Именно здесь самописные REST-обёртки обычно начинают рассыпаться. Они удобны до первого серьёзного аудита или инцидента.
Кейс: безопасный XML-RPC payload для Odoo 18
Ниже — деперсонализированный пример из production MCP-сервера dlab.md. Он показывает, как JSON-RPC-вызов со стороны MCP-сервера маршрутизируется вXML-RPC-интерфейс Odoo.
import os
import xmlrpc.client
import ssl
# Zero-Trust Environment Params
ODOO_URL = os.environ.get("ODOO_URL", "https://dlab.md")
ODOO_DB = os.environ.get("ODOO_DB", "bitnami_odoo")
ODOO_USER = os.environ.get("ODOO_USER", "agent_publisher@dlab.md")
ODOO_API_KEY = os.environ.get("ODOO_API_KEY") # Strict Token Requirement
def _get_odoo_models():
"""Authenticate via API Token and return models proxy."""
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
common = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/common', context=ctx)
uid = common.authenticate(ODOO_DB, ODOO_USER, ODOO_API_KEY, {})
if not uid:
raise Exception(f"Failed to authenticate Agent ({ODOO_USER}) with generated API Token.")
models = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/object', context=ctx)
return models, uidСам код выше полезен как иллюстрация маршрутизации, но в production я бы не оставлял ctx.check_hostname = False и ctx.verify_mode = ssl.CERT_NONE, если только речь не идёт о временном стенде в изолированном контуре. Для боевой среды нужен нормальный TLS с проверкой сертификата, ротацией токенов и журналированием вызовов.
Это важный момент. Без него Zero-Trust остаётся только красивым словом в презентации.
Базовая схема: Claude 3.5, FastMCP и Odoo 18
Ниже — минимальная архитектурная схема для локального или контролируемого корпоративного сценария:
[ Claude 3.5 Sonnet ] <--(MCP/JSON-RPC)--> [ FastMCP Server ] <--(XML-RPC)--> [ Odoo 18 / PostgreSQL ]В такой схеме Claude 3.5 не получает прямой доступ к базе данных. Он работает через MCP-клиент, который видит только опубликованные инструменты. А уже MCP-сервер решает, какие вызовы допустимы, какие параметры валидны и какие данные можно вернуть.
Это принципиально лучше, чем давать модели широкий сетевой доступ к ERP или SQL.
Жизненный цикл защищённого MCP-подключения
Если упростить, безопасное подключение Claude 3.5 к внутренним данным через MCP проходит несколько этапов:
- Инициализация клиента: MCP Client устанавливает соединение с MCP Server.
- Handshake и negotiation: сервер сообщает, какие инструменты и ресурсы доступны.
- Вызов инструмента: клиент вызывает, например,
fetch_erp_recordилиexecute_sql_query. - Проверка политики доступа: сервер валидирует токен, контекст, допустимость операции и область данных.
- Обращение к backend-системе: Odoo, PostgreSQL, CRM или другой источник.
- Возврат строго ограниченного результата: без лишних полей, без «полезной нагрузки на всякий случай».
На этом этапе особенно важно не смешивать транспорт, бизнес-логику и политику безопасности в одном месте. Как только всё это оказывается в одном Python-файле, сопровождение становится дорогим, а аудит — болезненным.
Почему `stdio` часто безопаснее, чем HTTP
Для локальных агентных сценариев я обычно предпочитаю stdio transport. Причина простая: меньше сетевой поверхности атаки, меньше промежуточных компонентов, меньше точек отказа.
Для распределённых сценариев HTTP или SSE тоже допустимы, но только если у вас уже есть зрелая модель аутентификации, сегментация сети, журналирование и понятные правила публикации сервисов.
Для сценариев с высокой чувствительностью к SLA и данным используйте локальный
stdio transport там, где это возможно. Это уменьшает attack surface и упрощает контроль над каналом обмена.
Ниже — пример инициализации FastMCP для локального агента:
from mcp.server.fastmcp import FastMCP
# Initialize the MCP Server with strict namespace
mcp = FastMCP("DLab Odoo Web Editor")
@mcp.tool()
def search_odoo_views(name: str) -> str:
"""
Search for Odoo QWeb views by name (e.g. 'bridge', 'homepage').
Returns a formatted list of IDs and Names to help you target the right page.
"""
# ... [XML-RPC Logic] ...
if __name__ == "__main__":
# Bind to stdio transport for local Agent execution
mcp.run()Если вам интересен более широкий контекст по FastMCP и тому, как из отдельных скриптов вырастает нормальный backend-слой, снова отсылаю к статье От Script-Kiddie к Enterprise: Рефакторинг Python-скрейперов в масштабируемые бекенды FastMCP.
Безопасность MCP: что действительно нужно CISO и ИТ-директору
Основной риск при интеграции LLM с внутренними системами — не «галлюцинации» как таковые. Главный риск — неконтролируемый доступ к данным и невозможность доказать, кто, когда и зачем получил конкретную информацию.
Подключение Claude или любого другого AI-агента к ERP без Zero-Trust архитектуры — это прямой путь к проблемам с безопасностью и комплаенсом. Особенно если речь идёт о PII, финансовых документах, кадровых данных или трансграничной обработке.
С практической точки зрения я бы считал обязательными следующие меры:
- Сервисные аккаунты и отзывные API-токены. Каждый агент работает от отдельной технической учётной записи. Пользовательские пароли в таких интеграциях использовать нельзя.
- Минимально необходимые права. Агент должен видеть только те модели, поля и записи, которые нужны для его функции.
- Row-Level Security и доменные ограничения. Если backend это поддерживает, ограничение должно применяться на уровне данных, а не только в UI.
- Изолированное выполнение. MCP-серверы лучше запускать в read-only контейнерах с ограниченным набором системных вызовов и без лишних сетевых маршрутов.
- Журналирование и трассировка. Каждый вызов инструмента должен оставлять след: кто вызвал, с какими параметрами, к каким данным был доступ.
- Rollback-протоколы. Если агент участвует в операциях записи, должна быть предусмотрена обратимая транзакционная схема.
- Air-gapping для чувствительных контуров. Для финансовых и персональных данных это не паранойя, а нормальная инженерная практика.
Если AI-агент работает с PII, финансовыми документами или внутренними реестрами, проектируйте интеграцию так, как будто вам завтра придётся объяснять её аудитору по GDPR Article 32 и требованиям EU AI Act.
Тема защиты данных здесь напрямую пересекается с принципом privacy by design. По этой причине полезно дополнительно прочитать Data Protection by Design: Почему ваши скрипты автоматизации обходятся в €20 миллионов и Zero-Trust IT Audit: Как обезопасить бизнес-процессы перед выходом на рынки Европы.
Где MCP особенно полезен на практике
MCP особенно хорошо показывает себя не в «демо-ботах», а в сценариях, где есть реальные ограничения по данным, SLA и аудиту. Например:
- AI-агент читает статусы счетов и отгрузок из Odoo, но не имеет доступа к зарплатным данным.
-
Claude помогает оператору находить документы для
RO e-Factura, но получает только нужные поля, а не весь бухгалтерский реестр. - Агент анализирует инциденты в CRM и ERP, но работает через опубликованные инструменты, а не через прямой SQL-доступ.
-
При миграции с
1CилиSAPMCP используется как промежуточный Data Bridge, который даёт контролируемый доступ к legacy-данным без открытия всей системы наружу.
Последний сценарий особенно важен для компаний, которые одновременно модернизируют ERP и внедряют AI-слой. В таком случае рекомендую посмотреть Миграция с устаревших систем (1C, SAP) на Odoo 19: Оценка рисков и Дорожная карта, потому что там хорошо видно, где именно появляются риски при совмещении миграции и автоматизации.
Что меняется для enterprise-команды в 2026 году
В 2026 году уже недостаточно просто «подключить LLM к данным». Для production-среды нужен управляемый слой доступа, который:
- не зависит жёстко от одного вендора модели;
- поддерживает аудит и воспроизводимость вызовов;
- вписывается в требования GDPR, SAF-T, RO e-Factura и EU AI Act;
- не превращает AI-интеграцию в новый теневой IT-контур.
Именно поэтому MCP становится не модным словом, а нормальным архитектурным выбором.
Если коротко: кастомный API можно собрать быстро. Но поддерживать его годами под нагрузкой, аудитом и требованиями безопасности — совсем другая задача. MCP здесь выигрывает не за счёт «новизны», а за счёт дисциплины интерфейсов и предсказуемости интеграции.
Вывод
Переход от самописных API к Model Context Protocol — это не косметическое улучшение. Это способ навести порядок в доступе AI-агентов к корпоративным данным.
Для Claude 3.5 это особенно важно, потому что сама модель сильна ровно настолько, насколько аккуратно вы построили слой инструментов, политик доступа и транспорт. Если этот слой сделан плохо, никакая модель не спасёт архитектуру. Если сделан правильно — AI-агент становится полезным рабочим компонентом, а не источником новых рисков.
Для enterprise-среды я бы сформулировал это так: MCP — это не про удобство интеграции. Это про управляемость, безопасность и возможность масштабировать AI без потери контроля.
*
Примеры в этой статье показывают архитектурный подход к подключению Claude 3.5 и MCP к корпоративным системам, но не заменяют отдельную проверку TLS-настроек, политик доступа и требований отраслевого комплаенса в вашей среде. Если интеграция затрагивает Odoo, финансовые документы, PII или трансграничную обработку данных, перед запуском в production нужен совместный аудит со стороны ИБ, ERP-архитектора и compliance-команды.