bitrix24-mcp-bridge 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,9 +1,8 @@
1
1
  # Bitrix24 MCP Bridge
2
2
 
3
- Локальный MCP-сервер, дающий ИИ-агенту доступ к задачам, проектам и чатам Bitrix24 (чтение
4
- и — для вызовов из каталога — выполнение действий) — в объёме прав пользователя, через
5
- браузерное расширение, переиспользующее живую сессию. Без прав администратора и без
6
- официального REST-вебхука.
3
+ Локальный MCP-сервер, дающий ИИ-агенту доступ к задачам, проектам, чатам и созвонам Bitrix24
4
+ через встроенные операции моста — в объёме прав пользователя, через браузерное расширение,
5
+ переиспользующее живую сессию. Без прав администратора и без официального REST-вебхука.
7
6
 
8
7
  ```
9
8
  ИИ-агент ─stdio─► MCP-клиент ─UDS(bridge.sock)─► daemon ─WS(127.0.0.1:39917, токен+Origin)─► Расширение (вкладка портала)
@@ -16,7 +15,7 @@
16
15
 
17
16
  ```bash
18
17
  # 1. Настроить портал через npx — без глобальной установки (интерактивно): токен +
19
- # первый портал + config.json + actions.json + расширение
18
+ # первый портал + config.json + расширение
20
19
  npx -y bitrix24-mcp-bridge setup
21
20
 
22
21
  # 2. Зарегистрировать сервер у MCP-клиента (пример — Claude Code); каждый запуск идёт через npx
@@ -43,21 +42,23 @@ bitrix24-mcp-bridge`.
43
42
 
44
43
  - **Первый запуск** (нет `config.json`): спрашивает origin портала и его alias,
45
44
  генерирует общий токен (`crypto.randomBytes(32)`), пишет
46
- `~/.bitrix24-mcp-bridge/config.json`, кладёт стартовый `actions.json`
47
- (каталог методов) и **материализует расширение** в
45
+ `~/.bitrix24-mcp-bridge/config.json` и **материализует расширение** в
48
46
  `~/.bitrix24-mcp-bridge/extension/` (статичные JS-бандлы + `config.json` +
49
47
  `manifest.json`, собранный под ваши порталы).
50
48
  - **Повторный запуск** (config уже есть): открывает меню правки —
51
49
  `[a]` добавить портал, `[r]` удалить, `[e]` изменить origin, `[d]` сменить
52
- портал по умолчанию, `[p]` порт, `[t]` ротировать токен, `[u]` обновить
53
- расширение из установленного пакета, `[q]` выход.
50
+ портал по умолчанию, `[p]` порт, `[m]` включить/выключить мутации, `[t]` ротировать
51
+ токен, `[u]` обновить расширение из установленного пакета, `[q]` выход.
54
52
 
55
53
  **Обновление пакета** почти полностью автоматическое:
56
54
 
57
- - **Каталог** — новые записи дописываются в ваш `~/.bitrix24-mcp-bridge/actions.json` при следующем
58
- старте (в stderr — `[catalog] added N new entries…`). Ваши записи и правки не трогаются, а запись,
59
- которую вы удалили сами, назад не возвращается: доставленные ключи помечаются в
60
- `catalog-state.json`, поэтому удаление считается решением, а не пробелом.
55
+ - **Daemon** — MCP-клиент новой версии при старте сверяет версию работающего daemon и, если она
56
+ старше, гасит его и поднимает свой (в stderr — `[mcp] restarted daemon <старая> → <новая>`).
57
+ Более новый daemon клиент не трогает (`[mcp] daemon <v> is newer than this client <v>; leaving it`),
58
+ чтобы две установленные версии не перезапускали daemon друг у друга по очереди.
59
+ - **Устаревшие файлы** — `actions.json` и `catalog-state.json` от прежней модели (каталог вызовов)
60
+ удаляются из `~/.bitrix24-mcp-bridge/` при старте (`[cleanup] removed …`). `config.json` и
61
+ `downloads/` не трогаются никогда.
61
62
  - **Файлы расширения** в `~/.bitrix24-mcp-bridge/extension/` обновляются там же автоматически, если
62
63
  версия пакета изменилась (`[extension] refreshed …`), — запускать `setup` → `[u]` вручную больше не нужно.
63
64
  - **Один ручной шаг остаётся:** нажать «Обновить» на расширении в `chrome://extensions` и перезагрузить
