Skip to main content
Glama
README.md
# bitrix24-mcp

**MCP-сервер для Bitrix24.** Даёт AI-ассистентам (Claude, Cursor и др.) прямой доступ к вашему порталу Bitrix24 через входящий вебхук: задачи и канбан, отчёты и аналитика загрузки, чаты и мессенджер, файлы, база знаний, пользователи. 48 инструментов, один файл, без облака — сервер ходит в Bitrix напрямую с вашей машины.

> *An MCP server for Bitrix24 — lets AI assistants manage tasks, kanban boards, reports, chats, files and the knowledge base of your Bitrix24 portal through an inbound webhook.*

Bitrix24 — самая распространённая CRM/таск-система в РФ и СНГ. Этот сервер превращает её в инструмент, которым пользуется AI-агент: *«покажи мои задачи в работе»*, *«собери отчёт по проекту за неделю»*, *«кто перегружен»*, *«заархивируй завершённые»*.

## Быстрый старт

**1. Получить вебхук в Bitrix24.**
`Приложения` → `Разработчикам` → `Входящий вебхук` (в некоторых версиях: `Приложения` → `Вебхуки` → `Входящий вебхук`). Отметьте права **Задачи и проекты (`task`), Мессенджер (`im`), Диск (`disk`), Пользователи (`user`), Рабочие группы (`sonet_group`)** — полный разбор скоупов ниже. Скопируйте URL, он выглядит так:

```
https://ВАШ-ПОРТАЛ.bitrix24.ru/rest/USER_ID/СЕКРЕТНЫЙ_КОД/
```

**2. Установить и настроить.**
```bash
git clone https://github.com/imejaikin/bitrix24-mcp.git
cd bitrix24-mcp
npm install
cp .env.example .env
# вписать свой BITRIX24_WEBHOOK_URL в .env
```

**3. Подключить к AI-клиенту** (Claude Code / Cursor) — см. раздел «Подключение» ниже.

> ⚠️ Вебхук = полный доступ к порталу под правами его владельца. Храните его как пароль: он в `.env`, который под `.gitignore` и в репозиторий не попадает.

---

## Инструменты

### Задачи
| Инструмент | Описание |
|---|---|
| `tasks_list` | Список задач с фильтрацией и сортировкой |
| `tasks_search_text` | READ-ONLY: поиск в заголовках и описаниях задач с локальной фильтрацией |
| `tasks_search_comments` | READ-ONLY: поиск в комментариях по ограниченному списку задач |
| `tasks_my` | Мои задачи (исполнитель + постановщик, с дедупом) |
| `tasks_get` | Детальная информация о задаче |
| `tasks_add` | Создать задачу |
| `tasks_update` | Обновить задачу |
| `tasks_complete` | Завершить задачу |
| `tasks_comments` | Комментарии задачи |
| `tasks_comment_add` | Добавить комментарий |
| `tasks_chat_messages` | Сообщения из чата задачи |
| `task_attach_file` | Прикрепить файл к существующей задаче |
| `project_stages` | Стадии канбана проекта (в порядке SORT) |
| `tasks_by_stage` | Задачи конкретной канбан-стадии (GROUP_ID + STAGE_ID) + `age_days` |
| `project_brief` | Бриф проекта: стадии канбана до «В процессе» с задачами |
| `tasks_in_progress` | Задачи стадии «В процессе» (стадия находится автоматически) + `age_days` |
| `tasks_stale` | READ-ONLY: задачи-долгожители на стадии дольше N дней |
| `tasks_overload` | READ-ONLY: исполнители с перегрузкой (>N задач «В процессе») |
| `tasks_completed_period` | Завершённые задачи за период (CLOSED_DATE + fallback по CHANGED_DATE) |
| `tasks_new_period` | Новые задачи за период (фильтр по CREATED_DATE) |
| `multi_project_report` | READ-ONLY: сводка «в работе / тестирование / завершено» по нескольким проектам |
| `tasks_archive_dry_run` | READ-ONLY preview: какие завершённые задачи будут архивированы |
| `tasks_archive` | WRITE: переместить завершённые задачи в финальную стадию (требует `confirm=true`) |

