A provider-agnostic MCP server that performs DNS record CRUD (list/get/create/update/delete) as typed tools, with credentials resolved at call time and a pluggable backend interface.
Five tools with clear verb-noun naming (dns_list_records, dns_get_record, dns_create_record, dns_update_record, dns_delete_record). All have descriptions (avg ~120 chars, within 10-1024 range). Input schemas present with typed parameters and descriptions. However, output schemas are NOT documented, responses are inferred as dict[str, Any] with no field specification. Parameter descriptions lack format constraints (e.g., what constitutes a valid zone, name, or type value). No enum constraints for the 'type' parameter despite DNS having a fixed set of valid RR types (A, AAAA, CNAME, TXT, MX, NS, SOA, etc.). Error handling maps DnsError to ToolError but provides no recovery guidance or categorization. Missing pagination for dns_list_records despite potentially returning large record sets.
Create a DNS record in ``zone``. ``name`` is the record name (``@`` for the apex, ``*`` for a wildcard). ``type`` is a supported RR type (A/AAAA/CNAME/TXT/MX/...). ``value`` is the record data. ``ttl`` (seconds) is optional; ``priority`` is used by MX/SRV. The backend rejects a record that already exists.
Delete the record identified by ``name`` + ``type`` in ``zone``.
Get the record identified by ``name`` + ``type`` in ``zone``.
List every DNS record in ``zone`` (sorted by name then type).
Update the record identified by ``name`` + ``type`` in ``zone`` to ``value`` (and optional ``ttl`` / ``priority``).
Output schemas not documented. Tools return dict[str, Any] with no field specification. LLMs cannot plan downstream calls or extract required data (e.g., created record ID, updated TTL).
'type' parameter accepts free-form strings instead of enum. DNS has fixed RR types (A, AAAA, CNAME, TXT, MX, NS, SOA, SRV, etc.). LLMs will hallucinate invalid types.
Parameter descriptions lack format constraints. 'zone' description does not specify format (FQDN, no trailing dot?). 'name' allows '@' and '*' but does not document other valid formats. 'value' is vague, does not specify format per record type (IP for A, hostname for CNAME, etc.).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
dns_list_records lacks pagination (limit, offset, next_cursor). Large zones could return hundreds of records, exhausting context window. No result count or truncation indicator.
Error handling provides no recovery guidance. DnsError is mapped to ToolError with a message, but LLM does not know if error is retryable, user-fixable, or fatal. No suggestions for next steps.