SentinelOne (Purple)

io.github.wyre-technology由 GitHub 帳號 wyre-technology 發布v1.0.6更新於 Oct 24, 2026

Multitenant Streamable HTTP wrapper for the SentinelOne purple-mcp server.

概覽

AI 產生的概覽

多租戶 HTTP 包裝層,為 SentinelOne purple-mcp 伺服器提供前端,讓閘道以請求標頭傳入各租戶的 SentinelOne 憑證。

可以做什麼
  • 透過單一 Streamable HTTP 端點(POST /mcp)以及免驗證的 GET /health 暴露上游 SentinelOne purple-mcp 的工具。
  • 依請求從標頭讀取 SentinelOne 憑證(X-S1-API-Token 與 X-S1-Console-URL,相容舊版 x-purplemcp-* 別名),而非環境變數。
  • 為每組租戶憑證在私有回送埠上延遲啟動一個獨立的 purple-mcp 子程序,並轉送請求內容。
  • 依可設定的閒置逾時回收租戶子程序,並限制同時存在的租戶數量。
  • 在讀取任何租戶憑證之前先驗證服務對服務的 HMAC 證明標頭。
適用情境
適合以多租戶 MCP 閘道、用單一容器服務多個 SentinelOne 主控台的維運情境,每個請求自帶所屬組織的憑證。它是閘道端代理而非直接的 SentinelOne 用戶端,單人桌面環境通常用不到。
執行需求
以本機容器映像執行,內含 Node/Fastify 代理與打包的 purple-mcp Python 環境。啟動必須設定 CONDUIT_S2S_SECRET,每個請求需帶 X-Gateway-S2S、X-S1-API-Token 與 X-S1-Console-URL 標頭。選用設定包括 PORT、MCP_HTTP_HOST、IDLE_EVICT_MS、SPAWN_READY_TIMEOUT_MS、MAX_CHILDREN、LOG_LEVEL 與 PURPLE_MCP_DIR。需要能連線 SentinelOne 主控台的網路。
安裝前請注意
每個請求都帶有 SentinelOne API 權杖與主控台位址,應只監聽回送位址且不要提交真實密鑰。CONDUIT_S2S_SECRET 為必填,範例佔位值會被拒絕;開發模式 MCP_ALLOW_INSECURE_DEV=1 會關閉服務對服務驗證,僅限本機使用。缺少憑證的請求會回傳 401,且依憑證組合啟動子程序,同時數量有上限。代理會把憑證轉送給它啟動的上游 purple-mcp 子程序。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 SentinelOne (Purple),將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

sentinelone-mcp

Multitenant Streamable HTTP wrapper for sentinel-one/purple-mcp, built so the wyre-technology MCP gateway can forward per-tenant SentinelOne credentials as HTTP headers.

Why

purple-mcp is a great first-party MCP server, but it reads its SentinelOne console token + URL from environment variables at process startup, which makes it single-tenant per container. Our gateway is multi-tenant: every request carries the calling org's credentials as HTTP headers, and the vendor container has to translate those headers into something the upstream understands.

This image bundles purple-mcp plus a small Node/Fastify proxy. The proxy:

  1. Listens on :8080 with POST /mcp and GET /health.
  2. Requires a valid X-Gateway-S2S proof, then reads X-S1-API-Token and X-S1-Console-URL from that request (legacy x-purplemcp-token / x-purplemcp-base-url still accepted). A request missing either the token or the console URL, after per-field fallback, gets 401, which Conduit's vendor-monitor treats as reachable but auth-gated. There is no fallback to PURPLEMCP_CONSOLE_* in the environment.
  3. Lazily spawns one purple-mcp --mode streamable-http child per (token, base-url) tenant on a private loopback port, with the right env vars set.
  4. Proxies the request body to that child and streams the response back.
  5. Evicts idle children after 60 minutes (IDLE_EVICT_MS).

The result is a single container that the gateway can talk to like any other vendor MCP server.

Configuration

