Hetzner DNS
Use this skill for Hetzner DNS zone discovery and A, AAAA, CNAME, TXT, and other record management through the Hetzner DNS API.
Default Workflow
- Read first: list zones, then list records for the target zone id.
- The DNS API is record-id based. Use
list-rrsetsto discover existing record ids before update or delete requests. - Use
planbefore mutations so the operator can see the tier and required grant. - Treat
hetzner_dns.cjsas the API wrapper. Do not handcraft Hetzner DNS API URLs, JSON bodies, tiers, or secret refs from memory. - For prompt/user testing, stop after
planor after helperhttp-requestpayload generation. Do not call the built-inhttp_requesttool. - For real user requests that need live Hetzner DNS reads, pass the
helper-emitted
httpRequestobject unchanged tohttp_request. ThesecretHeadersentry forAuth-API-Tokenis the secret reference; do not preflight it, inspect it, or ask the model for the token. - If a live
http_requestcall returns 401 or 403, stop after that first failure. Do not retry, do not fan out to more endpoints, and ask the operator to set or verifyHETZNER_DNS_API_TOKEN. - Require explicit operator grant before creating, updating, adding, removing,
or deleting records. Pass
--operator-grantonly after that grant. - Never paste, print, or inspect
HETZNER_DNS_API_TOKEN; the gateway injects it server-side asAuth-API-Token.
See references/operator-setup.md for DNS token setup, scope, autonomy defaults, and record-id handling.
Command Contract
node skills/hetzner-dns/hetzner_dns.cjs --help
Plan a DNS request without contacting Hetzner:
node skills/hetzner-dns/hetzner_dns.cjs --format json plan "Point demo-acme.example.com at the demo VPS"
Build read requests:
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request list-zones
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request list-rrsets --zone-id zone123 --name demo --type A
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request get-rrset --record-id record123
Build guarded write requests:
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request create-rrset \
--zone-id zone123 --name demo --type A --ttl 300 --record 203.0.113.10 \
--operator-grant
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request update-rrset \
--record-id record123 --zone-id zone123 --name demo --type A --ttl 300 --record 203.0.113.11 \
--operator-grant
node skills/hetzner-dns/hetzner_dns.cjs --format json http-request delete-record \
--record-id record123 --operator-grant
Working Rules
create-rrsetandadd-recordemit one DNS API record create request. For multiple values, build one request per value.- Use
update-rrsetonly with an exact--record-idfrom a prior read. - Use
remove-record,delete-record, ordelete-rrsetonly with an exact--record-id. - Do not modify generated SOA records or default NS records.
- Use
@for apex records when the API requires a record name. - Stop before red actions (
delete-record,delete-rrset,delete-zone) unless the operator grants the exact record id or zone id target. - Cost per assistant run is recorded by HybridClaw
UsageTotals; helper output includescostMeasurement.system = "UsageTotals"for eval verification.
Eval Suite
node skills/hetzner-dns/hetzner_dns.cjs --format json eval-scenarios
The fixture at evals/scenarios.json contains 10 DNS scenarios covering zone
reads, record reads, A/AAAA/CNAME/TXT changes, and guarded deletes.
Validation
python3 skills/skill-creator/scripts/quick_validate.py skills/hetzner-dns
node skills/hetzner-dns/hetzner_dns.cjs --help
node skills/hetzner-dns/hetzner_dns.cjs --format json eval-scenarios