Skip to main content
Glama
Catter58

mcpBPMSoft

by Catter58
README.md
# MCP-сервер для BPMSoft

Позволяет ИИ-помощнику работать с BPMSoft: искать записи, создавать и изменять данные, загружать файлы и запускать бизнес-процессы. Действия выполняются с правами того пользователя, чья сессия передана в запросе.

Ниже — установка через Docker за три шага. Устанавливать Node.js отдельно не нужно.

## 1. Подготовьте компьютер и скачайте проект

Установите [Docker Desktop](https://www.docker.com/products/docker-desktop/) и [Git](https://git-scm.com/downloads). Для Linux вместо Docker Desktop можно установить [Docker Engine](https://docs.docker.com/engine/install/). Запустите Docker.

Откройте терминал. Команды ниже подходят для Linux и macOS; в Windows используйте терминал Ubuntu в WSL 2 с включённой интеграцией Docker Desktop.

Скачайте проект и перейдите в его папку:

```bash
git clone https://github.com/Catter58/mcpBPMSoft.git
cd mcpBPMSoft
docker version
```

Последняя команда должна показать версии клиента и сервера Docker. Если она сообщает, что не может подключиться к Docker, сначала запустите Docker Desktop или службу Docker.

Все следующие команды выполняйте из папки `mcpBPMSoft`.

## 2. Укажите свой BPMSoft

Создайте в папке проекта файл **`.env`** и вставьте в него:

```dotenv
BPMSOFT_URL=https://bpm.example.ru
BPMSOFT_ODATA_VERSION=4
BPMSOFT_PLATFORM=net8
MCP_TRANSPORT=http
MCP_HTTP_HOST=0.0.0.0
MCP_HTTP_PORT=8007
MCP_ALLOWED_HOSTS=127.0.0.1:8007,localhost:8007
```

Замените `https://bpm.example.ru` адресом своего приложения BPMSoft. Например: `https://crm.company.ru`. Не добавляйте `/odata`, путь страницы, логин или пароль. Если приложение установлено в подпапке, сохраните её в адресе: `https://crm.company.ru/bpm`.

Версию OData и платформу выберите по настройкам своего стенда. Если не знаете их, уточните у администратора BPMSoft:

| Стенд                   | `BPMSOFT_ODATA_VERSION` | `BPMSOFT_PLATFORM` |
| ----------------------- | ----------------------- | ------------------ |
| .NET 8, OData 4         | `4`                     | `net8`             |
| .NET Framework, OData 4 | `4`                     | `netframework`     |
| .NET Framework, OData 3 | `3`                     | `netframework`     |

Логины и пароли пользователей в `.env` для этого запуска не нужны. Коннектор передаёт текущие cookies и токен пользователя. За обновление пользовательской сессии отвечает BPMSoft. Файл `.env` исключён из Git и Docker-образа.

<details>
<summary>Если один контейнер должен обслуживать несколько стендов</summary>

Создайте рядом с `.env` файл **`tenants.local.json`**. В нём перечислите свои стенды; вместо адресов из примера укажите настоящие:

```json
{
  "tenants": [
    { "id": "crm-a", "url": "https://bpm-a.example.ru", "odata_version": 4, "platform": "net8" },
    { "id": "crm-b", "url": "https://bpm-b.example.ru", "odata_version": 3, "platform": "netframework" }
  ]
}
```

`id` — короткое имя стенда для адреса подключения. Используйте латинские буквы, цифры, дефис или подчёркивание; начните с буквы или цифры. Каждое имя должно быть уникальным.

Добавьте в `.env` две строки:

```dotenv
BPMSOFT_MULTITENANT=true
BPMSOFT_TENANTS_FILE=/config/tenants.json
```

В этом режиме адреса берутся из JSON, а `BPMSOFT_URL` не используется. Пользователи и данные разных стендов разделены. Файл `tenants.local.json` также исключён из Git и Docker-образа.

**Без `BPMSOFT_MULTITENANT=true` сервер работает как раньше: один `BPMSOFT_URL`, подключение через `/mcp` или `/`.** Даже указанный файл тенантов без флага игнорируется.

</details>

## 3. Запустите сервис и подключитесь к нему

Соберите образ — при первом запуске это может занять несколько минут:

```bash
docker build -t mcp-bpmsoft .
```

Запустите сервер для **одного стенда**:

```bash
docker run -d --name mcp-bpmsoft --restart unless-stopped \
  --cpus=1 --memory=512m --memory-swap=512m \
  --env-file .env \
  -p 127.0.0.1:8007:8007 \
  --mount type=volume,source=mcp-bpmsoft-files,target=/app/files \
  --mount type=volume,source=mcp-bpmsoft-state,target=/app/state \
  mcp-bpmsoft
```

Docker сам создаст постоянные хранилища для файлов и журнала. Они сохранятся при замене контейнера. Сервер работает в фоне и автоматически запускается после перезапуска Docker.

Если вы включили режим нескольких стендов на шаге 2, вместо предыдущей команды выполните эту. Она дополнительно подключает ваш JSON-файл только для чтения:

```bash
docker run -d --name mcp-bpmsoft --restart unless-stopped \
  --cpus=1 --memory=512m --memory-swap=512m \
  --env-file .env \
  -p 127.0.0.1:8007:8007 \
  --mount type=volume,source=mcp-bpmsoft-files,target=/app/files \
  --mount type=volume,source=mcp-bpmsoft-state,target=/app/state \
  --mount "type=bind,source=$(pwd)/tenants.local.json,target=/config/tenants.json,readonly" \
  mcp-bpmsoft
```

Адреса подключения: `http://127.0.0.1:8007/tenants/crm-a/mcp` и `http://127.0.0.1:8007/tenants/crm-b/mcp`. Каждый запрос должен передавать сессию пользователя именно выбранного стенда. Изменения JSON-файла применяются после `docker restart mcp-bpmsoft`.

Проверьте, что сервис запущен:

```bash
curl -fsS http://127.0.0.1:8007/healthz
```

Ответ вида `{"status":"ok","version":"1.0.0"}` означает, что MCP-сервис работает. Эта проверка не обращается к BPMSoft.

В своём MCP-клиенте выберите подключение **Streamable HTTP** и укажите **`http://127.0.0.1:8007/mcp`**. В режиме нескольких стендов используйте соответствующий `/tenants/<id>/mcp`.

Коннектор должен передавать с каждым запросом заголовки `BPMCSRF` и `Cookie` с актуальной сессией пользователя BPMSoft. Одного адреса подключения недостаточно. Обновлённую сессию передаёт коннектор; сервер использует полученные токен и cookies.

Для проверки подключения попросите помощника: **«Вызови `bpm_whoami` и покажи, под каким пользователем BPMSoft ты работаешь»**. В ответе должен появиться ваш пользователь. Затем можно попросить найти несколько контактов или показать повестку.

### Проверка BPMSoft без MCP-клиента

Войдите в BPMSoft через браузер. Откройте инструменты разработчика (F12), вкладку «Сеть» / Network, и выполните поиск в BPMSoft. Выберите запрос `SelectQuery` или OData и скопируйте из заголовков запроса значения `BPMCSRF` и `Cookie` целиком.

В терминале выполните команды ниже и вставьте значения по запросу. Они не сохраняются в файлах проекта:

```bash
printf 'Вставьте BPMCSRF: '
read -r BPM_CHECK_CSRF
printf 'Вставьте Cookie: '
read -r BPM_CHECK_COOKIE
curl -sS http://127.0.0.1:8007/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "BPMCSRF: $BPM_CHECK_CSRF" \
  -H "Cookie: $BPM_CHECK_COOKIE" \
  --data '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"bpm_whoami","arguments":{}}}'
unset BPM_CHECK_CSRF BPM_CHECK_COOKIE
```

Для нескольких стендов замените `/mcp` в команде на `/tenants/crm-a/mcp` или другой настроенный маршрут. Используйте сессию этого же стенда. Успешный ответ содержит сведения о вашем пользователе BPMSoft.

</details>

**Готово: сервис запущен, подключение проверено, можно работать с BPMSoft через помощника.**

### Если что-то не работает

| Что произошло                                  | Что сделать                                                                                                                                                                  |
| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Сервис не отвечает                             | Выполните `docker logs --tail 50 mcp-bpmsoft` и проверьте адрес BPMSoft и настройки `.env`.                                                                                  |
| Ошибка авторизации                             | Войдите в BPMSoft заново и проверьте передачу актуальных `BPMCSRF` и cookies коннектором.                                                                                    |
| `403 Forbidden` при подключении к MCP          | В `MCP_ALLOWED_HOSTS` укажите Host без `http://`, `https://` и пути: например, `localhost:8007` или `mcp.company.ru`. Для браузера может понадобиться `MCP_ALLOWED_ORIGINS`. |
| `404` на адресе стенда                         | Проверьте флаг нескольких стендов и совпадение имени в JSON с `/tenants/<id>/mcp`.                                                                                           |
| Docker сообщает, что имя контейнера уже занято | Если обновляете прежний сервис, используйте порядок обновления ниже.                                                                                                         |

### Подключение с другого компьютера

Команда выше открывает порт только на компьютере, где запущен Docker. Для удалённых пользователей настройте HTTPS через reverse proxy, например `https://mcp.company.ru/mcp`. Добавьте его внешний Host в `.env`: `MCP_ALLOWED_HOSTS=mcp.company.ru,127.0.0.1:8007,localhost:8007`. Для браузерного клиента добавьте `MCP_ALLOWED_ORIGINS=https://mcp.company.ru`.

Proxy должен иметь доступ к локальному порту `8007` и передавать пользовательские заголовки авторизации. После изменения `.env` пересоздайте контейнер: обычный перезапуск не перечитывает `--env-file`.

### Обновление сервиса

Сохраните `.env`, `tenants.local.json`, если он используется, и постоянные хранилища Docker. В папке проекта выполните:

```bash
git pull
docker build -t mcp-bpmsoft .
docker stop mcp-bpmsoft
docker rm mcp-bpmsoft
```

Затем повторите свою команду `docker run` из шага 3 и проверку `/healthz`. Не удаляйте тома `mcp-bpmsoft-files` и `mcp-bpmsoft-state`: в них хранятся пользовательские файлы и журнал. Если обновление делаете без получения нового кода, пропустите `git pull` и сборку образа.

### Файлы и проверка операций

HTTP-файлы доступны только своему пользователю на своём стенде. Относительные `file_path` и `save_path` относятся к его личному каталогу. Старые файлы из общего каталога переносит администратор после проверки владельца; автоматически раздавать их пользователям нельзя. Содержимое файла также можно передать через `content_base64`.

В режиме нескольких стендов журнал изменений включён автоматически. Для одного стенда его можно включить строкой `BPMSOFT_JOURNAL_ROOT=/app/state/operations` в `.env` и пересоздать контейнер. После потери ответа используйте `bpm_get_operation` с полученным `operation_id` или без него, чтобы найти свои операции. Не повторяйте изменение вслепую: оно могло уже выполниться в BPMSoft.

Сервер допускает до 500 одновременно выполняемых HTTP-запросов. Возможности реального стенда и необходимую память проверяйте на своих данных; показанная конфигурация ресурсов — начальный профиль. Если чтение слишком большое, запрашивайте меньше записей и полей.

Лицензия: [MIT](LICENSE).

TDQS

A3.6/5.0

Scored across 32 tools

Disambiguation4/5

Tools have distinct purposes, but some overlap exists between bpm_get_records, bpm_search_records, and bpm_search_unified. However, descriptions clarify differences.

Naming Consistency5/5

All tools use a consistent bpm_verb_noun pattern in snake_case, making it easy to predict tool names.

Tool Count3/5

32 tools is high, but the server covers a complex domain (BPMSoft). While slightly above ideal, each tool serves a distinct purpose.

Completeness4/5

The tool set covers CRUD, batch, search, file handling, processes, and more. Minor gaps like lacking process management tools, but overall comprehensive.

Maintenance

ActivityActive
ResponsivenessNo issues