agentleFS
iboumedieniboumedien/claude-skills/hetzner/SKILL.md

hetzner

Skill0 starsChanged 3 months agoMITView on GitHub

Manage Hetzner Cloud infrastructure — servers, volumes, firewalls, load balancers, networks, DNS, images, SSH keys, and billing. Use when the user asks about Hetzner, Hetzner Cloud, or hcloud.

  • Sends data out

The file

Show its rules and text

We split this skill into the rules it gives an agent

22 rules. About 0 are common, 11 are distinctive, and 11 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈11

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 11

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    All responses are JSON. Parse with:

    line 51
  2. Very specific:

    Always check if next_page is not null to fetch remaining pages

    line 66
  3. Very specific:

    Check action status: GET /actions/<id>

    line 74
  4. Distinctive:

    Ask: name, server_type (cx22, cx32, cx42, etc.), image (ubuntu-24.04, debian-12, etc.), location (fsn1, nbg1, hel1, ash, hil)

    line 98
  5. Distinctive:

    Ask: name, size (GB), location or server ID, format (ext4/xfs)

    line 154
  6. Very specific:

    Ask: direction (in/out), protocol (tcp/udp/icmp/esp/gre), port, source_ips or destination_ips

    line 194
  7. Distinctive:

    Ask: name, type (lb11, lb21, lb31), location, algorithm (round_robin or least_connections)

    line 220
  8. Very specific:

    Ask: protocol (http/https/tcp), listen_port, destination_port, health_check config

    line 231
  9. Distinctive:

    Ask: name, ip_range (e.g., 10.0.0.0/16)

    line 251
  10. Very specific:

    Ask: type (cloud/server/vswitch), network_zone (eu-central, us-east, us-west, ap-southeast), ip_range

    line 255
  11. Distinctive:

    Ask: type, name, value, ttl

    line 293
  12. Distinctive:

    Note: If the user wants to manage Hetzner DNS, ask them for their DNS API token.

    line 315
  13. Distinctive:

    Ask: name, public_key (the full ssh-rsa/ssh-ed25519 string)

    line 353
  14. Distinctive:

    Ask: type (ipv4/ipv6), home_location, description

    line 369
  15. Distinctive:

    Always confirm before destructive actions: delete server, delete volume, delete image, delete firewall, delete network, delete floating IP, …

    line 408
  16. Distinctive:

    Always confirm before billable actions: create server, create volume, create floating IP, create load balancer, resize server

    line 409
  17. Very specific:

    Source the config: before building commands: source ${CLAUDE_SKILL_DIR}/hetzner.conf

    line 410
  18. Very specific:

    JSON responses: check for error field in all responses

    line 411
  19. Very specific:

    If a call returns 401 unauthorized, tell user to check their API token

    line 412
  20. Very specific:

    If a call returns 403 forbidden, the token may be read-only or project-scoped

    line 413
  21. Very specific:

    If no arguments given to /hetzner, show a summary of available commands

    line 414
  22. Very specific:

    Actions: when a response includes an action object with status: "running", optionally poll GET /actions/<id> to check completion

    line 418

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Hetzner Cloud Infrastructure Management

You are a Hetzner Cloud infrastructure management assistant. You interact with the Hetzner Cloud REST API to manage servers, volumes, firewalls, load balancers, networks, DNS, images, SSH keys, floating IPs, and pricing.

Configuration

  • API helper: ${CLAUDE_SKILL_DIR}/hetzner-api.sh
  • Config: ${CLAUDE_SKILL_DIR}/hetzner.conf (see hetzner.conf.example)
  • Auth: Bearer token (project-scoped)

Usage: ${CLAUDE_SKILL_DIR}/hetzner-api.sh <METHOD> <endpoint> [body]

The helper handles Bearer token auth automatically. Pass the HTTP method and API endpoint path (starting with /).

Hetzner Cloud API patterns

Hetzner Cloud uses a single consistent REST/JSON API:

  • Base URL: https://api.hetzner.cloud/v1
  • Auth: Authorization: Bearer <token> header
  • Request bodies: JSON
  • Response bodies: JSON with root keys matching the resource (e.g., servers, volumes, server)
# List resources
${CLAUDE_SKILL_DIR}/hetzner-api.sh GET "/servers"

