Cloudflare API CLI with MCP server support for managing DNS records, zones, cache, and firewall rules
8 tools with clear verb-noun naming (dns_list, dns_add, dns_update, dns_delete, zone_list, cache_purge, firewall_list, firewall_add). All have descriptions (avg ~50 chars, baseline 194). Input schemas visible with types and descriptions for all parameters. However, descriptions are terse (10-50 chars), below the 50-200 char LLM-optimized range. No output schemas documented. No error handling guidance. No enums for constrained inputs (e.g., 'mode' in firewall_add accepts 5 values but no enum). Token parameter exposed across all tools (security risk). No pagination support for list tools. Missing idempotency/destructive hints.
Purge cached content for a zone
Create a DNS record
Delete a DNS record
List DNS records for a zone
Update a DNS record
Create an IP access rule for a zone
List IP access rules for a zone
Token parameter exposed in all 8 tools as optional string. Credentials must never appear as tool parameters, use server-side secret injection via environment variables or vault. Agent traces log every parameter; secrets leak into logs and prompt history.
Descriptions are terse (10-50 chars, baseline 194 chars). LLMs cannot determine when/why to select tools. Descriptions lack WHAT the tool does, WHEN to use it, and prerequisites. E.g., 'List DNS records for a zone' should explain: 'Retrieves all DNS records for a Cloudflare zone. Use this to audit current DNS configuration or find a specific record before updating/deleting. Returns record ID, type, name, content, TTL, and proxy status.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
List Cloudflare zones
No output schemas documented. LLMs cannot plan downstream tool calls or extract required data. E.g., dns_list should document: returns array of {id, type, name, content, ttl, proxied, created_on, modified_on}. dns_add should document: returns {id, type, name, content, ttl, proxied, created_on}.
No enums for constrained inputs. firewall_add 'mode' accepts 5 values (block, challenge, whitelist, js_challenge, managed_challenge) but no enum constraint. dns_add/dns_update 'type' accepts 5 values (A, AAAA, CNAME, MX, TXT) but no enum. Free-form strings invite hallucinated values.
List tools (dns_list, zone_list, firewall_list) lack pagination support. No limit, offset, or page parameters. No total count or next_cursor in response. Large result sets will blow context window and degrade LLM reasoning.