kshana-mcp を HTTP で実行する(セルフホスト)
サードパーティの AI クライアントに触れた一節は、ここでは省いています。GitHub のdocs/deploy/mcp-http.mdにあります。
Kshana はエンドポイントをホストしません。クライアントの接続先となる共有のkshanaサーバーはありません。ご自身のマシン、コンテナ、またはクラウドプロジェクトで実行し、そのアクセス制御とコストはご自身で管理します。0.40.0 のサーバーは、このリポジトリにあるものです。その数値には、stdio の場合とまったく同じように、VALIDATED または MODELLED のラベルが付きます。
安全な既定値#
| 制御 | 動作 |
|---|---|
| バインドアドレス | ループバックのみ(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_*)は、KSHANA_MCP_IQ_DIRの設定にかかわらず HTTP モードでは無効です。ほかのすべてのツールは、シナリオをインラインで受け取り、ファイルを指定したシナリオは拒否します。パスを読み書きするツール引数はありません。 |
| ボディのサイズ | --max-body-bytes、既定は 5 MiB(シナリオの上限は 4 MiB)。超過した場合:413。長さが宣言されている場合も、ボディがチャンク転送の場合も同様です。 |
| 応答時間 | --request-timeout-secs、既定は 120。超過した場合:408。これが制限するのは呼び出し元が待つ時間であり、処理そのものではありません。すでに進行中の実行は止められないため、408の後も続行し、バックグラウンドで完了します。 |
| 同時実行数 | --max-concurrent、既定は 8。これを超えるとリクエストは直ちにRetry-Afterつきの503を受け取ります。キューに入るものはありません。 |
| ワークプール | すべてのツール呼び出しは、非同期ワーカーではなく、--max-concurrentスロットのプール内のブロッキングスレッドで実行されるため、長い実行がサーバーの応答を止めることはありません。スロットは、呼び出し元が諦めたときではなく、実行そのものが終わったときにだけ解放されます。そのため、放棄された実行がプールのサイズを超えて溜まることはなく、プールが満杯のときの呼び出しは、ビジーとして拒否されます。 |
| 作業の予算 | 同梱の例よりはるかに多くを要求するシナリオは、実行前に拒否されます。1000 を超えるモンテカルロ実現数(runs)、1000 ノードを超えるパラメーターグリッド、5000 を超えるメンバー実行数(グリッドノード数と実現数の積)、または 2 百万エポックを超える時間グリッドが対象です。エラーには、下げるべきフィールドが示されます。同じ予算は stdio でも適用されます。kshanaコマンドラインには予算がありません。 |
| CORS | Access-Control-*ヘッダーは一切送信されません。Originヘッダーを持つリクエストは、--allow-origin <scheme://host[:port]>で指定されていない限り拒否されます(403)。*は受け付けられません。 |
| Host ヘッダー | ループバック名、またはバインドアドレスと各--allowed-hostに対して検査されます。プロキシの背後やプラットフォームの URL では、--allowed-host your.domainを指定してください。それ以外:403。 |
| セッション | なし。すべての POST には JSON の応答が返され、セッションテーブルも、サーバー送信イベントのストリームも、開いたままにされることはありません。 |
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 はプラットフォームに任せます。
プラットフォームで CPU とメモリの上限を設定する#
タイムアウト、プール、予算は、受け入れる作業量を制限しますが、受け入れられた一回の呼び出しが長時間コアを使うことや、大きな結果が数百メガバイトを使うことは起こりえます。コンテナにも厳格な上限を設けてください。テンプレートは 2 CPU と 1 GiB を要求します(Compose ではcpusとmem_limit、Fly では[[vm]]、Cloud Run ではresources.limits)。--max-concurrentは CPU 数以下に保ってください。
対象外のもの#
- マルチテナントのサービスではありません。トークンを持つ人は誰でも、あなたのハードウェアでシミュレーションを実行できます。上記の制限以外に、ユーザーごとのクォータはありません。
- 助言用であり、型式承認を受けた航法装置ではありません。航行の責任は引き続き運用者にあります。シミュレーターの出力は、Kshana のほかの箇所と同様に、解析のための、モデルから計算した、または独立した参照と照合して確認した数値です。