Skip to main content
Glama
veeemlab

Datto BCDR MCP Server

by veeemlab

Datto BCDR MCP Server

Release npm version npm downloads License: MIT Docker Publish

A Model Context Protocol server for Datto BCDR (SIRIS, ALTO, Cloud SIRIS/DBMA). It lets MCP-compatible AI clients (Claude Desktop, Claude Code, and others) answer backup questions across your whole fleet, such as "Which backups are broken?" or "How is customer X doing?", in a single tool call.

Read-only Datto BCDR MCP server that turns fleet-wide backup monitoring into one tool call.

Why this server?

Most Datto BCDR integrations wrap the REST API one endpoint at a time. The model then has to list every device, fetch every agent and compare timestamps itself, which is slow, burns context and breaks on rate limits. This server takes a different approach:

  • Aggregated tools, not just wrappers. The health check runs server-side across all devices and returns only the problems.

  • Root causes, not just symptoms. Besides stale snapshots it detects full local storage, an expiring Datto service period, paused agents, failed local verification and excluded volumes.

  • Context-friendly output. Trimmed fields, relative timestamps ("vor 30 h"), empty values removed.

  • Rate-limit safe. A sliding-window limiter keeps fleet scans under Datto's roughly 120 requests/minute per key, with a short GET cache and Retry-After handling.

  • Strictly read-only. The server only issues GET requests. There is nothing to confirm because nothing can be changed.

Related MCP server: proxmox-monitor

When to use this

Use this server when an MCP client should monitor Datto BCDR backups without hand-walking the API.

It is especially suited for:

  • daily backup checks ("what failed overnight?")

  • per-client status for monthly reports and QBRs

  • finding a protected server by hostname across all appliances

  • reviewing failed screenshot verifications, including the image

  • automated alerting (e.g. an n8n cron job that opens PSA tickets via the REST endpoint)

  • containerized MCP deployments

Features

  • 10 tools, 2 of them fleet-wide aggregations (health summary, client overview)

  • 11 health checks with per-call threshold overrides, ignore and criticalOnly

  • Screenshot verification images returned as MCP image content, so the model can see why a boot test failed

  • Flat tool schemas (string / number / boolean only), compatible with Copilot Studio and MCP hubs

  • Two transports: stdio (default, for desktop/CLI clients) and authenticated Streamable HTTP for remote/containerized use

  • REST endpoint /api/health-summary with stable dedupKeys for ticket deduplication

  • Field names verified against the live Datto BCDR API

Tools (10)

Tool

Description

get-backup-health-summary

Checks all devices and agents against thresholds and returns only findings

get-client-overview

Per-client rollup: devices, agents, critical/warning counts, traffic-light status

find-asset

Find a protected server/agent by hostname across the whole fleet

get-screenshot-failures

Agents whose screenshot verification failed in the last N days

get-screenshot

Latest screenshot verification image of an agent

list-alerts

Active alerts, per device or fleet-wide

list-active-restores

Running virtualizations / VM restores, per device or fleet-wide

list-devices

Fleet with model, client and online status

get-device

Device details incl. local storage usage in %, service period and warranty

list-device-assets

Agents/shares of a device with snapshot, offsite, screenshot and backup status

All tools are read-only. Tool descriptions and finding texts are in German.

Health checks

Code

Severity

Default

DEVICE_OFFLINE

critical

not seen for > 1 h

SNAPSHOT_STALE / SNAPSHOT_MISSING

critical

last snapshot > 24 h ago / none

BACKUP_FAILED

critical

last backup run failed (incl. error message)

LOCAL_STORAGE_HIGH

warning, critical from 95 %

≥ 85 % used

SERVICE_EXPIRING

warning, critical once expired

Datto service period ends within 30 days

LOCAL_VERIFICATION_FAILED

warning

backup succeeded but local verification failed

OFFSITE_STALE / OFFSITE_MISSING

warning

