{"openapi":"3.1.0","info":{"title":"Hetzner Cloud (BYOK) API","version":"0.1.0","description":"Hetzner Cloud (BYOK) lets an AI assistant read your own Hetzner Cloud data through the Hetzner Cloud API with a key you supply (Cloud project API token (read-only is enough)). Read-only: 8 tools (list_servers, get_server, list_networks, list_volumes, list_firewalls, list_floating_ips, list_ssh_keys, list_locations). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-hetzner.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-hetzner/docs"},"termsOfService":"https://connectorbay.com/byok-hetzner/terms"},"servers":[{"url":"https://byok-hetzner.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-hetzner/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_servers":{"post":{"operationId":"list_servers","summary":"List the cloud servers of the token's project with status, server type, location, public IPv4 and IPv6 addresses, image ","description":"List the cloud servers of the token's project with status, server type, location, public IPv4 and IPv6 addresses, image and creation time. Use for \"Which Hetzner Cloud servers are running in my project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"status":{"anyOf":[{"enum":["running","initializing","starting","stopping","off","deleting","migrating","rebuilding","unknown"],"type":"string"},{"type":"null"}],"default":null,"description":"Only servers with this status.","title":"Status"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_serversArguments","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_server":{"post":{"operationId":"get_server","summary":"Get one cloud server by its numeric id: status, type, location, addresses, image, traffic counters and labels. Use for \"","description":"Get one cloud server by its numeric id: status, type, location, addresses, image, traffic counters and labels. Use for \"What is the status and IP address of Hetzner server 42\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the server, as shown by list_servers.","minimum":1,"title":"Id","type":"integer"}},"required":["id"],"title":"get_serverArguments","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_networks":{"post":{"operationId":"list_networks","summary":"List private networks with their IP range, subnets, routes and labels. Use for \"What private networks do I have in Hetzn","description":"List private networks with their IP range, subnets, routes and labels. Use for \"What private networks do I have in Hetzner Cloud\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_networksArguments","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_volumes":{"post":{"operationId":"list_volumes","summary":"List block storage volumes with size in GB, location, the server each is attached to and status. Use for \"How big are my","description":"List block storage volumes with size in GB, location, the server each is attached to and status. Use for \"How big are my Hetzner volumes and which server uses each\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"status":{"anyOf":[{"enum":["available","creating"],"type":"string"},{"type":"null"}],"default":null,"description":"Only volumes with this status.","title":"Status"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_volumesArguments","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_firewalls":{"post":{"operationId":"list_firewalls","summary":"List firewalls with their rules and the resources they are applied to. Use for \"Which firewall rules do I have in Hetzne","description":"List firewalls with their rules and the resources they are applied to. Use for \"Which firewall rules do I have in Hetzner Cloud\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_firewallsArguments","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_floating_ips":{"post":{"operationId":"list_floating_ips","summary":"List floating IP addresses with type, the server each is assigned to, home location and reverse DNS entries. Use for \"Wh","description":"List floating IP addresses with type, the server each is assigned to, home location and reverse DNS entries. Use for \"Which floating IPs do I have and where are they assigned\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_floating_ipsArguments","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_ssh_keys":{"post":{"operationId":"list_ssh_keys","summary":"List the names and fingerprints of SSH keys stored in the project. The key bodies are not returned. Use for \"Which SSH k","description":"List the names and fingerprints of SSH keys stored in the project. The key bodies are not returned. Use for \"Which SSH keys are registered in my Hetzner project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only return resources with exactly this name.","title":"Name"},"fingerprint":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only the key with this fingerprint.","title":"Fingerprint"},"label_selector":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Label selector to filter by, for example 'env=prod' or 'env in (prod,stage)'.","title":"Label Selector"},"sort":{"anyOf":[{"enum":["id","id:asc","id:desc","name","name:asc","name:desc","created","created:asc","created:desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: id, name or created, optionally with :asc or :desc, for example 'created: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_ssh_keysArguments","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_locations":{"post":{"operationId":"list_locations","summary":"List Hetzner Cloud locations with city, country and network zone. Use for \"Which Hetzner Cloud locations exist and in wh","description":"List Hetzner Cloud locations with city, country and network zone. Use for \"Which Hetzner Cloud locations exist and in which network zones\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Only the location with this name, for example 'fsn1'.","title":"Name"},"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_locationsArguments","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}}}}