Independent MCP server for Veeam Backup for Microsoft 365 (VB365): read-only review by default, plus an opt-in, confirm-gated, audited action/restore tier.
Strong foundation with 23 well-named tools following verb_noun convention (list_, get_, vb365_). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas present with type definitions and parameter descriptions. However, output schemas are not documented in the source code, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance or actionable error messages visible. Security is well-designed (confirm-gated writes, audit logging, no secrets in params), but this is implementation-level, not definition-level. Read-only tools dominate (17/23), which is appropriate for a backup system. Write tools (job_action, restore_item, generate_report) properly gate with two-call confirmation pattern.
Cross-check cloud immutability at the SOURCE: queries each Backblaze B2 / S3 bucket VB365 uses (Object Lock mode, retention window, versioning) and flags any mismatch vs what VB365 reports. Needs B2_*/S3_* creds; read-only.
Generate a protection/license/storage report and save it to TB_DOWNLOAD_DIR.
Start/stop/enable/disable one backup job (two-call confirm).
Trigger an on-demand directory resync for one organization.
Rescan a proxy or toggle its maintenance mode (two-call confirm).
Restore one mailbox/OneDrive/site/Teams item from a restore point (two-call confirm). Supports in-place restore, export-to-PST (mailbox only), or restore-to-alternate-location.
Output schemas not documented. LLMs cannot predict response structure for any tool. Responses from vb365_list_jobs, vb365_get_job, vb365_job_scope, etc. lack documented field names, types, and nesting. This forces LLMs to guess at response shape and breaks tool chaining.
No error handling guidance. Tools lack descriptions of failure modes, recovery steps, or actionable error messages. E.g., vb365_get_job does not document what happens if job_id is invalid or if the VB365 API is unreachable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Search for items (mailbox messages, OneDrive files, site documents, Teams messages) across restore points by keyword, sender, date range, or file type. Returns matching items + their restore points.
List the available VB365 REST resources + version (GET /<version>/). Good first call to confirm connectivity and discover endpoint names for this VB365 version.
Read-only GET against ANY VB365 REST resource under the API version base. Examples: path='Jobs', path='Organizations/<id>/Users'. GET only — cannot modify anything. Use vb365_api_root if unsure of resource names.
Full details for one backup job (schedule policy, scope, repository, last/next run).
Full configuration for one object storage / cloud repository by id. Read-only.
The selected + excluded items of a backup job (which users/groups/sites/teams it protects, and per-user mailbox/OneDrive/site facets). Read-only.
License information (edition, licensed users, expiry).
Recent job sessions / run results. Optionally filter to one job_id.
List backup jobs, including schedule policy and last status.
List object storage (cloud) repositories — Amazon S3, S3 Compatible (e.g. Backblaze B2), Azure Blob, Wasabi, IBM Cloud, Glacier. Queries the dedicated ObjectStorageRepositories resource AND object-storage-backed backup repos (v8).
List the backed-up Microsoft 365 organizations (tenants).
List backup proxies and their status.
List backup repositories (capacity, free space, retention, immutability).
List backup restore points (snapshots): time, job/org, workloads present, immutability-expiry, copy/archive flags. Read-only — feeds restore + trends.
VB365's view of an organization's objects. kind = users | groups | sites | teams. Read-only.
Gap analysis: compare VB365's protected scope (from job SelectedItems) against live M365 directory (via Graph API). Flags users/groups/sites/teams that exist in M365 but are NOT backed up, plus any that VB365 thinks it protects but no longer exist in M365. Requires GRAPH_* creds.
Read-only trend & anomaly analysis over job-session history: per-job success/failure drift (a job that 'succeeded' today but fails often), repo capacity-full projection, restore-test cadence per org, and RPO compliance. Surfaces issues a single latest-status check misses.
Parameter constraints not fully specified. Numeric parameters (limit, days, days_back, rpo_hours) lack min/max bounds. E.g., vb365_list_organizations accepts limit but does not document valid range (1 - 1000? 1 - 10000?). LLMs may pass invalid values.
Enum constraints missing for string parameters. vb365_org_inventory 'kind' parameter accepts 'users|groups|sites|teams' but is not declared as an enum in the schema. restore_item 'item_type' and 'restore_mode' similarly lack enum constraints. Free-form strings invite hallucinated values.
Tool chaining IDs not guaranteed in responses. vb365_list_jobs likely returns job_id, but this is not documented. If a downstream tool (job_action, vb365_get_job) requires job_id, the response must explicitly include it. Undocumented response fields break composition.