ProxmoxMCP-Plus
Run day-to-day Proxmox VE work, from VMs and LXCs to snapshots, backups and ISOs, from an MCP client
Homelab operations over MCP: change reports, Docker, backups, app installs and Proxmox guests
By SangheeSon (individual) Go Local · stdio DevOps and monitoring
57 popularity score ★ 315 ↓ 397/wk
Opens the app, which asks before it adds the server.
claude mcp add homebutler -- npx -y homebutler@latest{
"mcpServers": {
"homebutler": {
"command": "npx",
"args": [
"-y",
"homebutler@latest"
]
}
}
}{
"mcpServers": {
"homebutler": {
"command": "npx",
"args": [
"-y",
"homebutler@latest"
]
}
}
}{
"servers": {
"homebutler": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"homebutler@latest"
]
}
}
}[mcp_servers.homebutler]
command = "npx"
args = ["-y", "homebutler@latest"]gemini mcp add --scope user homebutler npx -- -y homebutler@latestOpens the app, which asks before it adds the server.
go install github.com/Higangssh/homebutler@latestclaude mcp add homebutler -- homebutler mcp{
"mcpServers": {
"homebutler": {
"command": "homebutler",
"args": [
"mcp"
]
}
}
}{
"mcpServers": {
"homebutler": {
"command": "homebutler",
"args": [
"mcp"
]
}
}
}{
"servers": {
"homebutler": {
"type": "stdio",
"command": "homebutler",
"args": [
"mcp"
]
}
}
}[mcp_servers.homebutler]
command = "homebutler"
args = ["mcp"]gemini mcp add --scope user homebutler homebutler -- mcp--max-risk |
Optional: Command-line flag after `mcp` (or after the npx package name): highest tool class offered, read, write or destructive. |
|---|
homebutler is one Go binary that bundles a command line, a web dashboard and an MCP server for a home server, all built on the same code. The MCP part talks JSON-RPC over stdio and hands back typed results, so nobody has to open a shell on the box for it. Most people start with `report`. It saves a snapshot of the machine and compares it with the one before, tagging each difference with one of eight kinds (gone, new, replaced, image, state, port, disk, skipped). A container recreated under the same name shows up as replaced even when the count did not move. When a comparison could not be made, it is marked skipped instead of passing as all clear.
Beyond that there are tools for load and processes, open ports and LAN discovery. Docker containers can be listed, inspected, restarted or stopped, and their logs read. Restarts can be watched, with an incident history kept. Compose backups come with a drill that boots an archive in an isolated container and checks it answers HTTP. It also installs apps from a built-in catalogue using generated compose files, and reads Proxmox VE nodes, guests and tasks. Most tools take an optional `server` argument, which runs them over SSH on a machine named in the config.
At v1.3.0, internal/capability/capability.go registers 44 tools and tags each by risk: 27 read, 13 write, 4 destructive. The tool table in the MCP docs has 40 of them and misses `watch_add`, `watch_remove`, `notify_test` and `alerts_history`. The `mcp` command takes a `--max-risk` ceiling. Tools above it drop out of the list and are refused if called by name anyway. It defaults to destructive, which offers everything. Under `--max-risk read`, `report` stays available but never saves a snapshot, whatever the caller sends (cmd/mcp.go). Add `--demo` for made-up data that touches no real machine.
| Runtime | Node.js 16+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Node.js 16 or later for the npx route. On first install the npm package downloads a prebuilt binary from GitHub releases for Linux, macOS or Windows on x64 or arm64, so it needs internet access then. Remote servers need SSH set up in ~/.config/homebutler/config.yaml (`homebutler init` walks you through it), with the binary copied there by `homebutler deploy`. Proxmox needs an API token in the config, plus a second action token for guest power actions. The source route needs Go 1.25 or later.
MCP runs over stdio only, with no HTTP transport. By design there are no tools for accepting SSH host keys, deploying to or upgrading remote hosts, or running the dashboard or watcher daemon; those stay on the CLI. Proxmox guest power tools need literal `confirm: true` and a separate action token. `proxmox_script_command` prints a pinned script command but never runs it. `backup_restore` refuses bind mounts named in an archive. Restart history is only recorded while a watcher runs. The npm package's README shows `npx -y homebutler-mcp`, which is an older separate package (0.7.3); the repository's `npx -y homebutler@latest` is current.
A good fit if you run a homelab of Docker hosts, perhaps with Proxmox, and want an assistant to tell you what changed since last time and handle routine jobs such as restarts, backups and app installs without an open SSH shell. It runs on your own machine and needs no account. If you only want the assistant to look, start it with `--max-risk read` and the tools that stop containers, purge apps or restore volumes are neither offered nor callable. Look elsewhere for cloud infrastructure, Kubernetes, or a server a hosted assistant reaches over HTTP, since it only speaks stdio.
27 only read, 13 change things, 4 can delete or overwrite. A ? marks an optional parameter.
proxmox_statusendpoint?: stringproxmox_guestsendpoint?: stringnode?: stringstatus?: stringtype?: stringproxmox_nodeendpoint?: stringnode: stringproxmox_tasksendpoint?: stringnode: stringsystem_statusserver?: stringproxmox_guest_start changesendpoint: stringnode: stringtype: enumvmid: integerconfirm: booleanproxmox_guest_reboot changesendpoint: stringnode: stringtype: enumvmid: integerconfirm: booleanproxmox_guest_shutdown deletesendpoint: stringnode: stringtype: enumvmid: integerconfirm: booleanproxmox_task_statusendpoint: stringnode: stringupid: stringproxmox_script_listproxmox_script_commandslug: stringdocker_listserver?: stringdocker_restart changesname: stringserver?: stringdocker_stop deletesname: stringserver?: stringdocker_logsname: stringlines?: integerserver?: stringdocker_statsserver?: stringdocker_topname: stringserver?: stringdocker_inspectname: stringserver?: stringwake changestarget: stringbroadcast?: stringopen_portsserver?: stringnetwork_scanalertsserver?: stringinventory_scanserver?: stringinventory_exportformat?: stringserver?: stringreport changeskeep?: integerno_save?: booleanserver?: stringdoctorbackup_max_age_hours?: integerserver?: stringwatch_check changesserver?: stringprocesseslimit?: integersort_by?: stringserver?: stringconfig_validatestrict?: booleanwatch_historylimit?: integercontainer?: stringinclude_logs?: booleanserver?: stringwatch_listserver?: stringwatch_add changescontainer: stringkind?: enumunit?: stringserver?: stringwatch_remove changescontainer: stringserver?: stringnotify_test changesserver?: stringalerts_historyserver?: stringbackup_create changesservice?: stringto?: stringserver?: stringbackup_listserver?: stringbackup_drill changesapp?: stringall?: booleanarchive?: stringserver?: stringbackup_restore deletesarchive: stringservice?: stringserver?: stringinstall_listinstall_app changesapp: stringport?: integerinstall_statusapp: stringinstall_uninstall changesapp: stringinstall_purge deletesapp: string