last offsite sync > 48 h ago / never (not for CLDSIRIS)

SCREENSHOT_FAILED / SCREENSHOT_STALE

warning

last attempt failed / older than 7 days

AGENT_PAUSED

warning

agent is paused (forgotten pauses after maintenance)

UNPROTECTED_VOLUMES

warning

volumes excluded from the backup (named)

DEVICE_API_ERROR

warning

assets of the device could not be fetched

Every threshold can be overridden per call. Use ignore (comma-separated codes) to hide specific checks and criticalOnly to return critical findings only. Archived agents are skipped, shares have no screenshot check. A paused agent is reported once as AGENT_PAUSED instead of its stale-snapshot symptoms.

Prerequisites

  • Node.js 20+

  • Datto BCDR API key pair: Partner Portal → Admin → Integrations → API Keys → Create API Key. Create it without a client or vendor restriction, otherwise the key only sees part of the fleet. Datto allows at most two API keys per organization.

Installation

1. Run via npx (recommended)

npx -y @veeemlab/datto-bcdr-mcp

2. Run from GitHub (bleeding edge)

npx -y github:veeemlab/datto-bcdr-mcp

3. Install globally

npm install -g @veeemlab/datto-bcdr-mcp
datto-bcdr-mcp

Configuration

MCP hubs (stdio)

Field

Value

Server type

STDIO

Command

npx

Arguments

-y @veeemlab/datto-bcdr-mcp@0.1.0

Environment

DATTO_BCDR_PUBLIC_KEY, DATTO_BCDR_SECRET_KEY

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "datto-bcdr": {
      "command": "npx",
      "args": ["-y", "@veeemlab/datto-bcdr-mcp"],
      "env": {
        "DATTO_BCDR_PUBLIC_KEY": "your-public-key",
        "DATTO_BCDR_SECRET_KEY": "your-secret-key"
      }
    }
  }
}

Claude Code

claude mcp add datto-bcdr --env DATTO_BCDR_PUBLIC_KEY=your-public-key --env DATTO_BCDR_SECRET_KEY=your-secret-key -- npx -y @veeemlab/datto-bcdr-mcp

MCP Inspector

npx @modelcontextprotocol/inspector npx -y @veeemlab/datto-bcdr-mcp

All tool schemas are flat. List parameters such as serials or ignore take comma-separated strings, e.g. "AGENT_PAUSED,SCREENSHOT_STALE".

Environment Variables

Variable

Required

Default

Description

DATTO_BCDR_PUBLIC_KEY

yes

Public key (Basic Auth username)

DATTO_BCDR_SECRET_KEY

yes

Secret key (Basic Auth password)

MCP_TRANSPORT

no

stdio

stdio or http

DATTO_BCDR_CONCURRENCY

no

5

Parallel requests during fleet scans

DATTO_BCDR_RATE_LIMIT_PER_MINUTE

no

100

Datto allows roughly 120/min per key

DATTO_BCDR_CACHE_TTL_SECONDS

no

60

GET cache TTL, 0 disables it

DATTO_BCDR_TIMEOUT_MS

no

30000

Timeout per request

DATTO_BCDR_BASE_URL

no

https://api.datto.com/v1/bcdr

MCP_AUTH_TOKEN

HTTP only

Bearer token for /mcp and /api. Always set it when the server is reachable from the network

HOST / PORT

HTTP only

127.0.0.1 / 3000

ALLOWED_HOSTS

HTTP only

Host header allowlist (DNS rebinding protection), e.g. mcp.example.com

Run with Docker

Images for linux/amd64 and linux/arm64 are published to GHCR on every release.

stdio (Claude Desktop/Code, MCP hubs):

docker run -i --rm -e DATTO_BCDR_PUBLIC_KEY=... -e DATTO_BCDR_SECRET_KEY=... ghcr.io/veeemlab/datto-bcdr-mcp:latest

