Bitrix24 MCP Bridge

Bitrix24 MCP Bridge

A bridge between Claude (MCP) and Bitrix24 CRM/Tasks, enabling natural language interaction with leads, deals, contacts, companies, and tasks via a custom MCP server using incoming webhooks.

Category
访问服务器

README

Bitrix24 MCP Bridge

Мост между Claude (MCP) и Bitrix24 CRM/Задачами. Развёрнут на хостинге Beget по адресу mcp-bitrix.karpovpartners-it.ru.

1. Зачем это понадобилось

Изначально пытались подключить Claude к Bitrix24 через встроенный в Bitrix24 коннектор «МСР-подключения» (приложение aiassistant.bitrix_mcp / кнопка «Б24» в маркетплейсе). Оказалось, что эта функция не работает: эндпоинты /authorize, /.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource отдают голый nginx 404, хотя все настройки и подписка в порядке. Это баг/недокат фичи на стороне Bitrix24, а не ошибка в настройках.

В качестве обходного пути был написан собственный MCP-сервер («мост»), который:

  • принимает MCP-запросы от Claude по протоколу Streamable HTTP;
  • транслирует их в вызовы обычного REST API Bitrix24 через входящий вебхук (создан в Bitrix24 с правами только на CRM + Задачи);
  • отдаёт результат обратно в Claude в виде MCP tool-ответов.

2. Архитектура и файлы

Файл Назначение
server.mjs Основной код моста (ES-модуль). Поднимает Express-сервер, разбирает MCP-запросы через @modelcontextprotocol/sdk, дергает REST API Bitrix24.
app.js Тонкая CommonJS-обёртка для запуска server.mjs. Нужна из-за особенности Passenger на Beget (см. ниже).
package.json Зависимости: @modelcontextprotocol/sdk, express, zod, undici.
.htaccess.example Шаблон конфигурации Phusion Passenger + переменные окружения. Реальный .htaccess с боевыми секретами не хранится в репозитории (см. .gitignore) — он развёрнут напрямую на сервере и сохранён отдельно у владельца проекта.

Какие инструменты (tools) доступны в Claude

  • bitrix24_call — вызов любого метода crm.*, task.*, tasks.*, user.current, profile напрямую (эскейп-люк).
  • bitrix24_list_crm / bitrix24_get_crm / bitrix24_add_crm / bitrix24_update_crm — список/чтение/создание/обновление записей CRM (lead, deal, contact, company).
  • bitrix24_list_tasks / bitrix24_add_task / bitrix24_update_task / bitrix24_complete_task — работа с задачами.

Сервер жёстко ограничивает вызываемые методы Bitrix24 префиксами crm., task., tasks., user.current, profile (см. ALLOWED_METHOD_PREFIXES в server.mjs) — это защита на случай, если у вебхука когда-нибудь появятся более широкие права.

3. Аутентификация / безопасность

У кастомных MCP-коннекторов в интерфейсе Claude нет поля для произвольных HTTP-заголовков — только URL (+ опционально OAuth Client ID/Secret). Поэтому вместо заголовка Authorization секрет зашит в путь URL:

https://mcp-bitrix.karpovpartners-it.ru/mcp/<секрет>

Секрет и адрес вебхука Bitrix24 хранятся только в боевом .htaccess на сервере и в приватной копии у владельца проекта — они намеренно не закоммичены в этот репозиторий (см. .gitignore). Любой, кто узнает секрет из URL, получит доступ к CRM и задачам Bitrix24 в рамках прав вебхука.

4. Как это работает по шагам

  1. Claude открывает MCP-коннектор → POST на /mcp/<секрет> с телом {"method":"initialize", ...}.
  2. Express-роут в server.mjs создаёт новый McpServer (StreamableHTTPServerTransport, sessionIdGenerator: undefined — сервер без сохранения сессии, каждый запрос независим).
  3. Claude вызывает tools/list, затем tools/call с конкретным инструментом (например bitrix24_list_crm).
  4. server.mjs вызывает bitrixCall(method, params), которая делает fetch() на https://<портал>.bitrix24.ru/rest/<id>/<вебхук>/<метод>.json.
  5. Ответ Bitrix24 оборачивается в MCP-формат и уходит обратно в Claude.

