bitrix24-mcp-bridge 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DarWiM
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # Bitrix24 MCP Bridge
2
+
3
+ Локальный MCP-сервер, дающий ИИ-агенту **read-only** доступ к задачам, проектам и чатам
4
+ Bitrix24 — в объёме прав пользователя, через браузерное расширение, переиспользующее
5
+ живую сессию. Без прав администратора и без официального REST-вебхука.
6
+
7
+ ```
8
+ ИИ-агент ─stdio─► MCP-клиент ─UDS(bridge.sock)─► daemon ─WS(127.0.0.1:39917, токен+Origin)─► Расширение (вкладка портала)
9
+ │ fetch + свежий sessid + cookie
10
+ ▼
11
+ Bitrix24 (задачи / группы / чаты)
12
+ ```
13
+
14
+ ## Быстрый старт
15
+
16
+ ```bash
17
+ # 1. Установить CLI глобально (prepare соберёт dist/cli.js + статичные бандлы расширения)
18
+ npm i -g github:DarWiM/bitrix24-mcp-bridge
19
+
20
+ # 2. Настроить портал (интерактивно): токен + первый портал + config.json + actions.json + расширение
21
+ bitrix24-bridge setup
22
+
23
+ # 3. Зарегистрировать сервер у MCP-клиента (пример — Claude Code)
24
+ claude mcp add bitrix24-bridge -s user -- bitrix24-bridge
25
+ ```
26
+
27
+ Затем — два ручных шага, которые нельзя автоматизировать:
28
+
29
+ 1. **Загрузить расширение.** `chrome://extensions` → включить **Developer mode** →
30
+ **Load unpacked** → выбрать `~/.bitrix24-mcp-bridge/extension/`.
31
+ 2. **Открыть залогиненную вкладку** нужного портала и держать её открытой.
32
+
33
+ Готово. Агент видит инструменты `bitrix_*`; `bitrix_status` покажет, какие порталы
34
+ подключены. Bun нужен только мейнтейнерам — конечному пользователю он не требуется.
35
+
36
+ ### Что делает `setup`
37
+
38
+ - **Первый запуск** (нет `config.json`): спрашивает origin портала и его alias,
39
+ генерирует общий токен (`crypto.randomBytes(32)`), пишет
40
+ `~/.bitrix24-mcp-bridge/config.json`, кладёт стартовый `actions.json`
41
+ (каталог методов) и **материализует расширение** в
42
+ `~/.bitrix24-mcp-bridge/extension/` (статичные JS-бандлы + `config.json` +
43
+ `manifest.json`, собранный под ваши порталы).
44
+ - **Повторный запуск** (config уже есть): открывает меню правки —
45
+ `[a]` добавить портал, `[r]` удалить, `[e]` изменить origin, `[d]` сменить
46
+ портал по умолчанию, `[p]` порт, `[t]` ротировать токен, `[u]` обновить
47
+ расширение из установленного пакета, `[q]` выход.
48
+
49
+ **Мультипортальность** поддержана: каждый портал — отдельная запись, а в манифесте
50
+ расширения `matches`/`host_permissions` перечисляют ровно сконфигурированные origin'ы
51
+ (least-privilege на origin).
52
+
53
+ daemon читает `config.json` только при старте, поэтому `setup` сам останавливает работающий
54
+ daemon после любой правки, затрагивающей конфиг — следующий вызов агента поднимет новый daemon с
55
+ актуальным конфигом. Если daemon почему-то не остановился (не было соединения), останови его
56
+ вручную (`pkill -f -- --daemon`). Дополнительно:
57
+ - сменили набор порталов (add/remove/edit) → **перезагрузить расширение** в `chrome://extensions`;
58
+ - сменили порт или токен → **переоткрыть вкладку** портала.
59
+
60
+ ## Инструменты
61
+
62
+ Все — read-only, каждый принимает необязательный параметр `portal` (alias; по умолчанию —
63
+ портал по умолчанию из `config.json`):
64
+
65
+ | Инструмент | Назначение |
66
+ |---|---|
67
+ | `bitrix_help` | справка по API/params (то же, что `docs/api-notes.md`) |
68
+ | `bitrix_status` | какие порталы сконфигурированы и какие сейчас подключены |
69
+ | `bitrix_call` | любой разрешённый вызов из каталога по имени |
70
+ | `bitrix_tasks_list` / `bitrix_task_get` | задачи |
71
+ | `bitrix_projects_list` / `bitrix_project_get` | рабочие группы / проекты |
72
+ | `bitrix_chats_recent` / `bitrix_chat_messages` | чаты и история сообщений |
73
+
74
+ `bitrix_help` — единственный источник конвенций params (select/filter/order/пагинация,
75
+ имена полей). Он отдаёт `docs/api-notes.md`, так что любому агенту не нужен доступ к репозиторию.
76
+
77
+ ## Архитектура
78
+
79
+ Модель — **один долгоживущий daemon + N тонких клиентов**:
80
+
81
+ - **daemon** (`bitrix24-bridge --daemon`) владеет тремя ресурсами: WS-портом
82
+ `127.0.0.1:39917`, подключениями расширений (маршрутизация запросов по `Origin`
83
+ вкладки к нужному порталу) и Unix-domain-сокетом
84
+ `~/.bitrix24-mcp-bridge/bridge.sock` (права `0600`).
85
+ - **MCP-клиент** (`bitrix24-bridge`, без флагов) — то, что запускает ваш MCP-хост по
86
+ stdio. Это тонкий UDS-клиент: он **сам поднимает daemon**, если сокета ещё нет, и
87
+ подключается к нему.
88
+
89
+ Зачем так: раньше каждый MCP-клиент пытался открыть WS-порт сам, и второй экземпляр
90
+ (или health-probe хоста) падал с конфликтом порта. Теперь порт держит только daemon, а
91
+ любое число клиентов и проб сосуществуют через сокет. Daemon **сам завершается по
92
+ простою** (~5 минут без клиентов).
93
+
94
+ ### Состояния (что видит агент)
95
+
96
+ - **unconfigured** — `config.json` ещё нет. Сервер всё равно стартует по stdio и
97
+ регистрирует только `bitrix_help` + `bitrix_status`, которые направляют выполнить
98
+ `bitrix24-bridge setup`. Настройка **никогда** не происходит в чате.
99
+ - **configured, вкладка закрыта** — портал сконфигурирован, но нет открытой залогиненной
100
+ вкладки → `bitrix_status` покажет портал как не подключённый; откройте вкладку.
101
+ - **live** — вкладка открыта, расширение подключено, вызовы проходят.
102
+
103
+ ### Конфигурация
104
+
105
+ Runtime-домашняя папка — `~/.bitrix24-mcp-bridge/` (или `$BITRIX24_MCP_BRIDGE_HOME`).
106
+ В ней: `config.json`, `actions.json`, `bridge.sock`, `extension/`.
107
+
108
+ Разрешение настроек слоями (побеждает верхний): **env → `.env` (только для разработки)
109
+ → `~/.bitrix24-mcp-bridge/config.json`**. Каталог методов по умолчанию берётся из
110
+ `~/.bitrix24-mcp-bridge/actions.json`; явный `BITRIX_CATALOG` (или `catalog` в config)
111
+ по-прежнему поддержан.
112
+
113
+ ## Безопасность и модель доверия
114
+
115
+ Это research/PoC-инструмент в публичном репозитории. Прочтите перед использованием.
116
+
117
+ **Граница доверия — локальная машина.** daemon слушает только `127.0.0.1`, требует токен
118
+ первым сообщением и проверяет `Origin` (защита от cross-site WebSocket hijacking). Но сама
119
+ привилегия — живая аутентифицированная сессия Bitrix24 — физически в расширении, а не в
120
+ сервере. Отсюда:
121
+
122
+ - **Read-only — гарантия «доброй воли», а не защита.** Ограничение на чтение — это
123
+ denylist мутирующих глаголов (`…add`/`…update`/`…delete`/…) в каталоге; каталог с
124
+ мутирующим вызовом просто не загрузится. Значения `params` при этом не инспектируются.
125
+ - **Токен — единственная защита loopback-WS.** Генерируйте длинный и случайный —
126
+ `setup` использует `crypto.randomBytes(32)`. Токен отсекает случайные подключения, но
127
+ не является границей против локального атакующего: любой локальный процесс, знающий
128
+ токен, может управлять мостом в объёме сессии.
129
+ - **Токен и WS живут только в ISOLATED-мире расширения.** Страница портала (MAIN world)
130
+ не может прочитать `config.json` расширения, потому что запись помечена
131
+ `use_dynamic_url: true` — URL ресурса непредсказуем со страницы. Подробности — в
132
+ [`extension/README.md`](extension/README.md).
133
+ - **UDS-граница — права ФС.** Сокет `bridge.sock` создаётся с режимом `0600`.
134
+ - **Origin-allowlist.** daemon отклоняет WS-подключения, чей `Origin` не входит в
135
+ сконфигурированный набор порталов.
136
+
137
+ **Вывод:** запускайте только на доверенной машине, где вы контролируете локальные процессы;
138
+ не используйте на общих или недоверенных хостах.
139
+
140
+ Полный операционный гайд и диагностика — **[docs/RUNBOOK.md](docs/RUNBOOK.md)**.
141
+
142
+ ## Разработка
143
+
144
+ Bun — инструмент разработчика/мейнтейнера (конечному пользователю не нужен).
145
+
146
+ ```bash
147
+ bun install
148
+ bun run src/index.ts # MCP-клиент (default); сам поднимет daemon
149
+ bun run src/index.ts --daemon # daemon вручную
150
+ bun run src/index.ts setup # интерактивная настройка
151
+ bun test # юнит-тесты (bun:test)
152
+ bun run typecheck # tsc --noEmit (сервер + extension)
153
+ bun run build:ext # dev-сборка пер-пользовательского расширения
154
+ ```
155
+
156
+ `.env` — **только dev-оверрайд** (gitignored): `BITRIX_MCP_TOKEN`, `BITRIX_ORIGIN`,
157
+ `BITRIX_MCP_PORT`, опционально `BITRIX_CATALOG`. В проде конфиг живёт в
158
+ `~/.bitrix24-mcp-bridge/config.json`, который пишет `setup`.
159
+
160
+ Дистрибуция: `bin` `bitrix24-bridge` → `dist/cli.js`; npm-хук `prepare` при установке
161
+ собирает и `dist/cli.js`, и статичные бандлы расширения (`extension/dist/`), которые
162
+ `setup` затем копирует в runtime-домашнюю папку. Публикуемые файлы перечислены в `files`
163
+ (`dist`, `extension/dist`, `docs/api-notes.md`, `actions.example.json`).
164
+
165
+ ## Документация
166
+
167
+ - [docs/RUNBOOK.md](docs/RUNBOOK.md) — установка, настройка, повседневная работа, диагностика
168
+ - [docs/api-notes.md](docs/api-notes.md) — карта API Bitrix24 (единый источник для `bitrix_help`)
169
+ - [docs/reconnaissance.md](docs/reconnaissance.md) — как снять HAR и расширить `actions.json`
170
+ - [extension/README.md](extension/README.md) — устройство расширения и модель доверия
@@ -0,0 +1,33 @@
1
+ {
2
+ "tasks.list": {
3
+ "action": "tasks.task.list",
4
+ "method": "POST"
5
+ },
6
+ "task.get": {
7
+ "action": "tasks.task.get",
8
+ "method": "POST"
9
+ },
10
+ "projects.list": {
11
+ "action": "socialnetwork.api.workgroup.list",
12
+ "method": "POST"
13
+ },
14
+ "projects.get": {
15
+ "action": "socialnetwork.api.workgroup.get",
16
+ "method": "POST"
17
+ },
18
+ "chats.recent": {
19
+ "endpoint": "/rest/im.recent.list.json",
20
+ "method": "POST",
21
+ "params": {
22
+ "LIMIT": 50,
23
+ "SKIP_OPENLINES": "Y",
24
+ "GET_ORIGINAL_TEXT": "Y",
25
+ "PARSE_TEXT": "Y",
26
+ "WITH_COUNTERS": "N"
27
+ }
28
+ },
29
+ "chat.messages": {
30
+ "action": "im.v2.Chat.Message.list",
31
+ "method": "POST"
32
+ }
33
+ }