HTTP (long-running service): use the included docker-compose.yml with a .env file containing the Datto keys and MCP_AUTH_TOKEN.

docker compose up -d

Without Docker: npm run start:http. In HTTP mode the server refuses to start without MCP_AUTH_TOKEN unless HOST is a loopback address.

Path

Purpose

POST /mcp

MCP Streamable HTTP (stateless), Authorization: Bearer $MCP_AUTH_TOKEN

GET /api/health-summary

Plain JSON health report, same parameters as query string (?criticalOnly=true&ignore=AGENT_PAUSED,SCREENSHOT_STALE)

GET /healthz

Liveness probe, no auth

curl -s localhost:3000/api/health-summary -H "Authorization: Bearer $MCP_AUTH_TOKEN" | jq .totals

Automation (e.g. n8n → PSA tickets)

GET /api/health-summary returns a dedupKey per finding (<serial>:<asset> or <serial>:_device). Before opening a ticket, the workflow looks for an open ticket with that key (e.g. in the title or a custom field) and only creates a new one if none exists.

Security

  • Read-only: the server only issues GET requests to the Datto API.

  • Credentials are read from environment variables only and never logged.

  • Screenshot images are only downloaded from https://*.datto.com / https://*.dattobackup.com, and API credentials are only sent to the API host.

  • In HTTP mode a bearer token is mandatory on non-loopback hosts. Use ALLOWED_HOSTS to pin the expected host name behind a reverse proxy.

Development

npm ci
cp .env.example .env   # add your keys
set -a; source .env; set +a
npm run smoke          # validates the key pair and prints the real field names of /device and /asset
npm run lint           # eslint
npm run format:check   # prettier
npm test               # vitest
npm run inspect        # MCP Inspector against dist/

Release

Releases are tag-driven. On a v* tag the workflows run lint, tests and build, publish to npm with provenance, create a GitHub release and push the Docker image to GHCR:

npm version patch && git push --follow-tags

License

MIT

Available Tools

10 tools
find-assetAgent flottenweit findenA
Read-onlyIdempotent

Sucht einen geschützten Server/Agent oder Share über Hostname/FQDN auf allen Geräten und liefert Gerät, Kunde und Backup-Status.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
hostnameYesTeilstring des Hostnamens oder FQDN
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds non-obvious behavior: it searches only 'geschützte' (protected) assets, implying unprotected devices are excluded, and it discloses what is returned (device, client, backup status) — both are useful context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the action, the search key and the scope before the return payload. Nothing is wasted, though the German title largely restates it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully states the returned fields (device, client, backup status), and annotations cover the safety profile. Gaps remain on result cardinality (multiple matches), pagination/limits, and the precise meaning of 'geschützt'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented, including that hostname is a substring match and includeHidden defaults to false. The description only echoes the hostname/FQDN lookup and the fleet-wide scope, adding no format or matching semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (search) plus the resource (protected server/agent/share), the lookup key (hostname/FQDN), the scope (all devices), and even the return payload (device, client, backup status). It is distinguishable from get-device (single) and list-device-assets, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the lookup key and fleet-wide scope, but there is no explicit when-to-use versus when-not, and no guidance on preferring list-devices/get-device or on what happens when the hostname matches multiple assets. Adequate but leaves routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-backup-health-summaryBackup Health Summary (Flotte)A
Read-onlyIdempotent

