Help:13-alpha MCP: Difference between revisions
Mitrofanov (talk | contribs) No edit summary |
Mitrofanov (talk | contribs) |
||
| Line 8: | Line 8: | ||
== Установка == | == Установка == | ||
Установка Svacer MCP, подключение клиентов и конфигурация. | |||
=== Требования === | |||
* Python 3.10+ | |||
* Доступ к Svacer-серверу: URL + логин/пароль | |||
=== Режим STDIO === | |||
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code. | |||
<code>git clone <nowiki>https://gitlab.ispras.ru/svacerai/mcp.git</nowiki> && cd mcp | |||
python3 -m venv .venv | |||
.venv/bin/pip install -e . | |||
cp .env.example .env | |||
# Отредактировать .env — указать URL и учётные данные Svacer | |||
# Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C) | |||
.venv/bin/svacer-mcp</code> | |||
После <code>pip install -e .</code> в окружении становится доступна команда <code>svacer-mcp</code> — её указывают в конфигурации клиентов ниже. | |||
=== Режим HTTP (Docker) === | |||
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа. | |||
'''Требования:''' Docker, Docker Compose. | |||
<code>cp .env.example .env | |||
# В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается | |||
echo "SVACER_MCP_TOKEN=$(openssl rand -hex 32)" >> .env | |||
docker compose up -d | |||
# MCP endpoint: <nowiki>http://localhost:8002/mcp</nowiki> | |||
# Клиенты передают заголовок: Authorization: Bearer <SVACER_MCP_TOKEN></code> | |||
Внешний порт хоста задаётся переменной <code>MCP_PORT</code> (по умолчанию <code>8002</code>), внутри контейнера сервер всегда слушает порт <code>8000</code>. | |||
=== Подключение клиентов === | |||
==== Claude Desktop ==== | |||
Файл конфигурации: <code>~/.config/Claude/claude_desktop_config.json</code> (Linux) или <code>%APPDATA%\Claude\claude_desktop_config.json</code> (Windows). | |||
Укажите '''абсолютный путь''' к <code>svacer-mcp</code> из вашего venv (<code>which svacer-mcp</code> в активированном venv или <code>/path/to/mcp/.venv/bin/svacer-mcp</code>). | |||
<code>{ | |||
"mcpServers": { | |||
"svacer": { | |||
"command": "/path/to/mcp/.venv/bin/svacer-mcp", | |||
"env": { | |||
"SVACER_URL": "<nowiki>https://your-svacer.example.com</nowiki>", | |||
"SVACER_LOGIN": "your-login", | |||
"SVACER_PASSWORD": "your-password" | |||
} | |||
} | |||
} | |||
}</code> | |||
==== Claude Code ==== | |||
<code>claude mcp add svacer \ | |||
-e SVACER_URL=<nowiki>https://your-svacer.example.com</nowiki> \ | |||
-e SVACER_LOGIN=your-login \ | |||
-e SVACER_PASSWORD=your-password \ | |||
-- /path/to/mcp/.venv/bin/svacer-mcp</code> | |||
==== VS Code ==== | |||
Файл <code>.vscode/mcp.json</code> в корне рабочей директории: | |||
<code>{ | |||
"servers": { | |||
"svacer": { | |||
"type": "stdio", | |||
"command": "/path/to/mcp/.venv/bin/svacer-mcp", | |||
"env": { | |||
"SVACER_URL": "<nowiki>https://your-svacer.example.com</nowiki>", | |||
"SVACER_LOGIN": "your-login", | |||
"SVACER_PASSWORD": "your-password" | |||
} | |||
} | |||
} | |||
}</code> | |||
==== Cursor ==== | |||
Файл <code>.cursor/mcp.json</code> в корне проекта или глобально: | |||
<code>{ | |||
"mcpServers": { | |||
"svacer": { | |||
"command": "/path/to/mcp/.venv/bin/svacer-mcp", | |||
"env": { | |||
"SVACER_URL": "<nowiki>https://your-svacer.example.com</nowiki>", | |||
"SVACER_LOGIN": "your-login", | |||
"SVACER_PASSWORD": "your-password" | |||
} | |||
} | |||
} | |||
}</code> | |||
==== OpenWebUI ==== | |||
# Развернуть через Docker (см. «Режим HTTP» выше). | |||
# Открыть '''Settings → Tools''' (или '''Admin Panel → Settings → Tools'''). | |||
# Добавить сервер: | |||
#* <code><nowiki>http://localhost:8002/mcp</nowiki></code> — если OpenWebUI работает на хосте, снаружи Docker. | |||
#* <code><nowiki>http://svacer-mcp:8000/mcp</nowiki></code> — если OpenWebUI развёрнут в той же compose-сети, что и <code>svacer-mcp</code> (имя берётся из <code>docker-compose.yml</code> → service name, порт 8000 — внутренний порт контейнера). | |||
# Тип подключения: '''MCP (Streamable HTTP)'''. | |||
# В настройках инструмента указать заголовок <code>Authorization: Bearer <SVACER_MCP_TOKEN></code> (значение — то же, что в <code>.env</code> сервера). | |||
# Сохранить — инструменты появятся в чате. | |||
=== Конфигурация === | |||
{| class="wikitable" | |||
!Переменная | |||
!По умолчанию | |||
!Описание | |||
|- | |||
|<code>SVACER_URL</code> | |||
|<code><nowiki>https://svacer-demo.ispras.ru</nowiki></code> | |||
|URL Svacer-сервера | |||
|- | |||
|<code>SVACER_LOGIN</code> | |||
|<code>admin</code> | |||
|Логин | |||
|- | |||
|<code>SVACER_PASSWORD</code> | |||
|<code>admin</code> | |||
|Пароль | |||
|- | |||
|<code>SVACER_TIMEOUT</code> | |||
|<code>30</code> | |||
|Тайм-аут HTTP-запросов к Svacer, секунды | |||
|- | |||
|<code>SVACER_TRANSPORT</code> | |||
|<code>stdio</code> | |||
|Режим транспорта: <code>stdio</code> или <code>http</code> | |||
|- | |||
|<code>SVACER_HTTP_PORT</code> | |||
|<code>8000</code> | |||
|TCP-порт сервера в режиме HTTP (внутри контейнера) | |||
|- | |||
|<code>SVACER_MCP_TOKEN</code> | |||
|''(не задано)'' | |||
|Bearer-токен для клиентов <code>/mcp</code>. Обязателен при <code>SVACER_TRANSPORT=http</code>, в режиме STDIO игнорируется. Генерация: <code>openssl rand -hex 32</code> | |||
|- | |||
|<code>SVACER_MCP_RESOURCE_URL</code> | |||
|<code><nowiki>http://localhost</nowiki>:<HTTP_PORT></code> | |||
|Публичный URL MCP-сервера для заголовка <code>WWW-Authenticate</code> (<nowiki>RFC 9728</nowiki>). Задаётся при работе за обратным прокси | |||
|- | |||
|<code>SVACER_TOOLS</code> | |||
|''(не задано)'' | |||
|Список инструментов через запятую. Если не задано, регистрируются все 8 | |||
|- | |||
|<code>MCP_PORT</code> | |||
|<code>8002</code> | |||
|Внешний порт хоста при запуске через <code>docker compose</code> (отображается на внутренний <code>SVACER_HTTP_PORT</code>) | |||
|} | |||
Переменные читаются из <code>.env</code> или из окружения. Для STDIO-клиентов их можно указать в секции <code>env</code> конфигурации клиента. | |||
==== Ограничение набора инструментов ==== | |||
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте <code>SVACER_TOOLS</code>: | |||
<code>SVACER_TOOLS=get_projects,get_snapshots,get_markers</code> | |||
Допустимые имена: <code>get_projects</code>, <code>get_snapshots</code>, <code>get_warnings</code>, <code>get_markers</code>, <code>get_project_stats</code>, <code>get_project_groups</code>, <code>get_advanced_file_preview</code>, <code>get_diff</code>. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов. | |||
==== Несколько экземпляров сервера ==== | |||
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений. | |||
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением. | |||
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, <code>MCP_PORT=8002</code> для одного экземпляра и <code>MCP_PORT=8003</code> для другого. Для каждого контейнера задаётся собственный <code>SVACER_MCP_TOKEN</code>. | |||
=== Безопасность === | |||
* '''STDIO''': сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса. | |||
* '''Streamable HTTP''': эндпоинт <code>/mcp</code> требует заголовок <code>Authorization: Bearer <SVACER_MCP_TOKEN></code>. Запросы без токена или с неверным значением получают ответ <code>401</code> и заголовок <code>WWW-Authenticate: Bearer ...</code>. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу. | |||
* Без <code>SVACER_MCP_TOKEN</code> HTTP-сервер не запускается. | |||
* Учётные данные <code>admin/admin</code> предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения. | |||
* Файл <code>.env</code> не должен добавляться в систему контроля версий. | |||
==== Передача токена клиентом ==== | |||
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок <code>Authorization</code> в настройках инструмента — указывается значение <code>Bearer <токен></code>. Для ручной проверки: | |||
<code>curl -H "Authorization: Bearer $SVACER_MCP_TOKEN" \ | |||
<nowiki> </nowiki> -H 'Content-Type: application/json' \ | |||
<nowiki> </nowiki> -H 'Accept: application/json, text/event-stream' \ | |||
<nowiki> </nowiki> -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}' \ | |||
<nowiki> </nowiki> <nowiki>http://localhost:8002/mcp</nowiki></code> | |||
== Инструменты == | == Инструменты == | ||
== Примеры сценариев == | == Примеры сценариев == | ||
Revision as of 10:49, 21 May 2026
Архитектура
MCP — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате — например, «сколько критических предупреждений в последнем снимке bash?» — и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.

Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → server.py передаёт его в выбранный инструмент из tools/ → инструмент проверяет параметры и обращается к api_client.py → клиент получает JWT от auth.py (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.
Установка
Установка Svacer MCP, подключение клиентов и конфигурация.
Требования
- Python 3.10+
- Доступ к Svacer-серверу: URL + логин/пароль
Режим STDIO
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.
git clone https://gitlab.ispras.ru/svacerai/mcp.git && cd mcp
python3 -m venv .venv
.venv/bin/pip install -e .
cp .env.example .env
# Отредактировать .env — указать URL и учётные данные Svacer
# Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)
.venv/bin/svacer-mcp
После pip install -e . в окружении становится доступна команда svacer-mcp — её указывают в конфигурации клиентов ниже.
Режим HTTP (Docker)
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.
Требования: Docker, Docker Compose.
cp .env.example .env
# В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается
echo "SVACER_MCP_TOKEN=$(openssl rand -hex 32)" >> .env
docker compose up -d
# MCP endpoint: http://localhost:8002/mcp
# Клиенты передают заголовок: Authorization: Bearer <SVACER_MCP_TOKEN>
Внешний порт хоста задаётся переменной MCP_PORT (по умолчанию 8002), внутри контейнера сервер всегда слушает порт 8000.
Подключение клиентов
Claude Desktop
Файл конфигурации: ~/.config/Claude/claude_desktop_config.json (Linux) или %APPDATA%\Claude\claude_desktop_config.json (Windows).
Укажите абсолютный путь к svacer-mcp из вашего venv (which svacer-mcp в активированном venv или /path/to/mcp/.venv/bin/svacer-mcp).
{
"mcpServers": {
"svacer": {
"command": "/path/to/mcp/.venv/bin/svacer-mcp",
"env": {
"SVACER_URL": "https://your-svacer.example.com",
"SVACER_LOGIN": "your-login",
"SVACER_PASSWORD": "your-password"
}
}
}
}
Claude Code
claude mcp add svacer \
-e SVACER_URL=https://your-svacer.example.com \
-e SVACER_LOGIN=your-login \
-e SVACER_PASSWORD=your-password \
-- /path/to/mcp/.venv/bin/svacer-mcp
VS Code
Файл .vscode/mcp.json в корне рабочей директории:
{
"servers": {
"svacer": {
"type": "stdio",
"command": "/path/to/mcp/.venv/bin/svacer-mcp",
"env": {
"SVACER_URL": "https://your-svacer.example.com",
"SVACER_LOGIN": "your-login",
"SVACER_PASSWORD": "your-password"
}
}
}
}
Cursor
Файл .cursor/mcp.json в корне проекта или глобально:
{
"mcpServers": {
"svacer": {
"command": "/path/to/mcp/.venv/bin/svacer-mcp",
"env": {
"SVACER_URL": "https://your-svacer.example.com",
"SVACER_LOGIN": "your-login",
"SVACER_PASSWORD": "your-password"
}
}
}
}
OpenWebUI
- Развернуть через Docker (см. «Режим HTTP» выше).
- Открыть Settings → Tools (или Admin Panel → Settings → Tools).
- Добавить сервер:
http://localhost:8002/mcp— если OpenWebUI работает на хосте, снаружи Docker.http://svacer-mcp:8000/mcp— если OpenWebUI развёрнут в той же compose-сети, что иsvacer-mcp(имя берётся изdocker-compose.yml→ service name, порт 8000 — внутренний порт контейнера).
- Тип подключения: MCP (Streamable HTTP).
- В настройках инструмента указать заголовок
Authorization: Bearer <SVACER_MCP_TOKEN>(значение — то же, что в.envсервера). - Сохранить — инструменты появятся в чате.
Конфигурация
| Переменная | По умолчанию | Описание |
|---|---|---|
SVACER_URL
|
https://svacer-demo.ispras.ru
|
URL Svacer-сервера |
SVACER_LOGIN
|
admin
|
Логин |
SVACER_PASSWORD
|
admin
|
Пароль |
SVACER_TIMEOUT
|
30
|
Тайм-аут HTTP-запросов к Svacer, секунды |
SVACER_TRANSPORT
|
stdio
|
Режим транспорта: stdio или http
|
SVACER_HTTP_PORT
|
8000
|
TCP-порт сервера в режиме HTTP (внутри контейнера) |
SVACER_MCP_TOKEN
|
(не задано) | Bearer-токен для клиентов /mcp. Обязателен при SVACER_TRANSPORT=http, в режиме STDIO игнорируется. Генерация: openssl rand -hex 32
|
SVACER_MCP_RESOURCE_URL
|
http://localhost:<HTTP_PORT>
|
Публичный URL MCP-сервера для заголовка WWW-Authenticate (RFC 9728). Задаётся при работе за обратным прокси
|
SVACER_TOOLS
|
(не задано) | Список инструментов через запятую. Если не задано, регистрируются все 8 |
MCP_PORT
|
8002
|
Внешний порт хоста при запуске через docker compose (отображается на внутренний SVACER_HTTP_PORT)
|
Переменные читаются из .env или из окружения. Для STDIO-клиентов их можно указать в секции env конфигурации клиента.
Ограничение набора инструментов
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте SVACER_TOOLS:
SVACER_TOOLS=get_projects,get_snapshots,get_markers
Допустимые имена: get_projects, get_snapshots, get_warnings, get_markers, get_project_stats, get_project_groups, get_advanced_file_preview, get_diff. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.
Несколько экземпляров сервера
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.
- В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.
- В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например,
MCP_PORT=8002для одного экземпляра иMCP_PORT=8003для другого. Для каждого контейнера задаётся собственныйSVACER_MCP_TOKEN.
Безопасность
- STDIO: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.
- Streamable HTTP: эндпоинт
/mcpтребует заголовокAuthorization: Bearer <SVACER_MCP_TOKEN>. Запросы без токена или с неверным значением получают ответ401и заголовокWWW-Authenticate: Bearer .... Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу. - Без
SVACER_MCP_TOKENHTTP-сервер не запускается. - Учётные данные
admin/adminпредназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения. - Файл
.envне должен добавляться в систему контроля версий.
Передача токена клиентом
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок Authorization в настройках инструмента — указывается значение Bearer <токен>. Для ручной проверки:
curl -H "Authorization: Bearer $SVACER_MCP_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}' \
http://localhost:8002/mcp