# Proxbase (oci · ghcr.io/virtbase/proxbase)

Create, test and break real Proxmox VE clusters in QEMU/KVM on the local host.

- Trust score: 52/100 (low)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- oci · `ghcr.io/virtbase/proxbase`: 52/100 (this document), [markdown](https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase.md), [page](https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/virtbase/proxbase`
- Version: `0.4.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 12 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5376 tokens (~145/item across 37 items; 36 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 38 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Proxbase MCP server?

Proxbase runs locally as a container image, launched with docker run --rm -i ghcr.io/virtbase/proxbase:0.4.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add virtbase-proxbase -- docker run --rm -i ghcr.io/virtbase/proxbase:0.4.0
```

### Cursor

```json
{
  "mcpServers": {
    "virtbase-proxbase": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/virtbase/proxbase:0.4.0"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "virtbase-proxbase": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/virtbase/proxbase:0.4.0"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add virtbase-proxbase -- docker run --rm -i ghcr.io/virtbase/proxbase:0.4.0
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "virtbase-proxbase": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/virtbase/proxbase:0.4.0"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  virtbase-proxbase:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/virtbase/proxbase:0.4.0"]
```

### Netclaw

```json
{
  "McpServers": {
    "virtbase-proxbase": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/virtbase/proxbase:0.4.0"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "virtbase-proxbase": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/virtbase/proxbase:0.4.0"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 52, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 51, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 50, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 46, +1)

- [functional] Package version: 0.3.0 → 0.4.0

### 2026-10-22 (score 45, 0)

- [security regression] Stability: 0.20 → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Schema quality: 116 → 145
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.2.1 → 0.3.0
- [functional] Package version: 0.2.1 → 0.2.2

## MCP tools (36)

### `cluster_create` (~581 tokens)

Create a Proxmox VE cluster (or resume a failed create of the same name).
Without config, it creates 1 node with 4 vCPUs, 4G memory, a 32G ZFS root disk and one 32G data disk
holding the ZFS pool "tank". Set nodes: 3 for a real cluster, storage: ceph for Ceph (3+ nodes).
The create runs in the background on this host and survives this connection; the tool reports
progress and returns when the cluster is ready, or with running=true after timeoutSeconds
(then call cluster_wait). Cancelling the call cancels the create (re-run to resume).
With snapshot="baseline" it saves a live snapshot when ready, which cluster_reset returns to in seconds.
templates in config provide VM templates from cloud images and container templates as fixtures.
Needs free memory for all nodes; the first create downloads a ~1.5 GB ISO.

Input parameters:

- `config` (string): cluster file (YAML, apiVersion proxbase.virtbase.com/v1alpha1, kind Cluster); the other parameters override it
- `cpus` (integer): vCPUs per node (default 4)
- `dataDisks` (string): data disks per node: 2x32G, 32G,64G or none
- `golden` (null|boolean): clone nodes from a cached installed base image instead of installing each (default true; the first create builds the image)
- `memory` (string): memory per node, e.g. 4G (default 4G, 6G with Ceph)
- `name` (string, required): cluster name: lowercase letters, digits and dashes, starting with a letter, at most 15 characters
- `nodes` (integer): number of nodes (default 1)
- `owner` (string): who owns the cluster, e.g. the agent and its task (default: the client's name)
- `pveVersion` (string): Proxmox VE ISO version, e.g. 9.2 or 9.2-1 (default: newest supported)
- `rootDisk` (string): root disk size, e.g. 32G
- `snapshot` (string): save a live snapshot with this name when the cluster is ready, e.g. baseline; cluster_reset returns to it in seconds
- `storage` (string): storage on the data disks: zfs, ceph or none
- `timeoutSeconds` (integer): return after this many seconds while the create keeps running (default 600, max 3600; at most 50 for clients that cancel tool calls after a minute)
- `ttlMinutes` (integer): lifetime: cluster_gc deletes the cluster this many minutes after the create (default: no expiry)

Output parameters:

- `cluster` (string)
- `command` (string): the proxbase command the job runs, e.g. create or node add
- `error` (string)
- `hint` (string)
- `log` (string): progress log (JSON lines); node install logs are in the cluster's logs directory
- `running` (boolean): the job is still running; call cluster_wait
- `status` (null|object)
- `steps` (null|array): latest progress messages

### `cluster_destroy` (~85 tokens)

Delete a cluster: kill its VMs and remove all its disks, snapshots and credentials. Also stops a create running in the background. Set confirm to the cluster name.

Input parameters:

- `cluster` (string, required): cluster name
- `confirm` (string): must equal the cluster name (destroying deletes all disks and cannot be undone); without it, clients that support elicitation ask the user

Output parameters:

- `message` (string)

### `cluster_diagnose` (~166 tokens)

Collect what explains a cluster problem, in one read-only call: the cluster status and, for every node,
the quorum seen by it, failed systemd units, PVE tasks that failed, error log lines of corosync, pmxcfs (pve-cluster),
pveproxy, pvedaemon, pvestatd, HA and Ceph from the last sinceMinutes, the clock offset, and ceph health detail.
For nodes that are not running it returns the end of their serial console. Also lists the log files on this host.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `sinceMinutes` (integer): report errors and failed tasks of the last this many minutes (default 30, max 1440)

Output parameters:

- `healthy` (boolean)
- `logs` (null|array): log files on this host: QEMU, install and serial console of each node, the switch; the result links them as resources
- `nodes` (null|array)
- `problem` (string)
- `status` (null|object)

### `cluster_env` (~130 tokens)

Return what API and SSH clients need: API endpoint, API token (proxbase@pve!api, full privileges), the cluster CA certificate (PEM and path), SSH user, key path and ports per node. Root password only if includeRootPassword is set.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `includeRootPassword` (boolean): also return the root password of the nodes (only if needed, e.g. for root@pam API logins)
- `token` (string): return this scoped token (token_create) instead of the main one

Output parameters:

- `caCertPem` (string): the cluster CA; API certificates are signed by it
- `env` (null|object)

### `cluster_gc` (~62 tokens)

Delete every expired cluster on this host (see ttlMinutes of cluster_create and cluster_ttl), with its
disks and snapshots; clusters with a running job are left. dryRun only lists them.

Input parameters:

- `dryRun` (boolean): only list the expired clusters

Output parameters:

- `deleted` (null|array): expired clusters deleted (with dryRun: to be deleted)
- `skipped` (null|array): expired clusters left, with the reason

### `cluster_list` (~22 tokens)

List all proxbase clusters on this host with phase and running nodes.

Output parameters:

- `clusters` (null|array)

### `cluster_plan` (~456 tokens)

Work out what cluster_create would set up, without creating anything: nodes with IPs and ports (a new
cluster takes the first free port range), the memory and disk of all nodes, whether the ISO is cached, the host's free
memory and disk, warnings, and the resolved cluster file. Takes the parameters of cluster_create.

Input parameters:

- `config` (string): cluster file (YAML, apiVersion proxbase.virtbase.com/v1alpha1, kind Cluster); the other parameters override it
- `cpus` (integer): vCPUs per node (default 4)
- `dataDisks` (string): data disks per node: 2x32G, 32G,64G or none
- `golden` (null|boolean): clone nodes from a cached installed base image instead of installing each (default true; the first create builds the image)
- `memory` (string): memory per node, e.g. 4G (default 4G, 6G with Ceph)
- `name` (string, required): cluster name: lowercase letters, digits and dashes, starting with a letter, at most 15 characters
- `nodes` (integer): number of nodes (default 1)
- `owner` (string): who owns the cluster, e.g. the agent and its task (default: the client's name)
- `pveVersion` (string): Proxmox VE ISO version, e.g. 9.2 or 9.2-1 (default: newest supported)
- `rootDisk` (string): root disk size, e.g. 32G
- `snapshot` (string): save a live snapshot with this name when the cluster is ready, e.g. baseline; cluster_reset returns to it in seconds
- `storage` (string): storage on the data disks: zfs, ceph or none
- `timeoutSeconds` (integer): return after this many seconds while the create keeps running (default 600, max 3600; at most 50 for clients that cancel tool calls after a minute)
- `ttlMinutes` (integer): lifetime: cluster_gc deletes the cluster this many minutes after the create (default: no expiry)

Output parameters:

- `plan` (null|object)
- `resolved` (string): the cluster file with all defaults and the port base, as cluster_create would use it

### `cluster_reset` (~112 tokens)

Return a cluster to a snapshot in one call (default "baseline"): power the nodes off, restore the snapshot
and start the cluster. A live snapshot resumes with its memory in seconds; a disk snapshot boots the nodes.
Changes since the snapshot are lost. cluster_create with snapshot="baseline" saves one when the cluster is ready;
snapshot_save saves one at any time.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `snapshot` (string): snapshot to return to (default baseline)

Output parameters:

- `duration` (string)
- `healthy` (boolean)
- `live` (boolean): the snapshot holds the memory, so the cluster resumed instead of booting
- `problem` (string)
- `snapshot` (string)
- `status` (null|object)

### `cluster_start` (~85 tokens)

Boot a stopped cluster and wait for quorum, the API and storage. Also boots nodes killed by fault_apply kill. If the call limit (50 s for clients that cancel tool calls after a minute) passes first, it returns healthy=false with what is pending while the nodes keep booting.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster, else "default"

Output parameters:

- `healthy` (boolean)
- `job` (null|object): the background job (create, node add or remove) and its latest progress
- `problem` (string)
- `status` (null|object)

### `cluster_status` (~86 tokens)

Show a cluster: phase, quorum, nodes (running/online, IP, web UI URL, SSH port), Ceph health, active faults, and the progress of a create running in the background. healthy=true means ready, quorate, all nodes online and Ceph HEALTH_OK.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster, else "default"

Output parameters:

- `healthy` (boolean)
- `job` (null|object): the background job (create, node add or remove) and its latest progress
- `problem` (string)
- `status` (null|object)

### `cluster_stop` (~97 tokens)

Shut all nodes of a cluster down (cleanly, then hard after the timeout). Disks are kept; cluster_start boots it again. Clears all faults.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `timeoutSeconds` (integer): time for a clean shutdown before powering off hard (default 180; nodes shut their guests down first; at most 30 for clients that cancel tool calls after a minute)

Output parameters:

- `message` (string)

### `cluster_ttl` (~84 tokens)

Set how long a cluster may live: it expires minutes from now (0: never). cluster_gc deletes expired
clusters; set a lifetime on clusters you create so that forgotten ones are cleaned up.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `minutes` (integer, required): the cluster expires this many minutes from now; 0: never

Output parameters:

- `cluster` (string)
- `expiresAt` (string): RFC 3339; empty: never

### `cluster_wait` (~103 tokens)

Wait for the background job of a cluster (after cluster_create, node_add or node_remove returned running=true), reporting its progress. Returns running=false with the status when it finished, or running=true again after timeoutSeconds.

Input parameters:

- `cluster` (string, required): cluster name
- `timeoutSeconds` (integer): return after this many seconds if the job is still running (default 600, max 3600; at most 50 for clients that cancel tool calls after a minute)

Output parameters:

- `cluster` (string)
- `command` (string): the proxbase command the job runs, e.g. create or node add
- `error` (string)
- `hint` (string)
- `log` (string): progress log (JSON lines); node install logs are in the cluster's logs directory
- `running` (boolean): the job is still running; call cluster_wait
- `status` (null|object)
- `steps` (null|array): latest progress messages

### `config_validate` (~65 tokens)

Check a cluster file (YAML) without creating anything; returns errors, warnings and the file with all defaults. The schema is the resource https://proxbase.virtbase.com/schema/v1alpha1/cluster.json.

Input parameters:

- `config` (string, required): cluster file (YAML)

Output parameters:

- `errors` (null|array)
- `resolved` (string): the cluster file with all defaults, as create would use it
- `valid` (boolean)
- `warnings` (null|array)

### `fault_apply` (~227 tokens)

Inject a failure into a running cluster to test HA, fencing, Ceph or applications: kill, freeze, thaw, link-down, link-up, partition or degrade. fault_clear undoes them.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `delayMs` (integer): degrade: delay per frame and direction in milliseconds
- `groups` (null|array): partition: lists of node names; unlisted nodes form one more group
- `kind` (string, required): one of: kill (power the node off hard; cluster_start boots it), freeze (stop its vCPUs), thaw, link-down, link-up (the node's cable on a network), partition (split a network into groups), degrade (la…
- `lossPercent` (number): degrade: percentage of frames dropped per direction
- `network` (string): network for link-*, partition and degrade (default: corosync link0)
- `node` (string): node for kill, freeze, thaw, link-down, link-up

Output parameters:

- `cleared` (null|array)
- `faults` (null|array): active faults

### `fault_clear` (~52 tokens)

Undo all injected faults (thaw, plug cables in, heal partitions and degradations). Killed nodes need cluster_start.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster, else "default"

Output parameters:

- `cleared` (null|array)
- `faults` (null|array): active faults

### `file_get` (~126 tokens)

Read a file of a node: text as content, other data as contentBase64; at most maxBytes (default 256 KiB,
max 4 MiB), truncated=true if the file is longer.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `maxBytes` (integer): read at most this many bytes (default 256 KiB, max 4 MiB)
- `node` (string): node name, e.g. pve1 (default: the first node)
- `path` (string, required): absolute path on the node

Output parameters:

- `content` (string): the data, if it is UTF-8 text
- `contentBase64` (string): the data, base64-encoded, if it is not text
- `node` (string)
- `path` (string)
- `sha256` (string): of the returned data
- `size` (integer): size of the whole file
- `truncated` (boolean): only the first maxBytes were read

### `file_put` (~185 tokens)

Write a file on a node as root, e.g. a config, script or test fixture: text in content, or binary data in
contentBase64 (at most 4 MiB). The file is replaced atomically; missing directories are created. Files in /etc/pve
(the cluster file system, shared by all nodes) get its fixed permissions.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `content` (string): file content as text
- `contentBase64` (string): file content, base64-encoded; instead of content
- `mode` (string): permissions in octal, e.g. 0755 (default 0644)
- `node` (string): node name, e.g. pve1 (default: the first node)
- `path` (string, required): absolute path on the node

Output parameters:

- `bytes` (integer)
- `node` (string)
- `path` (string)
- `sha256` (string)

### `host_check` (~66 tokens)

Check whether this host can run clusters: KVM, nested virtualization, QEMU, free memory, KSM, disk space, free ports and path lengths (as proxbase doctor).

Input parameters:

- `portBase` (integer): access.portBase whose first ports to check (default 18000)

Output parameters:

- `checks` (null|array)
- `ok` (boolean): no check failed; warnings do not block clusters

### `image_list` (~25 tokens)

List the cached base images (golden images) with the clusters that use them.

Output parameters:

- `images` (null|array)

### `image_prune` (~48 tokens)

Delete the base images no cluster uses (dryRun only lists them). The next create with a deleted image builds it again.

Input parameters:

- `dryRun` (boolean): only report what would be deleted

Output parameters:

- `deleted` (null|array): keys of deleted (or, with dryRun, unused) images
- `kept` (null|array): images in use, with their clusters

### `node_add` (~153 tokens)

Add nodes to a ready cluster: install (or clone) them, join them and set up ZFS or Ceph as configured.
Runs in the background like cluster_create; returns when done or with running=true (then call cluster_wait).
Cancelling the call stops it; cluster_create with the cluster's name finishes an interrupted add.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `count` (integer): nodes to add (default 1); numbers of removed nodes are reused first
- `timeoutSeconds` (integer): return after this many seconds while the job keeps running (default 600, max 3600; at most 50 for clients that cancel tool calls after a minute)

Output parameters:

- `cluster` (string)
- `command` (string): the proxbase command the job runs, e.g. create or node add
- `error` (string)
- `hint` (string)
- `log` (string): progress log (JSON lines); node install logs are in the cluster's logs directory
- `running` (boolean): the job is still running; call cluster_wait
- `status` (null|object)
- `steps` (null|array): latest progress messages

### `node_exec` (~159 tokens)

Run a shell command as root on a running node over SSH and return stdout, stderr and the exit code. Use it for pvesh, qm, pct, pvecm, ceph and the like. Non-interactive; output is capped at 64 KiB per stream.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `command` (string, required): shell command line, run as root through the login shell
- `node` (string): node name, e.g. pve1 (default: the first node)
- `timeoutSeconds` (integer): kill the command after this many seconds (default 120, max 3600; at most 50 for clients that cancel tool calls after a minute)

Output parameters:

- `exitCode` (integer): exit status; -1 if the command was killed
- `stderr` (string)
- `stdout` (string)
- `truncated` (boolean): stdout or stderr was cut to the last 64 KiB

### `node_remove` (~199 tokens)

Remove a node from a cluster: drain and destroy its Ceph daemons, take it out of the cluster and delete
its VM and disks. Refuses with guests on the node or Ceph pools that would be left degraded unless force is set.
Runs in the background like cluster_create. Set confirm to the node name.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `confirm` (string): must equal the node name (removing deletes the node's disks); without it, clients that support elicitation ask the user
- `force` (boolean): remove even with guests on the node or Ceph pools left degraded
- `node` (string, required): node to remove, e.g. pve3
- `timeoutSeconds` (integer): return after this many seconds while the job keeps running (default 600, max 3600; at most 50 for clients that cancel tool calls after a minute)

Output parameters:

- `cluster` (string)
- `command` (string): the proxbase command the job runs, e.g. create or node add
- `error` (string)
- `hint` (string)
- `log` (string): progress log (JSON lines); node install logs are in the cluster's logs directory
- `running` (boolean): the job is still running; call cluster_wait
- `status` (null|object)
- `steps` (null|array): latest progress messages

### `pve_call` (~302 tokens)

Change something through the Proxmox VE API of a cluster with its API token: POST, PUT or DELETE a path with params,
e.g. POST /nodes/pve1/qemu {"vmid": 100, "memory": 2048} or POST /nodes/pve1/qemu/100/status/start.
If the call starts a task (returns a UPID), waits for it and returns its exit status and log; a failed task is an error.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `method` (string, required): POST (create or run), PUT (change) or DELETE
- `node` (string): node whose API answers (default: the first running node); /nodes/<name>/... paths reach every node through it
- `params` (object): parameters, e.g. {"vmid": 100, "memory": 2048, "net0": "virtio,bridge=vmbr0"}; booleans become 1 or 0, arrays repeat the parameter
- `path` (string, required): API path under /api2/json, e.g. /nodes/pve1/qemu or /nodes/pve1/qemu/100/status/start
- `timeoutSeconds` (integer): wait this long for a task the call starts (default 120, max 3600; at most 50 for clients that cancel tool calls after a minute)

Output parameters:

- `data`: the data of the API response
- `task` (null|object): the task the call started

### `pve_get` (~204 tokens)

Read from the Proxmox VE API of a cluster with its API token (proxbase@pve!api) and return the response data as JSON.
Paths are those of pvesh and the API viewer, e.g. /cluster/resources, /cluster/status, /nodes/pve1/qemu, /nodes/pve1/storage,
/nodes/pve1/tasks (recent tasks) or /nodes/pve1/tasks/<upid>/log.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `node` (string): node whose API answers (default: the first running node); /nodes/<name>/... paths reach every node through it
- `params` (object): query parameters, e.g. {"type": "vm"}
- `path` (string, required): API path under /api2/json, e.g. /cluster/resources, /nodes/pve1/qemu or /nodes/pve1/tasks/<upid>/log

Output parameters:

- `data`: the data of the API response
- `task` (null|object): the task the call started

### `snapshot_delete` (~39 tokens)

Delete a snapshot of a cluster.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `name` (string, required): snapshot name

Output parameters:

- `message` (string)

### `snapshot_list` (~34 tokens)

List the snapshots of a cluster.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster, else "default"

Output parameters:

- `snapshots` (null|array)

### `snapshot_restore` (~76 tokens)

Reset all disks of a stopped cluster to a snapshot (call cluster_stop first). Changes since the snapshot are lost. After a disk snapshot call cluster_start; a live snapshot starts the cluster in its saved state by itself.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `name` (string, required): snapshot name

Output parameters:

- `message` (string)

### `snapshot_save` (~87 tokens)

Snapshot all disks of a stopped cluster (call cluster_stop first), or with live=true the running cluster including its memory. Restoring is much faster than creating again.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `live` (boolean): snapshot the running cluster with its memory; restoring it resumes the cluster in seconds
- `name` (string, required): snapshot name

Output parameters:

- `message` (string)

### `task_list` (~218 tokens)

List the Proxmox VE tasks of a cluster, newest first: VM and container operations, migrations,
backups, storage and Ceph jobs. Reads every node, or one. Filter by errorsOnly, running, type (e.g. qmstart,
qmigrate, vzdump), vmid and sinceMinutes. task_log shows a task's log, task_wait waits for one to end.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `errorsOnly` (boolean): only tasks that failed
- `limit` (integer): most tasks to return (default 20, max 200)
- `node` (string): only tasks of this node (default: every node)
- `running` (boolean): only tasks that are still running
- `sinceMinutes` (integer): only tasks started in the last this many minutes
- `type` (string): only tasks of this type, e.g. qmstart, qmigrate, vzdump
- `vmid` (integer): only tasks of this guest

Output parameters:

- `tasks` (null|array)
- `unavailable` (null|array): nodes whose tasks could not be read, with the reason

### `task_log` (~121 tokens)

Return the status and the end of the log of a Proxmox VE task, by its UPID (from task_list, pve_call or an error).

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `lines` (integer): last lines to return (default 50, max 2000)
- `upid` (string, required): task ID, e.g. UPID:pve1:000A12B3:0012C4D5:65000000:qmstart:100:root@pam:

Output parameters:

- `exitStatus` (string): OK, WARNINGS: n, or the error
- `log` (null|array)
- `node` (string)
- `status` (string): running or stopped
- `totalLines` (integer): lines the log has; log holds the last of them
- `upid` (string)

### `task_wait` (~118 tokens)

Wait for a Proxmox VE task (UPID) to end and return its exit status and the end of its log; a failed
task is an error. Use it for tasks that pve_call or task_list reported as running.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `timeoutSeconds` (integer): wait at most this long (default 120, max 3600; at most 50 for clients that cancel tool calls after a minute)
- `upid` (string, required): task ID

Output parameters:

- `exitStatus` (string): OK or WARNINGS: n
- `log` (null|array): last lines of the task log
- `node` (string)
- `status` (string): running or stopped; poll a running task with pve_get /nodes/<node>/tasks/<upid>/status
- `upid` (string)

### `token_create` (~230 tokens)

Create an API token that may only do what a role allows on a path, to test code with least privilege
or check that an operation is refused: e.g. role PVEAuditor on /, PVEVMAdmin on /vms/100, PVEDatastoreUser on
/storage/tank. Replaces a token of the same name. cluster_env with token returns the endpoint and CA with it.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `name` (string, required): token name: lowercase letters, digits and dashes; the token is proxbase@pve!name
- `path` (string): ACL path the role applies to (default /), e.g. /vms/100, /storage/tank, /pool/ci
- `propagate` (null|boolean): the role also applies below path (default true)
- `role` (string, required): a role of the cluster, e.g. PVEAuditor, PVEVMUser, PVEVMAdmin, PVEDatastoreUser, PVEPoolAdmin

Output parameters:

- `apiToken` (string): the value for Authorization: PVEAPIToken=<apiToken> headers (tokenId=tokenSecret)
- `name` (string)
- `path` (string)
- `propagate` (boolean): the role also applies below path
- `role` (string)
- `tokenId` (string): proxbase@pve!name
- `tokenSecret` (string): only returned when the token is created

### `token_delete` (~55 tokens)

Delete a scoped API token and its grant. The main token proxbase@pve!api cannot be deleted.

Input parameters:

- `cluster` (string): cluster name; default: the only cluster
- `name` (string, required): token name

Output parameters:

- `message` (string)

### `token_list` (~44 tokens)

List the scoped API tokens of a cluster with their role and path (without secrets).

Input parameters:

- `cluster` (string): cluster name; default: the only cluster, else "default"

Output parameters:

- `tokens` (null|array)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase#diagnostics

## Score history

- 2026-11-05: 52
- 2026-11-04: 51
- 2026-11-03: 51
- 2026-11-02: 50
- 2026-11-01: 50
- 2026-10-31: 49
- 2026-10-30: 49
- 2026-10-29: 48
- 2026-10-28: 48
- 2026-10-27: 47
- 2026-10-26: 47
- 2026-10-25: 46
- 2026-10-24: 46
- 2026-10-23: 46
- 2026-10-22: 45
- 2026-10-21: 45
- 2026-10-20: 45
- 2026-10-19: 44
- 2026-10-18: 44
- 2026-10-17: 43
- 2026-10-16: 42
- 2026-10-15: 42
- 2026-10-14: 10
- 2026-10-13: 10
- 2026-10-12: 9

## Common questions

### What is the Proxbase MCP server?

Proxbase is an MCP server listed in the public MCP registry as io.github.virtbase/proxbase. Create, test and break real Proxmox VE clusters in QEMU/KVM on the local host. This page covers its container image (ghcr.io/virtbase/proxbase).

### Is the Proxbase MCP server safe to use?

Proxbase scores 52 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Proxbase MCP server expose?

Proxbase exposes 36 tools: cluster_create, cluster_destroy, cluster_diagnose, cluster_env, cluster_gc, and 31 more. Their descriptions and schemas cost roughly 4,902 tokens of context every time the server is loaded.

### Is the Proxbase MCP server still maintained?

Proxbase is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Proxbase MCP server under?

Proxbase declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- GitHub Container Registry: https://ghcr.io/virtbase/proxbase
- Repository: https://github.com/virtbase/proxbase
- Website: https://github.com/virtbase/proxbase/blob/main/docs/mcp.md
- Changelog RSS feed: https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase.xml
- Changelog JSON feed: https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase.json
- HTML version of this page: https://verifymcp.io/servers/virtbase-proxbase/ghcr-io-virtbase-proxbase