Prüft alle Geräte und Agents gegen Schwellwerte und gibt NUR Problemfälle zurück. Kritisch: Gerät offline, Snapshot zu alt/fehlend, letzter Backup-Lauf fehlgeschlagen, lokaler Speicher >= 95 %, Datto-Servicevertrag abgelaufen. Warnung: Offsite-Sync zu alt, Screenshot-Verification fehlgeschlagen/zu alt, lokale Verifikation fehlgeschlagen, lokaler Speicher über Schwellwert, Servicevertrag endet bald, Agent pausiert, Volumes nicht im Backup. Archivierte Agents werden übersprungen. Standard: Snapshot 24 h, Offsite 48 h, Screenshot 7 d, Offline 1 h, Speicher 85 %, Servicevertrag 30 d.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
ignoreNoKommagetrennte Befund-Codes, die ignoriert werden. Gültig: DEVICE_OFFLINE, DEVICE_API_ERROR, LOCAL_STORAGE_HIGH, SERVICE_EXPIRING, AGENT_PAUSED, UNPROTECTED_VOLUMES, SNAPSHOT_STALE, SNAPSHOT_MISSING, BACKUP_FAILED, LOCAL_VERIFICATION_FAILED, OFFSITE_STALE, OFFSITE_MISSING, SCREENSHOT_FAILED, SCREENSHOT_STALE
serialsNoNur diese Geräte prüfen, kommagetrennte Seriennummern
criticalOnlyNoNur kritische Befunde (keine Warnungen)
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)
deviceOfflineHoursNo
offsiteMaxAgeHoursNo
snapshotMaxAgeHoursNo
screenshotMaxAgeDaysNo
serviceExpiryWarnDaysNo
localStorageMaxPercentNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description is free to add substantive behavior: it returns ONLY problem cases, skips archived agents, splits findings into critical vs warning, and states the default thresholds. That is real operational context beyond the annotations, though it omits things like result format or performance/rate considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the critical conditions, the warning conditions, the skipping rule, and the defaults in a logical order. It is dense and long, but nearly every clause carries distinct information; only minor tightening would be possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by enumerating the finding categories and the 'only problem cases' behavior. Given 11 optional parameters and no required ones, plus the threshold defaults provided, an agent has enough to call it correctly, though it never describes how findings are grouped or returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low (45%), so the description must compensate, and it does: it supplies the defaults for snapshot (24 h), offsite (48 h), screenshot (7 d), offline (1 h), storage (85 %) and service contract (30 d), effectively documenting the six numeric parameters that have no schema description. This is exactly the parameter meaning the schema is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it checks all devices/agents against thresholds and returns only problem cases, then enumerates the exact critical and warning conditions. This is precise and self-contained, but it never names or contrasts with overlapping siblings such as get-screenshot-failures or list-alerts, so the agent must infer the boundary itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope ('alle Geräte', 'NUR Problemfälle') and by the list of conditions, which tells the agent when a device will surface. However, there is no explicit when-to-use vs when-not guidance and no alternative tool named, so selection against list-alerts or get-screenshot-failures is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-client-overviewBackup-Status pro KundeA
Read-onlyIdempotent

Rollup pro Kunde: Geräte (online/offline), geschützte Agents/Shares, Anzahl kritischer und Warn-Befunde, Ampelstatus. Gut für Monatsreports, QBRs und 'wie steht Kunde X da?'. Nutzt dieselben Schwellwerte wie get-backup-health-summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: it discloses what the rollup aggregates, that severity counts and a traffic-light status are computed, and that threshold semantics are inherited from get-backup-health-summary, which warns the agent that results will be consistent with that sibling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-formed sentences, front-loaded with the aggregation content and followed by intended-use cases and a threshold note. Dense but every clause carries information; slightly long enumeration keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must convey the return shape, and it does by enumerating the rollup fields. Combined with annotations covering the read-only/idempotent profile and full schema coverage on inputs, an agent has enough to call it correctly; only explicit precedence rules vs. get-backup-health-summary are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (client substring filter, includeHidden with its default) are already fully documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, which is the baseline 3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb-equivalent (Rollup) plus the exact resource (Kunde) and enumerates the returned facets: Geräte online/offline, geschützte Agents/Shares, kritische und Warn-Befunde, Ampelstatus. It also implicitly separates itself from the global sibling by noting it shares thresholds with get-backup-health-summary, so an agent can tell the per-client rollup apart from the portfolio-level summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Concrete use cases are named ('Monatsreports, QBRs, wie steht Kunde X da?'), which gives the agent a clear context for invocation. It references get-backup-health-summary, but only to note shared thresholds rather than to state explicitly when to prefer that sibling over this one, so the when-not guidance is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-deviceDatto-Gerät DetailsB
Read-onlyIdempotent