### Мессенджер
| Инструмент | Описание |
|---|---|
| `im_chat_messages` | Сообщения из чата/канала/личного диалога + индикатор существующих тредов |
| `im_message_comments` | Комментарии к публикации канала |
| `im_thread_messages` | READ-ONLY: сообщения существующего треда по родительскому сообщению |
| `im_thread_reply` | WRITE: ответить в существующий тред |
| `im_chat_find` | Поиск доступных чатов по названию |
| `workgroup_chat_get` | Получить основной чат рабочей группы/проекта по ID или названию |
| `im_chat_messages_period` | Сообщения диалога за диапазон дат |
| `im_chat_list` | Список последних чатов текущего пользователя |
| `im_send_file` | Отправить файл в чат или личный диалог |
| `im_send_message` | Отправить сообщение |

> Треды доступны через `im.v2.Chat.Message.*`, хотя эти методы не публикуются в REST-манифесте webhook. Если `im.v2.*` станет недоступен, `im_chat_messages` продолжит работать без поля `thread`, а `im_thread_messages` попробует существующий fallback `im_message_comments`.

### Файлы
| Инструмент | Описание |
|---|---|
| `disk_upload` | Загрузить файл в Bitrix Drive по локальному пути или из base64 |

### Пользователи
| Инструмент | Описание |
|---|---|
| `user_get` | Информация о пользователе по ID |
| `user_search` | Поиск по имени или email |

### База знаний
| Инструмент | Описание |
|---|---|
| `kb_list` | Список баз знаний портала (Landing): standalone (`KNOWLEDGE`) + базы рабочих групп (`GROUP`) |
| `kb_sections` | Страницы и разделы базы по `site_id` (системные скрыты, иерархия через `is_folder`/`parent_id`) |
| `kb_page_content` | Полный текст страницы по `landing_id` в формате `markdown`/`text`/`html` |
| `kb_search` | Поиск по заголовкам и содержимому страниц Landing-баз ограниченным обходом блоков |
| `kb2_list` | Список доступных баз знаний 2.0 (`note.collection.list`, REST 3.0) |
| `kb2_tree` | Дерево документов базы знаний 2.0 по `collection_id` |
| `kb2_document` | Заголовок, Markdown и метаданные документа по ID из `/note/document/<id>/` |
| `kb2_search` | Поиск документов базы знаний 2.0 по заголовку и содержимому |
| `kb2_document_create` | WRITE: создать документ с preview и `confirm=true` |
| `kb2_document_delete` | WRITE: переместить документ в корзину с preview, сверкой title/updatedAt и `confirm=true` |
| `kb2_document_update` | WRITE: обновить заголовок/Markdown документа с `confirm=true`, без принудительной перезаписи |

### Универсальный
| Инструмент | Описание |
|---|---|
| `bitrix_call` | Вызвать любой метод Bitrix24 REST API |

## Установка

```bash
git clone <URL репозитория>
cd bitrix24-local-mcp
npm install
cp .env.example .env
# Заполнить BITRIX24_WEBHOOK_URL в .env
```

## Настройка webhook в Bitrix24

1. Перейти в **Приложения** → **Вебхуки** → **Входящий вебхук**
2. Создать вебхук с правами (минимальный набор для работы инструментов):
   - `task` — **Задачи и проекты**. Обязательно, на нём держится почти весь сервер: списки/создание/обновление задач, комментарии, канбан, архив, брифы проектов. Чекбокс «Задачи и проекты» в Bitrix выдаёт связку `task` / `tasks` / `tasks_extended`. ⚠️ Именно `task` (в единственном числе) нужен методам `tasks.task.*`, `task.stages.*`, `task.commentitem.*` — одного `tasks` недостаточно.
   - `im` — **Мессенджер**: чаты задач, поиск чатов, отправка файлов в диалоги.
   - `disk` — **Диск**: загрузка и прикрепление файлов.
   - `user` — **Пользователи**: `tasks_my`, поиск/резолв пользователей.
   - `sonet_group` — **Рабочие группы (Социальная сеть)**: проектные/групповые инструменты (`sonet_group.get`).
   - `landing` — **Лендинги**: инструменты базы знаний (этап H). Можно не включать, пока инструменты `kb_*` не используются.
   - `note` — **База знаний 2.0**: инструменты `kb2_*` для документов `/note/document/...`. Для чтения нужно право «Просмотр», для `kb2_document_create` — право создания в нужной базе/родителе, для `kb2_document_update` — право «Редактирование» конкретного документа или базы, для `kb2_document_delete` — право удаления документа. Scope добавляется к webhook вручную; после сохранения ещё раз проверьте остальные отмеченные права.
   - `calendar` — **Календарь**: выделенных инструментов в сервере нет, но методы `calendar.event.*`/`calendar.section.*` дёргаются через `bitrix_call` (утренний бриф, создание встреч). Без этого права такие вызовы падают с 401/insufficient_scope.
