proxmox-ve-mcp
proxmox-ve-mcp
Ein MCP-Server, der einen oder mehrere Proxmox VE-Hosts als Werkzeuge bereitstellt, die ein LLM-Client aufrufen kann – Inventar von Nodes, Gästen, Speicher und Netzwerk-Bridges, Live-Status abrufen und VMs und Container erstellen, klonen, starten, stoppen und löschen.
Es spricht MCP über Streamable HTTP, sodass es als eigener Dienst im Netzwerk läuft und nicht als lokaler Unterprozess eines Clients.
Entwickelt für universal-network-director, einen chatgesteuerten Multi-Vendor-Netzwerkmanager mit einer menschlichen Genehmigungsschranke bei jedem Schreibvorgang – aber es ist ein eigenständiger MCP-Server und funktioniert mit jedem MCP-Client.
Nicht verbunden mit, unterstützt von oder befürwortet durch die Proxmox Server Solutions GmbH. „Proxmox“ und „Proxmox VE“ sind Marken ihrer jeweiligen Eigentümer und werden hier nur verwendet, um zu beschreiben, womit diese Software kommuniziert.
Lesen Sie dies, bevor Sie es auf die Produktion anwenden
Zwölf der vierundzwanzig Werkzeuge ändern den Zustand, und dieser Server fragt nicht vor der Ausführung. Es gibt keine Bestätigung und keinen Probelauf. Wenn ein Modell beschließt, eines aufzurufen, geschieht es.
Tool | Was es tut | Risiko |
| Setzt das Notizfeld eines Gasts | Kosmetisch. Umkehrbar. |
| Schaltet einen Gast ein | Niedrig. |
| ACPI-Herunterfahren – das Gast-Betriebssystem fährt sich selbst herunter | Nimmt eine Arbeitslast offline. Sauber. |
| Sauberer Neustart des Gasts | Nimmt eine Arbeitslast kurzzeitig offline. |
| Sofortiges Ausschalten, wie das Ziehen des Netzkabels | Nimmt eine Arbeitslast unsauber offline. Risiko von Dateisystemschäden. |
| Klont einen Gast in eine neue vmid | Verbraucht Speicher. Quelle unberührt. |
| Erstellt eine VM aus einem bereitgestellten Datenträgerabbild | Verbraucht Speicher und eine vmid. |
| Erstellt eine VM mit einer leeren Festplatte, die von einer Installations-ISO bootet | Verbraucht Speicher und eine vmid. |
| Lädt ein Datenträgerabbild von einer URL in den | Verbraucht Speicher und ausgehende Bandbreite. |
| Löscht ein bereitgestelltes Abbild, ISO oder Vorlage | Zerstörerisch. Lehnt ab, wenn ein Gast es noch verwendet. |
| Fügt eine Gast-NIC in eine Bridge ein oder entfernt sie | Kann einen laufenden Gast in das falsche Segment verschieben – oder aus dem Netzwerk entfernen. |
| Löscht einen Gast und seine Festplatten dauerhaft | Zerstörerisch und irreversibel. Kein Snapshot, kein Rückgängigmachen. |
Drei Möglichkeiten, damit umzugehen, in der Reihenfolge, in der sie tatsächlich helfen:
Beschränken Sie das Proxmox-API-Token auf schreibgeschützt. Dies ist die eigentliche Kontrolle und liegt auf Proxmox, nicht in diesem Code. Weisen Sie dem Token die integrierte Rolle
PVEAuditorunter dem Pfad/zu, und jedes Schreibwerkzeug schlägt an der API fehl, egal was ein Modell entscheidet. Tun Sie dies, es sei denn, Sie beabsichtigen ausdrücklich, dass die Schreibvorgänge funktionieren.Verwenden Sie die Sperrliste für geschützte Gäste.
config/protected-vms.jsonlistet Gäste auf, die die Schreibwerkzeuge nicht anfassen dürfen, lokal geprüft vor jedem Backend-Aufruf – sie gilt also auch, wenn ein Mensch versehentlich etwas genehmigt. Eine fehlende oder nicht analysierbare Datei verweigert jeden Gast-Schreibvorgang, anstatt stillschweigend nichts zu schützen. Siehe unten.Schalten Sie die Schreibvorgänge in Ihrem Client frei. Jedes zustandsändernde Werkzeug hat das Präfix
write_. Dieses Präfix ist eine Konvention dieser Codebasis, damit ein Client darauf abgleichen und diese Aufrufe vor der Ausführung durch einen menschlichen Genehmigungsschritt leiten kann. Dieser Server tut das bewusst nicht selbst – er hat keinen Benutzer, den er fragen könnte.
Der MCP-Endpunkt hat keine Authentifizierung
Dieser Server stellt seine Werkzeuge jedem zur Verfügung, der seinen Port erreichen kann. Es gibt kein Token, keine Client-Authentifizierung, kein TLS auf der MCP-Seite.
MCP_HOST standardmäßig auf 127.0.0.1 aus diesem Grund. Das Container-Image setzt 0.0.0.0, weil es muss, was bedeutet: Das Veröffentlichen des Container-Ports legt eine nicht authentifizierte Steuerungsebene für Ihre Hypervisoren auf dieses Interface. Halten Sie es in einem internen Netzwerk mit dem Client oder terminieren Sie TLS und Authentifizierung davor.
Multi-Host von Grund auf
Proxmox-Cluster teilen sich eine API, aber viele Setups betreiben mehrere eigenständige Hosts in verschiedenen Subnetzen ohne Cluster zwischen ihnen. Dieser Server hält eine Verbindung pro Host, identifiziert durch ein kurzes freies Label, und jedes Werkzeug nimmt dieses Label, um auszuwählen, mit welchem Host es spricht.
Ein Host wird durch ein Paar von Umgebungsvariablen definiert:
PROXMOX_SERVER1_URL=https://pve1.example.com:8006
PROXMOX_SERVER1_TOKEN='automation@pve!mcp=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'Das <LABEL> in PROXMOX_<LABEL>_URL, kleingeschrieben, wird zum host-Wert, den die Werkzeuge verwenden (server1 oben). Fügen Sie einen dritten Host hinzu, indem Sie ein drittes Paar hinzufügen – keine Codeänderung. Benennen Sie sie nach dem Standort, damit das Modell und die Protokolle klar lesbar sind.
Das Token ist die gesamte Zeichenfolge user@realm!tokenid=secret, die einmalig bei der Erstellung unter Datacenter → Permissions → API Tokens angezeigt wird. Die Authentifizierung ist zustandslos: Jede Anfrage trägt einen Authorization: PVEAPIToken=...-Header. Es gibt keinen Login-Aufruf und kein CSRF-Token – das ist der Benutzername/Passwort-Session-Pfad, den dies bewusst nicht verwendet.
Setzen Sie PROXMOX_VERIFY_TLS=false für Hosts mit selbstsignierten Zertifikaten. Standardmäßig ist es aktiviert.
Die Sperrliste für geschützte Gäste
config/protected-vms.json wird schreibgeschützt in den Container eingebunden und enthält die Gäste, die Schreibwerkzeuge niemals berühren dürfen:
{
"protected_vms": [
{
"host": "server1",
"vmid": 100,
"name": "example-mcp-host",
"reason": "EXAMPLE -- the VM this MCP server itself runs in"
}
]
}host ist das Label aus list_hosts, nicht der Proxmox-Node-Name. reason wird wörtlich in der Ablehnung angezeigt, also schreiben Sie es für denjenigen, der darauf stößt.
Diese Datei soll in Git nachverfolgt werden. Sie begann als Umgebungsvariable in einer nicht verfolgten .env, was bedeutete, dass der Schutz einen frischen Klon nicht überlebte und eine leere Liste genauso aussah wie eine gefüllte. Jetzt verweigert eine fehlende oder nicht analysierbare Datei jeden Gast-Schreibvorgang; eine leere Liste ist erlaubt, protokolliert jedoch eine laute Warnung beim Start.
Die hier mitgelieferten Einträge sind Beispiele. Ersetzen Sie sie, bevor Sie dies auf etwas anwenden, das Ihnen wichtig ist.
Ausführen
docker build -t proxmox-ve-mcp .
docker run --rm \
-e PROXMOX_SERVER1_URL=https://pve1.example.com:8006 \
-e PROXMOX_SERVER1_TOKEN='automation@pve!mcp=...' \
-e PROXMOX_VERIFY_TLS=false \
-v "$PWD/config/protected-vms.json:/app/config/protected-vms.json:ro" \
-p 127.0.0.1:8002:8002 \
proxmox-ve-mcpOder installieren Sie pip install -r requirements.txt in einer virtuellen Umgebung und führen Sie python server.py direkt aus.
Variable | Standard | Bedeutung |
| — | API-Root eines Hosts, z.B. |
| — | Die vollständige Zeichenfolge |
|
| Setzen Sie |
| nicht gesetzt | Notausstieg ( |
|
| Pfad zur Sperrliste |
|
| Bindungsadresse (das Image setzt |
|
| Bindungsport |
Tests
Eigenständige Skripte, kein pytest. Führen Sie sie im Container aus, damit sie die PROXMOX_*-Umgebung haben, die der Client benötigt:
docker run --rm proxmox-ve-mcp python test_network_bridges.py
docker run --rm proxmox-ve-mcp python test_media_in_use.py
docker run --rm proxmox-ve-mcp python test_client.pyDie Offline-Abschnitte verwenden erfundene Schnittstellen- und Gastlisten und bestehen ohne konfigurierte Hosts. Die Live-Abschnitte lesen, worauf Ihre PROXMOX_*-Variablen zeigen, und überspringen sauber, wenn nichts konfiguriert ist – zeigen Sie sie auf einen echten Host, um die eine Unterscheidung zu üben, die nicht vorgetäuscht werden kann: ob eine Bridge angebunden oder isoliert ist.
Design-Notizen
/cluster/resourcesist das Inventar-Rückgrat. Ein Aufruf gibt jede VM, jeden Container, Node und Speicher zurück, bereits mit Node, vmid und Typ gekennzeichnet. Es funktioniert auch auf einem eigenständigen Host (es meldet diesen einen Node), daher wird dies verwendet, anstatt pro Node/nodes→/nodes/{node}/qemuzu durchlaufen.list_network_bridgesexistiert, weil eine NIC auf der falschen Bridge ein Gast ist, den Sie nicht erreichen können. Es meldet pro Bridge, ob sie einen Mitgliedsport (einen Weg aus der Box) hat oder ein isoliertes Segment ist – die Unterscheidung, die entscheidet, ob eine neue VM erreichbar hochkommt.VLAN-Tags schlagen geschlossen fehl. Ein
tag=auf einer Bridge, die nichtbridge_vlan_awareist, wird von Proxmox akzeptiert und dann stillschweigend nicht übertragen – ungetaggter Verkehr, wo Isolation verlangt wurde. Die Schreibpfade lehnen dies ab, anstatt zu warnen, und lehnen ab, wenn sie die Bridge-Liste nicht lesen können, um zu prüfen.Schreibvorgänge sind asynchron. Die meisten geben eine Proxmox-UPID zurück; fragen Sie sie mit
get_task_statusab, anstatt auf Abschluss zu warten.Gast-Schreibvorgänge laufen hinter einer Absicherung. Ein einzelner Wrapper führt die Prüfung auf geschützte VMs und die Auflösung von vmid→Node/Art durch, sodass ein einzelnes Werkzeug die Absicherung nicht vergessen kann und das Backend für einen geschützten Gast nicht erreichen kann.
Lizenz
Apache-2.0. See LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for the FFmpeg Micro video transcoding API — create, monitor, download transcodes.
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/anderson-jason573/proxmox-ve-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server