Acronis Cyber Protect Cloud

io.github.WYRE-AI由 GitHub 账号 WYRE-AI 发布v1.0.1更新于 Nov 7, 2026

Acronis Cyber Protect Cloud MCP: alerts, policies, resources, agents, tenants and EDR incidents.

概览

AI 生成的概览

以只读为主的 Acronis Cyber Protect Cloud MCP 接入:告警、EDR 事件、保护策略、资源、代理与租户。

可以做什么
  • 查询告警:列表、详情、计数器、分类、告警类型、按范围或客户分组、含最高严重度告警的资源
  • 查看保护策略与资源:策略、策略应用情况、问题统计、资源列表、资源保护状态
  • 查看代理与 EDR 事件:代理列表与详情、事件列表与详情、响应操作状态
  • 查询租户与用户:租户、子租户、租户用户、用户信息、MFA 状态、用量、搜索
  • 可选写入工具(默认关闭):将告警标记为误报、更新调查状态、执行保护策略
适用场景
适合让助手在不打开 Acronis 控制台的情况下排查备份与安全状况,例如查看活跃告警、EDR 事件、策略应用失败或未受保护的资源。也适合多租户服务商核对租户用量与 MFA 状态。
运行要求
以本地进程(stdio)或 HTTP 容器方式运行;本地使用需 Node.js 22 或更高版本。需要一个使用 client_credentials 的 Acronis API 客户端:ACRONIS_BASE_URL(https,主机名以 .acronis.com 结尾)、ACRONIS_CLIENT_ID 和 ACRONIS_CLIENT_SECRET。需要能通过 HTTPS 访问 Acronis 数据中心。HTTP 模式还需 CONDUIT_S2S_SECRET 与 X-Gateway-S2S 签名;网关模式从 X-Acronis-* 请求头获取凭据。
安装前请注意
ACRONIS_CLIENT_SECRET 是每次调用都会使用的特权凭据,上游子进程会在私有 HOME 下缓存访问令牌。写入工具仅在 ACRONIS_ENABLE_WRITES=true 时出现,届时可更改告警与调查状态或执行保护策略。创建/删除、定价与令牌类操作已被排除。网关模式下缺少 X-Acronis-* 请求头或 X-Gateway-S2S 签名无效的请求会被拒绝;切勿提交 CONDUIT_S2S_SECRET。

安装

在 SourceWeft 中

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

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

acronis-mcp