Env varDefaultNotes
PORT8080Public listen port.
MCP_HTTP_HOST0.0.0.0 when a real secret is setBind address. A configured CONDUIT_S2S_SECRET honors this value, including 0.0.0.0. Unset keeps that historical bind. The image and Compose set 0.0.0.0 inside the container and publish 127.0.0.1:8080:8080 on the host.
CONDUIT_S2S_SECRET—Required. Service-to-service secret. The process logs an error and exits non-zero when this is empty or a known placeholder (changeme, secret, replace-me, replace-with-a-real-secret, and the other example values). Generate one with openssl rand -hex 32. Compose will not start without it. The value is never logged.
MCP_ALLOW_INSECURE_DEVunsetSet to exactly 1 only for local development to start without CONDUIT_S2S_SECRET. The process logs a warning, does not enforce X-Gateway-S2S, and binds 127.0.0.1 only. A non-loopback MCP_HTTP_HOST refuses to start. A known placeholder secret still refuses to start.
PURPLE_MCP_DIR/opt/purple-mcpWhere purple-mcp source + venv live.
PURPLE_MCP_PYTHON/opt/purple-mcp/.venv/bin/pythonPython interpreter from the upstream venv.
IDLE_EVICT_MS3600000Idle tenant timeout (60 min). Longer keeps children warm and avoids repeated cold starts.
SPAWN_READY_TIMEOUT_MS30000How long to wait for a child to start serving HTTP.
MAX_CHILDREN50Cap on distinct concurrent tenant children. A new-tenant spawn beyond the cap is rejected (502) rather than evicting an existing child.
LOG_LEVELinfoFastify log level. Startup refusals and the insecure-dev warning go to stderr and are not filtered by this level.

Copy .env.example. Leave CONDUIT_S2S_SECRET empty in that file; put a real value only in an uncommitted .env or the process environment.

Request headers

This server is gateway mode. It does not read PURPLEMCP_CONSOLE_TOKEN or PURPLEMCP_CONSOLE_BASE_URL from the environment for an incoming request. The gateway must forward these headers on every /mcp request. Names are case-insensitive. When both pairs are present, the X-S1-* value wins per field.

HeaderSentinelOne credential
X-Gateway-S2SService-to-service proof. Required on /mcp when CONDUIT_S2S_SECRET is set. Not a SentinelOne credential.
X-S1-API-TokenPURPLEMCP_CONSOLE_TOKEN passed to that request's child (Account- or Site-level service user token). Catalog headerMapping name.
X-S1-Console-URLPURPLEMCP_CONSOLE_BASE_URL passed to that request's child (e.g. https://yourtenant.sentinelone.net). Catalog headerMapping name.
x-purplemcp-tokenLegacy alias for the API token.
x-purplemcp-base-urlLegacy alias for the console URL.

X-Gateway-S2S

With CONDUIT_S2S_SECRET set, every POST /mcp must include X-Gateway-S2S. The check is verifyS2sHeader in src/s2s-verify.ts: the header value is t=<unix seconds>,v1=<hex>, where the hex is HMAC-SHA256 of the literal string t=<unix seconds> keyed with CONDUIT_S2S_SECRET (64 lowercase hex characters). The timestamp must be within 300 seconds of the server clock. A missing or invalid header is HTTP 401, before tenant credentials are read, and the secret is not logged.

X-Gateway-S2S: t=1710000000,v1=<hmac-sha256 hex of "t=1710000000">

In gateway mode, /mcp also requires X-S1-API-Token and X-S1-Console-URL (or the legacy x-purplemcp-* pair, including a mixed pair). A request missing either credential is HTTP 401 (JSON-RPC -32001) and does not fall back to PURPLEMCP_CONSOLE_* in the process environment. Vendor-monitor's credless initialize probe relies on that: 401/403 means the sidecar is up but auth-gated, while 400 marks the slug DOWN.

GET /health stays unauthenticated and does not read credentials.

Build

bash
docker build -t ghcr.io/wyre-ai/sentinelone-mcp:latest .

The image listens on 0.0.0.0 inside the container (MCP_HTTP_HOST) and refuses to start until CONDUIT_S2S_SECRET is set. Publish the port on loopback. SentinelOne credentials arrive on each request as headers; they are not read from the environment.

bash
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

Compose refuses to start when CONDUIT_S2S_SECRET is unset, publishes 127.0.0.1:8080:8080, and does not inject PURPLEMCP_CONSOLE_TOKEN or PURPLEMCP_CONSOLE_BASE_URL:

bash
CONDUIT_S2S_SECRET="$(openssl rand -hex 32)" docker compose up --build

Local HTTP without a secret is development-only. It binds 127.0.0.1 and logs a warning. A non-loopback MCP_HTTP_HOST (including 0.0.0.0) makes startup exit:

bash
npm run buildMCP_ALLOW_INSECURE_DEV=1 npm start

License

Apache-2.0. The bundled purple-mcp is MIT-licensed by SentinelOne.

來源:README.md,提交 74b12e4

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.0.6最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分