Details eines Geräts: Modell, Kunde, Online-Status, Speicherbelegung lokal/offsite, Region (CLDSIRIS), Garantie.

ParametersJSON Schema
NameRequiredDescriptionDefault
serialYesSeriennummer des Datto-Geräts (z. B. aus list-devices)

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful context about what data is returned (local/offsite storage, warranty, region), but says nothing about auth requirements, freshness of the online status, or error behavior for unknown serials.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence naming the resource first and the returned fields after. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does list the key fields, which is genuinely helpful. It is slightly incomplete in not explaining the 'CLDSIRIS' region notation or handling of invalid serials, but it is adequate for a single-record read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the sole parameter (serial) is documented in the schema with an example source. The description adds no additional meaning about the serial format or where it comes from, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (Gerät) and enumerates the specific fields returned (Modell, Kunde, Online-Status, Speicherbelegung, Region, Garantie), which is more informative than a bare 'get'. However, it never contrasts itself with siblings like list-devices or find-asset, so an agent has to infer that this is a single-record fetch by serial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given: nothing says this is the lookup for one device by serial, nor points to list-devices/find-asset as alternatives. The only hint ('z. B. aus list-devices') lives in the schema parameter description, not the tool description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-screenshotScreenshot-Verification anzeigenA
Read-onlyIdempotent

Lädt das letzte Screenshot-Verification-Bild eines Agents, damit du siehst, warum der Boot-Test fehlschlug (Bluescreen, Login-Fenster, Updates, Black Screen). Gibt das Bild plus Status zurück.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYesName/Hostname des Agents (Teilstring reicht, muss eindeutig sein)
serialYesSeriennummer des Datto-Geräts (z. B. aus list-devices)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value beyond that by noting it returns the *last* screenshot (latest only) and that the response includes the image plus status, which matters given no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences with the action first and the diagnostic rationale second. The parenthetical symptom list is slightly verbose but earns its place by helping the agent recognize the failure scenarios the image depicts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, two-parameter tool with full schema coverage and annotations, the description covers purpose, scope (latest image) and return content. The main remaining gap is disambiguation from get-screenshot-failures, which is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (serial, asset) are already documented in the schema, including the substring-matching hint. The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lädt) and resource (letztes Screenshot-Verification-Bild eines Agents) and explains the diagnostic intent (warum der Boot-Test fehlschlug). It is clear on its own, but it does not distinguish itself from the very close sibling get-screenshot-failures, which an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage context (diagnosing a failed boot test) and lists failure symptoms, but it never states when to use this tool versus get-screenshot-failures or the other diagnostic siblings. The routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-screenshot-failuresFehlgeschlagene Screenshot-VerificationsB
Read-onlyIdempotent

Agents, deren Screenshot-Verification in den letzten X Tagen fehlgeschlagen ist (letzter Versuch oder Backups im Zeitraum).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoZeitraum in Tagen (Standard: 7)
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, openWorld behavior. The description adds genuinely new semantics by defining what counts as 'failed' — the last attempt or backups within the period — which the annotations do not cover. It does not describe result volume or ordering, but the failure criterion is meaningful added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly-worded sentence with no filler, front-loading the result set before the qualifying definition. Efficient, though the parenthetical definition is somewhat dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only query tool with full schema coverage and no output schema, the description states the returned entity type and the failure criterion, which is close to adequate. It is silent on result shape, ordering, or pagination, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (days, client, includeHidden) are already documented in the schema. The description only references the 'letzten X Tagen' window and adds no syntax or format detail beyond it. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific result set — agents whose screenshot verification failed — which is clearly distinct from siblings like get-screenshot (retrieves a screenshot) or get-backup-health-summary. It is a noun phrase rather than a verb+resource statement, but the scope is unambiguous. No explicit sibling differentiation is provided.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives (e.g. list-alerts or get-backup-health-summary), and no prerequisites or exclusions. The agent must infer the invocation context entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-active-restoresLaufende VirtualisierungenA
Read-onlyIdempotent

