Skip to main content
Glama

Nutanix AIops

Audit availability: Real writes require a committed pending audit row and stop before contacting the platform if storage is unavailable. Reads and previews may continue with a warning; new audit rows store outcome summaries rather than full responses.

Disclaimer: Community-maintained open-source project. Not affiliated with, endorsed by, or sponsored by Nutanix. Product and trademark names belong to their owners. MIT licensed.

Governed AI-ops for Nutanix Prism Central (v4 REST API) — clusters, hosts, VMs (AHV + ESXi), storage, network, catalog, data protection / DR, alerts, LCM upgrades, and capacity — with a built-in governance harness: unified audit log, token/runaway budget guard, undo-token recording, and descriptive risk-tier labels. Connects to Prism Central on HTTPS :9440 with HTTP Basic auth (username + encrypted password). Self-contained: no dependencies beyond httpx and the MCP SDK.

Why this over a read-only Nutanix MCP

  • Automatic ETag / If-Match on every mutation. The v4 API rejects an update or delete without the entity's current ETag — the classic footgun. This tool fetches and sends If-Match for you.

  • Automatic pagination — list tools walk every v4 page for you, and return a {"<items>": [...], "returned", "limit", "truncated"} envelope so a capped read announces itself instead of looking like the whole estate.

  • Absent is not empty — a field Prism Central did not return comes back as null, never as "". v4 omits a lot of fields; the two facts stay distinct.

  • Mixed-hypervisor VM listing — vm_list returns both AHV and ESXi guests under the same Prism Central (built for hypervisor-migration estates).

  • Governance harness — audit / token+call budget / descriptive risk-tier labels / undo-token / prompt-injection sanitize, with dry-run + double-confirm on destructive writes.

Related MCP server: nutanix-mcp

What this tool does, and does not, decide

It delivers Nutanix Prism Central operations — reads and writes — accurately and efficiently, and records every one of them. It does not decide whether a write is allowed to happen. That is the agent's judgement, or the permission of the account you connect it with: connect with a Prism Central account holding only a read-only (Viewer) role, and the writes fail at the server — the place that actually owns the permission.

So there is no read-only switch, no policy file, no approval gate to configure. The one thing the tool guarantees is that nothing is silent: every call, over MCP and over the CLI alike, lands an audit row in ~/.nutanix-aiops/audit.db, and destructive writes still capture their before-state and record an inverse where one exists.

Each tool declares a risk_level, carried into the audit row as a descriptive tier (none/confirm/review) — so a reviewer can see at a glance that a row was a high-risk delete. It is a label, not a gate.

