nodebb-plugin-integration 0.4.1 → 0.4.4
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 +199 -320
- package/README.ru.md +199 -347
- package/languages/en-GB/integration.json +15 -0
- package/languages/ru/integration.json +15 -0
- package/library.js +93 -115
- package/package.json +60 -53
- package/plugin.json +50 -33
- package/public/js/admin.js +58 -0
- package/public/templates/admin/plugins/integration.tpl +213 -0
- package/src/ai/embeddings.js +46 -253
- package/src/ai/indexer.js +156 -343
- package/src/ai/openai.js +74 -330
- package/src/ai/qdrant.js +114 -517
- package/src/ai/search.js +138 -251
- package/src/config/index.js +176 -133
- package/src/config/validation.js +250 -0
- package/src/events/index.js +174 -324
- package/src/mcp/manager.js +396 -0
- package/src/mcp/server.js +338 -172
- package/src/mcp/tools.js +158 -617
- package/src/nodebb/categories.js +39 -0
- package/src/nodebb/index.js +72 -305
- package/src/nodebb/meta.js +24 -273
- package/src/nodebb/posts.js +93 -348
- package/src/nodebb/privileges.js +68 -0
- package/src/nodebb/topics.js +91 -355
- package/src/nodebb/users.js +62 -345
- package/src/routes/api.js +255 -97
- package/src/routes/index.js +64 -49
package/README.ru.md
CHANGED
|
@@ -1,347 +1,199 @@
|
|
|
1
|
-
# NodeBB Integration Layer
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Возможности
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Плюсы:
|
|
203
|
-
|
|
204
|
-
* бесплатно;
|
|
205
|
-
* быстро;
|
|
206
|
-
* не требует сети;
|
|
207
|
-
* используется в тестах.
|
|
208
|
-
|
|
209
|
-
## OpenAI режим
|
|
210
|
-
|
|
211
|
-
Настройка:
|
|
212
|
-
|
|
213
|
-
```
|
|
214
|
-
AI_PROVIDER=openai
|
|
215
|
-
|
|
216
|
-
OPENAI_API_KEY=your_key
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
# Qdrant
|
|
220
|
-
|
|
221
|
-
Конфигурация:
|
|
222
|
-
|
|
223
|
-
```
|
|
224
|
-
QDRANT_URL=http://localhost:6333
|
|
225
|
-
|
|
226
|
-
QDRANT_COLLECTION=nodebb_knowledge
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Автоматически выполняется:
|
|
230
|
-
|
|
231
|
-
* проверка коллекции;
|
|
232
|
-
* создание коллекции;
|
|
233
|
-
* загрузка векторов;
|
|
234
|
-
* поиск похожих документов.
|
|
235
|
-
|
|
236
|
-
# MCP сервер
|
|
237
|
-
|
|
238
|
-
Запуск:
|
|
239
|
-
|
|
240
|
-
```bash
|
|
241
|
-
npm run mcp
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
Доступные инструменты:
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
get_forum_info
|
|
248
|
-
|
|
249
|
-
get_post
|
|
250
|
-
|
|
251
|
-
get_topic
|
|
252
|
-
|
|
253
|
-
get_user
|
|
254
|
-
|
|
255
|
-
search_knowledge
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
Пример поиска:
|
|
259
|
-
|
|
260
|
-
```
|
|
261
|
-
search_knowledge
|
|
262
|
-
|
|
263
|
-
{
|
|
264
|
-
"query": "как установить NodeBB",
|
|
265
|
-
"limit": 5
|
|
266
|
-
}
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
# Структура проекта
|
|
270
|
-
|
|
271
|
-
```
|
|
272
|
-
.
|
|
273
|
-
|
|
274
|
-
├── library.js
|
|
275
|
-
|
|
276
|
-
├── package.json
|
|
277
|
-
|
|
278
|
-
├── plugin.json
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
├── src
|
|
282
|
-
|
|
283
|
-
│
|
|
284
|
-
|
|
285
|
-
├── ai
|
|
286
|
-
|
|
287
|
-
│ ├── embeddings.js
|
|
288
|
-
|
|
289
|
-
│ ├── openai.js
|
|
290
|
-
|
|
291
|
-
│ ├── qdrant.js
|
|
292
|
-
|
|
293
|
-
│ ├── indexer.js
|
|
294
|
-
|
|
295
|
-
│ └── search.js
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
│
|
|
299
|
-
|
|
300
|
-
├── mcp
|
|
301
|
-
|
|
302
|
-
│ ├── server.js
|
|
303
|
-
|
|
304
|
-
│ └── tools.js
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
│
|
|
308
|
-
|
|
309
|
-
├── nodebb
|
|
310
|
-
|
|
311
|
-
│ ├── meta.js
|
|
312
|
-
|
|
313
|
-
│ ├── posts.js
|
|
314
|
-
|
|
315
|
-
│ ├── topics.js
|
|
316
|
-
|
|
317
|
-
│ └── users.js
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
│
|
|
321
|
-
|
|
322
|
-
└── config
|
|
323
|
-
|
|
324
|
-
└── index.js
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
└── test
|
|
328
|
-
|
|
329
|
-
└── plugin.test.js
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
# Безопасность
|
|
333
|
-
|
|
334
|
-
Не добавлять в Git:
|
|
335
|
-
|
|
336
|
-
```
|
|
337
|
-
.env
|
|
338
|
-
|
|
339
|
-
OPENAI_API_KEY
|
|
340
|
-
|
|
341
|
-
NODEBB_API_KEY
|
|
342
|
-
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
# Лицензия
|
|
346
|
-
|
|
347
|
-
MIT
|
|
1
|
+
# NodeBB Integration Layer
|
|
2
|
+
|
|
3
|
+
Плагин интеграции с форумами NodeBB, предоставляющий MCP (Model Context Protocol), семантический поиск на базе AI, RAG-поиск и хранение векторов в Qdrant.
|
|
4
|
+
|
|
5
|
+
## Возможности
|
|
6
|
+
|
|
7
|
+
- Интеграция с NodeBB
|
|
8
|
+
- MCP-сервер с транспортом Streamable HTTP
|
|
9
|
+
- Отдельный дочерний процесс MCP под управлением NodeBB
|
|
10
|
+
- Аутентификация MCP-клиентов по Bearer Token
|
|
11
|
+
- Внутренняя аутентификация API между MCP и NodeBB
|
|
12
|
+
- Генерация embeddings через OpenAI
|
|
13
|
+
- Хранение векторов и семантический поиск в Qdrant
|
|
14
|
+
- RAG-поиск с проверкой прав доступа NodeBB
|
|
15
|
+
- Индексация каждого сообщения отдельно, включая ответы
|
|
16
|
+
- Настройка исключённых категорий
|
|
17
|
+
- Режимы AI-провайдера OpenAI и Fake
|
|
18
|
+
- Интерфейс настройки в ACP
|
|
19
|
+
- Автоматизированные тесты
|
|
20
|
+
|
|
21
|
+
## Архитектура
|
|
22
|
+
|
|
23
|
+
NodeBB → Integration Plugin → MCP / AI
|
|
24
|
+
|
|
25
|
+
MCP: Streamable HTTP → MCP Child Process → Internal NodeBB API → NodeBB Access Control
|
|
26
|
+
|
|
27
|
+
AI: OpenAI → Embeddings → Qdrant → Vector Search → Knowledge Retrieval
|
|
28
|
+
|
|
29
|
+
## Требования
|
|
30
|
+
|
|
31
|
+
- Node.js >= 20
|
|
32
|
+
- npm >= 10
|
|
33
|
+
- NodeBB 4.x
|
|
34
|
+
|
|
35
|
+
Для работы AI необходимы API-ключ OpenAI и сервер Qdrant. Для работы MCP необходим запущенный экземпляр NodeBB.
|
|
36
|
+
|
|
37
|
+
## Установка
|
|
38
|
+
|
|
39
|
+
Установите плагин через интерфейс управления плагинами NodeBB или используйте обычную процедуру установки плагинов.
|
|
40
|
+
|
|
41
|
+
Установите зависимости командой npm install в каталоге плагина.
|
|
42
|
+
|
|
43
|
+
Перезапустите NodeBB и откройте настройки плагина: ACP → Plugins → NodeBB Integration.
|
|
44
|
+
|
|
45
|
+
## Настройка
|
|
46
|
+
|
|
47
|
+
Плагин настраивается через интерфейс ACP NodeBB.
|
|
48
|
+
|
|
49
|
+
### AI-провайдер
|
|
50
|
+
|
|
51
|
+
Доступны два режима.
|
|
52
|
+
|
|
53
|
+
**OpenAI**
|
|
54
|
+
|
|
55
|
+
Включает:
|
|
56
|
+
- Генерацию embeddings через OpenAI
|
|
57
|
+
- Хранение векторов в Qdrant
|
|
58
|
+
- Индексацию сообщений
|
|
59
|
+
- Семантический поиск
|
|
60
|
+
- RAG-поиск
|
|
61
|
+
|
|
62
|
+
Настраиваются API-ключ OpenAI, модель и размерность embeddings, URL Qdrant и имя коллекции.
|
|
63
|
+
|
|
64
|
+
**Fake**
|
|
65
|
+
|
|
66
|
+
Полностью отключает функциональность AI:
|
|
67
|
+
- API OpenAI не вызывается.
|
|
68
|
+
- Qdrant не используется.
|
|
69
|
+
- Embeddings не создаются.
|
|
70
|
+
- Индексация сообщений отключена.
|
|
71
|
+
- Семантический поиск отключён.
|
|
72
|
+
|
|
73
|
+
Интеграция с NodeBB и MCP продолжают работать.
|
|
74
|
+
|
|
75
|
+
Настройки OpenAI и Qdrant сохраняются при переключении провайдеров. Повторный выбор OpenAI снова включает AI-конвейер.
|
|
76
|
+
|
|
77
|
+
Режим Fake предназначен для разработки и тестирования интеграции NodeBB и MCP без внешних AI-сервисов.
|
|
78
|
+
|
|
79
|
+
### Исключённые категории
|
|
80
|
+
|
|
81
|
+
Категории, выбранные в ACP, исключаются из AI-индексации и семантического поиска.
|
|
82
|
+
|
|
83
|
+
## AI-конвейер
|
|
84
|
+
|
|
85
|
+
При включённом OpenAI обработка выполняется следующим образом:
|
|
86
|
+
|
|
87
|
+
Сообщение форума → Генерация Embeddings → Сохранение векторов в Qdrant → Семантический поиск → Проверка прав доступа NodeBB → Получение содержимого сообщений
|
|
88
|
+
|
|
89
|
+
Каждое сообщение индексируется отдельно, включая ответы.
|
|
90
|
+
|
|
91
|
+
Результаты поиска проверяются на соответствие правам NodeBB до получения содержимого сообщений. Сообщения и темы, недоступные сервисному пользователю, исключаются из результатов.
|
|
92
|
+
|
|
93
|
+
Qdrant хранит только векторы и метаданные. Текст сообщений извлекается из NodeBB после проверки прав доступа.
|
|
94
|
+
|
|
95
|
+
## Qdrant
|
|
96
|
+
|
|
97
|
+
Через ACP задаются URL Qdrant, имя коллекции и размерность векторов.
|
|
98
|
+
|
|
99
|
+
Плагин проверяет наличие коллекции и создаёт её при необходимости.
|
|
100
|
+
|
|
101
|
+
При выборе Fake обращения к Qdrant не выполняются.
|
|
102
|
+
|
|
103
|
+
## MCP-сервер
|
|
104
|
+
|
|
105
|
+
MCP-сервер управляется плагином NodeBB и работает в отдельном дочернем процессе.
|
|
106
|
+
|
|
107
|
+
Транспорт:
|
|
108
|
+
- Streamable HTTP
|
|
109
|
+
- Аутентификация Bearer Token
|
|
110
|
+
|
|
111
|
+
MCP-сервер взаимодействует с NodeBB через защищённый внутренний API. Для него используется отдельный секрет, управляемый плагином.
|
|
112
|
+
|
|
113
|
+
В ACP настраиваются:
|
|
114
|
+
- Включение и отключение MCP
|
|
115
|
+
- Адрес привязки
|
|
116
|
+
- Порт
|
|
117
|
+
- URL NodeBB
|
|
118
|
+
- Bearer Token
|
|
119
|
+
- UID сервисного пользователя
|
|
120
|
+
|
|
121
|
+
UID сервисного пользователя задаётся администратором. MCP-клиенты не могут его переопределять.
|
|
122
|
+
|
|
123
|
+
### Доступные инструменты
|
|
124
|
+
|
|
125
|
+
- get_forum_info — Получение общедоступной информации о форуме.
|
|
126
|
+
- get_post — Получение сообщения после проверки прав доступа.
|
|
127
|
+
- get_topic — Получение темы после проверки прав доступа.
|
|
128
|
+
- get_user — Получение общедоступной информации о пользователе.
|
|
129
|
+
- search_knowledge — Поиск по проиндексированным данным форума.
|
|
130
|
+
|
|
131
|
+
Для search_knowledge необходим провайдер OpenAI. В режиме Fake инструмент возвращает явную ошибку о выключенном AI.
|
|
132
|
+
|
|
133
|
+
## Безопасность
|
|
134
|
+
|
|
135
|
+
- MCP-клиенты проходят аутентификацию по Bearer Token.
|
|
136
|
+
- Внутренние API-запросы используют отдельный секрет.
|
|
137
|
+
- Секреты не возвращаются в интерфейс ACP.
|
|
138
|
+
- Пустые поля секретов сохраняют ранее заданные значения.
|
|
139
|
+
- Идентификаторам пользователей, переданным MCP-клиентами, не доверяют.
|
|
140
|
+
- Для проверки прав используется настроенный сервисный пользователь.
|
|
141
|
+
- Права на сообщения и темы проверяются до возврата содержимого.
|
|
142
|
+
- При ошибке проверки доступа доступ запрещается.
|
|
143
|
+
- Payload Qdrant содержит идентификаторы и метаданные, но не текст сообщений.
|
|
144
|
+
|
|
145
|
+
Не добавляйте API-ключи, токены и другие секреты в систему контроля версий.
|
|
146
|
+
|
|
147
|
+
## Разработка и тестирование
|
|
148
|
+
|
|
149
|
+
Установка зависимостей: npm install
|
|
150
|
+
|
|
151
|
+
Проверка синтаксиса: npm run check
|
|
152
|
+
|
|
153
|
+
Запуск тестов: npm test
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
Тесты проверяют конфигурацию, аргументы MCP-инструментов и другие компоненты плагина.
|
|
157
|
+
|
|
158
|
+
## Структура проекта
|
|
159
|
+
|
|
160
|
+
library.js
|
|
161
|
+
package.json
|
|
162
|
+
plugin.json
|
|
163
|
+
public/
|
|
164
|
+
js/admin.js
|
|
165
|
+
templates/admin/plugins/integration.tpl
|
|
166
|
+
src/
|
|
167
|
+
ai/
|
|
168
|
+
embeddings.js
|
|
169
|
+
indexer.js
|
|
170
|
+
openai.js
|
|
171
|
+
qdrant.js
|
|
172
|
+
search.js
|
|
173
|
+
config/
|
|
174
|
+
index.js
|
|
175
|
+
validation.js
|
|
176
|
+
events/
|
|
177
|
+
index.js
|
|
178
|
+
mcp/
|
|
179
|
+
manager.js
|
|
180
|
+
server.js
|
|
181
|
+
tools.js
|
|
182
|
+
nodebb/
|
|
183
|
+
categories.js
|
|
184
|
+
index.js
|
|
185
|
+
meta.js
|
|
186
|
+
posts.js
|
|
187
|
+
privileges.js
|
|
188
|
+
topics.js
|
|
189
|
+
users.js
|
|
190
|
+
routes/
|
|
191
|
+
api.js
|
|
192
|
+
index.js
|
|
193
|
+
test/
|
|
194
|
+
config-validation.test.js
|
|
195
|
+
mcp-tools.test.js
|
|
196
|
+
|
|
197
|
+
## Лицензия
|
|
198
|
+
|
|
199
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NodeBB Integration",
|
|
3
|
+
|
|
4
|
+
"settings": {
|
|
5
|
+
"ai-provider": "AI Provider",
|
|
6
|
+
"openai-key": "OpenAI API Key",
|
|
7
|
+
"openai-model": "OpenAI Embedding Model",
|
|
8
|
+
"qdrant-url": "Qdrant URL",
|
|
9
|
+
"collection": "Collection",
|
|
10
|
+
"mcp-enabled": "Enable MCP Server",
|
|
11
|
+
"mcp-port": "MCP Port",
|
|
12
|
+
"save": "Save Settings",
|
|
13
|
+
"saved": "Settings saved successfully"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "���������� NodeBB",
|
|
3
|
+
|
|
4
|
+
"settings": {
|
|
5
|
+
"ai-provider": "AI ���������",
|
|
6
|
+
"openai-key": "OpenAI API ����",
|
|
7
|
+
"openai-model": "������ ����������� OpenAI",
|
|
8
|
+
"qdrant-url": "URL Qdrant",
|
|
9
|
+
"collection": "���������",
|
|
10
|
+
"mcp-enabled": "�������� MCP ������",
|
|
11
|
+
"mcp-port": "���� MCP",
|
|
12
|
+
"save": "��������� ���������",
|
|
13
|
+
"saved": "��������� ������� ���������"
|
|
14
|
+
}
|
|
15
|
+
}
|