Laufende VM-Restores/Virtualisierungen. Ohne Seriennummer wird die ganze Flotte geprüft und nur Geräte mit aktiven Restores zurückgegeben.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
serialNoSeriennummer des Datto-Geräts (z. B. aus list-devices)
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description adds real behavioral context beyond them: without a serial the entire fleet is scanned and only devices with active restores are returned, clarifying the filtering semantics of the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with what the tool returns before the scoping rule. No filler, though it is terse enough that it could say a bit more about the includeHidden/client interplay.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with fully documented parameters and no output schema, the description covers purpose, the serial-absent filtering rule, and result scope. It stops short of describing the shape of returned items or pagination, which is a minor gap given annotations already carry the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes further by explaining the default fleet-wide behavior when `serial` is omitted — meaning that is not captured by the schema itself. This adds genuine parameter-level value for the serial argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource — running VM restores/virtualizations ("Laufende VM-Restores/Virtualisierungen") — which is a distinct concept from sibling listings like list-devices or list-alerts. It is clear what the tool enumerates, though it does not explicitly name any sibling it is not, leaving differentiation implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the note that omitting the serial checks the whole fleet hints at the narrow-vs-broad query modes, but there is no explicit guidance on when to reach for this tool over alternatives such as get-backup-health-summary or list-devices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-alertsAktive AlertsA
Read-onlyIdempotent

Aktive (nicht geräumte) Alerts. Mit Seriennummer für ein Gerät, ohne Seriennummer flottenweit (nur Geräte mit Alerts).

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
serialNoSeriennummer des Datto-Geräts (z. B. aus list-devices)
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: only non-cleared alerts are returned, and the fleet-wide mode returns only devices that actually have alerts. It stops short of describing ordering or return shape, but the extra semantics are real.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the resource and scope before the parameter-conditional behavior. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers the resource scope and the serial/no-serial behavior sufficiently. It does not mention the client or includeHidden filters, but those are fully documented in the schema, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by clarifying what happens when serial is omitted (fleet-wide, devices with alerts only), which the schema's per-parameter text does not state. This adds genuine meaning for how the optional parameters interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb (list) and resource (alerts) scoped to active/not-cleared ones, which distinguishes it from siblings like list-devices or get-device. However, it does not explicitly differentiate itself from related alert/failure tools such as get-screenshot-failures, so sibling routing relies on inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the conditional behavior (with serial = one device, without = fleet-wide), which is useful context. But it gives no guidance on when to prefer this over sibling tools (e.g., get-screenshot-failures or get-backup-health-summary), so alternative-selection guidance is implied at best.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-device-assetsAgents/Shares eines GerätsA
Read-onlyIdempotent