3. Скопировать URL вебхука в `.env`

> Права проверены против живого API. При ручном редактировании прав вебхука в UI Bitrix следите, чтобы не сбросить ранее выданные скоупы: интерфейс может оставить только что отмеченные права. Если задачи перестали работать с `insufficient_scope` — вернулось ли право `task` (Задачи и проекты).

## Подключение к Claude Code

В файле `~/.claude/settings.json` или `.claude/settings.json` проекта:

```json
{
  "mcpServers": {
    "bitrix24-local": {
      "command": "node",
      "args": ["/path/to/bitrix24-local-mcp/index.js"]
    }
  }
}
```

## Подключение к Cursor

В файле `.cursor/mcp.json` проекта:

```json
{
  "mcpServers": {
    "bitrix24-local": {
      "command": "node",
      "args": ["/path/to/bitrix24-local-mcp/index.js"]
    }
  }
}
```

## Примеры использования

### Мои задачи
```
tasks_my
tasks_my filter={"!STATUS": 5} order={"DEADLINE": "asc"}
tasks_my user_id=45
```
Объединяет задачи, где пользователь — исполнитель **и** постановщик (с дедупом). Если `user_id` не указан — определяется через `user.current`. Каждая задача содержит поле `_role: ["responsible"]` / `["creator"]` / `["responsible", "creator"]`.

### Фильтрация задач
```
tasks_list filter={"RESPONSIBLE_ID": 45, "!STATUS": 5}
```
`DESCRIPTION` нельзя передавать в `tasks_list filter`: Bitrix24 на проверенном портале молча игнорирует такой фильтр. Инструмент вернёт явную ошибку вместо неотфильтрованной выдачи.

### Поиск текста в задачах
```
tasks_search_text query="figma" group_id=9
tasks_search_text query="Pet in Vet" from="2026-01-01" max_results=50
tasks_search_comments query="figma" task_ids=[9049,9050,9051]
```
`tasks_search_text` обходит задачи страницами по 50 и локально ищет без учёта регистра в `TITLE` и `DESCRIPTION`. Ответ компактный: ID, заголовок, ссылка, проект и фрагменты, без полного описания. Ограничивайте поиск `group_id` или периодом; `max_pages` (по умолчанию 60) и `max_results` (20) не дают молча превратить вызов в неограниченный обход. При `stopped_by="max_pages"` можно продолжить с `next_start`; при `max_results` увеличьте лимит и повторите запрос, так как совпадение могло быть в середине страницы. Для комментариев используйте `tasks_search_comments` только с уже суженным списком `task_ids`: каждый кандидат требует отдельного REST-вызова.

### Стадии канбана проекта
```
project_stages group_id=9
```
Возвращает стадии в порядке по `SORT`. Для «My Planner» передать `group_id=0`.

### Задачи конкретной канбан-стадии
```
tasks_by_stage group_id=9 stage_id=65
tasks_by_stage group_id=9 stage_id=65 filter={"RESPONSIBLE_ID": 45}
```
Пользовательский `filter` мёржится с `GROUP_ID` / `STAGE_ID` так, что их нельзя перебить.

### Бриф проекта до стадии «В процессе»
```
project_brief group_id=9
project_brief group_id=9 include_description=true max_tasks_per_stage=10
project_brief group_id=9 exclude_completed=false
project_brief group_id=9 select=["ID","TITLE","DESCRIPTION","RESPONSIBLE_ID"] max_tasks_per_stage=5
```
Проходит стадии канбана по порядку и собирает задачи до стадии «В процессе» включительно. По умолчанию завершённые задачи (STATUS=5) исключаются (`exclude_completed=true`). `include_description` добавляет DESCRIPTION к дефолтным полям; `select` задаёт произвольный набор полей. `max_tasks_per_stage` ограничивает выборку на стадию (в ответе добавляются поля `truncated` и `total_in_stage`). Для проектов без канбана автоматически переключается на STATUS-фильтрацию (`has_kanban: false`). Если в проекте есть задачи с `stageId=0`, они показываются в отдельной секции `unassigned`.

