SentinelOne (Purple) について
SentinelOne (Purple) は、リクエストごとに SentinelOne の認証情報を渡すマルチテナントゲートウェイ向けの purple-mcp ラッパーです。トークンとコンソール URL の組み合わせごとに子プロセスを起動し、HTTP ストリームを中継します。
主な機能
- 01テナントごとの子プロセス分離
- 02Streamable HTTP リクエストの中継
- 03サービス間 HMAC 認証
- 04アイドル子プロセスの破棄
- 05ヘルスチェックエンドポイント
活用シーン
- 01ゲートウェイ経由で複数の SentinelOne テナントに接続
- 02リクエストごとのテナントトークンとコンソール URL の転送
- 03サービス稼働状況の確認
MCP 対応
`/mcp` で Streamable HTTP の MCP エンドポイントを公開し、テナント認証情報で起動した purple-mcp の子プロセスへリクエストを中継します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e PORT -e IDLE_EVICT_MS -e SPAWN_READY_TIMEOUT_MS -e LOG_LEVEL ghcr.io/wyre-ai/sentinelone-mcp:v1.0.9PORTPublic listen port for the proxy (POST /mcp, GET /health)IDLE_EVICT_MSIdle tenant timeout before a purple-mcp child is evicted (ms)SPAWN_READY_TIMEOUT_MSHow long to wait for a spawned child to start serving HTTP (ms)LOG_LEVELFastify log level: debug, info, warn, errorローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wyre-ai/sentinelone-mcp:v1.0.9stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
sentinelone-mcp
wyre-technology MCP gateway がテナントごとの SentinelOne 認証情報を HTTP ヘッダーとして転送できるように構築された、sentinel-one/purple-mcp のマルチテナント対応 Streamable HTTP ラッパーです。
背景
purple-mcp は優れた公式 MCP サーバーですが、SentinelOne コンソールのトークンと URL をプロセス起動時に環境変数から読み取るため、コンテナごとに単一テナントしか扱えません。当社のゲートウェイはマルチテナント対応で、リクエストごとに呼び出し元組織の認証情報を HTTP ヘッダーで受け取ります。そのため、ベンダーコンテナはこれらのヘッダーをアップストリームが理解できる形式に変換する必要があります。
このイメージには、purple-mcp と小規模な Node/Fastify プロキシが含まれています。プロキシは次の処理を行います。
:8080で待ち受け、POST /mcpとGET /healthを受け付けます。- 有効な
X-Gateway-S2S証明情報を必須とし、その後、リクエストからX-S1-API-TokenとX-S1-Console-URLを読み取ります(従来のx-purplemcp-token/x-purplemcp-base-urlも引き続き受け付けます)。フィールドごとのフォールバック後もトークンまたはコンソール URL のいずれかが欠けているリクエストには 401 を返します。Conduit のベンダーモニターは、これを到達可能だが認証で制限されている状態として扱います。環境変数のPURPLEMCP_CONSOLE_*へのフォールバックはありません。 (token, base-url)テナントごとに、適切な環境変数を設定して、プライベートなループバックポートでpurple-mcp --mode streamable-http子プロセスを遅延起動します。- リクエスト本文をその子プロセスにプロキシし、レスポンスをストリーミングして返します。
- アイドル状態が60分続いた子プロセスを削除します(
IDLE_EVICT_MS)。
これにより、ゲートウェイが他のベンダー MCP サーバーと同様に接続できる単一のコンテナが実現します。
設定
| Env var | Default | Notes |
|---|---|---|
PORT | 8080 | 外部向け待ち受けポートです。 |
MCP_HTTP_HOST | 実際のシークレットが設定されている場合は 0.0.0.0 | バインドアドレスです。CONDUIT_S2S_SECRET が設定されている場合は、0.0.0.0 を含め、この値が適用されます。未設定の場合は、従来どおりのバインドが維持されます。イメージと Compose はコンテナ内で 0.0.0.0 を設定し、ホスト上で 127.0.0.1:8080:8080 を公開します。 |
CONDUIT_S2S_SECRET | — | 必須です。サービス間シークレットです。空の場合、または既知のプレースホルダー(changeme、secret、replace-me、replace-with-a-real-secret などの例示値)の場合、プロセスはエラーをログに出力してゼロ以外の終了コードで終了します。openssl rand -hex 32 で生成してください。Compose はこの値がないと起動しません。この値がログに記録されることはありません。 |
MCP_ALLOW_INSECURE_DEV | 未設定 | CONDUIT_S2S_SECRET なしで起動する場合に限り、ローカル開発用として正確に 1 を設定します。プロセスは警告をログに出力し、X-Gateway-S2S の検証を行わず、127.0.0.1 のみでバインドします。ループバック以外の MCP_HTTP_HOST が指定されている場合は起動を拒否します。既知のプレースホルダーシークレットが指定されている場合も起動を拒否します。 |
PURPLE_MCP_DIR | /opt/purple-mcp | purple-mcp のソースと仮想環境の場所です。 |
PURPLE_MCP_PYTHON | /opt/purple-mcp/.venv/bin/python | アップストリームの仮想環境にある Python インタープリターです。 |
IDLE_EVICT_MS | 3600000 | テナントがアイドル状態になってから削除するまでの時間(60分)です。長くすると子プロセスを起動状態に保てるため、コールドスタートの繰り返しを回避できます。 |
SPAWN_READY_TIMEOUT_MS | 30000 | 子プロセスが HTTP サービスを開始するまで待機する時間です。 |
MAX_CHILDREN | 50 | 同時に実行できる異なるテナントの子プロセス数の上限です。上限を超えて新しいテナントの子プロセスを起動しようとすると、既存の子プロセスを削除せずに拒否されます(502)。 |
LOG_LEVEL | info | Fastify のログレベルです。起動拒否と安全でない開発モードの警告は stderr に出力され、このレベルによるフィルタリングの対象になりません。 |
.env.example をコピーしてください。このファイルの CONDUIT_S2S_SECRET は空のままにし、実際の値はコミット対象外の .env またはプロセス環境にのみ設定してください。
リクエストヘッダー
このサーバーはゲートウェイモードです。受信リクエストに対して、環境変数から PURPLEMCP_CONSOLE_TOKEN や PURPLEMCP_CONSOLE_BASE_URL を読み取りません。ゲートウェイは、すべての /mcp リクエストにこれらのヘッダーを転送する必要があります。ヘッダー名では大文字と小文字が区別されません。両方のペアが指定されている場合、フィールドごとに X-S1-* の値が優先されます。
| ヘッダー | SentinelOne の認証情報 |
|---|---|
X-Gateway-S2S | サービス間の証明です。CONDUIT_S2S_SECRET が設定されている場合、/mcp で必須です。SentinelOne の認証情報ではありません。 |
X-S1-API-Token | そのリクエストの子プロセスに渡される PURPLEMCP_CONSOLE_TOKEN(Account レベルまたは Site レベルのサービスユーザートークン)です。カタログの headerMapping 名です。 |
X-S1-Console-URL | そのリクエストの子プロセスに渡される PURPLEMCP_CONSOLE_BASE_URL(例:https://yourtenant.sentinelone.net)です。カタログの headerMapping 名です。 |
x-purplemcp-token | API トークンのレガシーエイリアスです。 |
x-purplemcp-base-url | コンソール URL のレガシーエイリアスです。 |
X-Gateway-S2S
CONDUIT_S2S_SECRET が設定されている場合、すべての POST /mcp に X-Gateway-S2S を含める必要があります。チェックは src/s2s-verify.ts の verifyS2sHeader で行われます。ヘッダー値は t=<unix seconds>,v1=<hex> であり、hex は CONDUIT_S2S_SECRET を鍵として、リテラル文字列 t=<unix seconds> を HMAC-SHA256 でハッシュした値(小文字の 16 進数 64 文字)です。タイムスタンプはサーバーの時計から 300 秒以内でなければなりません。ヘッダーがないか無効な場合、テナントの認証情報を読み取る前に HTTP 401 が返され、シークレットはログに記録されません。
X-Gateway-S2S: t=1710000000,v1=<hmac-sha256 hex of "t=1710000000">
ゲートウェイモードでは、/mcp に X-S1-API-Token と X-S1-Console-URL(または、混在したペアを含むレガシーの x-purplemcp-* ペア)も必要です。いずれかの認証情報が不足しているリクエストは HTTP 401(JSON-RPC -32001)を返し、プロセス環境の PURPLEMCP_CONSOLE_* にはフォールバックしません。Vendor-monitor の認証情報なしの initialize プローブはこれを利用します。401/403 はサイドカーが稼働中だが認証で保護されていることを示し、400 はスラッグが DOWN であることを示します。
GET /health は引き続き認証不要で、認証情報を読み取りません。
ビルド
docker build -t ghcr.io/wyre-ai/sentinelone-mcp:latest .
イメージはコンテナ内の 0.0.0.0(MCP_HTTP_HOST)でリッスンし、CONDUIT_S2S_SECRET が設定されるまで起動を拒否します。ポートはループバックで公開してください。SentinelOne の認証情報は各リクエストのヘッダーで渡され、環境変数からは読み取られません。
docker run --rm \
-e CONDUIT_S2S_SECRET="$(openssl rand -hex 32)" \
-p 127.0.0.1:8080:8080 \
ghcr.io/wyre-ai/sentinelone-mcp:latest
CONDUIT_S2S_SECRET が未設定の場合、Compose は起動を拒否します。127.0.0.1:8080:8080 を公開し、PURPLEMCP_CONSOLE_TOKEN や PURPLEMCP_CONSOLE_BASE_URL は注入しません。
CONDUIT_S2S_SECRET="$(openssl rand -hex 32)" docker compose up --build
シークレットを使わないローカル HTTP は、開発用途に限られます。127.0.0.1 にバインドし、警告をログに記録します。ループバック以外の MCP_HTTP_HOST(0.0.0.0 を含む)を指定すると、起動時に終了します。
npm run build
MCP_ALLOW_INSECURE_DEV=1 npm start
ライセンス
Apache-2.0。バンドルされている purple-mcp は SentinelOne による MIT ライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。