Hetzner Cloud MCP Server
Servidor MCP para la API de Hetzner Cloud: administra servidores, redes, volúmenes, firewalls, balanceadores de carga y más. 104 herramientas en 13 dominios de recursos.
Documentación
hetzner-mcp-server
Servidor MCP para la API de Hetzner Cloud. Gestiona servidores, redes, volúmenes, firewalls, balanceadores de carga y más a través del Protocolo de Contexto de Modelo.
185 herramientas en 15 dominios de recursos, con 9 puntos de entrada para que puedas elegir el servidor adecuado según el límite de herramientas de tu cliente MCP. También se expone un Recurso de referencia de API de solo lectura (reference://hetzner/api) en cada punto de entrada.
Instalación
npm install -g @lazyants/hetzner-mcp-server
O ejecuta directamente:
npx @lazyants/hetzner-mcp-server
Configuración
Establece tu token de API de Hetzner Cloud:
export HETZNER_API_TOKEN=your-token-here
Obtén un token desde la Consola de Hetzner Cloud en Seguridad > Tokens de API.
Las herramientas de Storage Box utilizan un host separado (https://api.hetzner.com/v1). Usan HETZNER_STORAGE_API_TOKEN si está configurado; de lo contrario, recurren a HETZNER_API_TOKEN, de modo que un solo token sigue funcionando. Establece HETZNER_STORAGE_API_TOKEN solo si limitas el acceso a Storage Box a un token dedicado:
export HETZNER_STORAGE_API_TOKEN=your-storage-token-here # optional
Puntos de entrada
| Comando | Dominios | Herramientas |
|---|---|---|
hetzner-mcp-server | Los 15 dominios | 185 |
hetzner-mcp-servers | Servidores, Ubicaciones/Tipos de servidor, Precios | 33 |
hetzner-mcp-networking | Redes, Firewalls | 23 |
hetzner-mcp-load-balancers | Balanceadores de carga, Certificados | 29 |
hetzner-mcp-ips | IPs flotantes, IPs primarias | 21 |
hetzner-mcp-storage | Volúmenes, Imágenes | 18 |
hetzner-mcp-storage-boxes | Storage Boxes (+ instantáneas, subcuentas, tipos) | 30 |
hetzner-mcp-config | Claves SSH, ISOs, Grupos de colocación | 15 |
hetzner-mcp-dns | Zonas DNS | 23 |
Cada punto de entrada incluye hetzner_wait_for_action; el servidor completo lo registra una sola vez.
Usa servidores divididos para reducir el tamaño del contexto: elige solo las divisiones que necesites.
Claude Code
Añade a ~/.claude/settings.json:
{
"mcpServers": {
"hetzner": {
"command": "npx",
"args": ["-y", "@lazyants/hetzner-mcp-server"],
"env": {
"HETZNER_API_TOKEN": "your-token-here"
}
}
}
}
O usa servidores divididos (elige las divisiones que necesites):
{
"mcpServers": {
"hetzner-servers": {
"command": "npx",
"args": ["-y", "-p", "@lazyants/hetzner-mcp-server", "hetzner-mcp-servers"],
"env": { "HETZNER_API_TOKEN": "your-token-here" }
},
"hetzner-networking": {
"command": "npx",
"args": ["-y", "-p", "@lazyants/hetzner-mcp-server", "hetzner-mcp-networking"],
"env": { "HETZNER_API_TOKEN": "your-token-here" }
}
}
}
Claude Desktop
Añade a claude_desktop_config.json:
{
"mcpServers": {
"hetzner": {
"command": "npx",
"args": ["-y", "@lazyants/hetzner-mcp-server"],
"env": {
"HETZNER_API_TOKEN": "your-token-here"
}
}
}
}
Herramientas
Las herramientas de listado principal exponen sort para servidores, volúmenes, redes, firewalls, balanceadores de carga, IPs, certificados, claves SSH y grupos de colocación. El listado de imágenes también admite bound_to (un ID de servidor o un array) y include_deprecated. Las métricas de servidores y balanceadores de carga aceptan step en segundos; la creación de redes acepta expose_routes_to_vswitch.
Establece resource en hetzner_get_pricing a server_types, load_balancer_types, volume, floating_ips, primary_ips, traffic, image o server_backup para reducir la respuesta. Los resultados filtrados conservan la moneda y el IVA; traffic selecciona el tráfico incluido específico de la ubicación y los precios de tráfico adicional para tipos de servidor y balanceador de carga.
Espera de acciones (1 herramienta compartida) — cada punto de entrada
hetzner_wait_for_action acepta domain, resource_id, action_id y un timeout opcional en segundos (predeterminado 300, máximo 3600). Consulta el historial de acciones paginado por recurso y devuelve la acción completa cuando su estado se convierte en success o error; los estados faltantes o desconocidos siguen esperando hasta el tiempo de espera. Los dominios admitidos son servidores, balanceadores_de_carga, volúmenes, redes, firewalls, IPs_flotantes, IPs_primarias, certificados, imágenes, zonas y storage_boxes; los Storage Boxes usan su host de API separado. La fecha límite limita las solicitudes y los retrasos por límite de velocidad, y la cancelación de MCP detiene la espera.
Servidores (27 herramientas) — servidores
hetzner_list_servers, hetzner_get_server, hetzner_create_server, hetzner_update_server, hetzner_delete_server, hetzner_power_on, hetzner_power_off, hetzner_reboot, hetzner_reset, hetzner_shutdown, hetzner_rebuild_server, hetzner_resize_server, hetzner_enable_rescue, hetzner_disable_rescue, hetzner_get_server_metrics, hetzner_list_server_actions, hetzner_change_server_protection, hetzner_request_console, hetzner_enable_backup, hetzner_disable_backup, hetzner_change_alias_ips, hetzner_change_dns_ptr, hetzner_attach_server_to_network, hetzner_detach_server_from_network, hetzner_add_server_to_placement_group, hetzner_remove_server_from_placement_group, hetzner_reset_server_password
Imágenes (7 herramientas) — almacenamiento
hetzner_list_images, hetzner_get_image, hetzner_update_image, hetzner_delete_image, hetzner_create_image, hetzner_change_image_protection, hetzner_list_image_actions
ISOs (4 herramientas) — configuración
hetzner_list_isos, hetzner_get_iso, hetzner_attach_iso, hetzner_detach_iso
Grupos de colocación (5 herramientas) — configuración
hetzner_list_placement_groups, hetzner_get_placement_group, hetzner_create_placement_group, hetzner_update_placement_group, hetzner_delete_placement_group
Datos de referencia (5 herramientas) — servidores
hetzner_list_locations, hetzner_get_location, hetzner_list_server_types, hetzner_get_server_type, hetzner_get_pricing
Hetzner eliminó los endpoints de /datacenters después del 2026-10-01 (HTTP 410), y este servidor ya no expone hetzner_list_datacenters ni hetzner_get_datacenter. Usa hetzner_list_server_types (locations[].available/recommended) y hetzner_list_locations para obtener información de disponibilidad y región.
Redes (13 herramientas) — redes
hetzner_list_networks, hetzner_list_network_members, hetzner_get_network, hetzner_create_network, hetzner_update_network, hetzner_delete_network, hetzner_add_subnet, hetzner_delete_subnet, hetzner_add_route, hetzner_delete_route, hetzner_change_network_protection, hetzner_change_ip_range, hetzner_list_network_actions
hetzner_list_network_members devuelve servidores y balanceadores de carga adjuntos con IPs, alias, subred y estado de adjunto. Pasa una cadena o un array para type, subnet, status y sort; los arrays producen claves de consulta repetidas. Los resultados incluyen los metadatos de paginación de la API.
Firewalls (9 herramientas) — redes
hetzner_list_firewalls, hetzner_get_firewall, hetzner_create_firewall, hetzner_update_firewall, hetzner_delete_firewall, hetzner_set_firewall_rules, hetzner_apply_firewall, hetzner_remove_firewall, hetzner_list_firewall_actions
Balanceadores de carga (21 herramientas) — balanceadores-de-carga
hetzner_list_load_balancers, hetzner_get_load_balancer, hetzner_create_load_balancer, hetzner_update_load_balancer, hetzner_delete_load_balancer, hetzner_add_lb_target, hetzner_remove_lb_target, hetzner_add_lb_service, hetzner_update_lb_service, hetzner_delete_lb_service, hetzner_change_lb_algorithm, hetzner_change_lb_type, hetzner_attach_lb_to_network, hetzner_detach_lb_from_network, hetzner_get_lb_metrics, hetzner_list_lb_types, hetzner_change_load_balancer_protection, hetzner_list_load_balancer_actions, hetzner_enable_lb_public_interface, hetzner_disable_lb_public_interface, hetzner_change_lb_dns_ptr
Certificados (7 herramientas) — balanceadores-de-carga
hetzner_list_certificates, hetzner_get_certificate, hetzner_create_certificate, hetzner_update_certificate, hetzner_delete_certificate, hetzner_retry_certificate, hetzner_list_certificate_actions
Volúmenes (10 herramientas) — almacenamiento
hetzner_list_volumes, hetzner_get_volume, hetzner_create_volume, hetzner_update_volume, hetzner_delete_volume, hetzner_attach_volume, hetzner_detach_volume, hetzner_resize_volume, hetzner_change_volume_protection, hetzner_list_volume_actions
IPs flotantes (10 herramientas) — ips
hetzner_list_floating_ips, hetzner_get_floating_ip, hetzner_create_floating_ip, hetzner_update_floating_ip, hetzner_delete_floating_ip, hetzner_assign_floating_ip, hetzner_unassign_floating_ip, hetzner_change_floating_ip_rdns, hetzner_change_floating_ip_protection, hetzner_list_floating_ip_actions
IPs primarias (10 herramientas) — ips
hetzner_list_primary_ips, hetzner_get_primary_ip, hetzner_create_primary_ip, hetzner_update_primary_ip, hetzner_delete_primary_ip, hetzner_assign_primary_ip, hetzner_unassign_primary_ip, hetzner_change_primary_ip_rdns, hetzner_change_primary_ip_protection, hetzner_list_primary_ip_actions
Claves SSH (5 herramientas) — configuración
hetzner_list_ssh_keys, hetzner_get_ssh_key, hetzner_create_ssh_key, hetzner_update_ssh_key, hetzner_delete_ssh_key
Zonas DNS (22 herramientas) — dns
hetzner_list_zones, hetzner_get_zone, hetzner_create_zone, hetzner_update_zone, hetzner_delete_zone, hetzner_change_zone_protection, hetzner_change_zone_ttl, hetzner_change_zone_primary_nameservers, hetzner_export_zonefile, hetzner_import_zonefile, hetzner_list_zone_actions, hetzner_list_zone_rrsets, hetzner_get_zone_rrset, hetzner_create_zone_rrset, hetzner_update_zone_rrset, hetzner_delete_zone_rrset, hetzner_change_zone_rrset_protection, hetzner_change_zone_rrset_ttl, hetzner_add_zone_rrset_records, hetzner_remove_zone_rrset_records, hetzner_set_zone_rrset_records, hetzner_update_zone_rrset_records
Storage Boxes (29 herramientas) — storage-boxes
Los Storage Boxes usan el host https://api.hetzner.com/v1. Token: HETZNER_STORAGE_API_TOKEN (recurre a HETZNER_API_TOKEN).
hetzner_list_storage_boxes, hetzner_create_storage_box, hetzner_get_storage_box, hetzner_update_storage_box, hetzner_delete_storage_box, hetzner_list_storage_box_folders, hetzner_list_storage_box_actions, hetzner_change_storage_box_protection, hetzner_change_storage_box_type, hetzner_reset_storage_box_password, hetzner_update_storage_box_access_settings, hetzner_rollback_storage_box_snapshot, hetzner_enable_storage_box_snapshot_plan, hetzner_disable_storage_box_snapshot_plan, hetzner_list_storage_box_types, hetzner_get_storage_box_type, hetzner_list_storage_box_snapshots, hetzner_create_storage_box_snapshot, hetzner_get_storage_box_snapshot, hetzner_update_storage_box_snapshot, hetzner_delete_storage_box_snapshot, hetzner_list_storage_box_subaccounts, hetzner_create_storage_box_subaccount, hetzner_get_storage_box_subaccount, hetzner_update_storage_box_subaccount, hetzner_delete_storage_box_subaccount, hetzner_change_storage_box_subaccount_home_directory, hetzner_reset_storage_box_subaccount_password, hetzner_update_storage_box_subaccount_access_settings
Seguridad
- Nunca confirmes tu token de API en el control de versiones
- Usa tokens de solo lectura cuando solo necesites listar/obtener recursos
- Las herramientas de crear y eliminar cuestan dinero real: Hetzner factura por los recursos aprovisionados
- El servidor maneja la limitación de velocidad automáticamente (3,600 solicitudes/hora, retroceso exponencial en 429)
Aviso legal
Las operaciones de crear, actualizar y eliminar pueden generar cargos en tu cuenta de Hetzner Cloud. Usa tokens de API de solo lectura cuando sea posible. Los autores no son responsables de ningún costo incurrido.
Publicación
Las versiones se publican mediante el evento de Release de GitHub. Flujo del mantenedor:
-
Incrementa la versión en
package.jsonyserver.json(ambos#/versiony#/packages[0].version), luego ejecutanpm install --package-lock-onlypara sincronizarpackage-lock.json.node scripts/check-versions.mjsfalla de forma estricta a menos quepackage.json#/versioncoincida conserver.json#/packages[0].version;server.json#/versionse verifica de forma flexible: puede estar legítimamente adelantado (las republicaciones solo de registro incrementan solo ese campo), por lo que un valor desactualizado pasa con una línea deWARN:y sin fallo. Lee la salida del script en lugar de confiar en su código de salida.CHANGELOG.mdno se verifica en absoluto. -
Actualiza
CHANGELOG.md. -
Confirma y fusiona el incremento de versión a
mainantes de crear el release. Luego crea la etiqueta tú mismo, en un SHA que hayas verificado, y solo entonces crea el release a partir de ella:V=X.Y.Z && PR=<release-pr-number> && SHA="$(gh pr view "$PR" --json mergeCommit -q .mergeCommit.oid)" && test -n "$SHA" && git fetch origin main && git merge-base --is-ancestor "$SHA" origin/main && PKG="$(git show "$SHA:package.json")" && test "$(printf '%s' "$PKG" | node -pe 'JSON.parse(require("fs").readFileSync(0,"utf8")).version')" = "$V" && CL="$(git show "$SHA:CHANGELOG.md")" && printf '%s\n' "$CL" | awk -v v="$V" 'index($0,"## ["v"]")==1{f=1;next} /^## \[/{f=0} /^\[[0-9]+\.[0-9]+\.[0-9]+\]:/{f=0} f' > "/tmp/notes-v$V.md" && grep -q '[^[:space:]]' "/tmp/notes-v$V.md" && git tag -a "v$V" "$SHA" -m "v$V" && git push origin "v$V" && gh release create "v$V" --verify-tag --notes-file "/tmp/notes-v$V.md"Nunca ejecutes un
gh release create vX.Y.Zsin argumentos. Sin una etiqueta existente, coloca una en la punta de la rama predeterminada, por lo que ejecutarlo mientras el incremento sigue en una rama de release etiqueta el commit de la versión anterior. El flujo de trabajo luego publica cualquier versión que encuentre en elpackage.jsonde ese commit, y obtienes un GitHub Release devX.Y.Zque republica silenciosamente la versión anterior. El flujo de trabajo de publicación ahora se niega a continuar cuandoGITHUB_REF_NAMEno esv<package.json version>, por lo que ese escenario exacto falla antes denpm publishen lugar de republicar silenciosamente. La secuencia anterior sigue siendo necesaria y protege un caso que el flujo de trabajo no puede: la protección del flujo de trabajo solo se ejecuta una vez que ya existe un release, y pasa para cualquier commit que lleve la versión correcta, por lo que detecta un release mal etiquetado, no el commit incorrecto que se está etiquetando.Cada elemento es esencial:
gh pr view … .mergeCommit.oidnombra el commit de squash propio del PR de lanzamiento. No sustituyasgit rev-parse origin/main— eso es meramente lo que esté enmainen el momento en que mires, por lo que un merge no relacionado que llegue en el intervalo se etiquetaría y publicaría en su lugar.ghsale con código 0 y no imprime nada para un PR sin fusionar, de ahí eltest -nexplícito.- La cadena
&&se detiene en el primer fallo en lugar de pasar al paso irreversible. Ambas llamadas agit showse asignan a una variable en lugar de canalizarse directamente, por lo que su estado de salida se comprueba de verdad — una tubería informa solo del estado de su último comando a menos quepipefailesté configurado, lo cual no se asume aquí. git merge-base --is-ancestordemuestra que el commit es alcanzable desdemain. La mera existencia no es suficiente — un commit puede estar presente localmente porque se obtuvo alguna otra rama.- La prueba de versión lee
package.jsondel commit objetivo, no del árbol de trabajo, que aún mostraría la versión correcta mientras$SHAapuntara a otro lugar. - El
awkextrae la sección de esa versión delCHANGELOG.mddel commit para--notes-file. Se detiene en el siguiente encabezado## [o en la primera definición de referencia de enlace, porque la entrada más antigua no tiene encabezado después y de otro modo se tragaría todo el bloque de referencias de enlace.grep -qen lugar detest -sprotege el resultado: una sección vacía salvo su línea en blanco aún produce un archivo de un byte, quetest -sacepta.
- El flujo de trabajo
Publish to npm + MCP Registryse ejecuta automáticamente:npm publishcon procedencia, consulta el registro hasta que el tarball esté disponible, y luego empuja elserver.jsoncorrespondiente al Registro MCP mediantemcp-publisher.
El flujo de trabajo omite npm publish limpiamente si la versión ya está en npm (guardia de transición para lanzamientos que se publicaron parcialmente de forma manual).
Autenticación de npm
La publicación usa npm Trusted Publishing: el token OIDC de GitHub del flujo de trabajo (id-token: write) se intercambia por un token de publicación de un solo uso en tiempo de ejecución. No es necesario que ningún secreto NPM_TOKEN viva en el repositorio.
El enlace se configura en la interfaz web de npm (paquete → Trusted Publishers): proveedor GitHub Actions, organización lazyants, repositorio hetzner-mcp-server, flujo de trabajo publish-registry.yml.
Licencia
FSL-1.1-MIT — consulta LICENSE para los términos completos. Las versiones 1.1.1 y anteriores permanecen bajo licencia MIT.