@@ -65,6 +66,12 @@ bitrix24-mcp-bridge`.
65
66
  сам. Пока этого не сделано, `bitrix_status` возвращает `warning` с версиями моста и расширения, так
66
67
  что рассинхрон виден сразу, а не всплывает необъяснимой ошибкой.
67
68
 
69
+ > **Переход на встроенные операции — несовместимый (breaking) релиз.** `bitrix_call` и
70
+ > пользовательский каталог вызовов убраны; агент работает только через инструменты из таблицы ниже.
71
+ > Первый же MCP-клиент новой версии заменит daemon, и **клиенты, запущенные прежней версией** (другие
72
+ > открытые сессии агентов), потеряют мост — на вызовы они получат `unsupported request type call — this
73
+ > daemon is <версия>; restart the agent session…`; им нужно перезапустить сессию агента.
74
+
68
75
  **Мультипортальность** поддержана: каждый портал — отдельная запись, а в манифесте
69
76
  расширения `matches`/`host_permissions` перечисляют ровно сконфигурированные origin'ы
70
77
  (least-privilege на origin).
@@ -78,18 +85,21 @@ daemon после любой правки, затрагивающей конфи
78
85
 
79
86
  ## Инструменты
80
87
 
81
- Помимо `bitrix_help` / `bitrix_status` / `bitrix_call`, мост регистрирует типизированные обёртки
82
- над каталогом (разумные дефолты + схема параметров). Регистрируются только те, чьё имя есть в
83
- `actions.json`. Точная выборка — через необязательный `params` (мержится последним, перекрывает
84
- дефолты). Каждый принимает необязательный `portal` (alias; по умолчанию — из `config.json`).
85
- Обёртки в основном read-only; мутирующие помечены ⚠. `bitrix_call` выполняет любой разрешённый
86
- каталогом вызов, включая мутирующие.
88
+ Кроме `bitrix_help` / `bitrix_status`, каждый инструмент — **встроенная операция** моста
89
+ (`src/ops/`): типизированные аргументы, разумные дефолты, запрос к Bitrix24 строит и проверяет
90
+ daemon. Набор операций фиксирован в коде; произвольного вызова Bitrix-метода по имени нет. У
91
+ большинства операций (пометка «+ `params`» в [`docs/api-notes.md`](docs/api-notes.md) §3) есть
92
+ необязательный `params` в нативном формате Bitrix (мержится последним, перекрывает дефолты). Каждый инструмент принимает необязательный `portal` (alias; по умолчанию —
93
+ из `config.json`). Мутирующие помечены ⚠: они **включены по умолчанию** и выключаются одним
94
+ переключателем (см. «Переключатель мутаций»). Мутирующие операции, кроме отметки прочитанным
95
+ (`bitrix_chat_mark_read` / `bitrix_chat_read_all`), не принимают `params`; изменения задач они,
96
+ где это возможно, перечитывают после записи, а списочные поля (соисполнители, наблюдатели, теги) правят поверх
97
+ текущего значения задачи.
87
98
 
88
99
  | Инструмент | Назначение |
89
100
  |---|---|
90
- | `bitrix_help` | справка по API/params (= `docs/api-notes.md`) |
91
- | `bitrix_status` | какие порталы сконфигурированы и подключены |
92
- | `bitrix_call` | любой разрешённый вызов из каталога по имени (в т.ч. мутирующий) |
101
+ | `bitrix_help` | справка по инструментам и params (= `docs/api-notes.md`) |
102
+ | `bitrix_status` | какие порталы сконфигурированы и подключены, разрешены ли мутации |
93
103
  | *Задачи* | |
94
104
  | `bitrix_tasks_list` / `bitrix_task_get` | список задач / карточка |
95
105
  | `bitrix_task_get_v2` | карточка через v2-подсистему (JSON) |
@@ -97,6 +107,28 @@ daemon после любой правки, затрагивающей конфи
97
107
  | `bitrix_task_files` | файлы задачи |
98
108
  | `bitrix_task_views_count` | счётчик просмотров |
99
109
  | `bitrix_task_subtasks` / `bitrix_task_related` | подзадачи / связанные задачи |
110
+ | `bitrix_task_comments` | старые комментарии задачи (форум, до чатов задач) |
111
+ | `bitrix_task_description_set` ⚠ / `bitrix_task_description_append` ⚠ | заменить описание задачи / дописать в его конец |
112
+ | `bitrix_task_description_replace` ⚠ | точечная правка фрагмента описания |
113
+ | `bitrix_task_tags` ⚠ | добавить / убрать теги (пакетно) |
114
+ | `bitrix_task_checklist` / `bitrix_task_checklist_edit` ⚠ | чек-лист задачи / его правка |
115
+ | `bitrix_task_plan` ⚠ | планируемые даты начала и завершения |
116
+ | `bitrix_task_priority` ⚠ / `bitrix_task_deadline` ⚠ | важность / крайний срок (пакетно) |
117
+ | `bitrix_task_close` ⚠ / `bitrix_task_reopen` ⚠ | закрыть задачу (через Definition of Done, в два шага) / возобновить (пакетно) |
118
+ | `bitrix_task_result_add` ⚠ | добавить результат задачам (пакетно, `taskIds`) |
119
+ | `bitrix_task_file_attach` ⚠ | прикрепить локальный файл (через Диск пользователя) |
120
+ | `bitrix_task_mute` ⚠ | выключить / включить свои уведомления по задаче |
121
+ | `bitrix_task_reminders` / `bitrix_task_reminder_set` ⚠ / `bitrix_task_reminder_delete` ⚠ | свои напоминания по задаче |
122
+ | *Участники и связи задач* | |
123
+ | `bitrix_task_delegate` ⚠ | сменить ответственного (пакетно) |
124
+ | `bitrix_task_accomplices` ⚠ / `bitrix_task_auditors` ⚠ | добавить / убрать соисполнителей / наблюдателей (пакетно) |
125
+ | `bitrix_user_find` | найти пользователей по фамилии |
126
+ | `bitrix_task_related_edit` ⚠ / `bitrix_task_parent` ⚠ / `bitrix_task_gantt_link` ⚠ | связанные задачи / родительская задача / связь на диаграмме Ганта |
127
+ | *Scrum* | |
128
+ | `bitrix_sprint_columns` | колонки доски активного спринта проекта |
129
+ | `bitrix_task_move` ⚠ | перенести задачи в колонку спринта (пакетно, `taskIds`) |
130
+ | `bitrix_task_to_sprint` ⚠ / `bitrix_task_to_backlog` ⚠ | поставить задачи на доску активного спринта / вернуть в бэклог (пакетно) |
131
+ | `bitrix_task_create` ⚠ | создать задачу на доске активного спринта |
100
132
  | *Проекты* | |
101
133
  | `bitrix_projects_list` / `bitrix_project_get` | рабочие группы / проекты |
102
134
  | *Чаты* | |
@@ -107,14 +139,52 @@ daemon после любой правки, затрагивающей конфи
107
139
  | `bitrix_chat_history` | листать историю вглубь |
108
140
  | `bitrix_chat_get_dialog_id` | резолв dialogId по externalId |
109
141
  | `bitrix_chat_mark_read` ⚠ / `bitrix_chat_read_all` ⚠ | пометить сообщения / все чаты прочитанными |
142
+ | `bitrix_chat_send` ⚠ | отправить сообщение в чат (в т.ч. ответом на сообщение) |
143
+ | `bitrix_chat_message_edit` ⚠ / `bitrix_chat_reaction` ⚠ | изменить своё сообщение / поставить реакцию |
144
+ | `bitrix_task_chat_post` ⚠ | написать в чаты задач (пакетно) |
110
145
  | *Люди / поиск* | |
111
146
  | `bitrix_user_get` | карточка пользователя |
112
147
  | `bitrix_entity_selector` / `bitrix_entity_search` | загрузка селектора / текстовый поиск сущностей |
113
148
  | `bitrix_entity_chat` | chatId чата связанного объекта (задача/группа/CRM) через `im.chat.get` |
149
+ | *Созвоны и файлы* | |
150
+ | `bitrix_chat_calls` | звонки в чате (callId + резюме) |
151
+ | `bitrix_call_detail` | всё по звонку: участники, решения, задачи, расшифровка |
152
+ | `bitrix_call_recording` | скачать аудиозапись звонка на диск |
153
+ | `bitrix_file_download` | скачать файл портала на диск (только ссылки на файлы, см. ниже) |
114
154
 
115
155
  `bitrix_help` — единственный источник конвенций params (select/filter/order/пагинация,
116
156
  имена полей). Он отдаёт `docs/api-notes.md`, так что любому агенту не нужен доступ к репозиторию.
117
157
 
158
+ ### Переключатель мутаций
159
+
160
+ Мутирующие операции — все помеченные ⚠ в таблице выше (полный список — `bitrix_help` /
161
+ [`docs/api-notes.md`](docs/api-notes.md) §3, «Мутирующие операции») — по умолчанию **разрешены**. Они действуют от имени
162
+ пользователя: другие участники видят изменения и получают уведомления Bitrix24 (кто именно — там же).
163
+ Запретить их можно тремя способами (побеждает верхний):
164
+
165
+ 1. env `BITRIX_MCP_MUTATIONS=off` (или `on`) у процесса daemon;
166
+ 2. `"mutations": false` в `~/.bitrix24-mcp-bridge/config.json`;
167
+ 3. `setup` → `[m]` — переключает то же поле и перезапускает daemon; открытые сессии агентов
168
+ переподключаются к новому daemon сами на следующем вызове.
169
+
170
+ Текущее состояние видно в `bitrix_status` (поле `mutations`). Политику применяет daemon: запрещённая операция не уходит в Bitrix24, агент получает ошибку
171
+ `operation <имя> changes data, but mutations are disabled…`. Операции чтения переключатель не трогает.
172
+
173
+ ### Скачивание файлов
174
+
175
+ `bitrix_file_download` принимает только ссылки на файлы сконфигурированного портала — иначе
176
+ произвольный URL стал бы аутентифицированным GET к любому эндпоинту портала. Разрешены:
177
+
178
+ - `/bitrix/services/main/ajax.php` с `action` = `disk.api.file.download`,
179
+ `disk.attachedObject.download` или `call.Track.download`;
180
+ - `/bitrix/tools/disk/uf.php` с `action` = `download`, `show` или `downloadArchiveByEntity`.
181
+
182
+ Повторённый (`action=…&action=…`) или массивный (`action[]=…`) `action` отклоняется: PHP читает
183
+ другое значение, чем проверка. Файлы ложатся в `~/.bitrix24-mcp-bridge/downloads/`.
184
+
185
+ Известное ограничение: другие формы ссылок портала на файлы (например, `/disk/downloadFile/…` из
186
+ интерфейса Диска или публичные `/docs/pub/…`) отклоняются — бери ссылку из ответа моста.
187
+
118
188
  ## Архитектура
119
189
 
120
190
  Модель — **один долгоживущий daemon + N тонких клиентов**:
@@ -144,12 +214,11 @@ daemon после любой правки, затрагивающей конфи
144
214
  ### Конфигурация
145
215
 
146
216
  Runtime-домашняя папка — `~/.bitrix24-mcp-bridge/` (или `$BITRIX24_MCP_BRIDGE_HOME`).
147
- В ней: `config.json`, `actions.json`, `bridge.sock`, `extension/`.
217
+ В ней: `config.json`, `bridge.sock`, `extension/`, `downloads/`.
148
218
 
149
219
  Разрешение настроек слоями (побеждает верхний): **env → `.env` (только для разработки)
150
- → `~/.bitrix24-mcp-bridge/config.json`**. Каталог методов по умолчанию берётся из
151
- `~/.bitrix24-mcp-bridge/actions.json`; явный `BITRIX_CATALOG` (или `catalog` в config)
152
- по-прежнему поддержан.
220
+ → `~/.bitrix24-mcp-bridge/config.json`**. Ключи `config.json`: `token`, `port`, `portals`,
221
+ `defaultPortal`, `mutations` (см. «Переключатель мутаций»).
153
222
 
154
223
  ## Безопасность и модель доверия
155
224
 
@@ -160,13 +229,15 @@ Runtime-домашняя папка — `~/.bitrix24-mcp-bridge/` (или `$BITR
160
229
  привилегия — живая аутентифицированная сессия Bitrix24 — физически в расширении, а не в