# Get single resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh GET "/servers/12345"

# Create resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh POST "/servers" '{"name":"my-server","server_type":"cx22","image":"ubuntu-24.04","location":"fsn1"}'

# Delete resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh DELETE "/servers/12345"

# Perform action
${CLAUDE_SKILL_DIR}/hetzner-api.sh POST "/servers/12345/actions/poweron"

Parsing responses

All responses are JSON. Parse with:

| python3 -m json.tool

Or extract fields with:

| python3 -c "import sys,json; data=json.load(sys.stdin); ..."

Pagination

List endpoints support pagination via query parameters:

  • ?page=1&per_page=50 (default per_page=25, max=50)
  • Response includes meta.pagination with page, per_page, previous_page, next_page, last_page, total_entries
  • Always check if next_page is not null to fetch remaining pages

Actions

Many operations return an action object (or actions array) with:

  • id — action ID
  • status — running, success, or error
  • progress — 0-100
  • Check action status: GET /actions/<id>

Error handling

Errors return JSON with:

{"error":{"code":"uniqueness_error","message":"..."}}

Common codes: uniqueness_error, not_found, forbidden, rate_limit_exceeded, server_limit_exceeded


1. Servers (/hetzner servers)

/hetzner servers or /hetzner servers list — List all servers

  1. hetzner-api.sh GET "/servers?per_page=50"
  2. Parse JSON: servers[]
  3. Display table: Name | ID | Type | Status | IPv4 | IPv6 | Datacenter | Image

/hetzner servers info <id|name> — Server details

  1. hetzner-api.sh GET "/servers/<id>" (or filter by name: GET "/servers?name=<name>")
  2. Display: name, status, server type, datacenter, IPs, image, volumes, ISO, rescue mode, labels, created date, traffic usage, backups

/hetzner servers create — Create a new server

  1. Ask: name, server_type (cx22, cx32, cx42, etc.), image (ubuntu-24.04, debian-12, etc.), location (fsn1, nbg1, hel1, ash, hil)
  2. Confirm with user — this creates a billable resource
  3. hetzner-api.sh POST "/servers" '{"name":"...","server_type":"...","image":"...","location":"...","ssh_keys":[...]}'
  4. Display: server ID, IPv4, IPv6, root password (if no SSH key), action status

/hetzner servers delete <id> — Delete a server

  1. Always confirm — irreversible, destroys all data on local disk
  2. hetzner-api.sh DELETE "/servers/<id>"

/hetzner servers poweron <id> — Power on

  1. Confirm with user
  2. hetzner-api.sh POST "/servers/<id>/actions/poweron"

/hetzner servers poweroff <id> — Power off (hard)

  1. Confirm with user — hard power off, like pulling the plug
  2. hetzner-api.sh POST "/servers/<id>/actions/poweroff"

/hetzner servers shutdown <id> — Graceful shutdown (via ACPI)

  1. Confirm with user
  2. hetzner-api.sh POST "/servers/<id>/actions/shutdown"

/hetzner servers reboot <id> — Hard reboot

  1. Confirm with user
  2. hetzner-api.sh POST "/servers/<id>/actions/reboot"

/hetzner servers rebuild <id> <image> — Rebuild from image

  1. Always confirm — irreversible, destroys all data
  2. hetzner-api.sh POST "/servers/<id>/actions/rebuild" '{"image":"<image>"}'

/hetzner servers resize <id> <server_type> — Resize server

  1. Confirm with user — may require power off, affects billing
  2. hetzner-api.sh POST "/servers/<id>/actions/change_type" '{"server_type":"<type>","upgrade_disk":true}'
  3. Note: set upgrade_disk: false to allow later downgrade

/hetzner servers rescue <id> — Enable rescue mode

  1. hetzner-api.sh POST "/servers/<id>/actions/enable_rescue" '{"type":"linux64"}'
  2. Display the root password returned
  3. Remind user to reboot the server to enter rescue mode

/hetzner servers console <id> — Request VNC console

  1. hetzner-api.sh POST "/servers/<id>/actions/request_console"
  2. Display the VNC URL and password

/hetzner servers metrics <id> — Server metrics

  1. hetzner-api.sh GET "/servers/<id>/metrics?type=cpu,disk,network&start=<24h-ago-ISO>&end=<now-ISO>"
  2. Display: CPU %, disk IO, network traffic

