关于 Datto BCDR
Datto BCDR 是面向 AI 助手的 MCP 服务,用于访问 Datto BCDR 合作伙伴门户。它提供设备、受保护 Agent、恢复点、截图验证、异地同步状态、警报和活动记录,并可在 MCP Apps 主机中显示交互式设备卡片。
主要功能
- 01列出 SIRIS 和 Alto 设备
- 02查看受保护 Agent 和恢复点
- 03获取截图验证结果
- 04检查异地同步状态
- 05查看警报和活动记录
- 06显示交互式设备卡片
适用场景
- 01检查设备备份状态
- 02查看 Agent 的恢复点
- 03核对截图验证结果
- 04查看门户警报和近期活动
MCP 相关
该 MCP 服务通过工具向 MCP 客户端提供 Datto BCDR 门户数据,也可在 MCP Apps 主机中返回只读的交互式设备卡片。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e DATTO_BCDR_PUBLIC_KEY -e DATTO_BCDR_PRIVATE_KEY -e DATTO_BCDR_REGION -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-technology/datto-bcdr-mcp:v1.1.4DATTO_BCDR_PUBLIC_KEY密钥Datto BCDR partner portal public API keyDATTO_BCDR_PRIVATE_KEY密钥Datto BCDR partner portal private API keyDATTO_BCDR_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-bcdr-mcp:v1.1.4stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Datto BCDR MCP 服务
用于 Datto BCDR(Backup Portal)API 的模型上下文协议(MCP)服务。 向 AI 助手提供 SIRIS / Alto 设备、受保护的 Agent、恢复点、屏幕截图验证、 异地同步状态、警报和活动日志。
工具
| 工具 | 描述 |
|---|---|
datto_bcdr_list_devices | 列出合作伙伴门户中的所有 SIRIS/Alto 设备 |
datto_bcdr_get_device | 根据 serialNumber 获取设备详情(在 MCP Apps 宿主中呈现为交互式卡片) |
datto_bcdr_list_assets | 列出设备上的受保护 Agent |
datto_bcdr_get_asset | 获取指定的受保护 Agent |
datto_bcdr_list_backups | 列出 Agent 的恢复点 |
datto_bcdr_list_screenshots | 列出 Agent 的屏幕截图验证 |
datto_bcdr_get_screenshot | 获取屏幕截图 PNG(以 base64 图像内容形式返回) |
datto_bcdr_get_offsite_status | 获取设备的异地同步状态 |
datto_bcdr_list_alerts | 门户警报(按日期范围筛选) |
datto_bcdr_list_activity | 活动日志(按日期范围筛选) |
当用户未提供必需的筛选条件(日期范围、序列号等)时,服务会使用 MCP elicitation 提示用户填写。
功能
- 交互式设备卡片(MCP Apps,SEP-1865):
datto_bcdr_get_device在 MCP Apps 宿主(Claude Desktop/web)中呈现为只读交互式卡片,一目了然地展示设备的备份状态—— 默认采用中性色,可通过注入window.__BRAND__或MCP_BRAND_*环境变量 进行品牌化;在其他宿主中,纯 JSON 行为保持不变。编辑ui/并运行npm run build:ui可重新生成嵌入式卡片包。
配置
复制 .env.example,并设置以下变量。stdio
传输会读取 DATTO_BCDR_*,且不受 HTTP 服务间
身份验证的影响。
| 变量 | 必需 | 描述 |
|---|---|---|
DATTO_BCDR_PUBLIC_KEY | stdio 和 AUTH_MODE=env 时必需 | Datto BCDR 合作伙伴门户公钥 |
DATTO_BCDR_PRIVATE_KEY | stdio 和 AUTH_MODE=env 时必需 | Datto BCDR 合作伙伴门户私钥(机密) |
DATTO_BCDR_REGION | 否 | us(默认值)或 eu |
MCP_TRANSPORT | 否 | stdio(默认值)或 http |
AUTH_MODE | 否 | gateway(Docker 镜像和 Compose 的默认值)或 env。Gateway 模式要求每个 /mcp 请求都携带 X-Datto-BCDR-Public-Key 和 X-Datto-BCDR-Private-Key,且绝不会回退到 DATTO_BCDR_*。env 仅在 S2S 身份验证成功后使用这些变量。 |
CONDUIT_S2S_SECRET | HTTP 必需 | 服务间密钥。如果该值为空或是已知占位符(replace-with-a-real-secret、your-s2s-secret、your-secret、changeme、change-me、placeholder、secret、example、replace-me、s2s-secret),HTTP 服务会记录错误并以非零状态码退出。未设置此变量时,Compose 不会启动。切勿提交真实值。使用 openssl rand -hex 32 生成。该值绝不会被记录。 |
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 | 否 | MCP_TRANSPORT=http 时的绑定地址。默认为 127.0.0.1。配置了 CONDUIT_S2S_SECRET 时会采用此值。容器镜像设置为 0.0.0.0。 |
MCP_HTTP_PORT | 否 | HTTP 端口。默认为 8080。 |
/health 无需身份验证,也不会读取凭据。
HTTP 身份验证
设置 MCP_TRANSPORT=http 和 CONDUIT_S2S_SECRET 后,每个 /mcp 请求都必须包含 X-Gateway-S2S。如果缺少该标头或标头无效,服务器会在读取供应商凭据前返回 401。
标头值为 t=<unix seconds>,v1=<hex hmac-sha256>。签名消息是 ASCII 字符串 t=<unix seconds>(即相同的时间戳前缀),HMAC 密钥为 CONDUIT_S2S_SECRET。与服务器时钟相差超过 300 秒的时间戳会被拒绝。
import { createHmac } from "node:crypto";
const t = Math.floor(Date.now() / 1000);
const v1 = createHmac("sha256", process.env.CONDUIT_S2S_SECRET).update(`t=${t}`).digest("hex");
const xGatewayS2s = `t=${t},v1=${v1}`;
在 AUTH_MODE=gateway 模式下,/mcp 还需要 X-Datto-BCDR-Public-Key 和 X-Datto-BCDR-Private-Key(X-Datto-BCDR-Region 为可选项)。这些标头是该请求唯一的凭据来源。缺少任一密钥的请求会返回 401,且不会回退使用 DATTO_BCDR_PUBLIC_KEY / DATTO_BCDR_PRIVATE_KEY。每个请求都会创建一个凭据隔离的全新服务实例。
WYRE MCP Gateway 使用按供应商配置的子密钥 CONDUIT_S2S_SECRET 对 X-Gateway-S2S 进行签名,并注入 Datto 标头:
await fetch("http://gateway:8080/mcp", {
method: "POST",
headers: {
"content-type": "application/json",
accept: "application/json, text/event-stream",
"x-gateway-s2s": xGatewayS2s,
"x-datto-bcdr-public-key": publicKey,
"x-datto-bcdr-private-key": privateKey,
},
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" }),
});
本地开发
npm install
npm run build
DATTO_BCDR_PUBLIC_KEY=... DATTO_BCDR_PRIVATE_KEY=... npm start
在设置 CONDUIT_S2S_SECRET 之前,HTTP 服务不会启动:
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http npm start
curl http://127.0.0.1:8080/health
未设置服务到服务密钥的本地 HTTP 仅限开发使用。它只绑定到 127.0.0.1,并会记录警告。若 MCP_HTTP_HOST 不是回环地址,启动将退出。容器镜像会设置 MCP_HTTP_HOST=0.0.0.0,因此使用镜像时,也必须通过 -e MCP_HTTP_HOST=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-bcdr-mcp .
docker run --rm \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
datto-bcdr-mcp
若未设置 CONDUIT_S2S_SECRET 或其值为空,Compose 将拒绝启动;它会设置 AUTH_MODE=gateway,发布 127.0.0.1:8080:8080,且不会注入 DATTO_BCDR_PUBLIC_KEY 或 DATTO_BCDR_PRIVATE_KEY:
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
单租户 HTTP(AUTH_MODE=env)仍需要 S2S 密钥,之后会使用 DATTO_BCDR_PUBLIC_KEY 和 DATTO_BCDR_PRIVATE_KEY:
docker run --rm \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-e AUTH_MODE=env \
-e DATTO_BCDR_PUBLIC_KEY=your-value \
-e DATTO_BCDR_PRIVATE_KEY=your-value \
-p 127.0.0.1:8080:8080 \
datto-bcdr-mcp
许可证
Apache-2.0
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。