### Задачи «В процессе»
```
tasks_in_progress group_id=9
tasks_in_progress group_id=9 in_progress_match=["in progress"]
```
Шорткат: стадия находится автоматически. Тот же механизм поиска, что в `project_brief`. Каждая задача содержит вычисляемое поле `age_days`.

### Задачи-долгожители
```
tasks_stale group_id=9
tasks_stale group_id=9 min_age_days=60 stage_match=["тестирование"]
tasks_stale group_id=9 stage_id=65 min_age_days=14
```
Находит задачи на стадии, созданные более N дней назад (по `createdDate`). По умолчанию `min_age_days=30`, стадия — «В процессе». Каждая задача содержит `age_days`.

### Перегрузка исполнителей
```
tasks_overload group_id=9
tasks_overload group_id=[9, 21, 31] threshold=3 include_user_names=true
```
Находит исполнителей с количеством задач «В процессе» больше порога (`threshold`, по умолчанию 2). Поддерживает несколько проектов. `include_user_names=true` обогащает результат именами.

### Завершённые задачи за период
```
tasks_completed_period from="2026-04-01" to="2026-04-08" group_id=9
tasks_completed_period from="2026-04-01" responsible_id=45
tasks_completed_period from="2026-04-01" group_id=9 stage_closed_fallback=true
```
Основной фильтр по `CLOSED_DATE`. При `stage_closed_fallback=true` (по умолчанию) дополнительно ищет задачи в финальных стадиях канбана по `CHANGED_DATE` — ловит задачи, закрытые перемещением по канбану без `closedDate`. Каждая задача содержит `_source: "closed_date"` или `"stage_fallback"`. Для проектов без канбана — fallback по `STATUS=5` + `CHANGED_DATE`.

### Новые задачи за период
```
tasks_new_period from="2026-04-01" to="2026-04-08" group_id=9
tasks_new_period from="2026-04-01" include_closed=true
```
Выборка задач по `CREATED_DATE`. По умолчанию исключает уже закрытые (STATUS=5). Для раздела «новые направления» в еженедельном отчёте.

### Multi-project report
```
multi_project_report group_ids=[9,21,31] from="2026-07-01" to="2026-07-28"
multi_project_report group_ids=[9,21] from="2026-07-01" max_tasks_per_section=10 include_testing=false
```
Собирает по каждому проекту активную работу, тестирование и закрытия за период. Закрытия используют ту же fallback-логику, что `tasks_completed_period`; в проекте без канбана активная работа определяется по `STATUS=3`. Ответ ограничивает каждую секцию параметром `max_tasks_per_section` (default 20) и возвращает ошибки конкретного проекта, не отменяя остальные.

### Предпросмотр архивирования (read-only)
```
tasks_archive_dry_run group_id=9
tasks_archive_dry_run group_id=9 final_stage_id=101
```
Показывает завершённые задачи, которые ещё не лежат в финальной стадии канбана. Ничего не перемещает. Поиск финальной стадии — с конца канбана по подстрокам `["готово","завершено","закрыт","архив"]` или по явному `final_stage_id`.

### Архивирование завершённых задач (WRITE)
```
tasks_archive group_id=9 confirm=true
tasks_archive group_id=9 confirm=true task_ids=[123, 456] final_stage_id=101 limit=5
```
**Требует `confirm=true`**, иначе ничего не делает. Дефолт `limit=10`, максимум `50`. Если `task_ids` передан (даже пустой массив) — массовая выборка отключена, каждая задача проходит preflight (проверка `group_id`, `STATUS`, не уже в финале). Последовательный `task.stages.movetask` с индивидуальными `moved[]` / `failed[]` и `from_stage_id` для отката.

### Загрузка файла в Drive
```
disk_upload local_path="/tmp/report.pdf"
disk_upload content_base64="JVBERi0xLjcK..." name="report.pdf"
disk_upload local_path="/tmp/report.pdf" folder_id=1739
```
Если `folder_id` не указан, сервер пытается загрузить файл в корень персонального Drive текущего пользователя.