161
230
  сервере. Отсюда:
162
231
 
163
- - **Граница — это allowlist каталога, не режим чтения.** Мост выполняет только именованные
164
- вызовы из `actions.json` — теперь среди них могут быть мутирующие. Общий локальный токен
165
- (риск G7) в write-режиме означает: процесс, знающий токен и порт демона, может выполнять
166
- эти действия в объёме прав пользователя. Внутри разрешённого действия значения `params`
167
- не инспектируются — для мутирующего вызова это означает полный контроль агента над телом
168
- запроса в рамках этого действия. Держи `actions.json` под контролем — это и есть
169
- граница возможностей агента.
232
+ - **Граница — набор встроенных операций и переключатель мутаций.** Мост выполняет только
233
+ операции из `src/ops/`; запрос к Bitrix24 строит daemon, произвольный метод по имени вызвать
234
+ нельзя. Значения `params` не инспектируются — агент управляет выборкой в рамках этого
235
+ метода; отклоняются только ключи `action`, `c`, `mode`, `sessid` (и их `[…]`-формы): они
236
+ выбирают контроллер или несут CSRF-токен, и их задаёт сама операция. Мутирующие операции выполняются, пока не выключены
237
+ (`"mutations": false`). Общий локальный токен (риск G7) означает: процесс, знающий токен и
238
+ порт демона, может выполнять эти операции в объёме прав пользователя.
239
+ - **Скачивание — только ссылки на файлы портала** (allowlist путей и `action`, см.
240
+ «Скачивание файлов»): `bitrix_file_download` не превращается в произвольный GET.
170
241
  - **Токен — единственная защита loopback-WS.** Генерируйте длинный и случайный —