Running a smaller / local model? See agent-guardrails.md — it lists the guardrails this tool now enforces for you (so you don't spend prompt budget restating them) and gives a ready-made system prompt for what's left.

Capability matrix (51 MCP tools)

Group

Tools

Count

R/W

Clusters

cluster_list, cluster_health, host_list, cluster_utilization

4

4 read

VMs

vm_list, vm_get, vm_power_on, vm_guest_shutdown, vm_power_off, vm_reboot, vm_create, vm_update, vm_clone, vm_delete, vm_migrate

11

2 read · 9 write

Storage

storage_container_list / _create / _update / _delete

4

1 read · 3 write

Network

subnet_list, subnet_get, subnet_create, subnet_delete

4

2 read · 2 write

Catalog

image_list, image_delete, category_list, category_create, category_assign

5

2 read · 3 write

Data protection / DR

snapshot_list / _create / _delete / _restore, recovery_point_list, protection_domain_list, vm_protect, pd_failover

8

3 read · 5 write

Alerts

alert_list, event_list, audit_list, analyze_alert (RCA), alert_acknowledge, alert_resolve

6

4 read · 2 write

LCM (upgrades)

lcm_inventory, lcm_precheck, lcm_update

3

1 read · 2 write

Capacity

task_list, capacity_runway

2

2 read

Diagnostics / RCA

cluster_health_rca, alert_triage_rca

2

2 read

Undo

undo_list, undo_apply

2

1 read · 1 write

Total

51

24 read · 27 write

Diagnostics / RCA are the flagship reads. cluster_health_rca ranks the whole estate — degraded fault-tolerance state, storage pools and containers over 80% (warning) / 90% (critical), nodes not healthy or missing from inventory — worst-first, each finding citing the measured percentage or raw Prism state that tripped it. alert_triage_rca groups active alerts by severity with a count per level, flags unacknowledged criticals, and surfaces the oldest unresolved alert with its age. Both are read-only (risk_level="low") and deterministic — no clock, no randomness, same input → same answer. analyze_alert complements them at the single-alert level: it correlates an alert with its related events into a probable-cause + suggested-actions summary. High-risk writes (vm_delete, vm_migrate, storage_container_delete, subnet_delete, snapshot_delete, snapshot_restore, pd_failover, image_delete, lcm_update) support dry_run and, at the CLI, double confirmation.

Install

uv tool install nutanix-aiops          # or: pipx install nutanix-aiops

Quick start

As a Claude Code plugin

One install gives an agent both the skill and the MCP server:

/plugin marketplace add AIops-tools/marketplace
/plugin install nutanix-aiops@aiops-tools

The MCP server is fetched with uv and pinned to the package version this plugin declares, so an audit row can be traced back to the code that wrote it. Credentials are still configured with nutanix-aiops init — see below.

As an OpenClaw plugin

The same bundle is published on ClawHub, where one install delivers the skill and its MCP server together:

openclaw plugins install clawhub:@zw008/nutanix-aiops
openclaw skills info nutanix-aiops          # expect: Visible to model: yes

Restart the OpenClaw gateway afterwards so it loads the plugin. The MCP server is fetched with uv, pinned to this exact release, so uvx has to be on PATH — without it the skill still installs but reports Visible to model: no. Credentials are configured exactly as below.

As a CLI or standalone MCP server

nutanix-aiops init                     # wizard: PC host / port 9440 / username / verify_ssl + encrypted password
nutanix-aiops doctor                   # config, secrets, connectivity + REST-RBAC preflight
nutanix-aiops overview                 # one-shot estate summary
nutanix-aiops diagnose cluster-health  # worst-first RCA: resiliency, storage, nodes
nutanix-aiops vm list                  # AHV + ESXi VMs

Run as an MCP server (stdio):

export NUTANIX_AIOPS_MASTER_PASSWORD=...   # unlock the encrypted secret store non-interactively
nutanix-aiops mcp

Where that password then lives: an exported variable is readable by every process this shell starts and is recorded by shell history. On a shared or long-lived host, prefer the interactive prompt, or inject it from a secret manager for the life of the one command that needs it.

CLI

nutanix-aiops (Typer): init, overview, doctor, mcp; cluster list/health/hosts/util; vm list/get/power/delete/migrate (delete & migrate take --dry-run + double confirm); diagnose cluster-health, diagnose alert-triage; secret set/list/rm/migrate/rotate-password. The CLI is a convenience subset — the full 51-tool surface is via the MCP server.

Governance

Every MCP tool passes through the bundled @governed_tool harness:

  • Audit — every call (params, outcome summary, status, duration, risk tier, and any operator-supplied approver/rationale) is logged to ~/.nutanix-aiops/audit.db (relocatable via NUTANIX_AIOPS_HOME). The CLI writes the same row the MCP path does — there is no unaudited entry point.

  • Runaway guard — a safety backstop, not an authorization gate: the same call hammered in a tight loop trips a circuit breaker. Disable with NUTANIX_RUNAWAY_MAX=0; optional hard ceilings via NUTANIX_MAX_TOOL_CALLS / NUTANIX_MAX_TOOL_SECONDS.

  • Undo recording — reversible writes record an inverse descriptor built from the fetched before-state (vm_update → prior CPU/memory, vm_migrate → prior host).

  • Risk tier — a descriptive label on the audit row derived from risk_level; it gates nothing.

Credentials

The Prism Central password is stored encrypted in ~/.nutanix-aiops/secrets.enc (Fernet + scrypt) — never plaintext on disk. Unlock with a master password from NUTANIX_AIOPS_MASTER_PASSWORD (MCP/CI) or an interactive prompt (CLI). The non-secret connection details (host, port, username, verify_ssl) live in ~/.nutanix-aiops/config.yaml. A legacy plaintext env var NUTANIX_<TARGET>_PASSWORD is honoured as a fallback.

Gotcha: the Prism Central account needs REST API rights, not just Web UI access. doctor's REST-RBAC preflight catches this early.

Supported scope & limitations

  • Validation status. All behaviour is currently validated against mocked v4 REST responses; it has not yet been run against a live Prism Central. The fastest live check is nutanix-aiops doctor. See docs/VERIFICATION.md for the full live-verification checklist.

  • Self-testable free on Nutanix Community Edition (CE): a single-node CE cluster + an X-Small Prism Central VM.

  • Least-verified paths: LCM update (lcm_update), protection-domain failover (pd_failover), and ESXi-VM listing in particular need live validation.

  • Out of scope this release: IAM / users / roles, Files / Objects / Volumes services, reports, X-Play playbooks, and anything outside Prism Central v4.

Missing a capability?

Missing a tool, an API dialect, or a workflow? Open an issue or PR — feedback and contributions are welcome.

Available Tools

51 tools
alert_acknowledgeA
Destructive

[WRITE][risk=medium] Acknowledge an alert. Auto-handles ETag; captures prior state.

Args:
    alert_ext_id: Alert extId as returned by alert_list.
    target: Prism Central target name from config; omit for the default.

Inputs: alert_ext_id (required), target.

alert_listA
Read-only

[READ] List alerts (extId, title, severity, impact, ack/resolved, affected entity).

Args:
    severity: Filter to one severity (e.g. CRITICAL); omit for all severities.
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target, severity.

alert_resolveA
Destructive

[WRITE][risk=medium] Resolve an alert. Auto-handles ETag; captures prior state.

Args:
    alert_ext_id: Alert extId as returned by alert_list.
    target: Prism Central target name from config; omit for the default.

Inputs: alert_ext_id (required), target.

alert_triage_rcaA
Read-only

[READ] Triage active Prism alerts: per-severity counts + oldest unresolved.

Groups every unresolved alert by severity with a count per level, flags
critical alerts nobody has acknowledged, and surfaces the oldest unresolved
alert with its age in days (aged against the newest alert in the same feed,
so the analysis is clock-free and reproducible). Use analyze_alert on an
individual extId for the per-alert event correlation.

Args:
    target: Prism Central target name from config; omit for the default.

Inputs: target.

analyze_alertA
Read-only

[READ] Root-cause analysis: correlate an alert with recent same-entity events.

Returns a probable cause and suggested actions plus the related events. Resilient
and deterministic — safe to run on a live, alerting cluster.

Args:
    alert_ext_id: Alert extId as returned by alert_list.
    target: Prism Central target name from config; omit for the default.

Inputs: alert_ext_id (required), target.

audit_listB
Read-only

[READ] List config audit records (extId, operation type, user, creation time).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

capacity_runwayA
Read-only

[READ] Deterministic storage-runway estimate for a cluster (days-to-full).

Supply daily_growth_bytes (bytes/day) to project daysToFull; without it the
forecast is 'insufficient-data'. No clock or randomness — same inputs, same
answer.

Args:
    cluster_ext_id: Cluster extId as returned by cluster_list.
    daily_growth_bytes: Assumed daily storage growth in bytes (omit to skip forecast).
    target: Prism Central target name from config; omit for the default.

Inputs: cluster_ext_id (required), target, daily_growth_bytes.

category_assignA
Destructive

[WRITE][risk=medium] Bulk-associate a category to a set of VMs.

Args:
    category_ext_id: Category extId as returned by category_list.
    vm_ext_ids: VM extIds (from vm_list) to associate the category with.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_ids (required), category_ext_id (required), target.

category_createB
Destructive

[WRITE][risk=medium] Create a category key/value pair.

Args:
    key: Category key (e.g. "Environment").
    value: Category value (e.g. "Production").
    description: Optional human-readable description.
    target: Prism Central target name from config; omit for the default.

Inputs: key (required), value (required), target, description.

category_listA
Read-only

[READ] List categories (extId, key, value, description).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

cluster_healthA
Read-only

[READ] One cluster's health: services, resiliency/fault-tolerance, upgrade state.

Args:
    cluster_ext_id: Cluster extId as returned by cluster_list.
    target: Prism Central target name from config; omit for the default.

Inputs: cluster_ext_id (required), target.

cluster_health_rcaA
Read-only

[READ] Estate health RCA: resiliency state, storage headroom, nodes down.

Collects every cluster's health + utilization, all hosts, and all storage
containers, then reports worst-first findings: degraded fault-tolerance
state, cluster storage pools or containers over 80% (warning) / 90%
(critical), hosts whose nodeStatus is not healthy, and clusters reporting
fewer visible hosts than their nodeCount. Every finding cites the measured
percentage or the raw Prism state string that tripped it.

Args:
    target: Prism Central target name from config; omit for the default.

Inputs: target.

cluster_listA
Read-only

[READ] List registered clusters (extId, name, AOS version, hypervisors, nodes).

Call this first — most other tools need a clusterExtId from here.

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

cluster_utilizationB
Read-only

[READ] Point-in-time CPU / memory / storage / IOPS utilization for a cluster.

Args:
    cluster_ext_id: Cluster extId as returned by cluster_list.
    target: Prism Central target name from config; omit for the default.

Inputs: cluster_ext_id (required), target.

event_listA
Read-only

[READ] List events (extId, title, creation time, source entity).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

host_listA
Read-only

[READ] List hosts across all clusters (extId, cluster, hypervisor, CPU/mem).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

image_deleteA
Destructive

[WRITE][risk=high] Delete an image. Destructive — pass dry_run=True to preview first.

Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why. Captures the image's
prior name on the audit trail.

Args:
    ext_id: Image extId as returned by image_list.
    dry_run: If True, return what WOULD be deleted without deleting.
    target: Prism Central target name from config; omit for the default.

Inputs: ext_id (required), target, dry_run.

image_listA
Read-only

[READ] List content-library images (extId, name, type, size, cluster placement).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

lcm_inventoryA
Read-only

[READ] List LCM-managed entities: current/available versions and updateAvailable.

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

lcm_precheckB
Destructive

[WRITE][risk=medium] Run LCM prechecks for entities on a cluster (read-safe validation).

Args:
    cluster_ext_id: Cluster extId as returned by cluster_list.
    entity_ext_ids: LCM entity extIds (from lcm_inventory) to precheck.
    target: Prism Central target name from config; omit for the default.

Inputs: cluster_ext_id (required), entity_ext_ids (required), target.

lcm_updateA
Destructive

[WRITE][risk=high] Perform an LCM firmware/software update. Pass dry_run=True to preview.

Destructive and NOT undoable — tagged risk=high (audit tier 'review');
NUTANIX_AUDIT_APPROVED_BY / NUTANIX_AUDIT_RATIONALE optionally annotate
who/why. Requires a precheck that passed: run lcm_precheck first and pass
the taskExtId it returned. The update is refused without it. The dry_run
preview enforces the same requirement, so a preview can never report an
update the real call would refuse.

Args:
    cluster_ext_id: Cluster extId as returned by cluster_list.
    entity_ext_ids: LCM entity extIds (from lcm_inventory) to update.
    precheck_task_ext_id: taskExtId returned by lcm_precheck for these entities,
        once that task has reached SUCCEEDED (check with task_list). Required —
        the update is refused without it.
    dry_run: If True, return what WOULD be updated without updating.
    target: Prism Central target name from config; omit for the default.

Inputs: cluster_ext_id (required), entity_ext_ids (required), target, dry_run, +1 more.

pd_failoverA
Destructive

[WRITE][risk=high] Fail a protection domain over to a target cluster (DR event).

Destructive DR operation; pass dry_run=True to preview. Tagged risk=high
(audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY / NUTANIX_AUDIT_RATIONALE
optionally annotate who/why.

Args:
    policy_ext_id: Protection policy extId as returned by protection_domain_list.
    cluster_ext_id: Target cluster extId (from cluster_list).
    dry_run: If True, preview the failover without performing it.
    target: Prism Central target name from config; omit for the default.

Inputs: policy_ext_id (required), cluster_ext_id (required), target, dry_run.

protection_domain_listA
Read-only

[READ] List protection domains / policies (extId, name, replicationType).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

recovery_point_listA
Read-only

[READ] List recovery points (extId, vmExtId, create/expiration time, locationType).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

snapshot_createA
Destructive

[WRITE][risk=medium] Snapshot a VM (reversible → delete the snapshot). Auto-handles ETag.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    name: Name for the new snapshot.
    target: Prism Central target name from config; omit for the default.

Inputs: name (required), vm_ext_id (required), target.

snapshot_deleteA
Destructive

[WRITE][risk=high] Delete a VM snapshot. Destructive — pass dry_run=True to preview.

Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why. Captures the
snapshot's prior name on the audit trail.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    snapshot_ext_id: Snapshot extId as returned by snapshot_list.
    dry_run: If True, return what WOULD be deleted without deleting.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), snapshot_ext_id (required), target, dry_run.

snapshot_listA
Read-only

[READ] List a VM's snapshots (extId, name, createTime) — spot lingering snapshots.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), limit, target.

snapshot_restoreA
Destructive

[WRITE][risk=high] Revert a VM to a snapshot. Destructive & NOT undoable — preview first.

Reverting overwrites the VM's current state; pass dry_run=True to preview.
Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    snapshot_ext_id: Snapshot extId as returned by snapshot_list.
    dry_run: If True, preview the revert without performing it.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), snapshot_ext_id (required), target, dry_run.

