{"openapi":"3.1.0","info":{"title":"Hetzner Cloud DNS (BYOK) API","version":"0.1.0","description":"Hetzner Cloud DNS (BYOK) lets an AI assistant read your own Hetzner Cloud DNS data through the Hetzner Cloud DNS API with a key you supply (Cloud project API token (read-only is enough)). Read-only: 5 tools (list_zones, get_zone, list_rrsets, get_rrset, list_zone_actions). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-hetzner-cloud-dns.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-hetzner-cloud-dns/docs"},"termsOfService":"https://connectorbay.com/byok-hetzner-cloud-dns/terms"},"servers":[{"url":"https://byok-hetzner-cloud-dns.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-hetzner-cloud-dns/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_zones":{"post":{"operationId":"list_zones","summary":"List DNS zones with status, mode (primary or secondary), default TTL, record count, delegation status and nameservers. U","description":"List DNS zones with status, mode (primary or secondary), default TTL, record count, delegation status and nameservers. Use for \"Which DNS zones do I host with Hetzner and are they delegated correctly\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":253,"type":"string"},{"type":"null"}],"default":null,"description":"Only the zone with exactly this name.","title":"Name"},"mode":{"anyOf":[{"enum":["primary","secondary"],"type":"string"},{"type":"null"}],"default":null,"description":"Zone mode: primary or secondary.","title":"Mode"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod'.","title":"Label Selector"},"per_page":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. meta.pagination.next_page in the answer is empty on the last page.","title":"Page"}},"title":"list_zonesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_zone":{"post":{"operationId":"get_zone","summary":"Get one DNS zone by id or name with status, TTL, record count, nameservers and delegation check result. Use for \"Is exam","description":"Get one DNS zone by id or name with status, TTL, record count, nameservers and delegation check result. Use for \"Is example.com delegated to the Hetzner nameservers\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"zone":{"description":"Zone id (number) or zone name such as 'example.com', as shown by list_zones.","maxLength":200,"title":"Zone","type":"string"}},"required":["zone"],"title":"get_zoneArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_rrsets":{"post":{"operationId":"list_rrsets","summary":"List the record sets of a primary zone with name, type, TTL and record values (filter by name or type). Use for \"What DN","description":"List the record sets of a primary zone with name, type, TTL and record values (filter by name or type). Use for \"What DNS records does example.com have at Hetzner\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"zone":{"description":"Zone id (number) or zone name such as 'example.com', as shown by list_zones.","maxLength":200,"title":"Zone","type":"string"},"name":{"anyOf":[{"maxLength":253,"type":"string"},{"type":"null"}],"default":null,"description":"Only record sets with exactly this name, for example 'www' or '@'.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod'.","title":"Label Selector"},"per_page":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. meta.pagination.next_page in the answer is empty on the last page.","title":"Page"}},"required":["zone"],"title":"list_rrsetsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_rrset":{"post":{"operationId":"get_rrset","summary":"Get one record set of a primary zone by name and type, with its TTL and record values. Use for \"What are the MX records ","description":"Get one record set of a primary zone by name and type, with its TTL and record values. Use for \"What are the MX records of example.com at Hetzner\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"zone":{"description":"Zone id (number) or zone name such as 'example.com', as shown by list_zones.","maxLength":200,"title":"Zone","type":"string"},"rr_name":{"description":"Record set name relative to the zone, for example 'www' or '@' for the apex.","maxLength":200,"title":"Rr Name","type":"string"},"rr_type":{"description":"Record type.","enum":["A","AAAA","CAA","CNAME","DS","HINFO","HTTPS","MX","NS","PTR","RP","SOA","SRV","SVCB","TLSA","TXT"],"title":"Rr Type","type":"string"}},"required":["zone","rr_name","rr_type"],"title":"get_rrsetArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_zone_actions":{"post":{"operationId":"list_zone_actions","summary":"List recent DNS zone actions (imports, nameserver changes, record changes) with command, status, progress and errors. Us","description":"List recent DNS zone actions (imports, nameserver changes, record changes) with command, status, progress and errors. Use for \"Did the last DNS changes on my Hetzner zones finish\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":["running","success","error"],"type":"string"},{"type":"null"}],"default":null,"description":"Only actions with this status: running, success or error.","title":"Status"},"sort":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Order, for example 'id:desc' or 'started:desc'.","title":"Sort"},"per_page":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. meta.pagination.next_page in the answer is empty on the last page.","title":"Page"}},"title":"list_zone_actionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}