171
242
  `setup` использует `crypto.randomBytes(32)`. Токен отсекает случайные подключения, но
172
243
  не является границей против локального атакующего: любой локальный процесс, знающий
@@ -196,26 +267,32 @@ bun run src/index.ts setup # интерактивная настройка
196
267
  bun test # юнит-тесты (bun:test)
197
268
  bun run typecheck # tsc --noEmit (сервер + extension)
198
269
  bun run build:dist # бандл сервера → dist/cli.js
199
- bun run build:ext # dev-сборка расширения → extension/dev/ (загружаемое)
200
- bun run sync:runtime # применить репо-изменения к живому daemon (см. ниже)
270
+ bun run build:ext:static # статичные бандлы расширения → extension/dist/
271
+ bun run sync:runtime # применить репо-изменения к живому daemon и расширению (см. ниже)
201
272
  ```
202
273
 
203
274
  `.env` — **только dev-оверрайды** (gitignored). Токен / origin / порт берутся из общего
204
275
  `~/.bitrix24-mcp-bridge/config.json` (через `loadConfig`) — дублировать их в `.env` не нужно, иначе
205
- dev-токен разойдётся с daemon. Осмысленно держать там лишь `BITRIX_CATALOG` (указывает
206
- dev-сборку/daemon на репозиторный `actions.json`). В проде весь конфиг — в
207
- `~/.bitrix24-mcp-bridge/config.json`, который пишет `setup`.
208
-
209
- **Репо ≠ живой daemon.** Daemon, к которому ходят агенты, читает **runtime-папку**
210
- (`~/.bitrix24-mcp-bridge/actions.json` + запущенный `dist/cli.js`), а не файлы репозитория. После
211
- правки каталога или кода сервера выполни **`bun run sync:runtime`**: она пересоберёт бандл, скопирует
212
- репо-`actions.json` в runtime-папку и погасит daemon (следующий вызов агента поднимет свежий). Без
213
- этого новые инструменты/методы агенту не видны.
276
+ dev-токен разойдётся с daemon. Осмысленно держать там разве что `BITRIX_MCP_MUTATIONS`. В проде
277
+ весь конфиг — в `~/.bitrix24-mcp-bridge/config.json`, который пишет `setup`.
278
+
279
+ **Репо ≠ живой daemon.** Daemon, к которому ходят агенты, исполняет собранный `dist/cli.js`, а не
280
+ исходники репозитория. После правки кода сервера (операции в `src/ops/`, регистрация инструментов)
281
+ или расширения (`extension/src/`) выполни **`bun run sync:runtime`**: она пересоберёт бандл и
282
+ статичные бандлы расширения, обновит расширение, развёрнутое `setup` в
283
+ `~/.bitrix24-mcp-bridge/extension/` (если его там нет — пропустит), и погасит daemon (следующий вызов
284
+ агента поднимет свежий). Затем перезагрузи расширение на `chrome://extensions` и вкладку портала. Без
285
+ этого новые операции агенту не видны. Как добавить операцию —
286
+ [docs/reconnaissance.md](docs/reconnaissance.md).
287
+
288
+ Запуск из исходников (`bun run src/index.ts`) не знает своей версии, поэтому не заменяет daemon
289
+ другой версии и не чистит устаревшие файлы — это делает только собранный `dist/cli.js`, чтобы
290
+ dev-запуск не трогал установленный мост.
214
291
 