WYRE-AI hosted wrapper around the vendor's own MCP server for Acronis Cyber Protect Cloud (@acronis-platform/mcp, pinned to the exact version 1.0.1). The wrapper adds what the upstream server does not have:

  • a curated, tiered tool allowlist (34 read tools, 3 opt-in write tools out of upstream's 159),
  • per-tenant process isolation, hosted dual-era HTTP serving (2025-era initialize handshake and 2026-07-28 stateless envelope), and X-Gateway-S2S verification,
  • response sanitising (size cap, secret/token redaction, uniform error shape),
  • an SSRF guard on the Acronis base URL (WYREAI-454).

tools/list is static (generated at build time), so it works without credentials and without starting any child process. Only tools/call starts an upstream child.

Upstream pinning policy

@acronis-platform/mcp is pinned to an exact version in package.json (no ^/~; a test enforces 1.0.1). Bumps happen by pull request only. Renovate/Dependabot may propose one, but it must not auto-merge: a bump needs a human to

  1. diff the upstream tools/list against research/upstream-tools-1.0.1.json (new, renamed or duplicated tools),
  2. regenerate src/generated/tools.ts with npm run gen-tools,
  3. re-review research/tiers.json and the integration test.

Upstream 1.0.1 ships three duplicated tool names (device_authorization_approval, fetch_registration_tokens, create_registration_token); none are allowlisted, and the generator refuses any allowlisted name that is missing or duplicated upstream.

Why one child process per tenant

One upstream process holds one privileged client_credentials token and uses it for every caller. Sharing a process between tenants would let one tenant's request run with another tenant's token. So src/upstream-pool.ts spawns one child per distinct credential tuple (key = sha256(baseUrl, clientId, clientSecret); raw values are never logged) over stdio, using @modelcontextprotocol/client, and routes each call to its own tenant's child.

  • Child binary: require.resolve('@acronis-platform/mcp/package.json') → bin/cli.js, run with process.execPath.
  • Child environment is built from scratch (the parent env is not inherited, so CONDUIT_S2S_SECRET etc. cannot leak): PATH, NODE_ENV, API_BASE_URL, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, MCP_TRANSPORT=stdio, MCP_TOOLS_INCLUDE=<allowlist for enabled tiers>. (The MCP client SDK additionally adds its own non-secret defaults: HOME, LOGNAME, SHELL, TERM, USER.)
  • LRU limit ACRONIS_POOL_MAX (default 50), idle TTL ACRONIS_POOL_IDLE_MS (default 10 min), and every child is closed on shutdown. An evicted child that is mid-call is closed when the call ends.

Known upstream behaviours to be aware of:

  • Upstream 1.0.1 fetches an OAuth token eagerly at startup, so a child with bad credentials (or no route to the datacenter) exits immediately. The caller then gets an {error:{code:"upstream_unavailable",…}} result; the first call per tenant pays the token round trip.
  • Each tenant child runs with its own private, throwaway HOME (mkdtemp, mode 0700, removed when the child exits), so the upstream token cache below is never shared between tenants.
  • Upstream caches the access token on disk under ~/.mcp/token-cache (mode 0600, AES-256-GCM, keyed from the client secret).
  • Upstream registers an extra built-in tool, get_acronis_skill, that is not filtered by MCP_TOOLS_INCLUDE. The wrapper never lists or forwards it (the allowlist is enforced a second time in the call handler).

Tools

Tool names are acronis_ + the upstream name. A tool that is not in research/tiers.json is never listed and never callable. This is enforced twice: MCP_TOOLS_INCLUDE on the child, and an allowlist check in our tools/call handler.

  • read tools are always available (readOnlyHint: true).
  • write tools appear and work only when ACRONIS_ENABLE_WRITES=true (default false); annotated readOnlyHint: false, destructiveHint: false.

Input schemas are taken verbatim from upstream. Because 37 tools exceeds the fleet's ~25 flat-tool threshold, descriptions are cut to the first sentence (max 300 chars) with the [Account Management API 2]-style prefix removed. Tool definitions live in src/generated/tools.ts, produced by scripts/gen-tools.mjs (npm run gen-tools) from research/upstream-tools-1.0.1.json filtered by research/tiers.json.

tools/list payload size (JSON bytes):

SurfaceBefore (upstream, full)After (wrapper)
Upstream, all 159 tools298,320n/a (not exposed)
34 read tools70,34367,309
37 tools (reads + writes)75,82272,864

(Schemas dominate the payload and are kept from upstream, so description trimming saves ~5%.)

ToolTierUpstream API
acronis_fetch_tenantreadAccount Management API 2
acronis_fetch_tenants_batchreadAccount Management API 2
acronis_fetch_tenant_childrenreadAccount Management API 2
acronis_fetch_tenant_usersreadAccount Management API 2
acronis_fetch_users_batchreadAccount Management API 2
acronis_fetch_userreadAccount Management API 2
acronis_fetch_current_user_inforeadAccount Management API 2
acronis_searchreadAccount Management API 2
acronis_fetch_tenant_mfa_statusreadAccount Management API 2
acronis_fetch_tenant_usagesreadAccount Management API 2
acronis_fetch_all_alertsreadAlert Manager 1.0
acronis_fetch_alertreadAlert Manager 1.0
acronis_fetch_categoriesreadAlert Manager 1.0
acronis_fetch_alert_countersreadAlert Manager 1.0
acronis_fetch_alerts_grouped_by_scopereadAlert Manager 1.0
acronis_fetch_all_alert_typesreadAlert Manager 1.0
acronis_fetch_resources_with_top_severity_alertsreadAlert Manager 1.0
acronis_fetch_alert_counts_per_customerreadAlert Manager 1.0
acronis_fetch_alerts_grouped_per_customerreadAlert Manager 1.0
acronis_fetch_active_alert_countreadAlert Manager 1.0
acronis_fetch_policiesreadResource and Policy Management API v4
acronis_fetch_policyreadResource and Policy Management API v4
acronis_fetch_policy_applicationsreadResource and Policy Management API v4
acronis_fetch_applications_issue_statisticsreadResource and Policy Management API v4
acronis_fetch_application_statuses_by_policyreadResource and Policy Management API v4
acronis_fetch_resourcesreadResource and Policy Management API v4
acronis_fetch_resource_countreadResource and Policy Management API v4
acronis_fetch_resourcereadResource and Policy Management API v4
acronis_fetch_resource_protection_statusreadResource and Policy Management API v4
acronis_fetch_agentsreadAgent Management REST API 2
acronis_fetch_agentreadAgent Management REST API 2
acronis_fetch_incidentsreadEndpoint Detection and Response API 1.0
acronis_fetch_incidentreadEndpoint Detection and Response API 1.0
acronis_fetch_response_action_statusreadEndpoint Detection and Response API 1.0
acronis_mark_alert_as_false_positivewriteAlert Manager 1.0
acronis_update_investigation_statewriteEndpoint Detection and Response API 1.0
acronis_execute_protection_policywriteResource and Policy Management API v4

Excluded categories

Not exposed and not callable, whatever the environment:

  • tenant / user / API-client create and delete, and all other deletes
  • pricing, offering items, usage updates, editions (money)
  • tokens, one-time tokens (OTT), device authorization, IdP / OpenID configuration
  • registration tokens
  • branding
  • EDR initiate_response_action
  • everything else not named in research/tiers.json

Response sanitising

Every upstream result passes through src/sanitize.ts: text is capped at 100 KB with a truncation marker; values under keys matching secret|password|token|access_token|refresh_token|api[_-]?key|authorization|client_secret are redacted in JSON; Bearer tokens and JWT-looking strings are redacted anywhere; non-text blocks are dropped. Errors reach the caller as {"error":{"code","message"}} with the message capped at 500 chars and the tenant's credentials scrubbed.

Credentials

Copy .env.example. Leave CONDUIT_S2S_SECRET empty in that file.

  • Local / stdio (Claude Desktop, CLI): set ACRONIS_BASE_URL, ACRONIS_CLIENT_ID, ACRONIS_CLIENT_SECRET (an Acronis API client with client_credentials). stdio does not use CONDUIT_S2S_SECRET.
  • Hosted / gateway (AUTH_MODE=gateway): credentials arrive per request and never fall back to the environment.
Gateway headerMeaning
X-Acronis-Base-UrlDatacenter URL, e.g. https://us5-cloud.acronis.com
X-Acronis-Client-IdAPI client ID
X-Acronis-Client-SecretAPI client secret

Base URL validation (SSRF guard): https only, hostname must end with .acronis.com, no userinfo, no non-default port, no path/query/fragment. Anything else is rejected (401 in gateway mode, no child spawned).

Environment variables

VariableRequiredDescription
ACRONIS_BASE_URLstdio and AUTH_MODE=envAcronis datacenter URL (see validation above)
ACRONIS_CLIENT_IDstdio and AUTH_MODE=envAPI client ID
ACRONIS_CLIENT_SECRETstdio and AUTH_MODE=envAPI client secret
ACRONIS_ENABLE_WRITESNotrue exposes the 3 write tools. Default false.
ACRONIS_POOL_MAXNoMax concurrent upstream children (LRU). Default 50.
ACRONIS_POOL_IDLE_MSNoIdle time before a child is closed. Default 600000 (10 min).
MCP_TRANSPORTNostdio (default) or http
AUTH_MODENogateway (Docker image and Compose default) or env. env uses ACRONIS_* 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. Compose will not start without it. Never commit a real value. Generate one with openssl rand -hex 32.
MCP_ALLOW_INSECURE_DEVNoSet to 1 only for local development to start HTTP without CONDUIT_S2S_SECRET. The process logs a warning, does not enforce X-Gateway-S2S, and binds 127.0.0.1 only. A placeholder secret is still refused.
MCP_HTTP_HOSTNoBind address when a real CONDUIT_S2S_SECRET is set. Defaults to 127.0.0.1. The container image sets 0.0.0.0.
MCP_HTTP_PORTNoHTTP port. Defaults to 8080.
LOG_LEVELNodebug, info (default), warn, error

/health and /healthz stay unauthenticated and do not read credentials.

X-Gateway-S2S signing

With MCP_TRANSPORT=http and CONDUIT_S2S_SECRET set, every /mcp request must include X-Gateway-S2S:

X-Gateway-S2S: t=<unix seconds>,v1=<hex hmac-sha256>

v1 is HMAC-SHA256 over the ASCII message t=<unix seconds>, keyed with CONDUIT_S2S_SECRET, hex-encoded. The timestamp must be within 300 seconds of the server clock. A missing or invalid header returns 401. The secret is never logged.

In AUTH_MODE=gateway, /mcp also requires the three X-Acronis-* headers. A request missing any of them (or carrying an invalid base URL) returns 401 and does not fall back to ACRONIS_*.

Run locally (stdio)

Requires Node >= 22.

bash
npm installnpm run buildACRONIS_BASE_URL=https://us5-cloud.acronis.com \ACRONIS_CLIENT_ID=... ACRONIS_CLIENT_SECRET=... npm start

Run as HTTP (gateway / hosted)

bash
CONDUIT_S2S_SECRET="$(openssl rand -hex 32)" MCP_TRANSPORT=http AUTH_MODE=env \ACRONIS_BASE_URL=https://us5-cloud.acronis.com ACRONIS_CLIENT_ID=... ACRONIS_CLIENT_SECRET=... npm start# → http://127.0.0.1:8080/mcp, health at http://127.0.0.1:8080/health

Local HTTP without a secret is development-only. It binds 127.0.0.1 and logs a warning:

bash
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start

Docker

The image (node:26-alpine, runs as user acronis) listens on 0.0.0.0 inside the container and defaults to AUTH_MODE=gateway. No registry auth or build secret is needed. The container needs outbound HTTPS to the Acronis datacenters.

bash
docker build --platform linux/amd64 -t acronis-mcp .docker run -e CONDUIT_S2S_SECRET="$(openssl rand -hex 32)" -p 127.0.0.1:8080:8080 acronis-mcp

Compose refuses to start when CONDUIT_S2S_SECRET is unset and does not inject ACRONIS_*:

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

Development

bash
npm installnpm run lint && npm run typecheck && npm test && npm run buildnpm run smoke        # dual-era HTTP smoke test (after build)npm run gen-tools    # regenerate src/generated/tools.ts

The integration test spawns the real pinned package. Upstream 1.0.1 needs a token endpoint before it answers tools/list, so the test points OAUTH_TOKEN_URL (and a temp HOME) at a local fake while keeping API_BASE_URL=https://example.acronis.com and dummy credentials.

License

Apache-2.0

来源:README.md,提交 c07e384

工具

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

版本历史

1
  1. v1.0.1最新Nov 7, 2026

评分

已满足适用检查项的 40%

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

  • 近 30 天内可连通25 分

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

  • 已声明认证方式10 分

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

  • 已列出工具15 分

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

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

    请在仓库或注册中心条目中声明许可证。