Skip to content

v2.1.0

Choose a tag to compare

@lazyants lazyants released this 20 May 18:45
· 22 commits to main since this release
f0a6ab9

Added

  • DNS Zones module (src/tools/zones.ts) + new entry binary
    hetzner-mcp-dns (src/entry-dns.ts) covering 22 tools across
    the Hetzner DNS Zones API (zones CRUD, RRSets CRUD,
    primary-nameserver changes, protection, TTL changes, zonefile
    import/export). Wraps the GA Nov 2025 surface on the existing
    api.hetzner.cloud baseURL + token (PR #24).
  • change_*_protection across 7 resources: servers, load
    balancers, volumes, networks, floating IPs, primary IPs, images.
    Adds the data-loss guard rails the API has supported for years
    but were never wrapped (PR #21).
  • Per-resource list_*_actions for 8 resources: load balancers,
    volumes, floating IPs, primary IPs, networks, firewalls,
    certificates, images (PR #23). Replaces the global /actions
    endpoint Hetzner deprecated in January 2025.
  • Server actions: request_console, enable_backup,
    disable_backup, change_alias_ips, change_dns_ptr (servers);
    change_ip_range (networks). Plus must_be_unassigned
    precondition notes on delete_floating_ip / delete_primary_ip
    descriptions (PR #25).
  • Per-tool axios-mock test coverage across all 14 tool modules
    (PRs #26, #28, #29, #30). Every tool now has at least one test
    asserting path/method/body/query shape against a mocked
    hetznerRequest().
  • README tool counts updated to reflect the 147-tool surface
    (PR #27).

Changed

  • Migrated to Zod 4 (zod ^4.4.3). Brings hetzner into line
    with @lazyants/lexware-mcp-server and
    @lazyants/transkribus-mcp-server (both already on Zod 4 since
    their 2.0.1). All z.record(z.unknown()) call sites updated to
    the Zod-4 two-argument form z.record(z.string(), z.unknown()).
    Runtime-verified .describe() propagation and tools/list
    required[] correctness on the full schema surface (PR #22).
  • Bumped grouped minor+patch deps (PR #18): see the Dependabot PR
    for the exact diff. No behavior changes.

Fixed

  • formatResponse no longer sets structuredContent for array
    payloads. The MCP SDK rejects arrays in structuredContent;
    previously this would crash on any tool returning a top-level
    array (e.g. paginated list_* shortcuts). Now array payloads
    go through the JSON-stringified content[] path only (PR #31).

Note on tool count

Total registered tools grew from 104 to 147 (+43): +22 DNS Zones
(PR #24), +8 list_*_actions (PR #23), +6 server/network actions
(PR #25), +7 change_*_protection (PR #21). Smoke test asserts
147 across full server + per-entry splits (28/21/25/20/17/14/22).