mcp-sysadmin
Provides tools for managing Cloudflare zones, DNS records, cache purging, and WAF rules.
Provides tools for managing Hetzner Cloud resources, including servers, firewalls, volumes, and power actions.
Provides tools for managing Proxmox VE virtual machines, containers, snapshots, storage, backups, and cluster tasks.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-sysadminlist all VMs on the Proxmox cluster"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Sysadmin
Servidor MCP agnóstico de proveedor para administrar infraestructura heterogénea: servidores físicos, VPS por SSH, clusters Proxmox VE, paneles Virtualizor, Hetzner Cloud y Cloudflare.
A diferencia de MCPs atados a un hosting (p. ej. Cloudways), este proyecto usa un inventario JSON donde registras cada host con su proveedor y credenciales. Un mismo cliente MCP puede operar Proxmox en tu homelab, Virtualizor en un datacenter y servidores bare-metal en otra ubicación.
Arquitectura
flowchart LR
Client[Cliente MCP / Cursor] --> MCP[mcp-sysadmin]
MCP --> Inv[(inventory.json)]
MCP --> SSH[SSH]
MCP --> PVE[Proxmox API]
MCP --> VZ[Virtualizor API]
MCP --> HZ[Hetzner API]
MCP --> CF[Cloudflare API]
SSH --> Physical[Servidores físicos / VPS]
PVE --> VMs1[VMs KVM / LXC]
VZ --> VMs2[VPS OpenVZ/KVM/Xen]
HZ --> VMs3[Cloud Servers]
CF --> DNS[DNS / CDN / WAF]Related MCP server: nandi-proxmox-mcp
Proveedores soportados
Provider | Uso | Autenticación |
| Servidores físicos, VPS sin API, cualquier Linux | Clave privada o password |
| Clusters / nodos Proxmox VE | API Token ( |
| Panel Virtualizor (Admin API) |
|
| Hetzner Cloud (servidores, firewalls, volúmenes) | API Token ( |
| DNS, CDN, WAF (zonas y registros) | API Token ( |
Tools incluidos (38)
Inventario
list-hosts,get-host
Nodos / métricas
list-nodes,get-node-status,health-check
Máquinas virtuales / cloud
list-vms,list-containers,get-vm,vm-powerlist-vm-snapshots,create-vm-snapshotlist-proxmox-tasks,get-proxmox-tasklist-storage-usage,list-backups,create-backuplist-hetzner-firewalls,list-hetzner-volumes
Cloudflare (DNS / CDN)
list-zones,list-dns-records,get-dns-recordcreate-dns-record,update-dns-record,delete-dns-record(confirmToken)purge-cache(confirmToken)list-waf-rules
Red
list-network
SSH — operaciones controladas
ssh-exec,ssh-read-file(destructivas / confirmToken)
SSH — diagnóstico read-only
ssh-tail-log— journalctl o tail en/var/log/list-firewall-rules— UFW / nftables / iptableslist-systemd-units— failed / running / allcert-status— certbot / fechas SSLdns-lookup,check-endpointlist-cron,list-timersdocker-compose-ps
Instalación
📖 Manuales operativos:
manuales/— manual general y guías por provider.
Opción A — GitHub Packages + npx (recomendado)
Publicado en GitHub Packages como @kreodevs/mcp-sysadmin. No necesitas clonar el repo.
1. Registry de GitHub (una vez por máquina):
echo "@kreodevs:registry=https://npm.pkg.github.com" >> ~/.npmrcO copia .npmrc.example. Los paquetes públicos no requieren token para instalar.
2. Inventario — crea tu inventory.json en cualquier ruta (p. ej. ~/mcp/inventory.json). Puedes basarte en config/inventory.example.json.
3. Probar en terminal:
export SYSADMIN_INVENTORY_PATH=~/mcp/inventory.json
export SYSADMIN_PRODUCTION_MODE=true
export SYSADMIN_CONFIRM_TOKEN=$(openssl rand -hex 32)
npx -y @kreodevs/mcp-sysadmin4. Cliente MCP — configura npx (ver Instalación por cliente MCP abajo).
Cliente | Botón 1 clic |
Cursor | |
VS Code |
⚠️ Tras el 1 clic, edita en el diálogo:
SYSADMIN_INVENTORY_PATH(ruta a tu inventario) ySYSADMIN_CONFIRM_TOKEN.
Generar enlaces personalizados:
SYSADMIN_INVENTORY_PATH=/ruta/a/inventory.json ./scripts/generate-install-links.sh
# Modo desarrollo local (clone): INSTALL_MODE=local ./scripts/generate-install-links.shOpción B — Desarrollo desde fuente
git clone https://github.com/kreodevs/mcp-sysadmin.git
cd mcp-sysadmin
npm install
npm run build
cp config/inventory.example.json config/inventory.jsonUsa scripts/run-mcp.sh o npm run dev.
Publicar nueva versión (maintainers)
Sube la versión en
package.jsonysrc/index.tsCrea un GitHub Release (tag
vX.Y.Z) → el workflow.github/workflows/publish.ymlpublica en GitHub PackagesVerifica en Packages del repo:
@kreodevs/mcp-sysadmin
Configuración
Copia el inventario de ejemplo:
cp config/inventory.example.json config/inventory.jsonEdita
config/inventory.jsoncon tus hosts reales.Variables de entorno (opcional):
cp .env.example .envSYSADMIN_INVENTORY_PATH=./config/inventory.json
SYSADMIN_PRODUCTION_MODE=true
SYSADMIN_CONFIRM_TOKEN=un-secreto-largo-que-el-llm-no-conoce
SYSADMIN_READ_ONLY=false
SYSADMIN_REQUIRE_CONFIRM=true
SYSADMIN_RATE_LIMIT_MAX=30
SYSADMIN_HTTP_TIMEOUT_MS=30000
SYSADMIN_SSH_TIMEOUT_MS=30000ACL por host (inventario)
Cada host puede restringir qué tools puede usar el LLM:
{
"defaults": { "readOnly": false, "requireConfirm": true },
"hosts": [
{
"id": "pve-prod",
"readOnly": false,
"allowedTools": ["list-vms", "get-vm", "vm-power"],
"provider": "proxmox",
"...": "..."
}
]
}readOnly: true— solo tools de lectura en ese hostallowedTools— lista blanca; si se omite, todas las tools del provider están permitidas
Referencias a secretos en el inventario
Puedes usar ${VAR} para no guardar credenciales en texto plano:
{
"tokenSecret": "${PROXMOX_HOMELAB_TOKEN}",
"apiKey": "${VIRTUALIZOR_API_KEY}",
"apiPass": "${VIRTUALIZOR_API_PASS}"
}Ejemplo: Proxmox
{
"id": "pve-prod",
"name": "Proxmox Producción",
"provider": "proxmox",
"url": "https://10.0.0.2:8006",
"tokenId": "root@pam!cursor-mcp",
"tokenSecret": "${PROXMOX_TOKEN}",
"verifySsl": false,
"defaultNode": "pve1",
"tags": ["production"]
}Crea el token en Proxmox: Datacenter → Permissions → API Tokens.
Ejemplo: Virtualizor
{
"id": "vz-panel",
"name": "Virtualizor DC1",
"provider": "virtualizor",
"url": "https://panel.example.com:4085",
"apiKey": "${VIRTUALIZOR_API_KEY}",
"apiPass": "${VIRTUALIZOR_API_PASS}",
"tags": ["vps"]
}Ejemplo: Servidor físico (SSH)
{
"id": "metal-01",
"name": "Bare Metal Rack A",
"provider": "ssh",
"host": "203.0.113.50",
"port": 22,
"username": "root",
"privateKeyPath": "~/.ssh/id_ed25519",
"tags": ["physical", "production"]
}Ejemplo: Hetzner Cloud
{
"id": "hz-cloud",
"name": "Hetzner Cloud",
"provider": "hetzner",
"apiToken": "${HETZNER_API_TOKEN}",
"defaultLocation": "fsn1",
"allowedTools": ["list-vms", "get-vm", "vm-power", "list-nodes", "health-check"],
"tags": ["cloud", "hetzner"]
}Crea el token en Hetzner Cloud Console → Security → API Tokens (permisos Read & Write para power actions).
Ejemplo: Cloudflare
{
"id": "cf-main",
"name": "Cloudflare Production",
"provider": "cloudflare",
"apiToken": "${CLOUDFLARE_API_TOKEN}",
"defaultZoneId": "${CLOUDFLARE_ZONE_ID}",
"readOnly": true,
"allowedTools": ["list-zones", "list-dns-records", "get-dns-record", "list-waf-rules"],
"tags": ["dns", "cdn"]
}Crea un API Token en Cloudflare con permisos mínimos: Zone → DNS (Read) y, si necesitas escritura, DNS Edit + Cache Purge.
Instalación por cliente MCP
Transporte stdio: el cliente lanza npx @kreodevs/mcp-sysadmin (GitHub Packages) o un script local en desarrollo.
Requisito previo:
@kreodevs:registry=https://npm.pkg.github.comen~/.npmrco--registry=https://npm.pkg.github.comen losargsde npx (incluido en los ejemplos).
Instalación rápida (1 clic)
Los botones de la sección Instalación → Opción A usan npx + GitHub Packages. Solo debes ajustar SYSADMIN_INVENTORY_PATH y SYSADMIN_CONFIRM_TOKEN en el diálogo del IDE.
# Enlaces con tu inventario:
SYSADMIN_INVENTORY_PATH=/ruta/a/inventory.json ./scripts/generate-install-links.shCursor
Archivo: ~/.cursor/mcp.json (global) o .cursor/mcp.json (por proyecto)
UI: Settings → Tools & MCP → New MCP Server
Manual (GitHub Packages):
{
"mcpServers": {
"sysadmin": {
"command": "npx",
"args": ["-y", "--registry=https://npm.pkg.github.com", "@kreodevs/mcp-sysadmin"],
"env": {
"SYSADMIN_INVENTORY_PATH": "/ruta/a/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano",
"SYSADMIN_REQUIRE_CONFIRM": "true",
"PROXMOX_HOMELAB_TOKEN": "..."
}
}
}
}{
"mcpServers": {
"sysadmin": {
"command": "/ruta/absoluta/mcp-sysadmin/scripts/run-mcp.sh",
"env": {
"SYSADMIN_INVENTORY_PATH": "/ruta/absoluta/mcp-sysadmin/config/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano"
}
}
}
}Claude Desktop
Archivo:
SO | Ruta |
macOS |
|
Windows |
|
UI: Settings → Developer → Edit Config
{
"mcpServers": {
"sysadmin": {
"command": "npx",
"args": ["-y", "--registry=https://npm.pkg.github.com", "@kreodevs/mcp-sysadmin"],
"env": {
"SYSADMIN_INVENTORY_PATH": "/ruta/a/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano"
}
}
}
}Reinicia Claude Desktop tras guardar.
Claude Code (CLI)
claude mcp add sysadmin -- npx -y --registry=https://npm.pkg.github.com @kreodevs/mcp-sysadminExporta SYSADMIN_INVENTORY_PATH y SYSADMIN_CONFIRM_TOKEN en el entorno o en la config de Claude Code.
OpenCode
Archivo: opencode.json / opencode.jsonc (proyecto) o ~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sysadmin": {
"type": "local",
"command": [
"npx",
"-y",
"--registry=https://npm.pkg.github.com",
"@kreodevs/mcp-sysadmin"
],
"enabled": true,
"environment": {
"SYSADMIN_INVENTORY_PATH": "/ruta/a/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano",
"SYSADMIN_REQUIRE_CONFIRM": "true"
}
}
}
}OpenCode usa
environment, noenv. Elcommanddebe ser un array.
opencode mcp add
opencode mcp listVS Code
Archivo: .vscode/mcp.json (workspace)
Manual:
{
"servers": {
"sysadmin": {
"type": "stdio",
"command": "npx",
"args": ["-y", "--registry=https://npm.pkg.github.com", "@kreodevs/mcp-sysadmin"],
"env": {
"SYSADMIN_INVENTORY_PATH": "/ruta/a/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano"
}
}
}
}Requiere GitHub Copilot con MCP o extensión compatible.
Windsurf (Cascade)
Archivo: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"sysadmin": {
"command": "npx",
"args": ["-y", "--registry=https://npm.pkg.github.com", "@kreodevs/mcp-sysadmin"],
"env": {
"SYSADMIN_INVENTORY_PATH": "/ruta/a/inventory.json",
"SYSADMIN_PRODUCTION_MODE": "true",
"SYSADMIN_CONFIRM_TOKEN": "tu-secreto-humano"
}
}
}
}Pulsa Refresh en MCPs. Límite ~100 tools entre servidores.
Variables de entorno recomendadas (todos los clientes)
SYSADMIN_INVENTORY_PATH=/ruta/a/inventory.json
SYSADMIN_PRODUCTION_MODE=true
SYSADMIN_CONFIRM_TOKEN=<openssl rand -hex 32>
SYSADMIN_READ_ONLY=false
SYSADMIN_REQUIRE_CONFIRM=true
PROXMOX_HOMELAB_TOKEN=...
HETZNER_API_TOKEN=...
CLOUDFLARE_API_TOKEN=...Desarrollo local del servidor (sin cliente MCP):
npm run devSeguridad
Modo producción
Activa siempre en prod:
SYSADMIN_PRODUCTION_MODE=true
SYSADMIN_CONFIRM_TOKEN=<secreto-largo-aleatorio>Con esto:
SSH exige
hostKeyFingerprint(anti-MITM) — falla al arrancar si faltaSYSADMIN_CONFIRM_TOKENobligatorio — falla al arrancar si faltaSSH usa allowlist estricta (sin
cat/grep; lecturas solo víassh-read-file)Prohibido
passworden inventario SSHvm-powerrequiere confirmación incluso parastartRegex custom validadas (sin
.*ni patrones demasiado amplios)
Gate humano: confirmToken
El LLM puede poner confirm: true por prompt injection, pero no conoce SYSADMIN_CONFIRM_TOKEN (solo está en env del MCP, no en el chat):
{
"hostId": "bare-metal-01",
"command": "systemctl status nginx",
"confirm": true,
"confirmToken": "tu-secreto-humano-no-compartir-con-el-modelo"
}Tú proporcionas el token cuando apruebas la operación.
Token de un solo uso (recomendado)
./scripts/mcp-approve.sh
# Válido 5 minutos; úsalo como confirmToken en la tool callAlternativa: el token fijo SYSADMIN_CONFIRM_TOKEN en env MCP.
Obtener fingerprint SSH
ssh-keyscan -H 10.0.0.5 | ssh-keygen -lf -
# Copia la línea SHA256:... al inventario como hostKeyFingerprintControles implementados
Control | Descripción |
confirmToken | Secreto humano en env MCP; el modelo no lo tiene por defecto |
Modo producción | Allowlist SSH, host key pinning, sin passwords SSH |
Modo read-only |
|
ACL por host |
|
Allowlist SSH | Solo diagnóstico ( |
Lectura de archivos | Exclusivamente vía |
cwd restringido | Solo |
Regex inventario | Patrones custom validados; prohibido |
Blocklist SSH | Capa extra: |
Paths remotos |
|
Rate limit | 30 req/tool/host/min (configurable) |
TLS Proxmox |
|
Redacción | Secretos, configs VM, errores API filtrados |
Auditoría | JSON en stderr: |
Allowlist SSH por defecto
Incluye solo diagnóstico operativo: systemctl status, journalctl, docker ps/logs, kubectl get, ls, df, free, nginx -t, etc.
No incluye cat, grep, head, tail — usa ssh-read-file para leer archivos.
Añade patrones específicos en inventario (sin .*):
{
"allowedCommandPatterns": ["^systemctl restart nginx$"]
}Tools que requieren confirm + confirmToken
ssh-exec— siempressh-read-file— siemprevm-power— todas las acciones en producción; stop/shutdown/reboot/reset siemprecreate-vm-snapshot— siemprecreate-backup— siemprecreate-dns-record,update-dns-record,delete-dns-record,purge-cache— siempre
Checklist pre-producción
SYSADMIN_PRODUCTION_MODE=trueSYSADMIN_CONFIRM_TOKENgenerado (openssl rand -hex 32)Fingerprint SSH en cada host
Tokens Proxmox / Hetzner / Cloudflare con permisos mínimos
verifySsl: trueen ProxmoxallowedToolspor host según necesidadInventario sin passwords en texto plano
Probar una operación destructiva con token manual
CI y publicación
CI: GitHub Actions ejecuta
typecheck+builden cada push/PR amain(.github/workflows/ci.yml)Paquete npm:
@kreodevs/mcp-sysadminen GitHub Packages — publicado al crear un GitHub Release
Extensión
Para añadir otro proveedor (oVirt, VMware, AWS, etc.):
Añade el provider en
src/config/schema.tsImplementa cliente en
src/providers/<nombre>/client.tsRegístralo en
src/providers/registry.tsExpone tools en
src/tools/
La estructura sigue el patrón del cloudways-mcp-server, pero con inventario multi-proveedor en lugar de una API única.
Desarrollo
npm run typecheck
npm run buildThis 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 Servers
- AlicenseAqualityBmaintenanceMCP server for managing Proxmox VE clusters — provision VMs and containers, manage snapshots and backups, execute commands, browse storage, and monitor resources through natural language3414MIT
- AlicenseNot gradedqualityAmaintenanceAn open-source MCP server for managing Proxmox environments, including nodes, virtual machines, and containers. It enables users to perform inventory checks, status monitoring, and control operations directly through MCP-compatible tools.610MIT
- AlicenseNot gradedqualityCmaintenanceOpen-source MCP server for managing Hetzner Cloud infrastructure with two management layers: * Layer 1 — Hetzner Cloud API (35 tools): Server power control, metrics, snapshots, backups, firewalls, DNS zones and records, rescue mode, server rebuild and rescale. Works even when the server OS is unresponsive. * Layer 2 — SSH (25 tools): Service management (systemd), Nginx config and reload,MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI assistants real-time access to your homelab infrastructure. It enables querying node status, managing Docker containers, controlling Proxmox VMs, and inspecting OPNsense firewall state through natural conversation.2MIT
Related MCP Connectors
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for InsForge BaaS — database, storage, edge functions, and deployments
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/kreodevs/mcp-sysadmin'
If you have feedback or need assistance with the MCP directory API, please join our Discord server