Hetzner Cloud MCP Server — (Cloud API + SSH)

Hetzner Cloud MCP Server — two management layers (Cloud API + SSH) with 60 tools. Manage server power, snapshots, firewalls, DNS, plus SSH into servers for service control, log viewing, Nginx management, MySQL queries, and system monitoring. Self-hosted PHP, MIT licensed.

Hetzner Cloud MCP

Hetzner Cloud MCP Server

The only Hetzner MCP with SSH server management. API + SSH in one tool.

PHP 8.1+ License: MIT MCP Protocol

Manage your Hetzner Cloud infrastructure from Claude.ai, Claude Desktop, VS Code, Cursor, or any MCP-compatible client. Two management layers give you complete control:

  • Layer 1 — Hetzner Cloud API: Server power, 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: Services, logs, Nginx, MySQL, supervisor, cron, UFW, disk/memory/CPU monitoring. Real sysadmin tools, not just API wrappers.

60 tools. Dynamic multi-server configuration. Self-hosted and open source.


Why This MCP?

Every existing Hetzner MCP only wraps the Cloud API. This one adds a full SSH management layer — the tools you actually need when managing production servers. Two layers, 60 tools, self-hosted.

FeatureIncluded
Cloud API (server power, metrics, snapshots, backups, firewalls, rescue, rebuild)Yes
SSH Management (services, logs, Nginx, MySQL, system health)Yes
DNS Management (zones, records, CRUD)Yes
Multi-Server (1 to N servers from a single instance)Yes
Destructive Guards (confirm required for dangerous ops)Yes
TransportSSE + Streamable HTTP
LanguagePHP 8.1+

Quick Start

Prerequisites

1. Clone and install

git clone https://github.com/wbf-solutions/hetzner-cloud-mcp.git
cd hetzner-cloud-mcp
composer install

2. Configure

cp .env.example .env

Edit .env with your details:

HETZNER_API_TOKEN=your-cloud-api-token

SERVERS=web
SERVER_WEB_ID=12345678
SERVER_WEB_IP=1.2.3.4
SERVER_WEB_SSH_USER=root

SSH_KEY_PATH=/root/.ssh/id_ed25519

MCP_API_KEY=your-random-key    # generate with: openssl rand -hex 32

3. Set up the SSH key

ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""
ssh-copy-id -i /root/.ssh/id_ed25519.pub [email protected]

4. Configure Nginx

server {
    listen 443 ssl;
    server_name mcp.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/mcp.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mcp.yourdomain.com/privkey.pem;

    root /var/www/hetzner-cloud-mcp;
    index api.php;

    location / {
        try_files $uri /api.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffering off;
        fastcgi_read_timeout 600;
    }
}

5. Connect to Claude.ai

Settings > Connectors > Add custom connector:

  • Name: Hetzner Cloud MCP
  • URL: https://mcp.yourdomain.com/api.php

If you set MCP_API_KEY, pass it via the URL: ?mcp=sse&key=YOUR_MCP_API_KEY or configure the API key in the connector's Advanced Settings as a Bearer token.


Available Tools (60)

Layer 1 — Hetzner Cloud API (25 tools)

ToolDescriptionDestructive
server_infoServer details: status, IP, type, datacenter
server_metricsCPU, disk, or network metrics
server_power_onPower on
server_power_offHard power offConfirm
server_shutdownGraceful ACPI shutdown
server_rebootSoft reboot
server_resetHard resetConfirm
server_reset_passwordReset root passwordConfirm
server_rescue_enableEnable rescue mode
server_rescue_disableDisable rescue mode
server_rebuildRebuild from image (wipes data)Confirm
server_change_typeRescale server planConfirm
snapshot_createCreate snapshot
snapshot_listList snapshots
snapshot_deleteDelete snapshotConfirm
backup_enableEnable backups (+20% cost)
backup_disableDisable backupsConfirm
firewall_listList firewalls
firewall_getGet firewall rules
firewall_set_rulesReplace all firewall rulesConfirm
firewall_apply_to_serverApply firewall to server
firewall_remove_from_serverRemove firewall from server
project_servers_listList all servers
ssh_keys_listList SSH keys
action_statusCheck async action status

DNS (8 tools, requires HETZNER_DNS_TOKEN)

