mcpField
S
SentinelOne (Purple)

SentinelOne (Purple)

ローカル
github.comセキュリティ02 週間前に更新

SentinelOne (Purple) について

SentinelOne の purple-mcp をマルチテナント対応にする HTTP ラッパーで、リクエストごとにテナント認証情報を転送するゲートウェイ向けです。認証情報の組み合わせごとに上流プロセスを起動し、MCP トラフィックを転送します。

主な機能

  1. 01リクエストごとのテナント認証情報を受信
  2. 02テナントごとに purple-mcp の子プロセスを起動
  3. 03Streamable HTTP のリクエストと応答をプロキシ
  4. 04アイドル状態のテナントプロセスを終了
  5. 05サービス間リクエストを検証

活用シーン

  1. 01単一コンテナで複数の SentinelOne テナントに対応
  2. 02ゲートウェイの認証情報を purple-mcp に転送
  3. 03リクエスト間で起動済みテナントプロセスを再利用
  4. 04ゲートウェイに認証必須のエンドポイントを提供

MCP 対応

purple-mcp をラップし、`/mcp` の Streamable HTTP エンドポイント経由で MCP リクエストをプロキシします。ラッパーはリクエストヘッダーから SentinelOne 認証情報を読み取り、テナントごとの子プロセスへトラフィックを転送します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"wyre-technology-sentinelone": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"PORT",
"-e",
"IDLE_EVICT_MS",
"-e",
"SPAWN_READY_TIMEOUT_MS",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-technology/sentinelone-mcp:v1.0.6"
],
"env": {
"PORT": "<PORT>",
"IDLE_EVICT_MS": "<IDLE_EVICT_MS>",
"SPAWN_READY_TIMEOUT_MS": "<SPAWN_READY_TIMEOUT_MS>",
"LOG_LEVEL": "<LOG_LEVEL>"
}
}
}
}
起動コマンドdocker run -i --rm -e PORT -e IDLE_EVICT_MS -e SPAWN_READY_TIMEOUT_MS -e LOG_LEVEL ghcr.io/wyre-technology/sentinelone-mcp:v1.0.6
設定が必要な環境変数
PORTPublic 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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/wyre-technology/sentinelone-mcp:v1.0.6

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

sentinelone-mcp

wyre-technology MCP gateway がテナントごとの SentinelOne 認証情報を HTTP ヘッダーとして転送できるように構築された、sentinel-one/purple-mcp のマルチテナント対応 Streamable HTTP ラッパーです。

背景

purple-mcp は優れた公式 MCP サーバーですが、SentinelOne コンソールのトークンと URL をプロセス起動時に環境変数から読み取るため、コンテナごとに単一テナントしか扱えません。当社のゲートウェイはマルチテナント対応で、リクエストごとに呼び出し元組織の認証情報を HTTP ヘッダーで受け取ります。そのため、ベンダーコンテナはこれらのヘッダーをアップストリームが理解できる形式に変換する必要があります。

このイメージには、purple-mcp と小規模な Node/Fastify プロキシが含まれています。プロキシは次の処理を行います。

  1. :8080 で待ち受け、POST /mcp と GET /health を受け付けます。
  2. 有効な X-Gateway-S2S 証明情報を必須とし、その後、リクエストから X-S1-API-Token と X-S1-Console-URL を読み取ります(従来の x-purplemcp-token/x-purplemcp-base-url も引き続き受け付けます)。フィールドごとのフォールバック後もトークンまたはコンソール URL のいずれかが欠けているリクエストには 401 を返します。Conduit のベンダーモニターは、これを到達可能だが認証で制限されている状態として扱います。環境変数の PURPLEMCP_CONSOLE_* へのフォールバックはありません。
  3. (token, base-url) テナントごとに、適切な環境変数を設定して、プライベートなループバックポートで purple-mcp --mode streamable-http 子プロセスを遅延起動します。
  4. リクエスト本文をその子プロセスにプロキシし、レスポンスをストリーミングして返します。
  5. アイドル状態が60分続いた子プロセスを削除します(IDLE_EVICT_MS)。

これにより、ゲートウェイが他のベンダー MCP サーバーと同様に接続できる単一のコンテナが実現します。

設定

Env varDefaultNotes
PORT8080外部向け待ち受けポートです。
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-mcppurple-mcp のソースと仮想環境の場所です。
PURPLE_MCP_PYTHON/opt/purple-mcp/.venv/bin/pythonアップストリームの仮想環境にある Python インタープリターです。
IDLE_EVICT_MS3600000テナントがアイドル状態になってから削除するまでの時間(60分)です。長くすると子プロセスを起動状態に保てるため、コールドスタートの繰り返しを回避できます。
SPAWN_READY_TIMEOUT_MS30000子プロセスが HTTP サービスを開始するまで待機する時間です。
MAX_CHILDREN50同時に実行できる異なるテナントの子プロセス数の上限です。上限を超えて新しいテナントの子プロセスを起動しようとすると、既存の子プロセスを削除せずに拒否されます(502)。
LOG_LEVELinfoFastify のログレベルです。起動拒否と安全でない開発モードの警告は 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-tokenAPI トークンのレガシーエイリアスです。
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 ライセンスです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。