215
292
  Дистрибуция: `bin` `bitrix24-bridge` → `dist/cli.js`; npm-хук `prepare` при установке
216
293
  собирает и `dist/cli.js`, и статичные бандлы расширения (`extension/dist/`), которые
217
294
  `setup` затем копирует в runtime-домашнюю папку. Публикуемые файлы перечислены в `files`
218
- (`dist`, `extension/dist`, `docs/api-notes.md`, `actions.example.json`).
295
+ (`dist`, `extension/dist`, `docs/api-notes.md`).
219
296
 
220
297
  ### Релизы
221
298
 
@@ -229,6 +306,6 @@ Trusted Publisher** (с provenance, без токенов). CI ([`.github/workfl
229
306
  ## Документация
230
307
 
231
308
  - [docs/RUNBOOK.md](docs/RUNBOOK.md) — установка, настройка, повседневная работа, диагностика
232
- - [docs/api-notes.md](docs/api-notes.md) — карта API Bitrix24 для агента (единый источник для `bitrix_help`)
233
- - [docs/reconnaissance.md](docs/reconnaissance.md) — capture, транспорт записи каталога, расширение `actions.json`
309
+ - [docs/api-notes.md](docs/api-notes.md) — справка по инструментам для агента (единый источник для `bitrix_help`)
310
+ - [docs/reconnaissance.md](docs/reconnaissance.md) — для мейнтейнера: как добавить операцию, транспорт, Bitrix-методы операций
234
311
  - [extension/README.md](extension/README.md) — устройство расширения и модель доверия