### Прикрепление файла к задаче
```
task_attach_file task_id=9049 file_id=6687
task_attach_file task_id=9049 local_path="/tmp/report.pdf"
task_attach_file task_id=9049 content_base64="JVBERi0xLjcK..." name="report.pdf"
```
Для существующей задачи используется штатный `tasks.task.files.attach`. Если передан локальный файл или base64-контент, MCP сначала грузит его в Drive, потом прикрепляет к задаче.

### Чтение личного диалога
```
im_chat_messages dialog_id="75"
```
Если Bitrix24 возвращает файлы в ответе, каждое сообщение дополнительно содержит `attachments: [{id,name,size,download_url,detail_url}]`.

### Чтение группового чата
```
im_chat_messages dialog_id="chat10833"
```
Если у сообщения есть обсуждение, оно содержит `thread: {dialog_id, message_count, is_user_subscribed}`. При недоступности `im.v2.*` верхнеуровневое поле `threads_available` будет `false`, но сами сообщения всё равно вернутся.

### Треды (комментарии к сообщению канала)
```
im_thread_messages dialog_id="chat10887" message_id=426029
im_thread_messages dialog_id="chat10887" message_id=412615 limit=50
im_thread_messages dialog_id="chat10887" message_id=426029 thread_dialog_id="chat27219"
im_thread_reply dialog_id="chat10887" message_id=426029 message="Проверю и вернусь с ответом"
im_thread_reply thread_dialog_id="chat27219" message="Уже известный тред"
```
`im_thread_messages` по умолчанию скрывает системный маркер «Начало обсуждения»; передайте `include_system=true`, чтобы его включить. `im_thread_reply` пишет от имени владельца webhook и умеет отвечать только в уже существующий тред: REST не создаёт первый комментарий под новым сообщением.

### Комментарии к публикации канала
```
im_message_comments dialog_id="chat10907" message_id=414247
im_message_comments dialog_id="chat10907" message_id=414247 include_system=true
im_message_comments dialog_id="chat10907" message_id=414247 comment_dialog_id="chat26615"
```
Комментарии Bitrix24 хранятся в отдельном скрытом чате `type=comment`. Публичный
REST API не умеет находить его напрямую по `message_id`, поэтому MCP проверяет
ограниченный диапазон свежих chat ID и сверяет `parent_chat_id` /
`parent_message_id`. Для старых веток увеличьте `scan_limit` или передайте
`scan_start_chat_id` и `scan_end_chat_id`. Если `comment_dialog_id` уже известен,
инструмент проверит его принадлежность и прочитает ветку без сканирования.
Любой диапазон ограничен 5000 chat ID; за один вызов возвращается до 50 сообщений.

### Поиск чата по названию
```
im_chat_find query="Агент поддержки"
im_chat_find query="support" limit=5
```
Возвращает доступные текущему пользователю чаты и нормализованный `dialog_id` (`chat<ID>` для обычного чата, `sg<ID>` для чата рабочей группы).

### Чат рабочей группы/проекта
```
workgroup_chat_get group_id=9
workgroup_chat_get group_name="Разработка"
```
Композиция `sonet_group.get` + `im.chat.get` для основного чата проекта/группы. Для проектных чатов `dialog_id` возвращается в формате `sg<group_id>`.

### Сообщения чата за период
```
im_chat_messages_period dialog_id="chat16405" date_from="2026-04-24T00:00:00+03:00" date_to="2026-04-24T23:59:59+03:00"
im_chat_messages_period dialog_id="sg9" date_from="2026-04-01" date_to="2026-04-24" limit=200 max_pages=40
```
Листает `im.dialog.messages.get` через `FIRST_ID` от начала истории, фильтрует сообщения по `date` на стороне MCP и возвращает `stopped_by` / `next_first_id` для диагностики длинных чатов. Если в ответе Bitrix есть файлы, сообщения обогащаются полем `attachments`.

### Отправка файла в чат
```
im_send_file dialog_id="75" local_path="/tmp/report.pdf"
im_send_file dialog_id="chat10833" local_path="/tmp/report.pdf" message="Отправляю отчёт"
im_send_file dialog_id="sg9" file_id=6687 message="Готовый файл из Drive"
```
Если передан локальный файл или `content_base64`, используется `im.v2.File.upload`. Если уже есть `file_id` в Drive — `im.disk.file.commit`.

