MCP server for Gandi LiveDNS — manage DNS records, domains, and zone snapshots from Claude Code or any MCP client.
Gandi MCP demonstrates solid fundamentals: all 8 tools have clear verb-noun naming (list_*, get_*, add_*, update_*, delete_*, create_*), comprehensive descriptions (100-200 chars typical), and complete JSON Schema with type definitions and parameter descriptions. Input schemas are strict (additionalProperties: false). Error handling includes GandiError with user-facing messages and scrubbing. However, output schemas are not documented, LLMs cannot predict response structure. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Destructive operations (delete_record) lack confirmation/dry-run patterns. Parameter descriptions are good but could be more prescriptive about constraints (e.g., TTL range, glob pattern syntax). No pagination support despite list_domains and list_records potentially returning large result sets.
Add a new DNS record. A local JSON backup of the full zone is written first (configurable). Verifies by re-fetching the record.
Create a server-side zone snapshot on Gandi. Snapshots persist on Gandi's servers and can be reviewed via `list_snapshots`. Use this before risky changes you might want to roll back.
Delete a DNS record. Irreversible. A local JSON backup of the full zone is written first (configurable).
Fetch a single DNS record by name and type. Throws if no record with that name and type exists — use `list_records` first if you're unsure what exists.
List all LiveDNS-managed domains the authenticated user can see, including domains owned by any organization the user belongs to. Without `sharing_id`, results are the union of the personal organization and every reachable organization. Pass `sharing_id` to scope to one organization.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields does list_domains return? Is it an array of objects with fqdn, status, registrar?). This forces agents to guess and wastes tokens on trial-and-error.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like delete_record are marked DESTRUCTIVE in metadata but the MCP tool definition lacks destructiveHint annotation. Agents cannot distinguish safe reads from irreversible writes without reading descriptions.
Destructive operations (delete_record) lack confirmation or dry-run support. An agent can irreversibly delete DNS records without a confirmation step. No pattern:confirmation-request implementation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
List DNS records for a domain. Optionally filter by `type` (A, CNAME, MX, TXT, ...) and `nameFilter` (anchored, case-insensitive glob: `*` = any chars, `?` = one char).
List server-side zone snapshots Gandi has stored for a domain.
Replace values and/or TTL for an existing record. A local JSON backup of the full zone is written first (configurable). Verifies by re-fetching.
No pagination support. list_domains and list_records could return hundreds of items, exhausting context window. No limit parameter, no offset/cursor, no total count in response. Violates pattern:paginated-result.
Parameter constraints not fully specified. TTL parameter in add_record and update_record lacks min/max bounds. nameFilter glob syntax ('*' and '?') is documented but not formally constrained. Agents may pass invalid values.