Машинный перевод, не проверенный носителем языка. Эталоном служит английская версия.

API и интеграцииПравить на GitHubИсточник: docs/deploy/mcp-http.md

Запуск 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 ничего не запускает)#

Каждый запускает опубликованный образ, задаёт --allowed-host по имени хоста платформы, которое вы подставляете в файл, и полагается на платформу в части HTTPS.

Задайте ограничение процессора и памяти на платформе#

Тайм-аут, пул и бюджет ограничивают, сколько работы принимается, но один принятый вызов всё равно может долго занимать ядро, а большой результат может занять сотни мегабайт. Поставьте также жёсткое ограничение на контейнер: шаблоны запрашивают 2 процессора и 1 ГиБ (cpus и mem_limit в Compose, [[vm]] в Fly, resources.limits в Cloud Run). Держите --max-concurrent не выше числа процессоров.

Чем он не является#

  • Не многопользовательская служба. Любой, у кого есть токен, запускает симуляции на вашем оборудовании; квот на пользователя сверх приведённых выше ограничений нет.
  • Носит консультативный характер, не навигационное оборудование с утверждённым типом: ответственность за судовождение остаётся на операторе. Выходные данные симулятора — это смоделированные или проверенные по внешнему эталону значения для анализа, как и везде в Kshana.