### База знаний
```
kb_list
kb_list type="KNOWLEDGE"
kb_sections site_id=5
kb_sections site_id=5 include_system=true
kb_page_content landing_id=15
kb_page_content landing_id=15 format="text"
kb_search query="VPN" site_id=5
kb_search query="Shadowsocks" site_id=5 max_pages=20
```
Эти инструменты работают со старыми базами на модуле Landing. `kb_list` возвращает все доступные базы (standalone `KNOWLEDGE` и базы рабочих групп `GROUP`); видны только расшаренные пользователю webhook. `kb_sections` отдаёт страницы базы по её `site_id` (scope определяется автоматически, системные страницы скрыты по умолчанию). `kb_page_content` собирает блоки страницы и склеивает их в `markdown` (по умолчанию), `text` или `html`. `kb_search` перебирает страницы и их блоки локально, потому что серверный `SEARCH_CONTENT` ненадёжен: ограничивайте его `site_id`, `max_pages` (default 10) и `max_results` (20). Требуется право webhook `landing`.

### База знаний 2.0
```
kb2_list
kb2_tree collection_id=123
kb2_document id=77
kb2_search query="Планы на спринт" limit=200
kb2_document_create collection_id=11 parent_id=77 title="20.07-02.08" markdown="..." confirm=false
kb2_document_create collection_id=11 parent_id=77 title="20.07-02.08" markdown="..." expected_preview_key="<preview_key>" confirm=true
kb2_document_delete id=123 confirm=false
kb2_document_delete id=123 expected_title="Документ" expected_updated_at="2026-07-16T10:51:36Z" confirm=true
kb2_document_delete id=123 expected_title="Документ" expected_updated_at="2026-07-16T10:51:36Z" expected_children_key="<children_key>" allow_delete_with_children=true confirm=true
kb2_document_update id=531 markdown="# Новый текст" confirm=false
kb2_document_update id=531 markdown="# Новый текст" expected_updated_at="2026-07-14T15:16:48Z" confirm=true
```
Документы с адресами `/note/document/...` обрабатываются отдельными методами `note.*` через REST 3.0. `kb2_tree` сохраняет вложенные `children` и возвращает `truncated`; `kb2_document` возвращает исходный Markdown. Поиск выдаёт только первую страницу: при `hasMore=true` нужно уточнить запрос или увеличить `limit`. Для чтения требуются scope webhook `note` и право «Просмотр» у пользователя webhook на нужную базу или документ.

Если у пользователя webhook есть только право «Просмотр», read-only инструменты (`kb2_list`, `kb2_tree`, `kb2_document`, `kb2_search`) продолжают работать в пределах доступных баз и документов. Write-инструменты могут сформировать preview, но подтверждённые вызовы `confirm=true` не обходят права Bitrix24: создание, обновление или перемещение в корзину завершится ошибкой доступа, если у пользователя нет соответствующего права на выбранную базу, родителя или документ.

`kb2_document_create` создаёт новый документ через `note.document.add` только после preview. Первый вызов выполняется с `confirm=false`: инструмент проверяет родительский документ, ищет дубли заголовка среди соседних документов, возвращает поля будущего создания и `preview_key`, но ничего не пишет. `confirm=true` допустим только после явного подтверждения пользователя в текущем диалоге и с тем же `expected_preview_key`; если поля создания изменились после preview, операция отменяется. Если в выбранном `parent_id` уже есть документ с таким же `title`, создание блокируется, пока пользователь явно не разрешит `allow_duplicate_title=true`. Bitrix24 дополнительно проверяет право пользователя webhook на создание документа в указанной базе или родителе.

`kb2_document_delete` перемещает документ в корзину Bitrix24 через `note.document.delete` только после preview. Первый вызов с `confirm=false` читает документ, возвращает `expected_title`, `expected_updated_at`, метаданные, первые 1000 символов Markdown, список вложенных дочерних документов и `children_key`. Подтверждённый вызов обязан передать значения из preview; MCP повторно читает документ и отменяет удаление, если title, `updatedAt` или список дочерних документов изменились. Если у документа есть дочерние документы, удаление по умолчанию блокируется; пользователь должен явно разрешить это через `allow_delete_with_children=true` и передать тот же `expected_children_key`. После успешного удаления документ исчезает из дерева и поиска, но может оставаться доступен прямым `note.document.get` по ID как объект в корзине. Bitrix24 дополнительно проверяет право пользователя webhook на удаление.