5. Развёртывание с нуля

  1. Создать входящий вебхук в Bitrix24: Настройки → Разработчикам → Другое → Входящий вебхук. Права — минимум CRM + Задачи.
  2. Склонировать репозиторий на сервер, в директорию сайта (public_html вашего домена/поддомена).
  3. npm install в этой директории (поставит express, zod, @modelcontextprotocol/sdk, undici).
  4. Скопировать .htaccess.example в .htaccess и прописать реальные BITRIX_WEBHOOK_URL и MCP_PATH_SECRET.
  5. На Beget: mkdir tmp && touch tmp/restart.txt — команда Passenger на перезапуск приложения после любых изменений в коде.
  6. В панели Beget: «Сайты» → у нужного сайта → «⋮» → «Прикрепить домен» — без этого шага Apache даже не пытается достучаться до вашего кода (см. раздел 6.2 — легко забыть, ошибка неочевидная).

6. Проблемы, с которыми столкнулись при разворачивании на Beget, и как их решили

Журнал отладки — пригодится при повторном развёртывании на Beget или другом shared-хостинге со старым Node.js.

6.1. Node.js на Beget — версия 16.20.2, слишком старая

На стороне Beget (Ubuntu 18.04, glibc 2.27) официальные сборки Node 18+ не запускаются (GLIBC_2.28' not found). Пришлось остаться на Node 16.20.2 и вручную подложить недостающие в Node 16 глобальные объекты, которые нужны современным зависимостям (@modelcontextprotocol/sdk, Express 5):

  • fetch, Headers, Request, Response — через пакет undici.
  • crypto (Web Crypto API, crypto.randomUUID()) — через встроенный node:crypto (webcrypto).
  • ReadableStream, WritableStream, TransformStream — через встроенный node:stream/web.
  • structuredClone, MessageChannel/MessagePort — на всякий случай, через node:v8 и node:worker_threads.

Всё это — в самом начале server.mjs, до импорта Express и MCP SDK (сделано через await import(...), а не через обычный import сверху файла — см. следующий пункт, почему).

6.2. Домен не был «приклеен» к папке сайта

После загрузки кода на сервер сайт отдавал фирменную страницу Beget «Домен не привязан к директории на сервере» вместо приложения. Просто создать папку сайта и залить туда файлы недостаточно — домен нужно отдельно «прикрепить» через панель: Сайты → нужный сайт → ⋮ → «Прикрепить домен». Неочевидный шаг, который легко пропустить.

6.3. ERR_REQUIRE_ESM: Passenger не умеет грузить ES-модули

Passenger на Beget (старая версия, passenger40) запускает стартовый файл через require(), а require() в Node принципиально не умеет грузить ES-модули (import/export, type: module в package.json). server.mjs использует await на верхнем уровне файла — а это возможно только в ES-модуле.

Решение: в package.json нет "type": "module" (по умолчанию .js — CommonJS), сам код лежит в файле с расширением .mjs (расширение .mjs — это всегда ES-модуль, вне зависимости от package.json), а точкой входа для Passenger сделан app.js — крошечный CommonJS-файл:

// app.js
import('./server.mjs').catch((err) => {
  console.error('Failed to start server:', err);
  process.exit(1);
});

require() спокойно загружает app.js (это обычный CommonJS), а внутри него динамический import() (это функция, а не декларация) уже может асинхронно загрузить ES-модуль server.mjs.

6.4. Секрет в пути URL

MCP_PATH_SECRET — случайная строка (например, secrets.token_urlsafe(32) в Python, или crypto.randomUUID() + crypto.randomUUID() в консоли браузера). Если нужно перевыпустить секрет — сгенерировать новый и обновить в .htaccess на сервере и в настройках коннектора в Claude.

7. Как подключить в Claude

  1. claude.ai → Настройки → Connectors → Add custom connector.
  2. Name: Bitrix24 (любое).
  3. Remote MCP server URL: https://mcp-bitrix.karpovpartners-it.ru/mcp/<секрет>
  4. OAuth Client ID / Secret — оставить пустыми, они не нужны (авторизация уже зашита в URL).
  5. Сохранить, включить коннектор в чате.

8. Открытый вопрос — родной MCP-коннектор Bitrix24

Стоит написать в поддержку Bitrix24 про сломанный нативный MCP-коннектор («Б24» в маркетплейсе): /authorize и стандартные OAuth-discovery эндпоинты отдают голый nginx 404 при включённых настройках и активной подписке. Когда/если Bitrix24 это починит, можно будет переключиться на официальный коннектор — либо оставить этот мост, он тоже рабочий и даёт больше контроля (например, ограничение методов до CRM+Задачи прямо в коде).

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选