mcp-hetzner
Allows managing Hetzner Cloud servers, volumes, networks, firewalls, load balancers, floating IPs, primary IPs, SSH keys, images, ISOs, placement groups, TLS certificates, and performing server actions (power on/off, reboot, rescue, rebuild, snapshot, resize, etc.); managing Hetzner DNS zones and records (including bulk create/update), primary servers, zone-file import/export and validation; and managing Storage Boxes, sub-accounts, snapshots, snapshot plans, and box actions (password reset, access settings, type change, snapshot rollback).
Click on "Deploy 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-hetzner show me all my Hetzner servers"
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-hetzner
A Model Context Protocol server that exposes the Hetzner Cloud, Hetzner DNS and Storage Box APIs as MCP tools, so any MCP-aware agent can manage your Hetzner infrastructure conversationally.
Cloud API — full CRUD for servers, volumes, networks, firewalls, load balancers, floating IPs, primary IPs, SSH keys, images, ISOs, placement groups, TLS certificates, plus server actions (power on/off, reboot, rescue, rebuild, snapshot, resize, …).
DNS API — full CRUD for zones, records (incl. bulk create/update), primary servers, zone-file import/export and validation.
Storage Box API — full CRUD for Storage Boxes, sub-accounts, snapshots, snapshot plans, and box/sub-account actions (password reset, access settings, type change, snapshot rollback).
Transports — both stdio and streamable HTTP are supported.
137 tools in total, registered under three clear namespace prefixes:
cloud_*, dns_*, sb_*.
⚠️ Disclaimer: This is an independent open-source project. It is not affiliated with, endorsed by, or sponsored by Hetzner Online GmbH. "Hetzner" is a trademark of Hetzner Online GmbH and is used here in a purely descriptive sense.
Install
Python 3.10+ required. Install directly from GitHub.
Option A — pipx from GitHub (recommended for end users)
pipx install git+https://github.com/ginkelsoft-development/mcp-hetzner.gitPipx installs the package in an isolated environment and adds hetzner-mcp
to your $PATH. Upgrade later with:
pipx upgrade hetzner-mcpTo pin a specific tag/branch, append @<ref>:
pipx install "git+https://github.com/ginkelsoft-development/mcp-hetzner.git@main"Option B — pip in a virtualenv
python -m venv .venv
source .venv/bin/activate
pip install git+https://github.com/ginkelsoft-development/mcp-hetzner.gitOption C — clone for development
git clone https://github.com/ginkelsoft-development/mcp-hetzner.git
cd mcp-hetzner
pip install -e .Smoke test (no tokens needed)
hetzner-mcp --list-tools | python -c "import json,sys; print(len(json.load(sys.stdin)),'tools')"
# -> 137 toolsRelated MCP server: hetzner-mcp
Tokens
The three Hetzner APIs each use their own token:
Variable | Where to create it |
| https://console.hetzner.cloud → your project → Security → API Tokens |
| |
| https://console.hetzner.com → API Tokens (for Storage Boxes) |
Copy .env.example to .env and fill in whichever you need. You can run the
server with only the tokens you have — calls to unconfigured APIs return a
structured 401 error instead of crashing.
Use it in an MCP-compatible host
Every MCP-compatible host application accepts the same stdio-server block. Drop the snippet below into the host's MCP-server config and you're done.
The universal config block
{
"mcpServers": {
"hetzner": {
"command": "hetzner-mcp",
"env": {
"HCLOUD_TOKEN": "...",
"HDNS_TOKEN": "...",
"HETZNER_TOKEN": "..."
}
}
}
}Where each host stores its config
Host | Config location | Transport |
Cursor | Settings → Cursor Settings → MCP → "Add new MCP server" | stdio or HTTP |
Cline (VS Code) | Cline extension → "MCP Servers" panel | stdio |
Continue (VS Code / JetBrains) |
| stdio |
Zed |
| stdio |
Cody | Settings → Cody → MCP servers | stdio |
Other desktop AI chat apps (macOS/Windows) | Their MCP / connector settings — see the app's own docs | stdio |
Web-based AI chat apps | Their "custom connectors" / remote MCP settings | HTTP only |
Custom Python/TypeScript agent (MCP SDK) | Whatever your client passes to | stdio or HTTP |
After saving the config, restart the host application. Most hosts surface a tool/plug icon in the chat interface when the server has connected successfully. You can confirm tool registration with a simple prompt such as:
"Run
hetzner_healthand tell me which tokens are configured."
Tip: absolute paths if hetzner-mcp isn't on the host's PATH
GUI applications often don't inherit your shell's PATH. If you see a
"command not found" error in the host's logs, replace "hetzner-mcp" with
the full path returned by which hetzner-mcp. Or use the explicit Python
form:
{
"mcpServers": {
"hetzner": {
"command": "/full/path/to/python",
"args": ["-m", "hetzner_mcp"],
"env": { "HCLOUD_TOKEN": "...", "HDNS_TOKEN": "...", "HETZNER_TOKEN": "..." }
}
}
}Run as HTTP (remote / shared)
Use this when you want a single shared deployment instead of installing the server on each user's machine — for example to plug it into a web-based AI host that only accepts remote MCP servers via custom connectors.
hetzner-mcp --http --host 0.0.0.0 --port 8765The streamable-HTTP endpoint is mounted at /mcp. Point an MCP-aware client
at http://your-host:8765/mcp.
🔒 Don't expose this endpoint to the public internet without a reverse proxy that enforces authentication and TLS. The MCP server itself has no auth layer — anyone who can reach the port can use your tokens.
A minimal hardening checklist before going public:
Put the server behind a reverse proxy (Caddy, nginx, Traefik) with TLS.
Require authentication at the proxy level (Basic auth, OAuth proxy, Cloudflare Access, Tailscale serve, etc.).
Allow-list the IP ranges your host actually calls from, where possible.
Use Hetzner API tokens scoped to read-only or to a specific project.
Tool naming
Tools are prefixed by API so it's always obvious which surface they touch:
cloud_*— Hetzner Cloud (servers, volumes, networks, …) — 91 toolsdns_*— Hetzner DNS (zones, records, …) — 20 toolssb_*— Storage Box (storage boxes, sub-accounts, snapshots, …) — 25 toolshetzner_health— reports which tokens are configured (no network call)
Run hetzner-mcp --list-tools for the full list with one-line descriptions.
Quick examples
"Spin up a cx22 in fsn1 with my SSH key, then add an A record for
staging.example.compointing at it."Calls:
cloud_list_ssh_keys→cloud_create_server→dns_list_zones→dns_create_record.
"Show me everything that's running, grouped by location."
Calls:
cloud_list_servers,cloud_list_volumes,cloud_list_load_balancers,sb_list_storage_boxes.
"Resize storage-box 12345 from bx11 to bx21 — take a snapshot first."
Calls:
sb_create_snapshot→sb_change_storage_box_type.
Safety notes
This server is fully read/write by default. Destructive tools
(cloud_delete_server, sb_delete_storage_box, dns_delete_zone, …) will
happily wipe resources if asked. For a safer setup, provision tokens with the
narrowest permission scope the API supports (Cloud and DNS tokens both
support read-only scopes).
Branch model
main— stable, what's published as releases.develop— active development; PRs target this branch.
See CONTRIBUTING.md for the full workflow.
Development
pip install -e ".[dev]"
ruff check src
hetzner-mcp --list-toolsLicense
MIT — © 2026 Ginkelsoft Development.
Available Tools
137 toolscloud_add_lb_serviceC
Add a service to a load balancer.
Inputs: load_balancer_id (required), protocol (required), listen_port (required), destination_port (required), +3 more. Returns: result
cloud_add_lb_targetC
Add a target. type one of: server | label_selector | ip.
Inputs: load_balancer_id (required), type (required), server, label_selector, +2 more. Returns: result
cloud_add_network_subnetC
Add a subnet to a network. type: 'cloud' | 'server' | 'vswitch'.
Inputs: network_id (required), type (required), network_zone (required), ip_range, +1 more. Returns: result
cloud_apply_firewall_to_resourcesB
Apply a firewall to the given resources (servers or label_selectors).
Inputs: firewall_id (required), apply_to (required). Returns: result
cloud_assign_floating_ipC
Assign a floating IP to a server.
Inputs: floating_ip_id (required), server_id (required). Returns: result
cloud_assign_primary_ipC
Assign a primary IP to a server.
Inputs: primary_ip_id (required), assignee_id (required), assignee_type. Returns: result
cloud_attach_server_to_networkB
Attach a server to a private network.
Inputs: server_id (required), network_id (required), ip, alias_ips. Returns: result
cloud_attach_volumeC
Attach a volume to a server.
Inputs: volume_id (required), server_id (required), automount. Returns: result
cloud_change_server_typeC
Change the type (size) of a server. Server must be powered off.
Inputs: server_id (required), server_type (required), upgrade_disk. Returns: result
cloud_create_certificateB
Upload a TLS cert (type='uploaded') or request a managed one (type='managed').
Inputs: name (required), type, certificate, private_key, +2 more. Returns: result
cloud_create_firewallC
Create a firewall with optional rules and resource bindings.
Inputs: name (required), rules, apply_to, labels. Returns: result
cloud_create_floating_ipB
Create a floating IP. type: 'ipv4' | 'ipv6'. Either home_location or server required.
Inputs: type (required), home_location, server, name, +2 more. Returns: result
cloud_create_load_balancerC
Create a load balancer. Either location or network_zone is required.
Inputs: name (required), load_balancer_type (required), location, network_zone, +6 more. Returns: result
cloud_create_networkC
Create a private network. ip_range e.g. '10.0.0.0/16'.
Inputs: name (required), ip_range (required), subnets, routes, +2 more. Returns: result
cloud_create_placement_groupC
Create a placement group. Currently only type='spread' is supported.
Inputs: name (required), type, labels. Returns: result
cloud_create_primary_ipC
Create a primary IP. type: ipv4 | ipv6.
Inputs: type (required), assignee_type, assignee_id, datacenter, +3 more. Returns: result
cloud_create_serverC
Create a cloud server. server_type e.g. 'cx22', image e.g. 'ubuntu-24.04'.
Inputs: name (required), server_type (required), image (required), location, +11 more. Returns: result
cloud_create_server_imageC
Create a snapshot or backup image from a server.
Inputs: server_id (required), description, type, labels. Returns: result
cloud_create_ssh_keyC
Add an SSH public key to the project.
Inputs: name (required), public_key (required), labels. Returns: result
cloud_create_volumeB
Create a volume. size is in GB. Either location or server is required.
Inputs: name (required), size (required), location, server, +3 more. Returns: result
cloud_delete_certificateC
Delete a certificate.
Inputs: certificate_id (required). Returns: result
cloud_delete_firewallA
Delete a firewall. Must be detached from all resources first.
Inputs: firewall_id (required). Returns: result
cloud_delete_floating_ipC
Delete a floating IP.
Inputs: floating_ip_id (required). Returns: result
cloud_delete_imageB
Delete a snapshot or backup image. System images cannot be deleted.
Inputs: image_id (required). Returns: result
cloud_delete_lb_serviceB
Remove a service from a load balancer by its listen port.
Inputs: load_balancer_id (required), listen_port (required). Returns: result
cloud_delete_load_balancerC
Delete a load balancer.
Inputs: load_balancer_id (required). Returns: result
cloud_delete_networkA
Delete a network. All attached subnets are removed.
Inputs: network_id (required). Returns: result
cloud_delete_network_subnetB
Remove a subnet from a network by its ip_range.
Inputs: network_id (required), ip_range (required). Returns: result
cloud_delete_placement_groupB
Delete a placement group. Must be empty first.
Inputs: placement_group_id (required). Returns: result
cloud_delete_primary_ipB
Delete a primary IP. Must be unassigned first.
Inputs: primary_ip_id (required). Returns: result
cloud_delete_serverB
Delete (destroy) a cloud server. This is irreversible.
Inputs: server_id (required). Returns: result
cloud_delete_ssh_keyC
Delete an SSH key from the project.
Inputs: ssh_key_id (required). Returns: result
cloud_delete_volumeB
Delete a volume. Volume must be detached first.
Inputs: volume_id (required). Returns: result
cloud_detach_server_from_networkC
Detach a server from a private network.
Inputs: server_id (required), network_id (required). Returns: result
cloud_detach_volumeC
Detach a volume from its current server.
Inputs: volume_id (required). Returns: result
cloud_disable_server_backupC
Disable automatic backups for a server.
Inputs: server_id (required). Returns: result
cloud_disable_server_rescueB
Disable rescue mode for a cloud server.
Inputs: server_id (required). Returns: result
cloud_enable_server_backupB
Enable automatic backups for a server (incurs additional cost).
Inputs: server_id (required). Returns: result
cloud_enable_server_rescueC
Enable rescue mode for a cloud server. Reboot required to enter rescue.
Inputs: server_id (required), type, ssh_keys. Returns: result
cloud_get_actionB
Get a single action by ID.
Inputs: action_id (required). Returns: result
cloud_get_certificateB
Get a single certificate by ID.
Inputs: certificate_id (required). Returns: result
cloud_get_firewallB
Get a single firewall by ID.
Inputs: firewall_id (required). Returns: result
cloud_get_floating_ipB
Get a single floating IP by ID.
Inputs: floating_ip_id (required). Returns: result
cloud_get_imageB
Get a single image by ID.
Inputs: image_id (required). Returns: result
cloud_get_load_balancerC
Get a single load balancer by ID.
Inputs: load_balancer_id (required). Returns: result
cloud_get_networkB
Get a single private network by ID.
Inputs: network_id (required). Returns: result
cloud_get_placement_groupC
Get a single placement group by ID.
Inputs: placement_group_id (required). Returns: result
cloud_get_primary_ipA
Get a single primary IP by ID.
Inputs: primary_ip_id (required). Returns: result
cloud_get_serverB
Get a single cloud server by its numeric ID.
Inputs: server_id (required). Returns: result
cloud_get_server_metricsB
Get server metrics. type one of: cpu, disk, network. start/end RFC3339.
Inputs: server_id (required), type (required), start (required), end (required), +1 more. Returns: result
cloud_get_ssh_keyA
Get a single SSH key by ID.
Inputs: ssh_key_id (required). Returns: result
cloud_get_volumeB
Get a single volume by ID.
Inputs: volume_id (required). Returns: result
cloud_list_actionsC
List recent actions across all resources.
Inputs: page, per_page, sort, status, +1 more. Returns: result
cloud_list_certificatesC
List managed TLS certificates.
Inputs: page, per_page, name, type, +1 more. Returns: result
cloud_list_datacentersC
List specific datacenters within locations (e.g. fsn1-dc14).
Inputs: page, per_page, name. Returns: result
cloud_list_firewallsC
List firewalls.
Inputs: page, per_page, name, label_selector. Returns: result
cloud_list_floating_ipsC
List floating IPs.
Inputs: page, per_page, name, label_selector. Returns: result
cloud_list_imagesC
List images (system + snapshot + backup + app).
Inputs: page, per_page, name, type, +4 more. Returns: result
cloud_list_isosC
List ISO images available for servers.
Inputs: page, per_page, name, architecture. Returns: result
cloud_list_load_balancersC
List load balancers.
Inputs: page, per_page, name, label_selector. Returns: result
cloud_list_locationsC
List datacenter locations (fsn1, nbg1, hel1, ash, hil).
Inputs: page, per_page, name. Returns: result
cloud_list_networksC
List private networks.
Inputs: page, per_page, name, label_selector. Returns: result
cloud_list_placement_groupsC
List placement groups.
Inputs: page, per_page, name, type, +1 more. Returns: result
cloud_list_primary_ipsC
List primary IPs.
Inputs: page, per_page, name, label_selector. Returns: result
cloud_list_serversC
List cloud servers in the project. Supports filtering by name, label_selector and status.
Inputs: page, per_page, name, label_selector, +2 more. Returns: result
cloud_list_server_typesC
List available cloud server types (cx22, cpx21, ax42, etc.) and prices.
Inputs: page, per_page, name. Returns: result
cloud_list_ssh_keysD
List SSH keys in the project.
Inputs: page, per_page, name, fingerprint, +1 more. Returns: result
cloud_list_volumesC
List block-storage volumes.
Inputs: page, per_page, name, status, +1 more. Returns: result
cloud_power_off_serverB
Hard power-off a cloud server (does not gracefully shutdown).
Inputs: server_id (required). Returns: result
cloud_power_on_serverB
Power on a stopped cloud server.
Inputs: server_id (required). Returns: result
cloud_reboot_serverC
ACPI reboot a cloud server (graceful).
Inputs: server_id (required). Returns: result
cloud_rebuild_serverA
Rebuild a server from an image (destroys all data on the boot volume).
Inputs: server_id (required), image (required). Returns: result
cloud_remove_firewall_from_resourcesC
Remove a firewall from the given resources.
Inputs: firewall_id (required), remove_from (required). Returns: result
cloud_remove_lb_targetC
Remove a target from a load balancer.
Inputs: load_balancer_id (required), type (required), server, label_selector, +1 more. Returns: result
cloud_reset_serverC
Hardware reset a cloud server.
Inputs: server_id (required). Returns: result
cloud_reset_server_passwordB
Reset root password (Linux only). New password is returned in the response.
Inputs: server_id (required). Returns: result
cloud_resize_volumeB
Resize a volume. Can only grow, not shrink. Filesystem grow happens online.
Inputs: volume_id (required), size (required). Returns: result
cloud_set_firewall_rulesB
Replace all rules of a firewall with the given list.
Inputs: firewall_id (required), rules (required). Returns: result
cloud_shutdown_serverA
ACPI shutdown a cloud server (graceful).
Inputs: server_id (required). Returns: result
cloud_unassign_floating_ipC
Unassign a floating IP from its current server.
Inputs: floating_ip_id (required). Returns: result
cloud_unassign_primary_ipB
Unassign a primary IP from its current server.
Inputs: primary_ip_id (required). Returns: result
cloud_update_firewallC
Update a firewall's name or labels.
Inputs: firewall_id (required), name, labels. Returns: result
cloud_update_floating_ipC
Update a floating IP's name, description or labels.
Inputs: floating_ip_id (required), name, description, labels. Returns: result
cloud_update_imageB
Update an image. Only user-created images (snapshots/backups) can be updated.
Inputs: image_id (required), description, type, labels. Returns: result
cloud_update_load_balancerC
Update a load balancer's name or labels.
Inputs: load_balancer_id (required), name, labels. Returns: result
cloud_update_networkC
Update a network's name, labels or vSwitch route exposure.
Inputs: network_id (required), name, labels, expose_routes_to_vswitch. Returns: result
cloud_update_placement_groupB
Update a placement group's name or labels.
Inputs: placement_group_id (required), name, labels. Returns: result
cloud_update_primary_ipB
Update primary IP name, auto_delete behaviour or labels.
Inputs: primary_ip_id (required), name, auto_delete, labels. Returns: result
cloud_update_serverC
Update a cloud server's name or labels.
Inputs: server_id (required), name, labels. Returns: result
cloud_update_ssh_keyB
Update an SSH key's name or labels.
Inputs: ssh_key_id (required), name, labels. Returns: result
cloud_update_volumeC
Update a volume's name or labels.
Inputs: volume_id (required), name, labels. Returns: result
dns_bulk_create_recordsB
Create multiple DNS records in one call. Each item: {zone_id,type,name,value[,ttl]}.
Inputs: records (required). Returns: result
dns_bulk_update_recordsB
Update multiple DNS records in one call. Each item must include id.
Inputs: records (required). Returns: result
dns_create_primary_serverB
Register a primary server for a secondary DNS zone.
Inputs: zone_id (required), address (required), port. Returns: result
dns_create_recordC
Create a DNS record. type e.g. 'A','AAAA','CNAME','MX','TXT','NS','SRV','CAA'.
Inputs: zone_id (required), type (required), name (required), value (required), +1 more. Returns: result
dns_create_zoneC
Create a DNS zone for a domain (e.g. 'example.com').
Inputs: name (required), ttl. Returns: result
dns_delete_primary_serverC
Delete a primary server.
Inputs: primary_server_id (required). Returns: result
dns_delete_recordC
Delete a DNS record.
Inputs: record_id (required). Returns: result
dns_delete_zoneB
Delete a DNS zone. All records in the zone are also removed.
Inputs: zone_id (required). Returns: result
dns_export_zone_fileB
Export the zone as a BIND-format zone file (string).
Inputs: zone_id (required). Returns: result
dns_get_primary_serverB
Get a single primary server by ID.
Inputs: primary_server_id (required). Returns: result
dns_get_recordA
Get a single DNS record by ID.
Inputs: record_id (required). Returns: result
dns_get_zoneC
Get a single DNS zone by ID.
Inputs: zone_id (required). Returns: result
dns_import_zone_fileA
Import records into an existing zone from a BIND zone file (replaces all records).
Inputs: zone_id (required), zone_file (required). Returns: result
dns_list_primary_serversC
List secondary-DNS primary servers configured for zones.
Inputs: zone_id. Returns: result
dns_list_recordsC
List DNS records. If zone_id is provided, filter to that zone.
Inputs: zone_id, page, per_page. Returns: result
dns_list_zonesC
List DNS zones.
Inputs: page, per_page, name, search_name. Returns: result
dns_update_primary_serverC
Update a primary server.
Inputs: primary_server_id (required), zone_id (required), address (required), port. Returns: result
dns_update_recordC
Update a DNS record. All fields are required by the API.
Inputs: record_id (required), zone_id (required), type (required), name (required), +2 more. Returns: result
dns_update_zoneC
Update a DNS zone.
Inputs: zone_id (required), name, ttl. Returns: result
dns_validate_zone_fileB
Validate a BIND zone file without importing it.
Inputs: zone_file (required). Returns: result
hetzner_healthA
Report which API tokens are configured. Does not make network calls.
Inputs: no named parameters. Returns: object
sb_change_storage_box_typeB
Resize a Storage Box by changing its type (bx11 -> bx21 etc.).
Inputs: storage_box_id (required), storage_box_type (required). Returns: result
sb_create_snapshotC
Create an on-demand snapshot of a Storage Box.
Inputs: storage_box_id (required), description, labels. Returns: result
sb_create_storage_boxC
Create a new Storage Box.
location e.g. 'fsn1' | 'nbg1' | 'hel1'.
storage_box_type e.g. 'bx11' (1TB), 'bx21' (5TB), 'bx31' (10TB), 'bx41' (20TB).
Inputs: name (required), location (required), storage_box_type (required), password, +3 more. Returns: result
sb_create_sub_accountC
Create a sub-account scoped to home_directory within the Storage Box.
Inputs: storage_box_id (required), home_directory (required), password, ssh_keys, +4 more. Returns: result
sb_delete_snapshotD
Delete a snapshot.
Inputs: storage_box_id (required), snapshot_id (required). Returns: result
sb_delete_storage_boxB
Delete a Storage Box. This permanently destroys all data!
Inputs: storage_box_id (required). Returns: result
sb_delete_sub_accountC
Delete a sub-account.
Inputs: storage_box_id (required), sub_account_id (required). Returns: result
sb_get_snapshotC
Get a single snapshot.
Inputs: storage_box_id (required), snapshot_id (required). Returns: result
sb_get_snapshot_planC
Get the automatic snapshot plan for a Storage Box.
Inputs: storage_box_id (required). Returns: result
sb_get_storage_boxA
Get a single Storage Box by ID.
Inputs: storage_box_id (required). Returns: result
sb_get_sub_accountC
Get a single sub-account.
Inputs: storage_box_id (required), sub_account_id (required). Returns: result
sb_list_snapshotsC
List snapshots of a Storage Box.
Inputs: storage_box_id (required), page, per_page. Returns: result
sb_list_storage_boxesC
List Storage Boxes in the project.
Inputs: page, per_page, name, label_selector, +1 more. Returns: result
sb_list_storage_box_locationsC
List locations where Storage Boxes can be provisioned.
Inputs: page, per_page, name. Returns: result
sb_list_storage_box_typesC
List available Storage Box types (bx11, bx21, bx31, bx41) and pricing.
Inputs: page, per_page, name. Returns: result
sb_list_sub_accountsB
List sub-accounts of a Storage Box.
Inputs: storage_box_id (required), page, per_page. Returns: result
sb_reset_storage_box_passwordC
Reset the password for a Storage Box.
Inputs: storage_box_id (required), password. Returns: result
sb_reset_sub_account_passwordC
Reset a sub-account's password.
Inputs: storage_box_id (required), sub_account_id (required), password. Returns: result
sb_rollback_storage_box_to_snapshotB
Rollback a Storage Box to a snapshot. Existing data after that snapshot is lost.
Inputs: storage_box_id (required), snapshot_id (required). Returns: result
sb_update_snapshotB
Update a snapshot's description or labels.
Inputs: storage_box_id (required), snapshot_id (required), description, labels. Returns: result
sb_update_snapshot_planA
Configure the automatic snapshot schedule for a Storage Box.
Unset fields default to wildcard (-1 in some encodings). Pass max_snapshots=0
to effectively disable retention.
Inputs: storage_box_id (required), max_snapshots, minute, hour, +2 more. Returns: result
sb_update_storage_boxB
Update a Storage Box's name or labels.
Inputs: storage_box_id (required), name, labels. Returns: result
sb_update_storage_box_access_settingsC
Toggle protocol availability and external reachability for a Storage Box.
Inputs: storage_box_id (required), samba_enabled, ssh_enabled, webdav_enabled, +2 more. Returns: result
sb_update_sub_accountC
Update a sub-account.
Inputs: storage_box_id (required), sub_account_id (required), description, labels. Returns: result
sb_update_sub_account_access_settingsC
Update a sub-account's access / protocol settings.
Inputs: storage_box_id (required), sub_account_id (required), home_directory, samba_enabled, +4 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 137 tools
All tools have clearly distinct purposes through specific verb-noun combinations and detailed descriptions. Even for similar resources (e.g., load balancer services vs targets), the actions are unique and well-defined.
Tool names follow a consistent pattern: prefix indicating service (cloud_, dns_, sb_, hetzner_) + verb + noun in snake_case. The verb tense is uniform (imperative present) and the structure is predictable across all 137 tools.
With 137 tools, the server is extremely large and exceeds the typical scope for a single MCP server. While the tools are necessary for complete Hetzner API coverage, the count is far beyond the recommended range and would benefit from decomposition into separate servers per service domain.
The tool set offers comprehensive CRUD and lifecycle operations for all exposed Hetzner services: compute, networking, storage, DNS, firewalls, load balancers, and more. No obvious gaps are present for the intended domain coverage.
Maintenance
Related MCP Connectors
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Email inboxes, webhook URLs, mock APIs and 170+ tools for coding agents over one MCP connection.
Manage Vozora VPS servers, SSH keys, firewalls, DNS and usage from an AI agent.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceEnables users to manage Hetzner Cloud resources including servers, load balancers, and volumes through natural language commands. It facilitates infrastructure operations such as resource creation, security configuration, and real-time pricing queries within AI-powered environments.173 npm1-
- AlicenseNot gradedqualityAmaintenanceModel Context Protocol server for full Hetzner Cloud + Storage API automation. Exposes all official Hetzner operations as MCP tools so AI agents can manage servers, networking, load balancers, firewalls, volumes, DNS zones, and storage boxes from one server.1MIT
- AlicenseNot gradedqualityFmaintenanceEnables management of Hetzner Cloud resources including servers, SSH keys, volumes, storage boxes, and live metrics through 40 tools.8 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents like Mistral Work to manage Hetzner Cloud VPS services in natural Spanish, including creating, modifying, and deleting servers, networks, firewalls, and storage, as well as automating complex tasks.MIT