ToolDescriptionDestructive
dns_zones_listList DNS zones
dns_zone_getGet zone details
dns_zone_createCreate DNS zone
dns_zone_deleteDelete DNS zoneConfirm
dns_records_listList records in zone
dns_record_addAdd DNS record
dns_record_updateUpdate DNS record
dns_record_deleteDelete DNS recordConfirm

Layer 2 — SSH (27 tools)

ToolDescription
ssh_service_statusCheck systemd service status
ssh_service_startStart a service
ssh_service_stopStop a service
ssh_service_restartRestart a service
ssh_services_listList running services
ssh_disk_usageDisk space (df -h)
ssh_memory_usageRAM usage (free -h)
ssh_cpu_loadCPU load + top processes
ssh_process_listTop processes by mem/CPU
ssh_uptimeServer uptime
ssh_nginx_testTest Nginx config syntax
ssh_nginx_reloadReload Nginx (tests first)
ssh_nginx_sites_listList enabled sites
ssh_nginx_site_configView site Nginx config
ssh_logs_nginx_errorTail Nginx error log
ssh_logs_nginx_accessTail Nginx access log
ssh_logs_syslogTail system log
ssh_logs_journalView systemd journal
ssh_logs_supervisorView supervisor logs
ssh_mysql_databasesList MySQL databases
ssh_mysql_processlistShow MySQL processes
ssh_mysql_queryRead-only SQL query
ssh_cron_listList crontab entries
ssh_supervisor_statusSupervisor program statuses
ssh_supervisor_restartRestart supervisor program
ssh_ufw_statusCheck UFW firewall
ssh_execRun command (dangerous cmds blocked)

Authentication

Choose the mode that fits your deployment:

ModeConfigBest for
No authMCP_API_KEY= (empty), no OAUTH_*Behind VPN/firewall, local dev
API keyMCP_API_KEY=your-keySelf-hosted, single user/team
API key + OAuthSet MCP_API_KEY + OAUTH_* varsMulti-user, Connectors Directory

API Key (recommended for self-hosting)

Generate a key and set it in .env:

openssl rand -hex 32

Clients pass the key as ?key=XXX or Authorization: Bearer XXX.

OAuth 2.1 (optional)

For advanced deployments or Anthropic Connectors Directory submission, you can add OAuth 2.1 token introspection alongside the static API key. This requires an external OAuth authorization server with an introspection endpoint (RFC 7662). See .env.example for the OAUTH_* variables.


Security

  • Authentication: API key via query param or Authorization: Bearer header. Optional OAuth 2.1 introspection. Timing-safe validation.
  • Destructive guards: All dangerous operations require confirm=true.
  • Tool annotations: All tools include readOnlyHint and destructiveHint per MCP spec.
  • SSH safety: 29 blocked command patterns (rm -rf, dd, mkfs, curl|sh, passwd, fdisk, etc.).
  • Read-only SQL: Only SELECT, SHOW, DESCRIBE, EXPLAIN allowed.
  • Rate limiting: Per-IP with atomic flock().

Configuration

Define any number of servers in .env:

SERVERS=web,staging
SERVER_WEB_ID=12345678
SERVER_WEB_IP=1.2.3.4
SERVER_WEB_SSH_USER=root
SERVER_WEB_ALIASES=production,prod
SERVER_STAGING_ID=87654321
SERVER_STAGING_IP=5.6.7.8
DEFAULT_SERVER=web

SSH and DNS are optional — tools are auto-disabled when not configured.

See .env.example for the full reference.


Client Configuration

ClientConnection
Claude.aiSettings > Connectors > Add custom connector with SSE URL
Claude DesktopAdd to claude_desktop_config.json
Claude Codeclaude mcp add --transport http hetzner URL --header "Authorization: Bearer KEY"
VS Code / CursorVS Code extension — coming soon

Deployment

Works with VitoDeploy or manual Nginx + PHP-FPM setup. Requires fastcgi_buffering off for SSE streaming. See the full deployment guide in the Quick Start section.


Contributing

See CONTRIBUTING.md. Security vulnerabilities: [email protected].

Links

License

MIT — WBF Solutions | [email protected]

Related Servers

NotebookLM Web Importer

Import web pages and YouTube videos to NotebookLM with one click. Trusted by 200,000+ users.

Install Chrome Extension