Datto BCDR

io.github.wyre-technology由 GitHub 账号 wyre-technology 发布v1.1.4更新于 Oct 24, 2026

MCP server for Datto BCDR — appliances, agents, recovery points, screenshots, alerts.

概览

AI 生成的概览

面向 Datto BCDR 备份门户的只读 MCP 服务器,让助手查看设备、受保护代理、恢复点、截图验证和告警。

可以做什么
  • 列出并查看 SIRIS/Alto 设备及其按序列号的详细信息
  • 列出设备上的受保护代理并获取单个代理
  • 列出代理的恢复点和截图验证,并获取截图图像
  • 查看设备的异地同步状态
  • 按日期范围列出门户告警和活动日志
  • 在缺少日期范围或序列号等筛选条件时提示用户补充
适用场景
适合托管服务提供商或备份管理员让助手查询 Datto BCDR 备份状况:有哪些设备、代理是否受保护、最近恢复点时间、异地同步是否正常以及有哪些未处理告警。
运行要求
以本地 stdio 进程运行(Docker 镜像或 npm 构建)。需要 Datto BCDR 合作伙伴门户 API 凭据,即 DATTO_BCDR_PUBLIC_KEY 和 DATTO_BCDR_PRIVATE_KEY,可选 DATTO_BCDR_REGION(us 或 eu)。HTTP 模式还需 CONDUIT_S2S_SECRET 和 X-Gateway-S2S 请求头;网关模式从 X-Datto-BCDR-Public-Key 和 X-Datto-BCDR-Private-Key 请求头读取凭据。
安装前请注意
需要合作伙伴门户的公钥和私钥对,可访问备份门户数据,应避免写入日志或提交到代码仓库。HTTP 部署必须设置 CONDUIT_S2S_SECRET,不安全的开发绕过仅限本机回环地址使用。所列工具只读取数据,但截图和设备详情来自第三方厂商 API。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Datto BCDR,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Datto BCDR MCP Server

[Release] [License: Apache 2.0]

Model Context Protocol (MCP) server for the Datto BCDR (Backup Portal) API. Exposes SIRIS / Alto appliances, protected agents, recovery points, screenshot verifications, off-site sync status, alerts, and activity logs to AI assistants.

Tools

ToolDescription
datto_bcdr_list_devicesList all SIRIS/Alto appliances in the partner portal
datto_bcdr_get_deviceGet appliance details by serialNumber (renders as an interactive card in MCP Apps hosts)
datto_bcdr_list_assetsList protected agents on an appliance
datto_bcdr_get_assetGet a specific protected agent
datto_bcdr_list_backupsList recovery points for an agent
datto_bcdr_list_screenshotsList screenshot verifications for an agent
datto_bcdr_get_screenshotFetch a screenshot PNG (returned as base64 image content)
datto_bcdr_get_offsite_statusOff-site sync status for an appliance
datto_bcdr_list_alertsPortal alerts (date-range filtered)
datto_bcdr_list_activityActivity log (date-range filtered)

When the user omits required filters (date range, serial number, etc.) the server uses MCP elicitation to prompt for them.

Features

  • Interactive Device Card (MCP Apps, SEP-1865): datto_bcdr_get_device renders as a read-only interactive card in MCP Apps hosts (Claude Desktop/web) showing the appliance's backup status at a glance — neutral by default, brandable via window.__BRAND__ injection or MCP_BRAND_* env vars; plain-JSON behavior is unchanged in other hosts. Edit ui/ and run npm run build:ui to regenerate the embedded card bundle.

Configuration

Copy .env.example and set the variables below. The stdio transport reads DATTO_BCDR_* and is not affected by HTTP service-to-service auth.