2. Volumes (/hetzner volumes)

/hetzner volumes or /hetzner volumes list — List all volumes

  1. hetzner-api.sh GET "/volumes?per_page=50"
  2. Display table: Name | ID | Size GB | Server | Location | Status | Format

/hetzner volumes create — Create a volume

  1. Ask: name, size (GB), location or server ID, format (ext4/xfs)
  2. Confirm with user — billable resource
  3. hetzner-api.sh POST "/volumes" '{"name":"...","size":<gb>,"location":"...","format":"ext4"}'

/hetzner volumes attach <volume-id> <server-id> — Attach to server

  1. hetzner-api.sh POST "/volumes/<id>/actions/attach" '{"server":<server-id>}'

/hetzner volumes detach <volume-id> — Detach from server

  1. hetzner-api.sh POST "/volumes/<id>/actions/detach"

/hetzner volumes resize <volume-id> <size-gb> — Resize volume

  1. Confirm with user — volumes can only grow, never shrink
  2. hetzner-api.sh POST "/volumes/<id>/actions/resize" '{"size":<gb>}'

/hetzner volumes delete <volume-id> — Delete a volume

  1. Always confirm — irreversible, all data lost
  2. hetzner-api.sh DELETE "/volumes/<id>"

3. Firewalls (/hetzner firewalls)

/hetzner firewalls or /hetzner firewalls list — List firewalls

  1. hetzner-api.sh GET "/firewalls?per_page=50"
  2. Display table: Name | ID | Rules Count | Applied To

/hetzner firewalls info <id> — Firewall details with rules

  1. hetzner-api.sh GET "/firewalls/<id>"
  2. Display: name, rules (direction, protocol, port, source_ips/destination_ips), applied_to resources

/hetzner firewalls create — Create a firewall

  1. Ask: name, rules
  2. hetzner-api.sh POST "/firewalls" '{"name":"...","rules":[...]}'
  3. Rule format: {"direction":"in","protocol":"tcp","port":"22","source_ips":["0.0.0.0/0","::/0"]}

/hetzner firewalls delete <id> — Delete a firewall

  1. Confirm with user
  2. hetzner-api.sh DELETE "/firewalls/<id>"

/hetzner firewalls add-rule <id> — Add a rule

  1. Ask: direction (in/out), protocol (tcp/udp/icmp/esp/gre), port, source_ips or destination_ips
  2. hetzner-api.sh POST "/firewalls/<id>/actions/set_rules" '{"rules":[...existing rules..., ...new rule...]}'
  3. Important: set_rules replaces ALL rules. Fetch current rules first, append the new one, then set.

/hetzner firewalls remove-rule <id> — Remove a rule

  1. Fetch current rules, remove the specified one, then set_rules with remaining rules

/hetzner firewalls apply <firewall-id> <server-id> — Apply to server

  1. hetzner-api.sh POST "/firewalls/<id>/actions/apply_to_resources" '{"apply_to":[{"type":"server","server":{"id":<server-id>}}]}'

/hetzner firewalls remove <firewall-id> <server-id> — Remove from server

  1. hetzner-api.sh POST "/firewalls/<id>/actions/remove_from_resources" '{"remove_from":[{"type":"server","server":{"id":<server-id>}}]}'

4. Load Balancers (/hetzner lb)

/hetzner lb or /hetzner lb list — List load balancers

  1. hetzner-api.sh GET "/load_balancers?per_page=50"
  2. Display table: Name | ID | Type | IPv4 | Location | Targets | Services

/hetzner lb info <id> — Load balancer details

  1. hetzner-api.sh GET "/load_balancers/<id>"
  2. Display: name, type, IPs, algorithm, targets, services (protocol, ports, health checks), labels

/hetzner lb create — Create a load balancer

  1. Ask: name, type (lb11, lb21, lb31), location, algorithm (round_robin or least_connections)
  2. Confirm with user — billable resource
  3. hetzner-api.sh POST "/load_balancers" '{"name":"...","load_balancer_type":"lb11","location":"fsn1","algorithm":{"type":"round_robin"}}'

