关于 Datto SaaS Protection
Datto SaaS Protection 的 MCP 服务将 Datto REST API 接入 MCP 客户端,供管理 Microsoft 365 和 Google Workspace 备份的团队查看保护状态并管理席位。支持经确认后批量更改席位,并提供只读交互式席位卡片。
主要功能
- 01查看受保护的客户和域
- 02检查席位及保护状态
- 03查看应用备份状态
- 04确认后批量更改席位
- 05渲染交互式席位卡片
适用场景
- 01核查客户的 SaaS 备份覆盖情况
- 02检查特定席位的保护状态
- 03按应用查看备份统计
- 04批量许可、暂停或取消席位许可
MCP 相关
通过 MCP 工具向客户端开放 Datto SaaS Protection 的域、席位、应用和备份统计信息,并支持确认后执行批量席位更改。MCP Apps 主机可将席位查询呈现为只读交互卡片。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e DATTO_SAAS_API_KEY -e DATTO_SAAS_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-technology/datto-saas-protection-mcp:v2.1.4DATTO_SAAS_API_KEY密钥Datto SaaS Protection (Backupify) API keyDATTO_SAAS_REGIONRegion: 'us' (default) or 'eu'MCP_TRANSPORTTransport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.AUTH_MODE密钥Credential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.LOG_LEVELLog verbosity: debug, info, warn, error本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/wyre-technology/datto-saas-protection-mcp:v2.1.4stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Datto SaaS Protection MCP 服务
这是一个 Model Context Protocol 服务,可将 Datto SaaS Protection (Backupify) API 提供给 Claude 和其他 MCP 客户端使用。
功能
通过 Datto 公开的 REST API
(https://api.datto.com/v1/saas/...),向 AI 助手展示 Microsoft 365 和 Google Workspace
客户的 SaaS 备份状态:列出受保护的客户和域名,查看席位及其保护状态,检查各应用的备份状态,以及(经确认后)批量授权、暂停或取消席位授权。
- 交互式席位卡片(MCP Apps):在 MCP Apps 宿主(Claude Desktop/web)中,
datto_saas_get_seat会呈现为交互式卡片——只读,显示席位类型和 Datto 席位状态;默认采用中性色,可通过注入window.__BRAND__或设置MCP_BRAND_*环境变量进行品牌化;在其他宿主中,纯 JSON 行为保持不变
工具
| 工具 | Datto 端点 | 注解 |
|---|---|---|
datto_saas_list_domains | GET /v1/saas/domains | 只读 |
datto_saas_list_seats | GET /v1/saas/{saasCustomerId}/seats | 只读 |
datto_saas_get_seat | GET /v1/saas/{saasCustomerId}/seats(筛选单个席位) | 只读 |
datto_saas_list_applications | GET /v1/saas/{saasCustomerId}/applications | 只读 |
datto_saas_get_backup_stats | GET /v1/saas/{saasCustomerId}/detailedBackupStats | 只读 |
datto_saas_bulk_seat_change | PUT /v1/saas/{saasCustomerId}/{externalSubscriptionId}/bulkSeatChange | 写入,会造成破坏(需确认) |
请从 datto_saas_list_domains 开始:它会返回其他所有工具所需的 saasCustomerId 和
externalSubscriptionId。
早期版本提供了
list_clients、list_backups、queue_restore、get_restore_status、list_activity和get_license_usage。这些工具基于 Datto 未提供的路由(/v1/saas/clients、/restores、…) 构建,始终返回 404,因此现已移除。
凭据
在 Datto Partner Portal(Admin > Integrations > API
Keys)中创建 API 密钥。该 API 使用 HTTP Basic 身份验证,并需要公钥/密钥对。API 只有一个主机(api.datto.com);没有区域性(EU)API 主机。
复制 .env.example,并设置以下变量。
| 变量 | 必需 | 说明 |
|---|---|---|
DATTO_SAAS_PUBLIC_KEY | stdio 和 AUTH_MODE=env 时必需 | Datto REST API 公钥 |
DATTO_SAAS_SECRET_KEY | stdio 和 AUTH_MODE=env 时必需 | Datto REST API 密钥 |
MCP_TRANSPORT | 否 | stdio(默认)或 http |
AUTH_MODE | 否 | gateway(Docker 镜像和 Compose)或 env。Gateway 模式要求每个 /mcp 请求都携带 X-Datto-SaaS-Public-Key 和 X-Datto-SaaS-Secret-Key,且绝不会回退到 DATTO_SAAS_*。env 仅在 S2S 身份验证成功后使用这些变量。未设置时默认为 env。 |
CONDUIT_S2S_SECRET | HTTP 模式下必需 | 服务到服务密钥。如果该变量为空或使用已知占位值(changeme、secret、replace-me、your-s2s-secret、replace-with-a-real-secret 以及其他示例值,或未解析的 ${...} 模板),HTTP 服务会记录错误并以非零状态码退出。使用 openssl rand -hex 32 生成密钥。未设置此变量时,Compose 不会启动。此值绝不会写入日志。 |
MCP_ALLOW_INSECURE_DEV | 否 | 仅限本地开发时,设为 1 才能在未设置 CONDUIT_S2S_SECRET 的情况下启动 HTTP。进程会记录警告,不会强制检查 X-Gateway-S2S,且仅绑定到 127.0.0.1。如果 MCP_HTTP_HOST 设置为非环回地址(包括 0.0.0.0),则会覆盖该设置并记录此覆盖。使用已知占位值作为密钥时仍会拒绝启动。 |
MCP_HTTP_HOST | 否 | 设置了真实 CONDUIT_S2S_SECRET 时使用的绑定地址。未设置时默认为 127.0.0.1。容器镜像和 Compose 会在容器内将其设为 0.0.0.0。 |
MCP_HTTP_PORT | 否 | HTTP 端口。默认为 8080。 |
/health 无需身份验证,且不会读取凭据。stdio 传输不使用 CONDUIT_S2S_SECRET。
本地(env 模式)
export DATTO_SAAS_PUBLIC_KEY="..."
export DATTO_SAAS_SECRET_KEY="..."
托管(gateway 模式)
WYRE MCP Gateway 会通过请求头按请求注入凭据:
X-Datto-SaaS-Public-Key(必需,密钥)X-Datto-SaaS-Secret-Key(必需,密钥)X-Datto-SaaS-Region(为向后兼容而接受;忽略)
如果请求缺少公钥或密钥,则会返回 HTTP 401,且不会回退到进程环境中的 DATTO_SAAS_PUBLIC_KEY / DATTO_SAAS_SECRET_KEY。
HTTP 身份验证
设置了 MCP_TRANSPORT=http 和 CONDUIT_S2S_SECRET 时,每个 /mcp 请求都必须携带 X-Gateway-S2S。检查逻辑位于 src/s2s-verify.ts 中的 verifyS2sHeader:请求头的值为 t=<unix seconds>,v1=<hex>,其中 hex 是以 CONDUIT_S2S_SECRET 为密钥、对字面字符串 t=<unix seconds> 计算的 HMAC-SHA256(64 个小写十六进制字符)。时间戳与服务器时钟的偏差不得超过 300 秒。缺少或无效的请求头会导致 HTTP 401,且发生在读取供应商凭据之前。
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H "X-Datto-SaaS-Public-Key: $DATTO_SAAS_PUBLIC_KEY" \
-H "X-Datto-SaaS-Secret-Key: $DATTO_SAAS_SECRET_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
运行
npm install
npm run build
npm start # stdio
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http npm start
在 CONDUIT_S2S_SECRET 设置为真实密钥之前,HTTP 会拒绝启动。未设置该密钥时,仅限开发环境启动本地 HTTP,并绑定到 127.0.0.1:
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start
Docker
镜像会在容器内的 0.0.0.0(MCP_HTTP_HOST)上监听,且默认使用 AUTH_MODE=gateway。将端口发布到环回地址,并传入真实的 S2S 密钥。在 gateway 模式下,Datto 凭据会作为请求头随每个请求传入;不会从环境变量中读取。
docker build -t datto-saas-protection-mcp .
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
datto-saas-protection-mcp
未设置 CONDUIT_S2S_SECRET 时,Compose 会拒绝启动。Gateway 服务会设置 AUTH_MODE=gateway,不会注入 DATTO_SAAS_PUBLIC_KEY 或 DATTO_SAAS_SECRET_KEY,并发布 127.0.0.1:8080:8080:
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
单租户 HTTP(AUTH_MODE=env)仍需要 S2S 密钥,然后使用 DATTO_SAAS_PUBLIC_KEY 和 DATTO_SAAS_SECRET_KEY。它与上文的 Gateway Compose 服务相互独立。
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-e AUTH_MODE=env \
-e DATTO_SAAS_PUBLIC_KEY=your-public-key \
-e DATTO_SAAS_SECRET_KEY=your-secret-key \
-p 127.0.0.1:8080:8080 \
datto-saas-protection-mcp
许可证
Apache 2.0——参见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。