VariableRequiredDescription
DATTO_BCDR_PUBLIC_KEYFor stdio and AUTH_MODE=envDatto BCDR partner portal public key
DATTO_BCDR_PRIVATE_KEYFor stdio and AUTH_MODE=envDatto BCDR partner portal private key (secret)
DATTO_BCDR_REGIONNous (default) or eu
MCP_TRANSPORTNostdio (default) or http
AUTH_MODENogateway (Docker image and Compose default) or env. Gateway mode requires X-Datto-BCDR-Public-Key and X-Datto-BCDR-Private-Key on each /mcp request and never falls back to DATTO_BCDR_*. env uses those variables only after S2S auth succeeds.
CONDUIT_S2S_SECRETYes for HTTPService-to-service secret. The HTTP server logs an error and exits non-zero when this is empty or a known placeholder (replace-with-a-real-secret, your-s2s-secret, your-secret, changeme, change-me, placeholder, secret, example, replace-me, s2s-secret). Compose will not start without it. Never commit a real value. Generate one with openssl rand -hex 32. The value is never logged.
MCP_ALLOW_INSECURE_DEVNoSet to exactly 1 only for local development to start HTTP without CONDUIT_S2S_SECRET. The process logs a warning and does not enforce X-Gateway-S2S. The listener is forced to 127.0.0.1. A non-loopback MCP_HTTP_HOST (including 0.0.0.0) refuses to start. A known placeholder secret still refuses to start.
MCP_HTTP_HOSTNoBind address when MCP_TRANSPORT=http. Defaults to 127.0.0.1. A configured CONDUIT_S2S_SECRET honors this value. The container image sets 0.0.0.0.
MCP_HTTP_PORTNoHTTP port. Defaults to 8080.

/health stays unauthenticated and does not read credentials.

HTTP authentication

With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include X-Gateway-S2S. A missing or invalid header returns 401 before vendor credentials are read.

The header value is t=<unix seconds>,v1=<hex hmac-sha256>. The signed message is the ASCII string t=<unix seconds> (the same timestamp prefix), and the HMAC key is CONDUIT_S2S_SECRET. Timestamps more than 300 seconds from the server clock are rejected.

js
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}`;

In AUTH_MODE=gateway, /mcp also requires X-Datto-BCDR-Public-Key and X-Datto-BCDR-Private-Key (X-Datto-BCDR-Region is optional). Those headers are the only credential source for that request. A request missing either key returns 401 and does not fall back to DATTO_BCDR_PUBLIC_KEY / DATTO_BCDR_PRIVATE_KEY. Each request creates a fresh server instance with isolated credentials.

The WYRE MCP Gateway signs X-Gateway-S2S with the per-vendor subkey provisioned as CONDUIT_S2S_SECRET and injects the Datto headers:

js
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" }),});

Local development

bash
npm installnpm run buildDATTO_BCDR_PUBLIC_KEY=... DATTO_BCDR_PRIVATE_KEY=... npm start

HTTP refuses to start until CONDUIT_S2S_SECRET is set:

bash
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http npm startcurl http://127.0.0.1:8080/health

Local HTTP without a service-to-service secret is development-only. It binds 127.0.0.1 only and logs a warning. A non-loopback MCP_HTTP_HOST makes startup exit. The container image sets MCP_HTTP_HOST=0.0.0.0, so this bypass also needs -e MCP_HTTP_HOST=127.0.0.1 when using the image:

bash
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start

Docker

The image listens on 0.0.0.0 inside the container (MCP_HTTP_HOST) and defaults to AUTH_MODE=gateway. Publish the port on loopback and pass the S2S secret. In gateway mode, Datto credentials arrive on each request as headers; they are not read from the environment.

bash
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

Compose refuses to start when CONDUIT_S2S_SECRET is unset or empty, sets AUTH_MODE=gateway, publishes 127.0.0.1:8080:8080, and does not inject DATTO_BCDR_PUBLIC_KEY or DATTO_BCDR_PRIVATE_KEY:

bash
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up

Single-tenant HTTP (AUTH_MODE=env) still requires the S2S secret, then uses DATTO_BCDR_PUBLIC_KEY and DATTO_BCDR_PRIVATE_KEY:

bash
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

License

Apache-2.0

来源:README.md,提交 c0e0580

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

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

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分