Public leaderboard

Public assessment

ofershap/mcp-server-cloudflare (mcp-server-cloudflare-dns)

mcp-server-cloudflare-dns · v0.1.0 · scanned

What changed in the harness

Selection accuracy 98→100, token cost up 15%, unconfirmed writes 0%→0%.

Category breakdown

Where the score comes from.

Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.

01Safety

0.0 / 30

0.0 out of 30
02Legibility

22.2 / 30

22.2 out of 30
03Economics

19.7 / 20

19.7 out of 20
04Discoverability

11.1 / 20

11.1 out of 20

Highest-impact fix

Estimated gain +30 points

Add explicit identity and permission preflight tools

Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.

Description evidence

Defects and rewrites.

13 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.

Tool Defect types Suggested rewrite
cf_zones
params_unexplained no_return_description
Lists Cloudflare zones (domains) in the account. 'page' selects the results page and 'perPage' sets how many zones to return per page (max 50); returns an array of zone objects with id, name, and status.
cf_dns_list
params_unexplained no_return_description
Lists DNS records belonging to the zone given by 'zoneId'. 'page' and 'perPage' (max 100) control pagination; returns an array of DNS record objects (id, type, name, content, ttl, proxied).
cf_dns_create
params_unexplained no_return_description
Creates a DNS record in the zone given by 'zoneId', using the supplied type, name, content, ttl, and proxied flag; returns the newly created DNS record object including its assigned ID.
cf_dns_delete
params_unexplained no_return_description
Deletes the DNS record 'recordId' from the zone given by 'zoneId'; returns confirmation that the record was deleted.
cf_workers_list
no_return_description
Lists Workers scripts deployed under the given (or default) account; returns an array of script metadata objects including name and last-modified date.
cf_worker_delete
params_unexplained no_return_description
Deletes the Workers script 'scriptName' from the account given by 'accountId' (falls back to the configured default account); returns confirmation that the script was deleted.
cf_kv_namespaces
params_unexplained no_return_description
Lists KV namespaces under the account given by 'accountId' (falls back to the configured default account); returns an array of namespace objects including id and title.
cf_kv_keys
params_unexplained no_return_description
Lists keys in the KV namespace 'namespaceId', optionally filtered by 'prefix' and capped at 'limit' results (max 1000), under the account given by 'accountId'; returns an array of key metadata objects.
cf_kv_get
params_unexplained no_return_description
Reads the value stored under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns the stored value's contents.
cf_kv_put
params_unexplained no_return_description
Writes 'value' under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns confirmation that the write succeeded.
cf_kv_delete
params_unexplained no_return_description
Deletes the entry under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns confirmation that the key was deleted.
cf_r2_buckets
params_unexplained no_return_description
Lists R2 storage buckets under the account given by 'accountId'; returns an array of bucket objects including name and creation date.
cf_cache_purge
params_unexplained no_return_description
Purges cached content for the zone given by 'zoneId' — everything when 'purgeAll' is true, otherwise only the entries listed in 'urls'; returns confirmation that the purge request was accepted.

Selection evidence

Confusable tool pairs.

7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.

Tool A Tool B Confidence Why they collide
cf_kv_get cf_kv_put medium A vague task like 'update the KV value for key X' could lead the agent to call cf_kv_get instead of cf_kv_put, or vice versa, since both operate on the same key/namespace and differ only in read vs write intent.
cf_dns_list cf_dns_create low Both operate on DNS records for a zone; a task like 'add the DNS record' is unlikely to be confused with listing, but an ambiguous phrasing like 'set up the www record' could momentarily point to list if the agent is checking existence first, though intent is usually clear.
cf_dns_delete cf_kv_delete low Both are delete operations but act on entirely different resource types (DNS record vs KV key) with distinct required params, so confusion is unlikely unless the task is extremely vague about what 'record' means.
cf_dns_delete cf_worker_delete low Both delete Cloudflare resources but target clearly different entities (DNS record vs Worker script); a task naming 'the record' vs 'the worker' would disambiguate easily.
cf_kv_namespaces cf_kv_keys medium A task like 'list the KV namespace contents' is ambiguous between listing namespaces themselves (cf_kv_namespaces) and listing keys within a namespace (cf_kv_keys), especially if the user conflates 'namespace' with its contents.
cf_dns_list cf_workers_list low Both are 'list' tools but for unrelated resource types (DNS records vs Worker scripts); a task would need to omit the resource type entirely to cause confusion, which is unlikely.
cf_workers_list cf_worker_delete low Clearly distinct actions (list vs delete) on the same resource type; a task like 'remove the worker' would not plausibly trigger the list tool.

Compare the field

One score is useful.
The evidence makes it actionable.

Back to the leaderboard