Veeam AIops
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 — 25 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.
What This Skill Does
| Category |
Tools |
Count |
Read or Write |
| Overview |
health overview |
1 |
1 read |
| Diagnostics / RCA |
job-failure triage, repository capacity |
2 |
2 read |
| Backup Jobs |
list, get, start, stop, retry, enable, disable |
7 |
2 read / 5 write |
| Restore |
list restore points (opt. per backup), start VM restore |
2 |
1 read / 1 write |
| Repositories |
list, get (detail), state (capacity) |
3 |
3 read |
| Backups |
list stored backups, list backup objects |
2 |
2 read |
| Infrastructure |
managed servers, proxies |
2 |
2 read |
| Sessions |
list, get, log, stop (poll/cancel async progress) |
4 |
3 read / 1 write |
Quick Install
uv tool install veeam-aiops
veeam-aiops init # interactive wizard: connection + encrypted password
veeam-aiops doctor
When to Use This Skill
- List/inspect Veeam backup jobs and their last result
- Start or stop a backup job on demand
- Enable or disable a job's schedule
- List available restore points and start a VM restore
- List backup repositories and stored backups
- Poll async sessions to follow job/restore progress
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).
Related Skills — Skill Routing
| If the user wants… |
Use |
| Veeam backup jobs / restore / repositories |
veeam-aiops (this skill) |
| Hypervisor VM lifecycle (power, snapshot, migrate) |
a hypervisor ops skill |
| Container/cluster lifecycle |
a cluster ops skill |
Common Workflows
Diagnose why last night's backups failed
veeam-aiops diagnose job-failures → 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 line
- If a finding says repository full, confirm with
veeam-aiops diagnose repo-capacity → the flagged repo's measured free% and free bytes
- Fix the root cause (extend/offload the repository, restore source connectivity, or repair guest credentials/VSS), then
veeam-aiops job retry <job_id> to re-run only the failed objects
veeam-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)
Run a backup job and follow it to completion
veeam-aiops job list → find the job id and confirm lastResult
veeam-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 / progressPercent
- Failure branch: if
session 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).
Restore a VM from a restore point
veeam-aiops restore list-points → identify the correct restore point id
veeam-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 GUID
veeam-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 yourself
- Failure branch: if
doctor 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.
Usage Mode
| Scenario |
Recommended |
Why |
| Local/small models |
CLI |
fewer tokens than MCP |
| Cloud models (Claude, GPT) |
Either |
MCP gives structured JSON I/O |
| Automated pipelines |
MCP |
type-safe parameters, audited |
MCP Tools (25 — 17 read, 8 write)
| Category |
Tools |
R/W |
| Overview |
overview |
Read |
| Diagnostics / RCA |
job_failure_rca, repository_capacity_rca |
Read |
| Backup Jobs |
job_list, job_get |
Read |
|
job_start, job_stop, job_retry, job_enable, job_disable |
Write |
| Restore |
restore_list_points |
Read |
|
start_vm_restore |
Write |
| Repositories |
repository_list, repository_get, repository_state |
Read |
| Backups |
backup_list, backup_object_list |
Read |
| Infrastructure |
managed_server_list, proxy_list |
Read |
| Sessions |
session_list, session_get, session_log |
Read |
|
session_stop |
Write |
| Undo |
undo_list |
Read |
|
undo_apply |
Write |
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 25 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%).
CLI Quick Reference
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>]
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
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.
Troubleshooting
"Config file not found"
Run veeam-aiops init to set up your first target (writes ~/.veeam-aiops/config.yaml and stores the password encrypted).
"No password for target ''"
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.
"Master password not set" / "Wrong master password"
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.
"Authentication/authorization failed (401)"
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.
"Could not reach Veeam server … check the host/port"
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).
"Resource not found (404)"
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.
Governance & Safety
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.
- Credentials stored encrypted in
~/.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
- Audit is the guarantee, and it is not bypassable. Every operation — MCP and CLI alike — is logged to
~/.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.
- Runaway guard — a safety backstop, not authorization: cumulative tool calls and wall-time are capped, and the same call looped in a tight session-poll/retry window trips a circuit breaker.
- Writes support
--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.
- Reversible writes (job start/stop/retry, enable/disable) record an inverse undo descriptor; the irreversible
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.
Contributing & feature requests
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.
License
MIT — github.com/AIops-tools/Veeam-AIops
1---2name: veeam-aiops3description: Use this skill whenever the user needs to operate Veeam Backup & Replication — a one-shot health overview, read-only diagnostics / RCA (triage failed backup-job sessions and flag repositories low on space), list/inspect/start/stop/retry backup jobs, enable/disable jobs, list restore points and start a VM restore, list backup repositories with capacity, list stored backups and their objects, inventory backup infrastructure (managed servers, proxies), and poll/stop async sessions for job/restore progress. Always use this skill for "list veeam jobs", "run veeam backup", "start veeam job", "veeam restore", "veeam repository", "veeam backup status", or "veeam session" when the context is explicitly Veeam / Veeam Backup & Replication / VBR. Do NOT use when the target is not Veeam Backup & Replication (other backup products, hypervisor lifecycle, or cloud providers are out of scope). Common Veeam B&R operations with a built-in governance harness (audit, policy, token budget, undo, risk-tiers).4license: MIT5---67# Veeam AIops89> **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](https://github.com/AIops-tools/Veeam-AIops) under the MIT license.1011Governed Veeam Backup & Replication operations — **25 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.1213> **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.1415## What This Skill Does1617| Category | Tools | Count | Read or Write |18|----------|-------|:-----:|:-------------:|19| **Overview** | health overview | 1 | 1 read |20| **Diagnostics / RCA** | job-failure triage, repository capacity | 2 | 2 read |21| **Backup Jobs** | list, get, start, stop, retry, enable, disable | 7 | 2 read / 5 write |22| **Restore** | list restore points (opt. per backup), start VM restore | 2 | 1 read / 1 write |23| **Repositories** | list, get (detail), state (capacity) | 3 | 3 read |24| **Backups** | list stored backups, list backup objects | 2 | 2 read |25| **Infrastructure** | managed servers, proxies | 2 | 2 read |26| **Sessions** | list, get, log, stop (poll/cancel async progress) | 4 | 3 read / 1 write |2728## Quick Install2930```bash31uv tool install veeam-aiops32veeam-aiops init # interactive wizard: connection + encrypted password33veeam-aiops doctor34```3536## When to Use This Skill3738- List/inspect Veeam backup jobs and their last result39- Start or stop a backup job on demand40- Enable or disable a job's schedule41- List available restore points and start a VM restore42- List backup repositories and stored backups43- Poll async sessions to follow job/restore progress4445**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).4647## Related Skills — Skill Routing4849| If the user wants… | Use |50|--------------------|-----|51| Veeam backup jobs / restore / repositories | **veeam-aiops** (this skill) |52| Hypervisor VM lifecycle (power, snapshot, migrate) | a hypervisor ops skill |53| Container/cluster lifecycle | a cluster ops skill |5455## Common Workflows5657### Diagnose why last night's backups failed58591. `veeam-aiops diagnose job-failures` → 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 line602. If a finding says **repository full**, confirm with `veeam-aiops diagnose repo-capacity` → the flagged repo's measured free% and free bytes613. Fix the root cause (extend/offload the repository, restore source connectivity, or repair guest credentials/VSS), then `veeam-aiops job retry <job_id>` to re-run only the failed objects624. `veeam-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)6364### Run a backup job and follow it to completion65661. `veeam-aiops job list` → find the job id and confirm `lastResult`672. `veeam-aiops job start <job_id>` → starts the job (records an inverse `job_stop` undo descriptor)683. `veeam-aiops session list` → find the running session; `veeam-aiops session get <session_id>` → check `state` / `progressPercent`694. **Failure branch**: if `session 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).7071### Restore a VM from a restore point72731. `veeam-aiops restore list-points` → identify the correct restore point id742. `veeam-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 GUID753. `veeam-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 yourself764. **Failure branch**: if `doctor` 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.7778## Usage Mode7980| Scenario | Recommended | Why |81|----------|:-----------:|-----|82| Local/small models | **CLI** | fewer tokens than MCP |83| Cloud models (Claude, GPT) | Either | MCP gives structured JSON I/O |84| Automated pipelines | **MCP** | type-safe parameters, audited |8586## MCP Tools (25 — 17 read, 8 write)8788| Category | Tools | R/W |89|----------|-------|:---:|90| Overview | `overview` | Read |91| Diagnostics / RCA | `job_failure_rca`, `repository_capacity_rca` | Read |92| Backup Jobs | `job_list`, `job_get` | Read |93| | `job_start`, `job_stop`, `job_retry`, `job_enable`, `job_disable` | Write |94| Restore | `restore_list_points` | Read |95| | `start_vm_restore` | Write |96| Repositories | `repository_list`, `repository_get`, `repository_state` | Read |97| Backups | `backup_list`, `backup_object_list` | Read |98| Infrastructure | `managed_server_list`, `proxy_list` | Read |99| Sessions | `session_list`, `session_get`, `session_log` | Read |100| | `session_stop` | Write |101| Undo | `undo_list` | Read |102| | `undo_apply` | Write |103104**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 25 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%).105106## CLI Quick Reference107108```bash109veeam-aiops init # onboarding wizard (encrypted password)110veeam-aiops overview [--target <t>] # health summary111veeam-aiops diagnose job-failures [--target <t>] # RCA: triage failed job sessions112veeam-aiops diagnose repo-capacity [--target <t>] # RCA: repos low on free space113veeam-aiops job list [--target <t>]114veeam-aiops job get <job_id>115veeam-aiops job start <job_id>116veeam-aiops job stop <job_id> [--dry-run] # double confirm117veeam-aiops job retry <job_id>118veeam-aiops job enable <job_id>119veeam-aiops job disable <job_id>120veeam-aiops restore list-points [--backup-id <id>]121veeam-aiops restore start --restore-point-id <id> [--dry-run] # double confirm122veeam-aiops repository list123veeam-aiops repository get <repository_id>124veeam-aiops repository state # capacity / free / used%125veeam-aiops session list126veeam-aiops session get <session_id>127veeam-aiops session log <session_id>128veeam-aiops session stop <session_id> [--dry-run] # double confirm129veeam-aiops backup list130veeam-aiops backup objects <backup_id>131veeam-aiops infra servers132veeam-aiops infra proxies133veeam-aiops secret set <target> # store password encrypted134veeam-aiops secret list # names only135veeam-aiops secret migrate # import legacy plaintext .env136veeam-aiops secret rotate-password137veeam-aiops doctor138veeam-aiops mcp # start MCP server (stdio)139```140141See `references/cli-reference.md` for the full command list.142143## Troubleshooting144145### "Config file not found"146Run `veeam-aiops init` to set up your first target (writes `~/.veeam-aiops/config.yaml` and stores the password encrypted).147148### "No password for target '<name>'"149Add 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.150151### "Master password not set" / "Wrong master password"152The 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`.153154### "Authentication/authorization failed (401)"155The 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.156157### "Could not reach Veeam server … check the host/port"158The 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).159160### "Resource not found (404)"161The job/session/restore-point id is stale. List the parent collection first (`job list`, `session list`, `restore list-points`) to get a current id.162163## Governance & Safety164165The skill delivers reads and writes and records them; it does **not** decide166whether a write is permitted. That is your agent's judgement, or the permission167of the Veeam account you connect it with (a read-only or restricted role on the168VBR server — writes then fail at the server). There is no read-only switch,169policy file, or approval gate.170171- Credentials stored **encrypted** in `~/.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 + ciphertext172- **Audit is the guarantee, and it is not bypassable.** Every operation — MCP and CLI alike — is logged to `~/.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.173- `VEEAM_AUDIT_APPROVED_BY` / `VEEAM_AUDIT_RATIONALE` are optional annotations recorded on the audit row (who/why); they are never required and never block.174- **Runaway guard** — a safety backstop, not authorization: cumulative tool calls and wall-time are capped, and the same call looped in a tight session-poll/retry window trips a circuit breaker.175- Writes support `--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.176- Reversible writes (job start/stop/retry, enable/disable) record an inverse undo descriptor; the irreversible `start_vm_restore` and `session_stop` record none.177178The harness is bundled in the package — no external dependency, no manual setup. See `references/setup-guide.md` for security details.179180## Contributing & feature requests181182Coverage is intentionally focused. **Missing a device, action, or feature you need?** Open an issue or pull request at [github.com/AIops-tools/Veeam-AIops](https://github.com/AIops-tools/Veeam-AIops/issues) — feature requests, contributions, and comments are all welcome.183184## License185186MIT — [github.com/AIops-tools/Veeam-AIops](https://github.com/AIops-tools/Veeam-AIops)