Запуск kshana-mcp по HTTP (на собственном оборудовании)
Фрагмент с названиями сторонних клиентов ИИ здесь опущен; он есть в docs/deploy/mcp-http.md на GitHub.
Kshana не предоставляет конечную точку. Общего сервера kshana, на который можно направить клиента, нет. Вы запускаете его на собственной машине, в контейнере или облачном проекте и сами отвечаете за контроль доступа и расходы. Сервер 0.40.0 — тот, что находится в этом репозитории: его величины несут свои метки VALIDATED или MODELLED точно так же, как по stdio.
Безопасные значения по умолчанию#
| Параметр | Поведение |
|---|---|
| Адрес привязки | Только петля (127.0.0.1, ::1). Голый порт (--http 8080) означает 127.0.0.1:8080. |
| Non-loopback | Требуются --allow-remote и токен-носитель в переменной окружения KSHANA_MCP_HTTP_TOKEN (16 символов или больше). Без обоих сервер отказывается запускаться. При наличии обоих он выводит предупреждение, что слушает за пределами этой машины. |
| Аутентификация | Authorization: Bearer <token> в каждом запросе, когда задан токен (его можно задать и на петле). Сравнивается за постоянное время. Отсутствует или неверен: 401. |
| Файловая система | Нет. Инструменты для файлов IQ (iq_*) в режиме HTTP отключены независимо от KSHANA_MCP_IQ_DIR; каждый другой инструмент принимает сценарий в самом запросе и отклоняет тот, который указывает файл. Ни один аргумент инструмента не читает и не записывает путь. |
| Размер тела | --max-body-bytes, по умолчанию 5 МиБ (предел сценария — 4 МиБ). При превышении: 413, независимо от того, объявлена ли длина или тело передаётся частями. |
| Время ответа | --request-timeout-secs, по умолчанию 120. При превышении: 408. Это ограничивает, как долго ждёт вызывающий, а не работу: уже начатый прогон остановить нельзя, поэтому он продолжается после 408 и завершается в фоне. |
| Параллелизм | --max-concurrent, по умолчанию 8. Сверх этого запрос сразу получает 503 с Retry-After; в очередь ничто не ставится. |
| Пул работ | Каждый вызов инструмента выполняется в блокирующем потоке внутри пула из --max-concurrent мест, а не в асинхронных исполнителях, поэтому долгий прогон не мешает серверу отвечать. Место освобождается только по окончании самого прогона, а не когда вызывающий отказывается ждать: поэтому брошенные прогоны не могут накапливаться сверх размера пула, а вызов, обнаруживший полный пул, отклоняется как занятый. |
| Бюджет работы | Сценарий, запрашивающий намного больше, чем встроенные примеры, отклоняется до запуска: более 1000 реализаций Монте-Карло (runs), сетка параметров из более чем 1000 узлов, более 5000 прогонов-членов (узлы сетки, умноженные на реализации) или временная сетка более чем из 2 миллионов эпох. В ошибке указано поле, которое нужно уменьшить. Тот же бюджет действует и по stdio; у командной строки kshana его нет. |
| CORS | Заголовок Access-Control-* никогда не отправляется. Запрос с заголовком Origin отклоняется (403), если источник не назван через --allow-origin <scheme://host[:port]>; * не принимается. |
| Заголовок Host | Проверяется по именам петли или по адресу привязки плюс каждому --allowed-host. За прокси или на URL платформы передайте --allowed-host your.domain. Всё остальное: 403. |
| Сессии | Нет. Каждый POST получает ответ JSON; таблица сессий не ведётся, поток server-sent events открытым не держится. |
TLS не завершается в kshana-mcp. Когда сервер доступен за пределами одной машины, поставьте перед ним HTTPS (TLS вашей платформы или обратный прокси) и храните токен в секрете; токен-носитель по обычному HTTP можно прочитать в канале.
Локально#
kshana-mcp --http 127.0.0.1:8080
Конфигурация клиента (клиент с URL; добавляйте заголовок, только когда задан токен):
{ "mcpServers": { "kshana": { "url": "http://127.0.0.1:8080/mcp",
"headers": { "Authorization": "Bearer ${KSHANA_MCP_HTTP_TOKEN}" } } } }
Docker#
export KSHANA_MCP_HTTP_TOKEN="$(openssl rand -hex 32)"
docker run --rm -p 127.0.0.1:8080:8080 -e KSHANA_MCP_HTTP_TOKEN \
ghcr.io/ashfordeou/kshana-mcp:0.40.0 \
--http 0.0.0.0:8080 --allow-remote --allowed-host localhost:8080 --allowed-host 127.0.0.1:8080
Внутри контейнера сервер должен слушать 0.0.0.0, поэтому ему нужны --allow-remote и токен. Публикация порта как 127.0.0.1:8080:8080 оставляет его на вашей машине; убирайте 127.0.0.1:, только если вы намерены открыть его, и тогда завершайте TLS перед ним. docker compose и шаблоны для Fly.io и Cloud Run находятся в mcp-http/.
Шаблоны (вы развёртываете их сами; Kshana ничего не запускает)#
mcp-http/docker-compose.ymlmcp-http/fly.toml: задайте токен командойfly secrets set KSHANA_MCP_HTTP_TOKEN=...mcp-http/cloudrun.service.yaml: берите токен из Secret Manager
Каждый запускает опубликованный образ, задаёт --allowed-host по имени хоста платформы, которое вы подставляете в файл, и полагается на платформу в части HTTPS.
Задайте ограничение процессора и памяти на платформе#
Тайм-аут, пул и бюджет ограничивают, сколько работы принимается, но один принятый вызов всё равно может долго занимать ядро, а большой результат может занять сотни мегабайт. Поставьте также жёсткое ограничение на контейнер: шаблоны запрашивают 2 процессора и 1 ГиБ (cpus и mem_limit в Compose, [[vm]] в Fly, resources.limits в Cloud Run). Держите --max-concurrent не выше числа процессоров.
Чем он не является#
- Не многопользовательская служба. Любой, у кого есть токен, запускает симуляции на вашем оборудовании; квот на пользователя сверх приведённых выше ограничений нет.
- Носит консультативный характер, не навигационное оборудование с утверждённым типом: ответственность за судовождение остаётся на операторе. Выходные данные симулятора — это смоделированные или проверенные по внешнему эталону значения для анализа, как и везде в Kshana.