Disclaimer: This is a community-maintained open-source project and is not affiliated with, endorsed by, or sponsored by Veeam Software. "Veeam" is a trademark of its owner. Source code is publicly auditable at github.com/AIops-tools/Veeam-AIops under the MIT license.
Governed Veeam Backup & Replication operations — 27 MCP tools, every one wrapped with the bundled @governed_tool harness: a local unified audit log under ~/.veeam-aiops/, policy engine, token/runaway budget guard, undo-token recording, and descriptive risk tiers. Credentials are stored encrypted ( ~/.veeam-aiops/secrets.enc, Fernet + scrypt) — never plaintext on disk.
Standalone: the governance harness is bundled in the package (
veeam_aiops.governance) — veeam-aiops has no external skill-family dependency. Coverage focuses on common Veeam operations and is not yet exhaustive.
CategoryToolsCountRead or WriteOverviewhealth overview11 readDiagnostics / RCAjob-failure triage, repository capacity22 readBackup Jobslist, get, start, stop, retry, enable, disable72 read / 5 writeRestorelist restore points (opt. per backup), start VM restore21 read / 1 writeRepositorieslist, get (detail), state (capacity)33 readBackupslist stored backups, list backup objects, per-VM storage usage, storage ranking44 readInfrastructuremanaged servers, proxies22 readSessionslist, get, log, stop (poll/cancel async progress)43 read / 1 write
bash
uv tool install veeam-aiops
veeam-aiops init # interactive wizard: connection + encrypted password
veeam-aiops doctor
Or as an OpenClaw plugin, which installs this skill and its MCP server together:
bash
openclaw plugins install clawhub:@zw008/veeam-aiops
openclaw skills info veeam-aiops # expect: Visible to model: yes
Needs uvx on PATH: the MCP server is fetched with uv, pinned to this release.
Do NOT use when the target is not Veeam Backup & Replication (other backup products, hypervisor VM lifecycle, Kubernetes, or cloud providers are out of scope for this skill).
If the user wants…UseVeeam backup jobs / restore / repositoriesveeam-aiops (this skill)Hypervisor VM lifecycle (power, snapshot, migrate)a hypervisor ops skillContainer/cluster lifecyclea cluster ops skill
veeam-aiops diagnose job-failures --since-hours 24 → worst-first table of Failed/Warning sessions, each with the categorized cause (repository full / source unreachable / credential-VSS / retry exhaustion) and the cited failing log lineveeam-aiops diagnose repo-capacity → the flagged repo's measured free% and free bytesveeam-aiops job retry <job_id> to re-run only the failed objectsveeam-aiops session list → veeam-aiops session get <session_id> to confirm the retry completes — do not tight-loop session get (the runaway budget guard will trip it)veeam-aiops job list → find the job id and confirm lastResultveeam-aiops job start <job_id> → starts the job (records an inverse job_stop undo descriptor)veeam-aiops session list → find the running session; veeam-aiops session get <session_id> → check state / progressPercentsession get shows the session Failed, inspect result, then re-run job start after fixing the cause — do not loop session get rapidly (the runaway budget guard will trip a tight poll loop).veeam-aiops backup usage <vm-name> → per backup (primary job and each backup copy): repository, restore points, stored / full / incremental bytes, shared bytes, job retentionveeam-aiops backup ranking --limit 20 → which machines consume the most backup storage, largest first; raise --max-backups if backupsTruncated is true. On a large estate scope it ( --backup <job name> repeatable, --repository <name>) — a full scan can take tens of minutes; a SCOPED ranking is not an estate-wide oneveeam-aiops restore list-points → identify the correct restore point idveeam-aiops restore start --restore-point-id <id> --dry-run → preview the exact API call and the VM name + creation time the id resolves to — never approve a restore from a GUIDveeam-aiops restore start --restore-point-id <id> → double confirmation required; this is IRREVERSIBLE (overwrites/creates a VM) and records no undo token. Refused outright if the VM name matches the configured VBR host (an in-place overwrite of the backup server itself) — a name-based safety net, not a proof, so confirm the target yourselfdoctor shows the VBR server unreachable or the password env var is missing, fix ~/.veeam-aiops/.env (chmod 600) before retrying — the restore is never issued against an unauthenticated session.ScenarioRecommendedWhyLocal/small modelsCLIfewer tokens than MCPCloud models (Claude, GPT)EitherMCP gives structured JSON I/OAutomated pipelinesMCPtype-safe parameters, audited
CategoryToolsR/WOverviewoverviewReadDiagnostics / RCAjob_failure_rca, repository_capacity_rcaReadBackup Jobsjob_list, job_getReadjob_start, job_stop, job_retry, job_enable, job_disableWriteRestorerestore_list_pointsReadstart_vm_restoreWriteRepositoriesrepository_list, repository_get, repository_stateReadBackupsbackup_list, backup_object_list, backup_object_storage_usage, backup_storage_rankingReadInfrastructuremanaged_server_list, proxy_listReadSessionssession_list, session_get, session_logReadsession_stopWriteUndoundo_listReadundo_applyWrite
Harness features that light up: write tools with a clean inverse ( job_start ↔ job_stop, job_retry → job_stop, job_enable ↔ job_disable) pass an undo= lambda so the harness records an inverse descriptor (with _undo_id) to the undo store. The irreversible start_vm_restore and session_stop declare no undo; start_vm_restore is tagged risk_level=high. All 27 tools are audit-logged under ~/.veeam-aiops/ and pass through the budget/runaway guard, each row carrying a descriptive risk tier. Veeam jobs/restores run as async sessions — poll with session_get / session_log instead of re-issuing (the runaway breaker backs this up). Start any triage with overview (jobs by last result, repos near full, running sessions), then drill in with job_failure_rca (categorizes failing sessions with cited error substrings) and repository_capacity_rca (cited free%).
bash
veeam-aiops init # onboarding wizard (encrypted password)
veeam-aiops overview [--target <t>] # health summary
veeam-aiops diagnose job-failures [--target <t>] # RCA: triage failed job sessions
veeam-aiops diagnose repo-capacity [--target <t>] # RCA: repos low on free space
veeam-aiops job list [--target <t>]
veeam-aiops job get <job_id>
veeam-aiops job start <job_id>
veeam-aiops job stop <job_id> [--dry-run] # double confirm
veeam-aiops job retry <job_id>
veeam-aiops job enable <job_id>
veeam-aiops job disable <job_id>
veeam-aiops restore list-points [--backup-id <id>] [--limit 100]
veeam-aiops restore start --restore-point-id <id> [--dry-run] # double confirm
veeam-aiops repository list
veeam-aiops repository get <repository_id>
veeam-aiops repository state # capacity / free / used%
veeam-aiops session list [--limit 100]
veeam-aiops session get <session_id>
veeam-aiops session log <session_id>
veeam-aiops session stop <session_id> [--dry-run] # double confirm
veeam-aiops backup list
veeam-aiops backup objects <backup_id>
veeam-aiops infra servers
veeam-aiops infra proxies
veeam-aiops secret set <target> # store password encrypted
veeam-aiops secret list # names only
veeam-aiops secret migrate # import legacy plaintext .env
veeam-aiops secret rotate-password
veeam-aiops doctor
veeam-aiops mcp # start MCP server (stdio)
See references/cli-reference.md for the full command list.
Run veeam-aiops init to set up your first target (writes ~/.veeam-aiops/config.yaml and stores the password encrypted).
Add it to the encrypted store: veeam-aiops secret set <name> (prompts hidden), or run veeam-aiops init. For non-interactive use (MCP/CI), also export VEEAM_AIOPS_MASTER_PASSWORD so the store can be unlocked without a prompt.
The encrypted store ~/.veeam-aiops/secrets.enc is unlocked by VEEAM_AIOPS_MASTER_PASSWORD (or an interactive prompt). If you forgot it, delete secrets.enc and re-run veeam-aiops init. Rotate it with veeam-aiops secret rotate-password.
The username/password is wrong, or the account lacks a Veeam role. Veeam usernames are typically DOMAIN\\user or a local Windows account on the VBR server. Confirm the account can log in to the Veeam console.
The default REST API port is 9419 — confirm the Veeam Backup & Replication REST API service is running and the port is open. For self-signed certificates set verify_ssl: false on the target (lab only).
The job/session/restore-point id is stale. List the parent collection first ( job list, session list, restore list-points) to get a current id.
The skill delivers reads and writes and records them; it does not decide whether a write is permitted. That is your agent's judgement, or the permission of the Veeam account you connect it with (a read-only or restricted role on the VBR server — writes then fail at the server). There is no read-only switch, policy file, or approval gate.
~/.veeam-aiops/secrets.enc (Fernet/AES-128 + scrypt key derivation; chmod 600) — never plaintext on disk; the master password is never stored, only a per-store salt + ciphertext~/.veeam-aiops/audit.db (relocatable via VEEAM_AIOPS_HOME): params (secrets redacted), result, status, duration, and the risk tier. The CLI writes the same row the MCP path does.VEEAM_AUDIT_APPROVED_BY / VEEAM_AUDIT_RATIONALE are optional annotations recorded on the audit row (who/why); they are never required and never block.--dry-run / dry_run=True and double confirmation at the CLI; CLI writes execute through the same governed tools, so they are audited + undo-recorded.start_vm_restore and session_stop record none.The harness is bundled in the package — no external dependency, no manual setup. See references/setup-guide.md for security details.
Coverage is intentionally focused. Missing a device, action, or feature you need? Open an issue or pull request at github.com/AIops-tools/Veeam-AIops — feature requests, contributions, and comments are all welcome.