cloudflare-mcp-pro
Provides tools for managing Cloudflare services including DNS, Zones, Workers, KV, R2, D1, Pages, Queues, Tunnels, SSL, WAF, Email Routing, Logpush, and Workers AI via the Cloudflare REST API v4.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cloudflare-mcp-pro list DNS records for example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Cloudflare MCP Pro ☁️
MCP server for the Cloudflare REST API v4 — 69 tools across DNS, Zones, Workers, KV, R2, D1, Pages, Queues, Tunnels, SSL, WAF, Email Routing, Logpush and Workers AI in a single local stdio server authenticated by API token.
Unlike the official Cloudflare MCP offering (13 separate remote, OAuth-based servers), cloudflare-mcp-pro runs locally over stdio, authenticates with a single API token, and consolidates the most-used Cloudflare operations into one server with consistent verb_object tool names — ideal for Claude Code, CI, and scripted automation.
Features
DNS — list/create/update/delete records, DNSSEC, BIND zone-file export
Zones — list/get/create/delete, settings (SSL mode, HTTPS, min TLS…), cache purge, GraphQL analytics
Workers — deploy (ES module), routes, secrets, cron triggers, list/get/delete
KV / R2 / D1 — namespaces + key CRUD, bucket management, databases + SQL queries
Pages / Queues / Tunnels — list/get projects, queue management, tunnel inspection
Security — WAF rulesets, IP/ASN/country access rules, page rules, SSL certificate packs, custom hostnames (SaaS), Turnstile widgets
Email Routing — rules + destination addresses
Logpush — list/create jobs (zone or account scoped)
Workers AI — model catalog + inference (text generation, embeddings, classification)
Human-approval gate — every mutating tool requires
confirm: true; without it the tool returns a non-executing preview (with secrets redacted) instead of acting (see below)MCP annotations — every tool carries readOnly/destructive/idempotent hints so clients can gate dangerous actions
Auto-pagination —
fetch_all: trueon list tools follows every pageSingle API-token auth, automatic retry + rate-limit (429/5xx) handling, and actionable error messages
Related MCP server: mcp-server-cloudflare
Installation
npm install
npm run buildOr run directly once published:
npx -y cloudflare-mcp-proConfiguration
Copy .env.example to .env and fill in:
Variable | Required | Description |
| ✅ | API token from https://dash.cloudflare.com/profile/api-tokens |
| optional | Default account ID used when a tool doesn't receive |
| optional | Override the API base URL |
Token scopes depend on what you use, e.g.: Zone:Read, DNS:Edit, Workers Scripts:Edit, Workers KV Storage:Edit, Workers R2 Storage:Edit, D1:Edit, Pages:Edit, Account Analytics:Read. Run the verify_token tool to confirm your token works.
Testing
Run the automated test suite (no network — fetch is mocked):
npm testIt covers the human-approval gate, secret redaction, the security validations (hex IDs, path-segment encoding, model-id allowlist, purge mutual-exclusion, analytics hour-alignment), the API client (query serialization, 429 retry, error mapping, pagination + clamp, GraphQL non-JSON guard) and the Zod→JSON-Schema converter.
Interactive testing with the MCP inspector:
npx @modelcontextprotocol/inspector dist/index.jsAdd to Claude Code
In .claude/settings.json → mcpServers:
{
"mcpServers": {
"cloudflare-mcp-pro": {
"command": "node",
"args": ["projects/cloudflare-mcp-pro/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your-token",
"CLOUDFLARE_ACCOUNT_ID": "your-account-id"
}
}
}
}Add to Claude Desktop
Mac:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"cloudflare-mcp-pro": {
"command": "node",
"args": ["/absolute/path/projects/cloudflare-mcp-pro/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your-token",
"CLOUDFLARE_ACCOUNT_ID": "your-account-id"
}
}
}
}Human-approval gate
Every mutating tool (any create_*, update_*, delete_*, deploy_*, put_*, edit_*, purge_cache, query_d1, run_ai, …) is gated server-side. Read-only tools (list_*, get_*, verify_token, export_dns_records, analytics) are never gated.
Calling a mutating tool without
confirm: truereturns aconfirmation_requiredpreview describing the tool, the risk level, and the (secret-redacted) arguments — and does not execute.Re-call the same tool with
"confirm": trueto actually perform it, after a human has approved.
This gate is enforced in the server regardless of the MCP client, and works alongside the MCP annotations (destructiveHint) that prompt the human in compatible clients like Claude Code. Secret values (e.g. Worker secret text) are redacted from previews and never appear in error messages.
// 1) preview (no confirm) → nothing happens
delete_zone { "zone_id": "..." }
// → { "status": "confirmation_required", "risk": "DESTRUCTIVE — ...", ... }
// 2) after human approval
delete_zone { "zone_id": "...", "confirm": true } // actually deletesTools (69)
List tools accept fetch_all: true to follow pagination. Mutating tools accept confirm: true (see the gate above). Every tool advertises MCP annotations (readOnlyHint / destructiveHint / idempotentHint).
Account — verify_token, list_accounts
Zones & settings — list_zones, get_zone, create_zone, delete_zone, purge_cache, get_zone_analytics, get_zone_setting, update_zone_setting
DNS — list_dns_records, create_dns_record, update_dns_record, delete_dns_record, get_dnssec, edit_dnssec, export_dns_records
Workers — list_workers, get_worker, deploy_worker, delete_worker, list_worker_routes, create_worker_route, delete_worker_route, put_worker_secret, delete_worker_secret, update_worker_cron
KV — list_kv_namespaces, create_kv_namespace, kv_list_keys, kv_get, kv_put, kv_delete
R2 — list_r2_buckets, create_r2_bucket, delete_r2_bucket
D1 — list_d1_databases, create_d1_database, query_d1
Pages — list_pages_projects, get_pages_project
WAF & firewall — list_firewall_rulesets, get_ruleset, list_access_rules, create_access_rule, delete_access_rule
Page rules — list_page_rules, create_page_rule, delete_page_rule
SSL/TLS — list_certificate_packs, get_ssl_verification, order_certificate_pack
Custom hostnames (SaaS) — list_custom_hostnames, create_custom_hostname, delete_custom_hostname
Email Routing — list_email_rules, create_email_rule, list_email_destinations
Queues — list_queues, create_queue, delete_queue
Tunnels — list_tunnels, get_tunnel
Turnstile — list_turnstile_widgets, create_turnstile_widget
Workers AI — list_ai_models, run_ai
Logpush — list_logpush_jobs, create_logpush_job
Author
Helbert Paranhos / Strat Academy — stratacademy.com.br
GitHub: @helbertparanhos
Instagram: @helbertparanhos
YouTube: @stratacademy
LinkedIn: helbert-paranhos
License
MIT — see LICENSE.
Available Tools
69 toolscreate_access_ruleA
Create an IP/ASN/country access rule (block, challenge, or whitelist). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), mode (required), target (required), value (required), +2 more.
create_custom_hostnameA
Add a custom hostname (SSL for SaaS) to a zone. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), hostname (required), ssl_method, ssl_type, +1 more.
create_d1_databaseA
Create a new D1 database. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), account_id, primary_location_hint, confirm.
create_dns_recordA
Create a DNS record (A, AAAA, CNAME, TXT, MX, etc). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), type (required), name (required), content (required), +5 more.
create_email_ruleA
Create an Email Routing rule (forward an address to a destination). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), match_to (required), forward_to (required), name, +2 more.
create_kv_namespaceA
Create a new Workers KV namespace. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: title (required), account_id, confirm.
create_logpush_jobA
Create a Logpush job streaming a dataset to a destination. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), dataset (required), destination_conf (required), zone_id, +4 more.
create_page_ruleA
Create a page rule (URL pattern + actions like cache_level, forwarding_url). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), url_pattern (required), actions (required), status, +2 more.
create_queueA
Create a new Cloudflare Queue. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: queue_name (required), account_id, confirm.
create_r2_bucketA
Create a new R2 bucket. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), account_id, location_hint, confirm.
create_turnstile_widgetA
Create a Turnstile widget (CAPTCHA alternative) for given domains. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), domains (required), account_id, mode, +1 more.
create_worker_routeA
Create a Worker route mapping a URL pattern to a Worker script. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), pattern (required), script, confirm.
create_zoneA
Add a new domain (zone) to an account. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), account_id, type, confirm.
delete_access_ruleADestructiveIdempotent
Delete an access rule by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), rule_id (required), confirm.
delete_custom_hostnameADestructiveIdempotent
Delete a custom hostname by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), custom_hostname_id (required), confirm.
delete_dns_recordADestructiveIdempotent
Delete a DNS record by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), record_id (required), confirm.
delete_page_ruleADestructiveIdempotent
Delete a page rule by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), rule_id (required), confirm.
delete_queueADestructiveIdempotent
Delete a Queue by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: queue_id (required), account_id, confirm.
delete_r2_bucketADestructiveIdempotent
Delete an (empty) R2 bucket. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: name (required), account_id, confirm.
delete_workerADestructiveIdempotent
Delete a Worker script by name. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: script_name (required), account_id, confirm.
delete_worker_routeADestructiveIdempotent
Delete a Worker route by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), route_id (required), confirm.
delete_worker_secretADestructiveIdempotent
Delete a secret binding from a Worker script. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: script_name (required), name (required), account_id, confirm.
delete_zoneADestructiveIdempotent
Delete a zone by ID. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), confirm.
deploy_workerAIdempotent
Create or update (deploy) a Worker script from ES module source. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: script_name (required), script (required), account_id, main_module, +2 more.
edit_dnssecAIdempotent
Enable or disable DNSSEC for a zone. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), status (required), confirm.
export_dns_recordsARead-only
Export all DNS records of a zone as a BIND zone file.
Inputs: zone_id (required).
get_dnssecARead-only
Get the DNSSEC status and DS record details for a zone.
Inputs: zone_id (required).
get_pages_projectARead-only
Get details of a Cloudflare Pages project.
Inputs: project_name (required), account_id.
get_rulesetARead-only
Get a single ruleset (with its rules) by ID.
Inputs: zone_id (required), ruleset_id (required).
get_ssl_verificationARead-only
Get SSL/TLS certificate verification status for a zone.
Inputs: zone_id (required).
get_tunnelARead-only
Get details of a Cloudflare Tunnel by ID.
Inputs: tunnel_id (required), account_id.
get_workerARead-only
Get a Worker script's settings/metadata.
Inputs: script_name (required), account_id.
get_zoneARead-only
Get details of a single zone by ID.
Inputs: zone_id (required).
get_zone_analyticsARead-only
Get HTTP traffic analytics for a zone over a time range (via GraphQL).
Inputs: zone_id (required), since (required), until (required).
get_zone_settingBRead-only
Get a single zone setting (e.g. ssl, always_use_https, min_tls_version).
Inputs: zone_id (required), setting (required).
kv_deleteADestructiveIdempotent
Delete a key from a KV namespace. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: namespace_id (required), key (required), account_id, confirm.
kv_getARead-only
Read the value of a key in a KV namespace.
Inputs: namespace_id (required), key (required), account_id.
kv_list_keysBRead-only
List keys in a KV namespace, optionally filtered by prefix.
Inputs: namespace_id (required), account_id, prefix, limit.
kv_putAIdempotent
Write a value to a key in a KV namespace, with optional TTL. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: namespace_id (required), key (required), value (required), account_id, +2 more.
list_access_rulesBRead-only
List IP/ASN/country access rules (block/challenge/allow) on a zone.
Inputs: zone_id (required), mode, page, per_page, +1 more.
list_accountsBRead-only
List Cloudflare accounts accessible by the token.
Inputs: page, per_page, fetch_all.
list_ai_modelsARead-only
Search the catalog of Workers AI models available to the account.
Inputs: account_id, search, task.
list_certificate_packsBRead-only
List SSL/TLS certificate packs on a zone.
Inputs: zone_id (required), status.
list_custom_hostnamesCRead-only
List custom hostnames (SSL for SaaS) on a zone.
Inputs: zone_id (required), hostname, page, per_page, +1 more.
list_d1_databasesCRead-only
List D1 databases in an account.
Inputs: account_id, name, page, per_page, +1 more.
list_dns_recordsARead-only
List DNS records of a zone, optionally filtered by type/name.
Inputs: zone_id (required), type, name, page, +2 more.
list_email_destinationsARead-only
List verified Email Routing destination addresses in an account.
Inputs: account_id.
list_email_rulesCRead-only
List Email Routing rules on a zone.
Inputs: zone_id (required).
list_firewall_rulesetsARead-only
List WAF rulesets configured on a zone.
Inputs: zone_id (required).
list_kv_namespacesBRead-only
List Workers KV namespaces in an account.
Inputs: account_id, page, per_page, fetch_all.
list_logpush_jobsBRead-only
List Logpush jobs for a zone or account.
Inputs: zone_id, account_id.
list_page_rulesARead-only
List page rules on a zone.
Inputs: zone_id (required), status.
list_pages_projectsARead-only
List Cloudflare Pages projects in an account.
Inputs: account_id.
list_queuesARead-only
List Cloudflare Queues in an account.
Inputs: account_id.
list_r2_bucketsARead-only
List R2 buckets in an account.
Inputs: account_id, name_contains.
list_tunnelsARead-only
List Cloudflare Tunnels (cloudflared) in an account.
Inputs: account_id, is_deleted.
list_turnstile_widgetsARead-only
List Turnstile widgets in an account.
Inputs: account_id.
list_worker_routesARead-only
List Worker routes (URL patterns mapped to Workers) on a zone.
Inputs: zone_id (required).
list_workersARead-only
List Worker scripts in an account.
Inputs: account_id.
list_zonesARead-only
List zones (domains), optionally filtered by name or status.
Inputs: name, status, page, per_page, +1 more.
order_certificate_packA
Order an advanced certificate pack for one or more hostnames. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), hosts (required), certificate_authority, validation_method, +2 more.
purge_cacheA
Purge a zone's cache — everything, or by files/tags/hosts/prefixes. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), purge_everything, files, tags, +3 more.
put_worker_secretAIdempotent
Create or update a secret binding on a Worker script. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: script_name (required), name (required), text (required), account_id, +1 more.
query_d1A
Execute a SQL statement against a D1 database (with optional bound params). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: database_id (required), sql (required), account_id, params, +1 more.
run_aiA
Run inference on a Workers AI model (text generation, embeddings, classification). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: model (required), input (required), account_id, confirm.
update_dns_recordAIdempotent
Update an existing DNS record (partial update). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), record_id (required), type, name, +6 more.
update_worker_cronAIdempotent
Set the cron triggers (schedules) for a Worker script. Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: script_name (required), crons (required), account_id, confirm.
update_zone_settingAIdempotent
Update a single zone setting (e.g. set ssl=full, always_use_https=on). Requires confirm:true (human-approval gate); without it returns a preview only.
Inputs: zone_id (required), setting (required), value (required), confirm.
verify_tokenARead-only
Validate the configured Cloudflare API token and show its status/permissions.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 69 tools
Most tools target distinct Cloudflare resources (DNS, Workers, KV, D1, etc.), and descriptions clearly differentiate them. A few pairs like 'get_zone' and 'get_zone_setting' could cause minor confusion, but overall boundaries are clear.
The majority follow a verb_noun pattern (e.g., create_dns_record), but there are deviations like 'kv_get', 'deploy_worker', 'edit_dnssec', and 'verify_token'. The mixture of conventions reduces predictability.
69 tools is excessively high for a single MCP server, leading to context overload. The broad scope would be better served by splitting into multiple specialized servers (e.g., DNS, Workers, Storage).
The tool surface covers core CRUD for many services (DNS, Workers KV, Zones) but lacks update operations for custom hostnames, D1 databases, R2 buckets, and queues. Additionally, firewall rules and SSL certificate management are incomplete.
Maintenance
Related MCP Connectors
Zero-dependency Cloudflare Worker gateway turning websites and REST APIs into MCP tools.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Cloudflare Workers MCP server: ai-token-counter
Cloudflare Workers MCP server: ai-gateway
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceA token-efficient MCP server for managing Cloudflare DNS zones and records with full CRUD support and bulk operations. It can be deployed locally via stdio or as a Cloudflare Worker for remote HTTP access.-
- AlicenseAqualityDmaintenanceMCP server to manage Cloudflare Workers, KV, R2, Pages, DNS, and cache from your IDE.1381 npm4MIT
- AlicenseBqualityCmaintenanceSlim Cloudflare MCP Server — 42 tools for managing DNS, zones, tunnels, WAF, Zero Trust, and security via Cloudflare API v4. Multi-zone support. No SSH, no shell, API-only with 3 runtime dependencies. AGPL-3.0 + Commercial dual-licensed.9665 npmAGPL 3.0
- AlicenseAqualityCmaintenanceCloudflare DNS MCP server. Manage zones, DNS records, cache, and page rules from Claude, Cursor, Codex, or any MCP-compatible AI assistant.10MIT