mcpField
S
SentinelOne (Purple)

SentinelOne (Purple)

本地服务
github.com安全02 周前更新

关于 SentinelOne (Purple)

SentinelOne (Purple) 是面向多租户网关部署的 purple-mcp HTTP 包装器,适用于需要按请求传入各租户 SentinelOne 凭据的环境。它为每组令牌和控制台 URL 按需启动独立子进程,并转发流式 HTTP 请求。

主要功能

  1. 01按租户凭据隔离子进程
  2. 02Streamable HTTP 请求代理
  3. 03服务间 HMAC 身份验证
  4. 04空闲子进程回收
  5. 05健康检查端点

适用场景

  1. 01通过网关接入多个 SentinelOne 租户
  2. 02在请求中转发租户令牌与控制台 URL
  3. 03检查服务运行状态

MCP 相关

提供 Streamable HTTP MCP 端点 `/mcp`,将请求代理到按租户凭据启动的 purple-mcp 子进程。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"wyre-ai-sentinelone": {
"command": "docker",
"args": [
"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.9"
],
"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-ai/sentinelone-mcp:v1.0.9
需要配置的环境变量
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-ai/sentinelone-mcp:v1.0.9

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

sentinelone-mcp

sentinel-one/purple-mcp 的多租户 Streamable HTTP 封装,旨在让 wyre-technology MCP gateway 能通过 HTTP 标头转发各租户的 SentinelOne 凭据。

原因

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 服务通信一样与其通信。

配置

环境变量默认值说明
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未设置仅在本地开发时准确设置为 1,即可在未设置 CONDUIT_S2S_SECRET 的情况下启动。进程会记录警告,不会验证 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(账户级或站点级服务用户令牌)。目录中的 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>,其中十六进制字符串是以 CONDUIT_S2S_SECRET 为密钥、对字面字符串 t=<unix seconds> 计算得到的 HMAC-SHA256(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 表示 sidecar 已启动但要求身份验证,而 400 表示 slug 状态为 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 许可证授权。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。