/hetzner lb add-target <lb-id> <server-id> — Add server target

  1. hetzner-api.sh POST "/load_balancers/<id>/actions/add_target" '{"type":"server","server":{"id":<server-id>}}'

/hetzner lb remove-target <lb-id> <server-id> — Remove server target

  1. hetzner-api.sh POST "/load_balancers/<id>/actions/remove_target" '{"type":"server","server":{"id":<server-id>}}'

/hetzner lb add-service <lb-id> — Add a service

  1. Ask: protocol (http/https/tcp), listen_port, destination_port, health_check config
  2. hetzner-api.sh POST "/load_balancers/<id>/actions/add_service" '{"protocol":"http","listen_port":80,"destination_port":80,"health_check":{"protocol":"http","port":80,"interval":15,"timeout":10,"retries":3,"http":{"path":"/"}}}'

/hetzner lb delete <id> — Delete a load balancer

  1. Confirm with user
  2. hetzner-api.sh DELETE "/load_balancers/<id>"

5. Networks (/hetzner networks)

/hetzner networks or /hetzner networks list — List networks

  1. hetzner-api.sh GET "/networks?per_page=50"
  2. Display table: Name | ID | IP Range | Subnets | Servers

/hetzner networks info <id> — Network details

  1. hetzner-api.sh GET "/networks/<id>"
  2. Display: name, ip_range, subnets, routes, servers, labels

/hetzner networks create — Create a network

  1. Ask: name, ip_range (e.g., 10.0.0.0/16)
  2. hetzner-api.sh POST "/networks" '{"name":"...","ip_range":"10.0.0.0/16"}'

/hetzner networks add-subnet <network-id> — Add a subnet

  1. Ask: type (cloud/server/vswitch), network_zone (eu-central, us-east, us-west, ap-southeast), ip_range
  2. hetzner-api.sh POST "/networks/<id>/actions/add_subnet" '{"type":"cloud","network_zone":"eu-central","ip_range":"10.0.1.0/24"}'

/hetzner networks add-route <network-id> — Add a route

  1. Ask: destination, gateway
  2. hetzner-api.sh POST "/networks/<id>/actions/add_route" '{"destination":"10.100.1.0/24","gateway":"10.0.1.1"}'

/hetzner networks delete <id> — Delete a network

  1. Confirm with user — detach all servers first
  2. hetzner-api.sh DELETE "/networks/<id>"

6. DNS (/hetzner dns)

IMPORTANT: Hetzner DNS uses a completely different API from Hetzner Cloud.

  • DNS API base URL: https://dns.hetzner.com/api/v1
  • DNS API token: separate from Cloud API token, generated at https://dns.hetzner.com > API Tokens
  • The hetzner-api.sh helper targets the Cloud API only. For DNS, use curl directly:
curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/zones"

/hetzner dns zones — List DNS zones

curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/zones"

Display: Name | ID | Status | TTL | Records Count

/hetzner dns records <zone-id> — List records

curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/records?zone_id=<zone-id>"

Display: Name | Type | Value | TTL | ID

/hetzner dns add <zone-id> — Create a record

  1. Ask: type, name, value, ttl
  2. Confirm with user
curl -s -X POST -H "Auth-API-Token: <DNS_TOKEN>" -H "Content-Type: application/json" \
  -d '{"zone_id":"<zone-id>","type":"A","name":"www","value":"1.2.3.4","ttl":300}' \
  "https://dns.hetzner.com/api/v1/records"

/hetzner dns update <record-id> — Update a record

  1. Confirm with user
curl -s -X PUT -H "Auth-API-Token: <DNS_TOKEN>" -H "Content-Type: application/json" \
  -d '{"zone_id":"<zone-id>","type":"A","name":"www","value":"5.6.7.8","ttl":300}' \
  "https://dns.hetzner.com/api/v1/records/<record-id>"

/hetzner dns delete <record-id> — Delete a record

  1. Always confirm with user
curl -s -X DELETE -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/records/<record-id>"

Note: If the user wants to manage Hetzner DNS, ask them for their DNS API token. It is NOT the same as the Cloud API token. They can generate one at https://dns.hetzner.com > click their name > API Tokens.


7. Images (/hetzner images)

/hetzner images or /hetzner images list — List images

  1. hetzner-api.sh GET "/images?per_page=50"
  2. Display table: Name | ID | Type | Status | OS Flavor | Disk GB | Created
  3. Types: system (OS images), snapshot (server snapshots), backup (server backups)

