{"name":"io.github.ni-c/hetzner-dns-mcp","slug":"ni-c-hetzner-dns-mcp","title":"Hetzner DNS","description":"Manage DNS zones and records (zonefiles, RRSets, TTL, protection) via the Hetzner Cloud API","url":"https://mcp.market/server/ni-c-hetzner-dns-mcp","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":27,"stars":0,"forks":0,"downloads_week":60,"last_push_at":"2026-09-16T08:52:54.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ni-c/hetzner-dns-mcp","website":"https://hetzner-dns-mcp.ni-c.de","version":"0.6.0","remotes":[],"packages":[{"registryType":"npm","identifier":"hetzner-dns-mcp","version":"0.6.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Hetzner Cloud API token (project-scoped, Cloud Console -> Security -> API tokens)","isRequired":true,"format":"string","isSecret":true,"name":"HETZNER_API_TOKEN"},{"description":"Set to true to register only the read-only tools (default: false)","format":"boolean","name":"HETZNER_READ_ONLY"},{"description":"Comma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)","format":"string","name":"HETZNER_ALLOW_TOOLS"},{"description":"Comma-separated tool names or list_* prefixes to remove from whatever HETZNER_ALLOW_TOOLS left","format":"string","name":"HETZNER_DENY_TOOLS"},{"description":"Override the Hetzner Cloud API base URL (default: https://api.hetzner.cloud/v1)","format":"string","name":"HETZNER_API_BASE_URL"}]},{"registryType":"oci","identifier":"ghcr.io/ni-c/hetzner-dns-mcp:0.6.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Hetzner Cloud API token (project-scoped, Cloud Console -> Security -> API tokens)","isRequired":true,"format":"string","isSecret":true,"name":"HETZNER_API_TOKEN"},{"description":"Set to true to register only the read-only tools (default: false)","format":"boolean","name":"HETZNER_READ_ONLY"},{"description":"Comma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)","format":"string","name":"HETZNER_ALLOW_TOOLS"},{"description":"Comma-separated tool names or list_* prefixes to remove from whatever HETZNER_ALLOW_TOOLS left","format":"string","name":"HETZNER_DENY_TOOLS"},{"description":"Override the Hetzner Cloud API base URL (default: https://api.hetzner.cloud/v1)","format":"string","name":"HETZNER_API_BASE_URL"}]}],"tools":[{"name":"add_records","description":"Add records to an RRSet. Existing records are kept. Creates the RRSet if it does not exist yet — so denying create_rrset does not remove the ability to create one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"change_primary_nameservers","description":"Replace the primary nameservers of a secondary zone (the servers Hetzner transfers the zone from). The ENTIRE zone content will be taken from the new primaries on the next transfer. Only applicable to zones in secondary mode. The first call returns a short-lived confirmation token bound to exactly this nameserver list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"change_rrset_protection","description":"Enable or disable the change protection of an RRSet. Enabling is immediate; DISABLING removes the last safeguard against delete_rrset and set_records and therefore needs a confirm_token.","write_action":false,"price_micros":0,"input_schema":null},{"name":"change_rrset_ttl","description":"Change the Time To Live (TTL) of an RRSet. Pass null to fall back to the zone's default TTL.","write_action":false,"price_micros":0,"input_schema":null},{"name":"change_zone_protection","description":"Enable or disable the delete protection of a DNS zone. Enabling is immediate; DISABLING removes the last safeguard against delete_zone and therefore needs a confirm_token, exactly like a deletion.","write_action":false,"price_micros":0,"input_schema":null},{"name":"change_zone_ttl","description":"Change the default Time To Live (TTL) of a DNS zone. Applies to RRSets without an explicit TTL.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_rrset","description":"Create a new RRSet (DNS record set) in a zone, e.g. an A record for \"www\". Fails if an RRSet with the same name and type already exists — use set_records or add_records in that case.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_zone","description":"Create a new DNS zone. Use mode \"primary\" for zones managed at Hetzner, or \"secondary\" with primary_nameservers to transfer the zone from external primaries. A primary zone can optionally be initialized from a zone file. Creating a zone with primary_nameservers or a zonefile asks a person first — those two carry the whole content of the zone, exactly like change_primary_nameservers and import_zone","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_rrset","description":"Permanently delete an RRSet (DNS record set) with all its records. This is irreversible. The first call returns a short-lived confirmation token; ask the user, then call again with confirm_token.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_zone","description":"Permanently delete a DNS zone including all its records. This is irreversible. The first call returns a short-lived confirmation token; ask the user, then call again with confirm_token.","write_action":true,"price_micros":0,"input_schema":null},{"name":"export_zonefile","description":"Export the full contents of a DNS zone as a zone file (BIND format).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_rrset","description":"Get a single RRSet (DNS record set) of a zone by name and type.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_zone","description":"Get the full details of a single DNS zone.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_zone_action","description":"Get a single zone action by ID to check its status and result.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_zonefile","description":"Import a zone file (BIND format) into an existing primary zone. This REPLACES the current records of the zone. The first call returns a short-lived confirmation token bound to exactly this zone file; ask the user, then call again with confirm_token. Consider export_zonefile first as a backup.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_rrsets","description":"List the RRSets (DNS record sets) of a zone, including their records, TTLs and protection status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_zone_actions","description":"List actions (asynchronous operations like zone file imports) of all zones, or of a single zone if one is given.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_zones","description":"List the DNS zones of the Hetzner Cloud project, including status, mode, default TTL, assigned nameservers and record counts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_records","description":"Remove specific records (matched by value) from an RRSet. Removing the last record deletes the RRSet — so denying delete_rrset does not remove the ability to delete one. The first call returns a short-lived confirmation token bound to exactly this record list.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_records","description":"Replace ALL records of an RRSet with the given records. Existing records not listed are removed. Use add_records to append instead. The first call returns a short-lived confirmation token bound to exactly this record list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_rrset","description":"Update the labels of an RRSet. The given set replaces all existing labels. (Records and TTL are changed via set_records/add_records/remove_records and change_rrset_ttl.)","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_zone","description":"Update the labels of a DNS zone. The given set replaces all existing labels. (Other zone properties are changed via the dedicated change_zone_* tools.)","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-20T00:26:19.879Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T00:26:19.868Z","components":{"code":{"score":25,"max":25,"notes":["31 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"hetzner-dns-mcp","version":"0.6.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-09-07T20:12:46.256Z","repositoryUrl":"git+https://github.com/ni-c/hetzner-dns-mcp.git","weeklyDownloads":60}],"repo":{"found":true,"owner":"ni-c","repo":"hetzner-dns-mcp","archived":false,"pushedAt":"2026-09-16T08:52:54Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/283341?v=4","ownerCreatedAt":"2010-05-21T13:00:22Z","license":"MIT"},"icon":{"url":"https://hetzner-dns-mcp.ni-c.de/favicon.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":60,"license":"MIT","lastPushAt":"2026-09-16T08:52:54.000Z","score":27}}}},"grade_history":[],"reviews":[]}