This page is the reference index for the ProxmoxMCP-Plus tool surface, the native MCP Streamable HTTP endpoint, and the OpenAPI wrapper that exposes tools as REST-style HTTP routes.
Use this page when you need exact tool names, input shapes, prerequisites, or common failure patterns. Use the Operator Guide for deployment and runtime setup, and the Security Guide for policy and access controls.
Read-onlytools inspect Proxmox state and should be your first call when validating reachability or inventory.Mutatingtools create, start, stop, change, restore, or delete infrastructure.- Tool availability depends on runtime configuration. In particular, some command-execution tools are only registered when
sshconfig is present. - MCP Streamable HTTP mode exposes the native MCP endpoint at
/mcp. - OpenAPI mode is a bridge over the same MCP tool surface. The generated schema at
/openapi.jsonis the source of truth for the exact request and response shape exposed by the running server.
When mcp.transport is STREAMABLE_HTTP or STREAMABLE, the server exposes the MCP endpoint at:
| Path | Purpose | Notes |
|---|---|---|
/mcp |
MCP Streamable HTTP endpoint | use this for remote MCP clients that support Streamable HTTP |
The Docker Compose mcp-http profile exposes this endpoint on port 8000.
When MCP_API_KEY is set, callers must send Authorization: Bearer <MCP_API_KEY>.
Missing or incorrect credentials return 401 with WWW-Authenticate: Bearer.
When the OpenAPI wrapper is enabled, the primary endpoints are:
| Path | Purpose | Notes |
|---|---|---|
/ |
service metadata | basic wrapper metadata |
/docs |
Swagger UI | interactive API docs for the currently running tool set |
/openapi.json |
generated OpenAPI schema | reflects conditional tool registration such as SSH-backed tools |
/livez |
liveness check | unauthenticated, minimal process liveness |
/readyz |
readiness check | requires OpenAPI auth and reports MCP backend connectivity |
/health |
readiness alias | requires OpenAPI auth and matches /readyz |
/metrics |
Prometheus metrics | includes per-route labels for route, method, and status |
/jobs |
persistent job list | requires a local JobStore in the OpenAPI process |
- Proxmox API access requires a valid
proxmoxandauthconfiguration. - Native MCP Streamable HTTP access optionally requires
Authorization: Bearer <MCP_API_KEY>whenMCP_API_KEYis configured. - OpenAPI access requires
Authorization: Bearer <PROXMOX_API_KEY>by default. Startup without an API key requires the explicit local-development overridePROXMOX_ALLOW_NO_AUTH=true. - SSH-backed container command workflows require a valid
sshconfiguration. - Command-execution tools are subject to command-policy checks. Depending on policy, a request can be allowed, denied, or require an
approval_token. - Detailed policy behavior lives in the Security Guide.
- Some tools return human-readable text by default.
- Several container tools support
format_stylewithprettyorjson. - In HTTP mode, exact request and response payloads should be verified against
/openapi.jsonfor the running server version. - Long-running mutating tools can return both a raw Proxmox
task_idand a stablejob_id.
job_idis the MCP and OpenAPI stable identifier for a long-running operation.task_idremains the raw ProxmoxUPIDand can change when a job is retried.- Job records persist in the configured SQLite database and survive process restart.
retry_jobonly works when the job was created with a stored retry recipe.cancel_jobis best-effort and follows Proxmox task cancellation semantics.
200: list, fetch, or poll succeeded202: cancel or retry request accepted404: unknownjob_id409: the job exists but cannot perform that action now503: the OpenAPI wrapper has no localJobStore
- Mutating tools assume the target node, VM, container, storage pool, or archive already exists unless the tool itself creates it.
- VM command execution requires a running VM with QEMU Guest Agent available.
- Container command execution requires SSH to the Proxmox host and a running target container.
- Backup restore uses a new target
vmid; it is not an in-place overwrite workflow.
Several container tools accept a selector parameter. Supported forms:
123pve1:123pve1/namename- comma-separated lists for bulk operations
Selector-based tools fail when no container matches the selector or when a bulk selector includes invalid targets.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
get_nodes |
Read-only | none | none | Proxmox API reachable | auth failure, API unavailable |
get_node_status |
Read-only | node |
none | target node exists | unknown node, auth failure |
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
get_vms |
Read-only | none | none | Proxmox API reachable | partial node-query failures may reduce returned coverage |
create_vm |
Mutating | node, vmid, name, cpus, memory, disk_size |
storage, ostype, network_bridge, pool |
target node exists and selected storage is valid | duplicate vmid, invalid storage or resource pool, insufficient permissions or resources |
clone_vm |
Mutating | node, source_vmid, target_vmid |
name, target_node, full=true, storage, pool, snapname |
source VM exists and target VM ID is free | duplicate target VM ID, clone permission failure, invalid storage or snapshot |
start_vm |
Mutating | node, vmid |
none | VM exists | VM not found, node mismatch |
stop_vm |
Mutating | node, vmid |
none | VM exists | VM not found, stop failure from Proxmox |
shutdown_vm |
Mutating | node, vmid |
none | VM exists | guest shutdown unavailable or timeout on guest side |
reset_vm |
Mutating | node, vmid |
none | VM exists | VM not found, reset rejected by Proxmox |
delete_vm |
Mutating | node, vmid |
force=false |
VM exists | running VM without force, VM not found |
execute_vm_command |
Mutating | node, vmid, command |
approval_token |
VM running, QEMU Guest Agent installed, policy allows command | guest agent unavailable, VM not running, policy denial |
get_vm_config |
Read-only | node, vmid |
none | VM exists | VM not found, node mismatch |
set_vm_description |
Mutating | node, vmid, description |
none | VM exists and API token can update its config | VM not found, node mismatch, insufficient permissions |
stop_vmis the force-stop path. Useshutdown_vmfor graceful guest shutdown when supported.execute_vm_commandis not a generic SSH shell. It is mediated through QEMU Guest Agent and command-policy checks.create_vm.poolis an optional Proxmox resource pool, not a storage pool. Pool-scoped API tokens also needPool.Allocateon the target pool.create_vm,clone_vm,start_vm,stop_vm,shutdown_vm,reset_vm, anddelete_vmregister persistent jobs when they return asynchronous Proxmox tasks.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
get_containers |
Read-only | none | node, include_stats=false, include_raw=false, format_style=pretty|json, legacy payload object |
Proxmox API reachable | invalid payload shape, auth failure |
start_container |
Mutating | selector |
format_style=pretty|json |
selector resolves to one or more containers | no selector match, start failure from Proxmox |
stop_container |
Mutating | selector |
graceful=true, timeout_seconds=10, format_style=pretty|json |
selector resolves to one or more containers | no selector match, timeout on graceful shutdown, container already stopped |
restart_container |
Mutating | selector |
timeout_seconds=10, format_style=pretty|json |
selector resolves to one or more containers | no selector match, reboot failure |
update_container_resources |
Mutating | selector |
cores, memory, swap, disk_gb, disk=rootfs, format_style=pretty|json |
selector resolves to one or more containers | no selector match, invalid resize target, resource update rejected |
create_container |
Mutating | node, vmid, ostemplate |
hostname, cores=1, memory=512, swap=512, disk_size=8, storage, password, ssh_public_keys, network_bridge=vmbr0, start_after_create=false, onboot=false, nesting=false, unprivileged=true, pool |
target node exists, template path valid, target storage valid | duplicate vmid, missing template, invalid storage, resource pool, or bridge |
delete_container |
Mutating | selector |
force=false, format_style=pretty|json |
selector resolves to one or more containers | no selector match, running container without force, delete failure |
execute_container_command |
Mutating | selector, command |
approval_token |
only registered when ssh config exists; container must be running; policy must allow command |
tool unavailable without SSH config, no selector match, SSH failure, policy denial |
update_container_ssh_keys |
Mutating/high-risk | node, vmid, public_keys |
mode=append|replace, approval_token |
only registered when ssh config exists; target container reachable through configured execution path; high-risk policy must allow the operation |
tool unavailable without SSH config, invalid container target, SSH failure, approval required |
get_container_config |
Read-only | node, vmid |
none | target container exists | container not found, node mismatch |
set_container_description |
Mutating | node, vmid, description |
none | target container exists and API token can update its config | container not found, node mismatch, insufficient permissions |
get_container_ip |
Read-only | node, vmid |
none | target container exists | container not found, IP information unavailable |
get_containersexposes flat top-level parameters for stricter MCP clients. The legacypayloadobject is still accepted for existing callers.update_container_resources.disk_gbis an additional resize amount for the selected disk, not a full replacement size target.create_container.start_after_createcontrols immediate startup after provisioning.create_container.nestingandcreate_container.unprivilegedchange container execution characteristics and should match your Proxmox policy.create_container.poolis an optional Proxmox resource pool, not thestorageused forrootfs. Pool-scoped API tokens also needPool.Allocateon the target pool.create_container,start_container,stop_container,restart_container, anddelete_containercreate persistent job records for asynchronous task tracking.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
list_snapshots |
Read-only | node, vmid |
vm_type=qemu|lxc |
target VM or container exists | wrong vm_type, missing target |
create_snapshot |
Mutating | node, vmid, snapname |
description, vmstate=false, vm_type=qemu|lxc |
target exists | duplicate snapshot name, unsupported vmstate use, wrong target type |
delete_snapshot |
Mutating | node, vmid, snapname |
vm_type=qemu|lxc |
snapshot exists | snapshot not found, wrong target type |
rollback_snapshot |
Mutating | node, vmid, snapname |
vm_type=qemu|lxc |
snapshot exists | snapshot not found, rollback rejected by Proxmox |
rollback_snapshotis a disruptive restore action and should be treated as an operationally sensitive step.vmstateapplies to VM snapshots and is not a general LXC memory-capture option.create_snapshot,delete_snapshot, androllback_snapshotall register persistent jobs when Proxmox returns a taskUPID.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
list_isos |
Read-only | none | node, storage |
Proxmox API reachable | invalid node or storage filter |
list_templates |
Read-only | none | node, storage |
Proxmox API reachable | invalid node or storage filter |
download_iso |
Mutating | node, storage, url, filename |
checksum, checksum_algorithm=sha256 |
target storage writable and reachable by Proxmox | invalid URL, checksum mismatch, unsupported storage target |
delete_iso |
Mutating | node, storage, filename |
none | file exists in target storage | file not found, storage mismatch |
list_templatesis commonly used to discover a validostemplatevalue forcreate_container.- When
checksumis supplied,checksum_algorithmmust match the provided digest. download_isoanddelete_isoregister jobs so callers can poll progress from the samejob_id.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
list_backups |
Read-only | none | node, storage, vmid |
backup-capable storage reachable | invalid filter or storage mismatch |
create_backup |
Mutating | node, vmid, storage |
compress=0|gzip|lz4|zstd, mode=snapshot|suspend|stop, notes |
target workload exists and storage accepts backups | invalid mode, storage unavailable, backup job rejected |
restore_backup |
Mutating | node, archive, vmid |
storage, unique=true |
archive exists and target vmid is free |
missing archive, duplicate target vmid, invalid target storage |
delete_backup |
Mutating | node, storage, volid |
none | backup volume exists | volume not found, storage mismatch |
restore_backuprestores into a newvmid.create_backup.modechanges how Proxmox coordinates workload state during backup and may affect runtime interruption characteristics.create_backup,restore_backup, anddelete_backupregister persistent jobs and support laterpoll,cancel, andretrythrough the job surface.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
list_jobs |
Read-only | none | status, tool_name, limit=100 |
in-process JobStore enabled |
job store unavailable |
get_job |
Read-only | job_id |
refresh=false |
job exists | unknown job_id |
poll_job |
Mutating | job_id |
none | job exists and has a Proxmox UPID |
unknown job_id, backend poll failure |
cancel_job |
Mutating | job_id |
none | job exists and supports cancellation | unknown job_id, no UPID, cancel conflict |
retry_job |
Mutating | job_id |
none | job exists and has a retry recipe | unknown job_id, no retry recipe, handler unavailable |
get_job(refresh=true)is the HTTP equivalent of callingpoll_job.- Completed jobs stay queryable until you remove the SQLite file or add retention logic.
previous_upidsrecords earlier Proxmox task IDs after retries.audit_logstores creation, polling, retry, and cancellation events for operator review.
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
get_storage |
Read-only | none | none | Proxmox API reachable | auth failure, cluster query failure |
get_cluster_status |
Read-only | none | none | Proxmox API reachable | auth failure, cluster query failure |
| Tool | Mode | Required Inputs | Optional Inputs | Prerequisites | Common Failures |
|---|---|---|---|---|---|
get_node_syslog |
Read-only | node |
limit=100, start, since, until, service |
target node exists | unknown node, auth failure |
get_task_log |
Read-only | node, upid |
start, limit=50 |
task exists on the node | unknown upid, node mismatch |
get_cluster_log |
Read-only | none | max_entries=50 |
Proxmox API reachable | auth failure, cluster query failure |
get_node_firewall_log |
Read-only | node |
limit=100, start, since, until |
target node exists | unknown node, firewall logging disabled yields few or no entries |
get_guest_firewall_log |
Read-only | node, vmid |
vm_type=qemu|lxc, limit=100, start, since, until |
guest exists on the node | unknown guest, wrong vm_type, guest firewall logging disabled |
- All tools in this group are read-only and never modify Proxmox state.
get_node_syslog.since/untiltake date/time strings (YYYY-MM-DD[ HH:MM[:SS]]); the firewall variants take UNIX epoch integers.get_task_logaccepts any Proxmox taskUPID(for example the Task ID returned by mutating tools), whilepoll_joboperates on the persistent job records created by this server's mutating tools.- Log content is returned as-is from Proxmox and may include sensitive operational details; scope API token permissions accordingly.
When adding or changing a tool, update all of the following:
- tool implementation under
src/proxmox_mcp/tools/ - registration in the built-in plugin layer under
src/proxmox_mcp/services/builtin_tool_plugins.py - human-facing description in
src/proxmox_mcp/tools/definitions.py - tests under
tests/ - this page if parameters, prerequisites, or availability changed