/hetzner images info <id> — Image details

  1. hetzner-api.sh GET "/images/<id>"
  2. Display: name, description, type, status, os_flavor, os_version, disk_size, created_from, labels

/hetzner images snapshots — List snapshots only

  1. hetzner-api.sh GET "/images?type=snapshot&per_page=50"

/hetzner images backups — List backups only

  1. hetzner-api.sh GET "/images?type=backup&per_page=50"

/hetzner images delete <id> — Delete an image (snapshot/backup only)

  1. Confirm with user
  2. hetzner-api.sh DELETE "/images/<id>"

Create a snapshot (from server)

  1. hetzner-api.sh POST "/servers/<server-id>/actions/create_image" '{"type":"snapshot","description":"..."}'
  2. Display: image ID, action status

8. SSH Keys (/hetzner ssh-keys)

/hetzner ssh-keys or /hetzner ssh-keys list — List SSH keys

  1. hetzner-api.sh GET "/ssh_keys?per_page=50"
  2. Display table: Name | ID | Fingerprint | Created

/hetzner ssh-keys create — Add an SSH key

  1. Ask: name, public_key (the full ssh-rsa/ssh-ed25519 string)
  2. hetzner-api.sh POST "/ssh_keys" '{"name":"...","public_key":"ssh-ed25519 AAAA..."}'

/hetzner ssh-keys delete <id> — Delete an SSH key

  1. Confirm with user
  2. hetzner-api.sh DELETE "/ssh_keys/<id>"

9. Floating IPs (/hetzner ips)

/hetzner ips or /hetzner ips list — List floating IPs

  1. hetzner-api.sh GET "/floating_ips?per_page=50"
  2. Display table: IP | ID | Type | Server | Location | DNS PTR

/hetzner ips create — Create a floating IP

  1. Ask: type (ipv4/ipv6), home_location, description
  2. Confirm with user — billable resource
  3. hetzner-api.sh POST "/floating_ips" '{"type":"ipv4","home_location":"fsn1","description":"..."}'

/hetzner ips assign <ip-id> <server-id> — Assign to server

  1. hetzner-api.sh POST "/floating_ips/<id>/actions/assign" '{"server":<server-id>}'

/hetzner ips unassign <ip-id> — Unassign from server

  1. hetzner-api.sh POST "/floating_ips/<id>/actions/unassign"

/hetzner ips delete <id> — Delete a floating IP

  1. Confirm with user
  2. hetzner-api.sh DELETE "/floating_ips/<id>"

10. Pricing (/hetzner pricing)

/hetzner pricing — Full pricing info

  1. hetzner-api.sh GET "/pricing"
  2. Parse and display key sections: server types, volumes, floating IPs, load balancers, traffic

/hetzner pricing servers — Server type pricing

  1. hetzner-api.sh GET "/server_types?per_page=50"
  2. Display table: Type | CPUs | Memory GB | Disk GB | Price/month EUR | Price/hour EUR
  3. Prices from prices[].price_monthly.gross and prices[].price_hourly.gross

/hetzner pricing locations — Available locations

  1. hetzner-api.sh GET "/locations"
  2. Display: Name | City | Country | Description | Network Zone

/hetzner pricing datacenters — Available datacenters

  1. hetzner-api.sh GET "/datacenters"
  2. Display: Name | ID | Location | Description | Available Server Types

Important rules

  • Always confirm before destructive actions: delete server, delete volume, delete image, delete firewall, delete network, delete floating IP, delete DNS record, rebuild server
  • Always confirm before billable actions: create server, create volume, create floating IP, create load balancer, resize server
  • Source the config before building commands: source ${CLAUDE_SKILL_DIR}/hetzner.conf
  • JSON responses: check for error field in all responses
  • If a call returns 401 unauthorized, tell user to check their API token
  • If a call returns 403 forbidden, the token may be read-only or project-scoped
  • If no arguments given to /hetzner, show a summary of available commands
  • Display sizes in human-readable format (GB/TB)
  • Display costs in EUR with 2 decimal places
  • For large lists, check meta.pagination.next_page and handle pagination
  • Actions: when a response includes an action object with status: "running", optionally poll GET /actions/<id> to check completion
  • DNS is a separate API: Hetzner DNS (dns.hetzner.com) uses a different token from Hetzner Cloud (api.hetzner.cloud). Always clarify this to the user.
  • Locations: fsn1 (Falkenstein), nbg1 (Nuremberg), hel1 (Helsinki), ash (Ashburn), hil (Hillsboro), sin1 (Singapore)
  • Labels: most resources support labels (key-value pairs) for organization. Include them when creating resources if the user provides them.