storage_container_createA
Destructive

[WRITE][risk=medium] Create a storage container on a cluster.

Args:
    name: New storage container name.
    cluster_ext_id: Target cluster extId (from cluster_list).
    replication_factor: Copies kept per block (default 2).
    target: Prism Central target name from config; omit for the default.

Inputs: name (required), cluster_ext_id (required), target, replication_factor.

storage_container_deleteA
Destructive

[WRITE][risk=high] Delete a storage container. Destructive — pass dry_run=True first.

Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why. Captures the
container's prior capacity/RF on the audit trail.

Args:
    ext_id: Storage container extId as returned by storage_container_list.
    dry_run: If True, return what WOULD be deleted without deleting.
    target: Prism Central target name from config; omit for the default.

Inputs: ext_id (required), target, dry_run.

storage_container_listA
Read-only

[READ] List storage containers (extId, name, cluster, capacity, usage, RF).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

storage_container_updateA
Destructive

[WRITE][risk=medium] Resize a container's capacity / replication (reversible → prior).

Args:
    ext_id: Storage container extId as returned by storage_container_list.
    max_capacity_bytes: New max capacity in bytes (omit to leave unchanged).
    replication_factor: New replication factor (omit to leave unchanged).
    target: Prism Central target name from config; omit for the default.

Inputs: ext_id (required), target, max_capacity_bytes, replication_factor.

