Proxmox AIops
Disclaimer: This is a community-maintained open-source project and is not affiliated with, endorsed by, or sponsored by Proxmox Server Solutions GmbH. "Proxmox" is a trademark of its owner. Source code is publicly auditable at github.com/AIops-tools/Proxmox-AIops under the MIT license.
Governed VM and container lifecycle operations for Proxmox VE — 43 MCP tools, every one wrapped with the bundled @governed_tool harness: a local unified audit log under ~/.proxmox-aiops/, token/runaway budget guard, undo-token recording, and descriptive risk-tier labels.
Standalone: the governance harness is bundled in the package (proxmox_aiops.governance) — proxmox-aiops has no external skill-family dependency. Coverage focuses on common Proxmox operations and is not yet exhaustive.
What This Skill Does
| Category |
Tools |
Count |
Read or Write |
| VM Lifecycle |
list, get, config, start, stop, shutdown, reboot, reconfigure, clone, delete, migrate |
11 |
3 read / 8 write |
| Snapshots |
create, delete, list, rollback |
4 |
1 read / 3 write |
| Disk |
resize (grow-only), move |
2 |
0 read / 2 write |
| Backups (vzdump) |
create, list, restore |
3 |
1 read / 2 write |
| LXC Containers |
list, start, stop |
3 |
1 read / 2 write |
| Cluster / Tasks |
node list, cluster status, task poll, cluster resources, node status, task log, next vmid |
7 |
7 read |
| HA |
status, resource list |
2 |
2 read |
| Pools |
list, members |
2 |
2 read |
| Firewall |
vm rules, cluster status |
2 |
2 read |
| Guest Agent |
ping |
1 |
1 read |
| Storage |
list pools, list content |
2 |
2 read |
| Diagnostics / RCA |
node-pressure, guest-health |
2 |
2 read |
Quick Install
uv tool install proxmox-aiops
proxmox-aiops doctor
When to Use This Skill
- List/inspect Proxmox QEMU VMs and their config
- Power ops: start, hard-stop, graceful shutdown, reboot
- Reconfigure (cores/memory), clone, delete, or migrate a VM between nodes
- Grow a VM disk (grow-only — shrink is refused) or move it to another storage
- Create, list, and restore vzdump backups
- Create / delete / list / roll back VM snapshots
- Manage LXC containers (list, start, stop)
- Inspect cluster nodes, quorum, the
/cluster/resources inventory, node load/mem, and poll async tasks + fetch their logs by UPID; get a free VMID
- Check HA status / HA-managed resources (handles "HA not configured" gracefully)
- List resource pools and their members
- Inspect VM firewall rules and the cluster firewall enable state (read-only)
- Ping a VM's QEMU guest agent
- List storage pools and their content (ISOs, disk images, backups)
- Diagnose cluster health: rank nodes by CPU/memory/root-fs pressure, and scan VMs/containers for stopped guests, memory saturation, and disks near full — each finding cites the measured number and a concrete action (read-only RCA)
Do NOT use when the target is not Proxmox VE (other hypervisors, Kubernetes, or cloud providers are out of scope for this skill).
Common Workflows
Triage a "cluster feels slow" complaint (read-only)
proxmox-aiops diagnose node-pressure → worst-first table of nodes over the CPU/mem/disk thresholds, each row citing the measured % and the fix
proxmox-aiops diagnose guest-health → guests near their memory ceiling or with disks near full, plus the list of stopped guests
- Act on the top finding — e.g.
proxmox-aiops vm migrate <vmid> --to-node <n> to shed load off a hot node, or vm reconfigure <vmid> --memory ... for a RAM-starved guest. All of these route through the governed path (audited, undo recorded).
Snapshot, then reconfigure a VM
proxmox-aiops vm list → find the vmid and confirm it is the right VM/node
proxmox-aiops vm snapshot-create <vmid> --name pre-change → baseline before any risky change
proxmox-aiops vm reconfigure <vmid> --cores 8 --memory 16384 → the harness captures the prior cores/memory as the undo descriptor
- Failure branch: if the change goes wrong, the write recorded an
_undo_id — reverse it with proxmox-aiops undo apply <id>, or roll back with proxmox-aiops vm snapshot-rollback <vmid> --name pre-change.
Free a node that is out of memory
proxmox-aiops diagnose node-pressure → identify the node flagged high memory
proxmox-aiops cluster resources --type vm → find a movable guest on that node
proxmox-aiops vm migrate <vmid> --to-node <other> --dry-run → preview, then run without --dry-run (migrate is high risk; the inverse migrate-back is recorded)
- Re-run
diagnose node-pressure to confirm the pressure cleared.
Stop a VM safely
proxmox-aiops vm get <vmid> → confirm current status is running
proxmox-aiops vm stop <vmid> --dry-run → preview the exact API call
proxmox-aiops vm stop <vmid> → double confirmation required; vm_stop records an inverse vm_start undo descriptor
- Failure branch: if
doctor shows the node unreachable or the secret env var is missing, fix credentials with proxmox-aiops secret set <target> before retrying — the stop 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 (43 — 25 read, 18 write)
| Category |
Tools |
R/W |
| VM Lifecycle |
vm_list, vm_get, vm_config |
Read |
|
vm_start, vm_stop, vm_shutdown, vm_reboot, vm_reconfigure, vm_clone, vm_delete, vm_migrate |
Write |
| Snapshots |
vm_list_snapshots |
Read |
|
vm_snapshot_create, vm_snapshot_delete, vm_snapshot_rollback |
Write |
| Disk |
vm_resize_disk (grow-only), vm_move_disk |
Write |
| Backups |
backup_list |
Read |
|
vm_backup, backup_restore (high) |
Write |
| LXC Containers |
ct_list |
Read |
|
ct_start, ct_stop |
Write |
| Cluster / Tasks |
node_list, cluster_status, task_status, cluster_resources, node_status, task_log, next_vmid |
Read |
| HA |
ha_status, ha_resource_list |
Read |
| Pools |
pool_list, pool_members |
Read |
| Firewall |
vm_firewall_rules_list, cluster_firewall_status |
Read |
| Guest Agent |
vm_agent_ping |
Read |
| Storage |
storage_list, storage_content |
Read |
| Diagnostics / RCA |
node_pressure_rca, guest_health_rca |
Read |
| Undo |
undo_list |
Read |
|
undo_apply |
Write |
Harness features that light up: write tools with a clean inverse (vm_start/vm_stop/vm_shutdown/vm_reconfigure/vm_clone/vm_migrate/vm_snapshot_create/vm_move_disk/ct_start/ct_stop) pass an undo= lambda so the harness records an inverse descriptor (with _undo_id) to the undo store — vm_reconfigure captures the prior cores/memory, vm_clone's inverse is vm_delete(newid), vm_migrate's is migrate-back, vm_move_disk's is move-back to the captured source storage. backup_restore records a vm_delete inverse only when it restored into a free VMID (a forced overwrite is destructive and declares none). Irreversible writes (vm_delete, vm_snapshot_rollback, backup_restore with force) declare no undo and are tagged risk_level=high; vm_resize_disk is grow-only and refuses shrink before any API call. All 43 tools are audit-logged under ~/.proxmox-aiops/ and pass through the budget/runaway guard + risk-tier tagging. Proxmox writes are async (return a task UPID) — poll with task_status (and read lines with task_log) instead of re-issuing (the runaway breaker backs this up).
CLI Quick Reference
proxmox-aiops vm list [--target <t>] [--node <n>]
proxmox-aiops vm get <vmid> [--node <n>]
proxmox-aiops vm start <vmid> [--node <n>]
proxmox-aiops vm stop <vmid> [--dry-run] # double confirm
proxmox-aiops vm resize-disk <vmid> --disk scsi0 --size +10G # grow-only
proxmox-aiops vm move-disk <vmid> --disk scsi0 --storage ceph [--delete]
proxmox-aiops vm agent-ping <vmid>
proxmox-aiops vm snapshot-create <vmid> --name <snap>
proxmox-aiops vm snapshot-delete <vmid> --name <snap> [--dry-run] # double confirm
proxmox-aiops vm snapshot-list <vmid>
proxmox-aiops backup create <vmid> --storage <s> [--mode snapshot]
proxmox-aiops backup list <storage> [--vmid <id>]
proxmox-aiops backup restore <vmid> --archive <volid> --storage <s> [--force] [--dry-run] # double confirm
proxmox-aiops cluster resources [--type vm|node|storage]
proxmox-aiops cluster node-status <node>
proxmox-aiops cluster task-log <upid>
proxmox-aiops cluster next-vmid
proxmox-aiops ha status
proxmox-aiops pool list
proxmox-aiops firewall vm-rules <vmid>
proxmox-aiops storage list [--node <n>]
proxmox-aiops diagnose node-pressure # rank nodes by CPU/mem/disk pressure (read-only RCA)
proxmox-aiops diagnose guest-health # stopped guests, mem saturation, disks near full
proxmox-aiops undo apply <id> # reverse a recorded governed write
proxmox-aiops init # onboarding wizard (encrypted creds)
proxmox-aiops secret set <target> # manage encrypted secret store
proxmox-aiops doctor
proxmox-aiops mcp # start MCP server (stdio)
Credentials are managed by the proxmox-aiops init onboarding wizard and the
proxmox-aiops secret commands, which back an encrypted secret store (no
plaintext passwords in config.yaml).
Troubleshooting
"Config file not found"
Create ~/.proxmox-aiops/config.yaml with a targets: list (see README), and put secrets in ~/.proxmox-aiops/.env (chmod 600).
"Secret not found. Set environment variable: PROXMOX__SECRET"
Each target needs a per-target secret env var. For target pve-lab, set PROXMOX_PVE_LAB_SECRET=<token-uuid> in .env.
"Token auth requires user in the form 'user@realm!tokenid'"
For API-token auth (recommended, least privilege), user must include the token id after !, e.g. root@pam!claude. For password auth set auth_kind: password and use user@realm.
"No node specified and no default node configured"
Either pass --node <name> / node=<name>, or set node: on the target in config.yaml. VM operations can auto-locate a vmid across nodes, but storage listing needs an explicit node.
Audit & 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 account you connect it with —
use a Proxmox VE user or API token granted only read privileges (no VM./Datastore. write roles),
and writes then fail at the server. There is no read-only switch, policy file, or approval gate.
- Audit is the guarantee, and it is not bypassable. Every operation — MCP and CLI alike — is logged to
~/.proxmox-aiops/audit.db (relocatable via PROXMOX_AIOPS_HOME): params, result, status, duration, and the risk tier. The CLI writes the same row the MCP path does.
PROXMOX_AUDIT_APPROVED_BY / PROXMOX_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: the same call looped in a tight window trips a circuit breaker. Disable with
PROXMOX_RUNAWAY_MAX=0; optional hard ceilings via PROXMOX_MAX_TOOL_CALLS / PROXMOX_MAX_TOOL_SECONDS.
- Undo store records inverse descriptors for reversible writes (start/stop/shutdown/reconfigure/clone/migrate/snapshot-create, container start/stop).
- Writes support
--dry-run / dry_run=True and double confirmation at the CLI.
The harness is bundled in the package — no external dependency, no manual setup.
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/Proxmox-AIops — feature requests, contributions, and comments are all welcome.
License
MIT — github.com/AIops-tools/Proxmox-AIops
1---2name: proxmox-aiops3description: Use this skill whenever the user needs to manage VMs and containers on Proxmox VE — list/inspect/configure VMs, power and lifecycle (start/stop/shutdown/reboot/reconfigure/clone/delete/migrate), snapshots (create/delete/list/rollback), disk grow/move, vzdump backups (create/list/restore), LXC containers (list/start/stop), cluster/node status, cluster resource inventory, async task polling + logs, free-VMID lookup, HA status, resource pools, firewall inspection, guest-agent ping, and storage listing. Also use it to diagnose cluster health — rank nodes by CPU/memory/disk pressure and scan guests for saturation (read-only RCA). Always use this skill for "list proxmox vms", "start proxmox vm", "stop proxmox vm", "proxmox snapshot", "proxmox backup", "restore proxmox vm", "resize proxmox disk", "proxmox vm status", "migrate proxmox vm", "proxmox container", "proxmox ha", "proxmox pool", "proxmox firewall", "list proxmox storage", "proxmox node pressure", or "why is proxmox slow" when the context is explicitly Prox4license: MIT5---67# Proxmox AIops89> **Disclaimer**: This is a community-maintained open-source project and is **not affiliated with, endorsed by, or sponsored by Proxmox Server Solutions GmbH.** "Proxmox" is a trademark of its owner. Source code is publicly auditable at [github.com/AIops-tools/Proxmox-AIops](https://github.com/AIops-tools/Proxmox-AIops) under the MIT license.1011Governed VM and container lifecycle operations for Proxmox VE — **43 MCP tools**, every one wrapped with the bundled `@governed_tool` harness: a local unified audit log under `~/.proxmox-aiops/`, token/runaway budget guard, undo-token recording, and descriptive risk-tier labels.1213> **Standalone**: the governance harness is bundled in the package (`proxmox_aiops.governance`) — proxmox-aiops has no external skill-family dependency. Coverage focuses on common Proxmox operations and is not yet exhaustive.1415## What This Skill Does1617| Category | Tools | Count | Read or Write |18|----------|-------|:-----:|:-------------:|19| **VM Lifecycle** | list, get, config, start, stop, shutdown, reboot, reconfigure, clone, delete, migrate | 11 | 3 read / 8 write |20| **Snapshots** | create, delete, list, rollback | 4 | 1 read / 3 write |21| **Disk** | resize (grow-only), move | 2 | 0 read / 2 write |22| **Backups (vzdump)** | create, list, restore | 3 | 1 read / 2 write |23| **LXC Containers** | list, start, stop | 3 | 1 read / 2 write |24| **Cluster / Tasks** | node list, cluster status, task poll, cluster resources, node status, task log, next vmid | 7 | 7 read |25| **HA** | status, resource list | 2 | 2 read |26| **Pools** | list, members | 2 | 2 read |27| **Firewall** | vm rules, cluster status | 2 | 2 read |28| **Guest Agent** | ping | 1 | 1 read |29| **Storage** | list pools, list content | 2 | 2 read |30| **Diagnostics / RCA** | node-pressure, guest-health | 2 | 2 read |3132## Quick Install3334```bash35uv tool install proxmox-aiops36proxmox-aiops doctor37```3839## When to Use This Skill4041- List/inspect Proxmox QEMU VMs and their config42- Power ops: start, hard-stop, graceful shutdown, reboot43- Reconfigure (cores/memory), clone, delete, or migrate a VM between nodes44- Grow a VM disk (grow-only — shrink is refused) or move it to another storage45- Create, list, and restore vzdump backups46- Create / delete / list / roll back VM snapshots47- Manage LXC containers (list, start, stop)48- Inspect cluster nodes, quorum, the `/cluster/resources` inventory, node load/mem, and poll async tasks + fetch their logs by UPID; get a free VMID49- Check HA status / HA-managed resources (handles "HA not configured" gracefully)50- List resource pools and their members51- Inspect VM firewall rules and the cluster firewall enable state (read-only)52- Ping a VM's QEMU guest agent53- List storage pools and their content (ISOs, disk images, backups)54- **Diagnose** cluster health: rank nodes by CPU/memory/root-fs pressure, and scan VMs/containers for stopped guests, memory saturation, and disks near full — each finding cites the measured number and a concrete action (read-only RCA)5556**Do NOT use when** the target is not Proxmox VE (other hypervisors, Kubernetes, or cloud providers are out of scope for this skill).5758## Common Workflows5960### Triage a "cluster feels slow" complaint (read-only)61621. `proxmox-aiops diagnose node-pressure` → worst-first table of nodes over the CPU/mem/disk thresholds, each row citing the measured % and the fix632. `proxmox-aiops diagnose guest-health` → guests near their memory ceiling or with disks near full, plus the list of stopped guests643. Act on the top finding — e.g. `proxmox-aiops vm migrate <vmid> --to-node <n>` to shed load off a hot node, or `vm reconfigure <vmid> --memory ...` for a RAM-starved guest. All of these route through the governed path (audited, undo recorded).6566### Snapshot, then reconfigure a VM67681. `proxmox-aiops vm list` → find the vmid and confirm it is the right VM/node692. `proxmox-aiops vm snapshot-create <vmid> --name pre-change` → baseline before any risky change703. `proxmox-aiops vm reconfigure <vmid> --cores 8 --memory 16384` → the harness captures the prior cores/memory as the undo descriptor714. **Failure branch**: if the change goes wrong, the write recorded an `_undo_id` — reverse it with `proxmox-aiops undo apply <id>`, or roll back with `proxmox-aiops vm snapshot-rollback <vmid> --name pre-change`.7273### Free a node that is out of memory74751. `proxmox-aiops diagnose node-pressure` → identify the node flagged `high memory`762. `proxmox-aiops cluster resources --type vm` → find a movable guest on that node773. `proxmox-aiops vm migrate <vmid> --to-node <other> --dry-run` → preview, then run without `--dry-run` (migrate is `high` risk; the inverse migrate-back is recorded)784. Re-run `diagnose node-pressure` to confirm the pressure cleared.7980### Stop a VM safely81821. `proxmox-aiops vm get <vmid>` → confirm current status is `running`832. `proxmox-aiops vm stop <vmid> --dry-run` → preview the exact API call843. `proxmox-aiops vm stop <vmid>` → double confirmation required; `vm_stop` records an inverse `vm_start` undo descriptor854. **Failure branch**: if `doctor` shows the node unreachable or the secret env var is missing, fix credentials with `proxmox-aiops secret set <target>` before retrying — the stop is never issued against an unauthenticated session.8687## Usage Mode8889| Scenario | Recommended | Why |90|----------|:-----------:|-----|91| Local/small models | **CLI** | fewer tokens than MCP |92| Cloud models (Claude, GPT) | Either | MCP gives structured JSON I/O |93| Automated pipelines | **MCP** | type-safe parameters, audited |9495## MCP Tools (43 — 25 read, 18 write)9697| Category | Tools | R/W |98|----------|-------|:---:|99| VM Lifecycle | `vm_list`, `vm_get`, `vm_config` | Read |100| | `vm_start`, `vm_stop`, `vm_shutdown`, `vm_reboot`, `vm_reconfigure`, `vm_clone`, `vm_delete`, `vm_migrate` | Write |101| Snapshots | `vm_list_snapshots` | Read |102| | `vm_snapshot_create`, `vm_snapshot_delete`, `vm_snapshot_rollback` | Write |103| Disk | `vm_resize_disk` (grow-only), `vm_move_disk` | Write |104| Backups | `backup_list` | Read |105| | `vm_backup`, `backup_restore` (high) | Write |106| LXC Containers | `ct_list` | Read |107| | `ct_start`, `ct_stop` | Write |108| Cluster / Tasks | `node_list`, `cluster_status`, `task_status`, `cluster_resources`, `node_status`, `task_log`, `next_vmid` | Read |109| HA | `ha_status`, `ha_resource_list` | Read |110| Pools | `pool_list`, `pool_members` | Read |111| Firewall | `vm_firewall_rules_list`, `cluster_firewall_status` | Read |112| Guest Agent | `vm_agent_ping` | Read |113| Storage | `storage_list`, `storage_content` | Read |114| Diagnostics / RCA | `node_pressure_rca`, `guest_health_rca` | Read |115| Undo | `undo_list` | Read |116| | `undo_apply` | Write |117118**Harness features that light up**: write tools with a clean inverse (`vm_start`/`vm_stop`/`vm_shutdown`/`vm_reconfigure`/`vm_clone`/`vm_migrate`/`vm_snapshot_create`/`vm_move_disk`/`ct_start`/`ct_stop`) pass an `undo=` lambda so the harness records an inverse descriptor (with `_undo_id`) to the undo store — `vm_reconfigure` captures the prior cores/memory, `vm_clone`'s inverse is `vm_delete(newid)`, `vm_migrate`'s is migrate-back, `vm_move_disk`'s is move-back to the captured source storage. `backup_restore` records a `vm_delete` inverse **only** when it restored into a free VMID (a forced overwrite is destructive and declares none). Irreversible writes (`vm_delete`, `vm_snapshot_rollback`, `backup_restore` with `force`) declare no undo and are tagged `risk_level=high`; `vm_resize_disk` is grow-only and refuses shrink before any API call. All 43 tools are audit-logged under `~/.proxmox-aiops/` and pass through the budget/runaway guard + risk-tier tagging. Proxmox writes are async (return a task UPID) — poll with `task_status` (and read lines with `task_log`) instead of re-issuing (the runaway breaker backs this up).119120## CLI Quick Reference121122```bash123proxmox-aiops vm list [--target <t>] [--node <n>]124proxmox-aiops vm get <vmid> [--node <n>]125proxmox-aiops vm start <vmid> [--node <n>]126proxmox-aiops vm stop <vmid> [--dry-run] # double confirm127proxmox-aiops vm resize-disk <vmid> --disk scsi0 --size +10G # grow-only128proxmox-aiops vm move-disk <vmid> --disk scsi0 --storage ceph [--delete]129proxmox-aiops vm agent-ping <vmid>130proxmox-aiops vm snapshot-create <vmid> --name <snap>131proxmox-aiops vm snapshot-delete <vmid> --name <snap> [--dry-run] # double confirm132proxmox-aiops vm snapshot-list <vmid>133proxmox-aiops backup create <vmid> --storage <s> [--mode snapshot]134proxmox-aiops backup list <storage> [--vmid <id>]135proxmox-aiops backup restore <vmid> --archive <volid> --storage <s> [--force] [--dry-run] # double confirm136proxmox-aiops cluster resources [--type vm|node|storage]137proxmox-aiops cluster node-status <node>138proxmox-aiops cluster task-log <upid>139proxmox-aiops cluster next-vmid140proxmox-aiops ha status141proxmox-aiops pool list142proxmox-aiops firewall vm-rules <vmid>143proxmox-aiops storage list [--node <n>]144proxmox-aiops diagnose node-pressure # rank nodes by CPU/mem/disk pressure (read-only RCA)145proxmox-aiops diagnose guest-health # stopped guests, mem saturation, disks near full146proxmox-aiops undo apply <id> # reverse a recorded governed write147proxmox-aiops init # onboarding wizard (encrypted creds)148proxmox-aiops secret set <target> # manage encrypted secret store149proxmox-aiops doctor150proxmox-aiops mcp # start MCP server (stdio)151```152153> Credentials are managed by the `proxmox-aiops init` onboarding wizard and the154> `proxmox-aiops secret` commands, which back an encrypted secret store (no155> plaintext passwords in `config.yaml`).156157## Troubleshooting158159### "Config file not found"160Create `~/.proxmox-aiops/config.yaml` with a `targets:` list (see README), and put secrets in `~/.proxmox-aiops/.env` (chmod 600).161162### "Secret not found. Set environment variable: PROXMOX_<NAME>_SECRET"163Each target needs a per-target secret env var. For target `pve-lab`, set `PROXMOX_PVE_LAB_SECRET=<token-uuid>` in `.env`.164165### "Token auth requires user in the form 'user@realm!tokenid'"166For API-token auth (recommended, least privilege), `user` must include the token id after `!`, e.g. `root@pam!claude`. For password auth set `auth_kind: password` and use `user@realm`.167168### "No node specified and no default node configured"169Either pass `--node <name>` / `node=<name>`, or set `node:` on the target in `config.yaml`. VM operations can auto-locate a vmid across nodes, but storage listing needs an explicit node.170171## Audit & Safety172173The skill delivers reads and writes and records them; it does **not** decide whether a write is174permitted. That is your agent's judgement, or the permission of the account you connect it with —175use a Proxmox VE user or API token granted only read privileges (no VM.*/Datastore.* write roles),176and writes then fail at the server. There is no read-only switch, policy file, or approval gate.177178- **Audit is the guarantee, and it is not bypassable.** Every operation — MCP and CLI alike — is logged to `~/.proxmox-aiops/audit.db` (relocatable via `PROXMOX_AIOPS_HOME`): params, result, status, duration, and the risk tier. The CLI writes the same row the MCP path does.179- `PROXMOX_AUDIT_APPROVED_BY` / `PROXMOX_AUDIT_RATIONALE` are optional annotations recorded on the audit row (who/why); they are never required and never block.180- **Runaway guard** — a safety backstop, not authorization: the same call looped in a tight window trips a circuit breaker. Disable with `PROXMOX_RUNAWAY_MAX=0`; optional hard ceilings via `PROXMOX_MAX_TOOL_CALLS` / `PROXMOX_MAX_TOOL_SECONDS`.181- Undo store records inverse descriptors for reversible writes (start/stop/shutdown/reconfigure/clone/migrate/snapshot-create, container start/stop).182- Writes support `--dry-run` / `dry_run=True` and double confirmation at the CLI.183184The harness is bundled in the package — no external dependency, no manual setup.185186## Contributing & feature requests187188Coverage is intentionally focused. **Missing a device, action, or feature you need?** Open an issue or pull request at [github.com/AIops-tools/Proxmox-AIops](https://github.com/AIops-tools/Proxmox-AIops/issues) — feature requests, contributions, and comments are all welcome.189190## License191192MIT — [github.com/AIops-tools/Proxmox-AIops](https://github.com/AIops-tools/Proxmox-AIops)