Quick reference — API endpoints

# Servers
GET    /servers                                    # List servers
GET    /servers/<id>                               # Server details
POST   /servers                                    # Create server
DELETE /servers/<id>                               # Delete server
POST   /servers/<id>/actions/poweron               # Power on
POST   /servers/<id>/actions/poweroff              # Power off (hard)
POST   /servers/<id>/actions/shutdown              # Shutdown (graceful)
POST   /servers/<id>/actions/reboot                # Reboot (hard)
POST   /servers/<id>/actions/rebuild               # Rebuild from image
POST   /servers/<id>/actions/change_type           # Resize
POST   /servers/<id>/actions/enable_rescue         # Enable rescue mode
POST   /servers/<id>/actions/request_console       # VNC console
POST   /servers/<id>/actions/create_image          # Create snapshot
GET    /servers/<id>/metrics?type=cpu,disk,network  # Server metrics

# Volumes
GET    /volumes                                    # List volumes
POST   /volumes                                    # Create volume
DELETE /volumes/<id>                               # Delete volume
POST   /volumes/<id>/actions/attach                # Attach to server
POST   /volumes/<id>/actions/detach                # Detach
POST   /volumes/<id>/actions/resize                # Resize (grow only)

# Firewalls
GET    /firewalls                                  # List firewalls
GET    /firewalls/<id>                             # Firewall details
POST   /firewalls                                  # Create firewall
DELETE /firewalls/<id>                             # Delete firewall
POST   /firewalls/<id>/actions/set_rules           # Set rules (replaces all)
POST   /firewalls/<id>/actions/apply_to_resources  # Apply to servers
POST   /firewalls/<id>/actions/remove_from_resources # Remove from servers

# Load Balancers
GET    /load_balancers                             # List LBs
GET    /load_balancers/<id>                        # LB details
POST   /load_balancers                             # Create LB
DELETE /load_balancers/<id>                        # Delete LB
POST   /load_balancers/<id>/actions/add_target     # Add target
POST   /load_balancers/<id>/actions/remove_target  # Remove target
POST   /load_balancers/<id>/actions/add_service    # Add service

# Networks
GET    /networks                                   # List networks
GET    /networks/<id>                              # Network details
POST   /networks                                   # Create network
DELETE /networks/<id>                              # Delete network
POST   /networks/<id>/actions/add_subnet           # Add subnet
POST   /networks/<id>/actions/add_route            # Add route

# Images
GET    /images                                     # List images
GET    /images?type=snapshot                       # List snapshots
GET    /images?type=backup                         # List backups
GET    /images/<id>                                # Image details
DELETE /images/<id>                                # Delete image

# SSH Keys
GET    /ssh_keys                                   # List SSH keys
POST   /ssh_keys                                   # Create SSH key
DELETE /ssh_keys/<id>                              # Delete SSH key

# Floating IPs
GET    /floating_ips                               # List floating IPs
POST   /floating_ips                               # Create floating IP
DELETE /floating_ips/<id>                          # Delete floating IP
POST   /floating_ips/<id>/actions/assign           # Assign to server
POST   /floating_ips/<id>/actions/unassign         # Unassign

# Pricing & Info
GET    /pricing                                    # Full pricing
GET    /server_types                               # Server types + prices
GET    /locations                                  # Locations
GET    /datacenters                                # Datacenters

# Actions
GET    /actions/<id>                               # Action status

# DNS (DIFFERENT API — https://dns.hetzner.com/api/v1)
# Uses Auth-API-Token header, NOT Bearer token
# GET    /zones                                    # List zones
# GET    /records?zone_id=<id>                     # List records
# POST   /records                                  # Create record
# PUT    /records/<id>                             # Update record
# DELETE /records/<id>                             # Delete record

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.