Если пользователь просит удалить документ по названию, агент сначала должен выполнить поиск и проверить неоднозначность. При нескольких совпадениях удалять нельзя: нужно показать пользователю варианты с `documentId`, `collectionId`, `parentId`, родителем/путём из `kb2_tree` и кратким preview/snippet, затем попросить уточнить, какой именно документ удалить. Только после выбора конкретного `documentId` можно вызывать `kb2_document_delete confirm=false` и затем запрашивать финальное подтверждение на `confirm=true`.

`kb2_document_update` заменяет переданный заголовок и/или **всё** содержимое Markdown. Первый вызов всегда выполняется с `confirm=false`: инструмент читает актуальный документ, возвращает preview с `expected_updated_at` и ничего не меняет. После показа изменений пользователь должен явно подтвердить именно эту запись в текущем диалоге. Только после такого ответа агент может повторить вызов с `confirm=true` и тем же `expected_updated_at`; самостоятельно подтверждать операцию или считать исходный запрос подтверждением запрещено. Перед записью MCP повторно читает документ. Если `updatedAt` изменился после preview, операция отменяется с `DOCUMENT_CHANGED_SINCE_PREVIEW`, и требуется новый preview и новое подтверждение. Запрос всегда отправляется с `overwrite=false`. Принудительная перезапись через MCP не поддерживается. Bitrix24 выполняет запись только при наличии у пользователя webhook права «Редактирование».

Bitrix24 поддерживает совместное редактирование и может принять REST-обновление при открытом веб-редакторе, уведомив редактора о новой версии. Публичный REST API не предоставляет отдельного метода проверки активных редакторов. Проверка `updatedAt` защищает от отправки изменений поверх уже сохранённой новой версии, но не определяет наличие несохранённого текста в открытом редакторе.

При `NOTE_DOCUMENT_HAS_UNSAVED_CHANGES` ответ содержит `pending_update` с ID и полным набором предложенных полей. Эти данные остаются в контексте текущего чата, поэтому пользователь может позже написать «попробовать ещё раз» — это считается явным подтверждением повторить именно ожидающее изменение. MCP не хранит черновик на диске или в Bitrix24: в новом чате preview нужно сформировать заново.

### Универсальный вызов API
```
bitrix_call method="crm.lead.list" params={"filter": {"STATUS_ID": "NEW"}}
```

### Multi-project report (cookbook)

Пошаговое руководство по сборке сводки по нескольким проектам через композицию инструментов — см. [`artifacts/cookbook-multi-project-report.md`](artifacts/cookbook-multi-project-report.md).

### Детали задачи для summary / отчёта
```
tasks_get id=9049 select=["ID","TITLE","DESCRIPTION","STATUS","DEADLINE","CREATED_DATE","CLOSED_DATE","RESPONSIBLE_ID","CREATED_BY","GROUP_ID","STAGE_ID"]
tasks_get id=9049 include_attachments=true
```
Сервер не обрезает `DESCRIPTION` — возвращает поле в том виде, в котором его отдаёт Bitrix24. При `include_attachments=true` дополнительно возвращаются нормализованные вложения задачи из `UF_TASK_WEBDAV_FILES`.

TDQS

B3/5.0

Scored across 48 tools

Disambiguation2/5

Multiple tools have overlapping purposes: kb2_search/kb_search and kb2_list/kb_list differ only by KB generation; several task report tools (tasks_completed_period, tasks_new_period, tasks_in_progress, tasks_stale, tasks_overload) cover similar territory. Even with descriptions, agents may struggle to pick the correct specialized tool.

Naming Consistency2/5

Naming conventions are inconsistent: some follow object_verb (tasks_add, user_get), some use object_noun (tasks_comments, project_brief), and others use prepositions/adjectives (tasks_in_progress, tasks_overload). The mix makes it hard to predict tool names.

Tool Count2/5

48 tools is excessive for a single server, even for a comprehensive Bitrix24 integration. Many tools are specialized variants of task reports, and the overall count burdens the agent with too many choices.

Completeness3/5

Core workflows for tasks, knowledge bases, and messaging are covered well, but notable gaps exist: no task deletion, no task stage movement, no user management beyond search/get, and no project creation. The two KB modules create redundancy rather than filling missing functionality.

Maintenance

ActivityMaintained
ResponsivenessNo issues