subnet_createA
Destructive

[WRITE][risk=medium] Create a subnet on a cluster.

Args:
    name: New subnet name.
    cluster_ext_id: Target cluster extId (from cluster_list).
    vlan_id: VLAN / network id for the subnet.
    subnet_type: Subnet type (default VLAN).
    target: Prism Central target name from config; omit for the default.

Inputs: name (required), vlan_id (required), cluster_ext_id (required), target, +1 more.

subnet_deleteA
Destructive

[WRITE][risk=high] Delete a subnet. Destructive — pass dry_run=True to preview first.

Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why. Irreversible, so the
audit trail captures the subnet's full prior state (name, description, type,
VLAN id, cluster, IP config and pools).

Args:
    ext_id: Subnet extId as returned by subnet_list.
    dry_run: If True, return what WOULD be deleted without deleting.
    target: Prism Central target name from config; omit for the default.

Inputs: ext_id (required), target, dry_run.

subnet_getA
Read-only

[READ] One subnet by extId, with its current ETag surfaced for downstream writes.

Args:
    ext_id: Subnet extId as returned by subnet_list.
    target: Prism Central target name from config; omit for the default.

Inputs: ext_id (required), target.

subnet_listA
Read-only

[READ] List subnets (extId, name, type, VLAN, cluster, IP config).