Alle geschützten Agents und Shares eines Geräts mit letztem Snapshot, Offsite-Sync, Screenshot-Verification und letztem Backup-Status.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter: Teilstring des Asset-Namens
serialYesSeriennummer des Datto-Geräts (z. B. aus list-devices)

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description earns credit by disclosing what the call returns (last snapshot, offsite sync, screenshot verification, last backup status) — the only place that payload is described since there is no output schema. It omits auth requirements, pagination and scale caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that identifies the subject first and the returned fields after. Nothing is wasted, though the enumerated return fields make it slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description is the sole source of return-value information and it supplies it at a useful summary level; parameters are fully covered by the schema and safety by the annotations. Only minor gaps remain, such as result volume or pagination behavior for a device with many shares.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'serial' and the 'name' substring filter documented inline, so the baseline is 3. The description adds no extra meaning about the parameters (e.g. that 'serial' must come from list-devices), so it does not exceed the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource ('geschützte Agents und Shares eines Geräts') and enumerates the data returned (letzter Snapshot, Offsite-Sync, Screenshot-Verification, Backup-Status), which clearly separates it from list-devices or get-device. It does not explicitly name a sibling, but the resource+scope combination is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus get-device, list-devices, or find-asset. The only routing hint ('z. B. aus list-devices') lives in the schema, not the description, so the description itself offers no guidance or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-devicesDatto-Geräte auflistenA
Read-onlyIdempotent

Listet alle BCDR-Geräte (SIRIS, ALTO, CLDSIRIS) mit Kunde, Modell, Online-Status, Agent-/Share-Anzahl und offenen Alerts.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoFilter: Teilstring des Modells, z. B. 'CLDSIRIS', 'ALTO', 'S5'
clientNoFilter: Teilstring des Kunden- oder Gerätenamens
onlyOfflineNoNur Geräte, die seit über 1 h nicht gesehen wurden
includeHiddenNoAuch im Portal ausgeblendete Geräte einbeziehen (Standard: false)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so safety behavior is covered. The description adds the returned data fields, which is useful context beyond the annotations, but it does not describe pagination, freshness guarantees, authentication needs, or what 'offene Alerts' means operationally. With annotations carrying the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no wasted words. The main action and the key returned fields are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with complete parameter descriptions and safety annotations, the description is nearly complete: it explains the resource scope and the summary columns returned, compensating for the absence of an output schema. It is only held back by not mentioning filtering behavior or routing guidance relative to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four filter parameters with examples and defaults. The description adds no additional parameter semantics, and per the calibration baseline, 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Listet alle BCDR-Geräte') and enumerates the returned fields (Kunde, Modell, Online-Status, Agent-/Share-Anzahl, offene Alerts), so an agent can tell this is a summary-listing tool rather than a detail-getter or asset-list tool. It also names the supported device families (SIRIS, ALTO, CLDSIRIS), which sharpens scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool returns but gives no guidance on when to use it versus siblings such as get-device, find-asset, or list-device-assets. It also does not mention the available filters (model, client, onlyOffline, includeHidden) as usage conditions, so the agent must infer when this is the right call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observedfind-asset
    • First observedget-backup-health-summary
    • First observedget-client-overview
    • First observedget-device
    • First observedget-screenshot
    • First observedget-screenshot-failures
    • First observedlist-active-restores
    • First observedlist-alerts
    • First observedlist-device-assets
    • First observedlist-devices

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Most tools have clearly distinct scopes, but get-backup-health-summary, get-client-overview, get-screenshot-failures, and list-device-assets overlap around backup health and screenshot verification. The descriptions clarify fleet-wide problems vs client rollup vs per-device asset status, so confusion is limited but not impossible.

Naming Consistency5/5

All tool names use snake_case and consistently start with get, list, or find followed by a resource/action phrase. There are no mixed conventions such as camelCase or vague standalone verbs.

Tool Count5/5

Ten tools is well-scoped for a BCDR monitoring server, covering devices, assets, alerts, restores, health summaries, screenshots, and client overviews. Each tool appears to earn its place without obvious redundancy.

Completeness4/5

The read-only monitoring surface is strong, with device, asset, alert, restore, health, and screenshot views. Minor gaps exist for operational follow-up, such as alert acknowledgement/resolution, restore start/cancel, alert detail, and a client-list tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Read-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.
    5
    12 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides read-only Proxmox cluster oversight and configuration compliance checks through MCP, covering health, inventory, storage, backups, snapshots, and updates.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query Zabbix monitoring data through MCP, including host briefs and problem reports, with read-only access and whitelist controls.
    -