Args:
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target.

task_listA
Read-only

[READ] List Prism Central tasks (extId, operation, status, %complete, entity).

Args:
    status: Optional status filter, e.g. RUNNING / SUCCEEDED / FAILED.
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, status, target.

undo_applyA
Destructive

[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.

The inverse runs through its own governed tool, so its real risk tier is
tagged on its own audit row there. Pass dry_run=True to preview the
inverse call without executing it. A token can only be applied once.

Args:
    undo_id: The undoId from undo_list (or an ``_undo_id`` in a write result).
    dry_run: If True, preview the inverse tool + params without running it.
    target: Passed through to the inverse tool when it accepts a target.

Inputs: undo_id (required), target, dry_run.

undo_listA
Read-only

[READ] List recorded, not-yet-applied undo tokens (most recent first).

Each entry names the original tool, the inverse tool that ``undo_apply``
would run, and a human note. Use the ``undoId`` with ``undo_apply``.

``truncated`` is measured — one extra row is fetched — so a capped listing
announces itself instead of looking like the complete set.

Each entry carries ``effectVerified``. False means the original write
lost its response, so the change it reverses is PROBABLE, not confirmed —
check the live state before applying, and do not report the result as a
restore of a state that may never have been reached.

Args:
    limit: Max rows to return (default 50). Re-run with a higher limit when
        the result reports ``truncated: true``.
    target: Unused (undo state is host-local); accepted for CLI uniformity.

Inputs: limit, target.

vm_cloneB
Destructive

[WRITE][risk=medium] Clone a VM to a new name.

Args:
    vm_ext_id: Source VM extId as returned by vm_list.
    new_name: Name for the clone.
    target: Prism Central target name from config; omit for the default.

Inputs: new_name (required), vm_ext_id (required), target.

vm_createA
Destructive

[WRITE][risk=medium] Create a minimal VM on a cluster.

Args:
    name: New VM name.
    cluster_ext_id: Target cluster extId (from cluster_list).
    num_sockets: vCPU sockets (default 1).
    memory_bytes: RAM in bytes (default 4 GiB).
    target: Prism Central target name from config; omit for the default.

Inputs: name (required), cluster_ext_id (required), target, num_sockets, +1 more.

vm_deleteA
Destructive

[WRITE][risk=high] Delete a VM. Destructive — pass dry_run=True to preview first.

Tagged risk=high (audit tier 'review'); NUTANIX_AUDIT_APPROVED_BY /
NUTANIX_AUDIT_RATIONALE optionally annotate who/why. Captures the VM's
prior name/power state on the audit trail.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    dry_run: If True, return what WOULD be deleted without deleting.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, dry_run.

vm_getA
Read-only

[READ] One VM by extId, with its current ETag surfaced for downstream writes.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target.

vm_guest_shutdownA
Destructive

[WRITE][risk=medium] Graceful in-guest shutdown (reversible → power-on).

Args:
    vm_ext_id: VM extId as returned by vm_list.
    dry_run: If True, preview it (runs the self-lockout guard) without shutting down.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, dry_run.

vm_listA
Read-only

[READ] List VMs — AHV and (by default) ESXi-backed too; hypervisor field distinguishes.

AHV and ESXi are read from separate endpoints. If the ESXi read fails, the
AHV rows are still returned with `esxiError` set and `truncated: null`
(completeness unknown) — a partial list, not "no ESXi VMs".

Args:
    include_esxi: Include ESXi-backed VMs Prism Central can see (default True).
    limit: Max rows to return (default 500). The result reports
        `returned`, `limit`, and `truncated` so a capped read is visible.
    target: Prism Central target name from config; omit for the default.

Inputs: limit, target, include_esxi.

vm_migrateA
Destructive

[WRITE][risk=high] Live-migrate a VM to another host (reversible → prior host).

Pass dry_run=True to preview. Tagged risk=high (audit tier 'review');
NUTANIX_AUDIT_APPROVED_BY / NUTANIX_AUDIT_RATIONALE optionally annotate
who/why.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    target_host_ext_id: Destination host extId (from host_list).
    dry_run: If True, preview the migration without performing it.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target_host_ext_id (required), target, dry_run.

vm_power_offA
Destructive

[WRITE][risk=medium] Hard power off a VM (reversible → power-on).

Args:
    vm_ext_id: VM extId as returned by vm_list.
    dry_run: If True, preview it (runs the self-lockout guard) without powering off.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, dry_run.

vm_power_onA
Destructive

[WRITE][risk=medium] Power on a VM (reversible → power-off). Auto-handles ETag.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    dry_run: If True, return what WOULD be powered on without doing it.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, dry_run.

vm_protectA
Destructive

[WRITE][risk=medium] Associate a VM with a protection policy.

Args:
    vm_ext_id: VM extId as returned by vm_list.
    policy_ext_id: Protection policy extId as returned by protection_domain_list.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), policy_ext_id (required), target.

vm_rebootA
Destructive

[WRITE][risk=medium] Reboot a VM (no distinct inverse).

Args:
    vm_ext_id: VM extId as returned by vm_list.
    dry_run: If True, return what WOULD be rebooted without doing it.
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, dry_run.

vm_updateA
Destructive

[WRITE][risk=medium] Resize a VM's CPU sockets / memory (reversible → prior values).

Args:
    vm_ext_id: VM extId as returned by vm_list.
    num_sockets: New vCPU socket count (omit to leave unchanged).
    memory_bytes: New RAM in bytes (omit to leave unchanged).
    target: Prism Central target name from config; omit for the default.

Inputs: vm_ext_id (required), target, num_sockets, memory_bytes.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 51 tools

    Disambiguation5/5

    Every tool targets a distinct resource/action, covering VMs, alerts, clusters, snapshots, subnets, storage containers, LCM, categories, images, undo, and RCA separately. The closest overlaps (vm_power_off vs vm_guest_shutdown, cluster_health vs cluster_health_rca, alert_list vs analyze_alert vs alert_triage_rca) are clearly differentiated by descriptions.

    Naming Consistency4/5

    Names are overwhelmingly snake_case and follow a resource_action convention (vm_create, subnet_delete, storage_container_update). Minor deviations exist: analyze_alert is verb-first, while capacity_runway, cluster_health, and cluster_utilization are noun phrases, and pd_failover abbreviates protection_domain.

    Tool Count1/5

    51 tools far exceeds the 3-15 well-scoped range and lands in the rubric's 50+ extreme-mismatch band. Although the Nutanix estate is broad, the set includes many thin read/write/RCA operations that would overwhelm tool selection.

    Completeness4/5

    The surface covers core Nutanix operational workflows: VM lifecycle/power/migration, snapshots, alerts, clusters, storage containers, subnets, LCM, categories, and undo. Gaps remain, such as subnet update, category unassign/delete, image create/update, protection-domain CRUD, and richer VM NIC/disk operations, but agents can work around most of these.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to manage Nutanix infrastructure via Prism Central and Prism Element APIs, including VM operations, cluster management, networking, and as-built report generation.
      28
      AGPL 3.0
    • A
      license
      A
      quality
      D
      maintenance
      MCP server for Nutanix Prism Central v4 REST API, enabling AI agents to list and inspect VMs, control VM power state, list clusters, read alerts, and list subnets.
      8
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      AI-powered MCP server for managing Proxmox VE VMs and containers with built-in governance, audit logging, and reversibility.
      43
      5
      MIT
    • A
      license
      A
      quality
      A
      maintenance
      AI-powered Veeam Backup & Replication operations MCP server with tools for managing jobs, restores, sessions, and repositories, featuring built-in governance, audit logging, and safety controls.
      27
      MIT