Skip to main content
Glama
mcp-cloudflare-crunchtools

mcp-cloudflare-crunchtools

by crunchtools

MCP Cloudflare CrunchTools

A secure MCP (Model Context Protocol) server for Cloudflare DNS, Transform Rules, Page Rules, and cache management.

Overview

This MCP server is designed to be:

  • Secure by default - Threat modeling, input validation, and token protection

  • No third-party services - Runs locally via stdio, your API token never leaves your machine

  • Cross-platform - Works on Linux, macOS, and Windows

  • Automatically updated - GitHub Actions monitor for CVEs and update dependencies

  • Containerized - Available at quay.io/crunchtools/mcp-cloudflare built on Hummingbird Python base image

Related MCP server: cloudflare-dns-mcp-server

Naming Convention

Component

Name

GitHub repo

crunchtools/mcp-cloudflare

Container

quay.io/crunchtools/mcp-cloudflare

Python package (PyPI)

mcp-cloudflare-crunchtools

CLI command

mcp-cloudflare-crunchtools

Module import

mcp_cloudflare_crunchtools

Why Hummingbird?

The container image is built on the Hummingbird Python base image from Project Hummingbird, which provides:

  • Minimal CVE exposure - Hummingbird images are built with a minimal package set, dramatically reducing the attack surface compared to general-purpose images

  • Regular updates - Security patches are applied promptly, keeping CVE counts low

  • Optimized for Python - Pre-configured Python environment with uv package manager for fast, reproducible builds

  • Production-ready - Designed for production workloads with proper signal handling and non-root user defaults

This means your MCP server runs in a hardened environment with fewer vulnerabilities than typical Python container images

Features

Zone Management (2 tools)

  • list_zones - List all zones accessible by your API token

  • get_zone - Get zone details by ID or domain name

DNS Records (5 tools)

  • list_dns_records - List DNS records with filtering

  • get_dns_record - Get a single DNS record

  • create_dns_record - Create A, AAAA, CNAME, MX, TXT, NS, SRV, CAA records

  • update_dns_record - Update existing records

  • delete_dns_record - Delete records

Transform Rules (6 tools)

  • list_request_header_rules / set_request_header_rules - Modify request headers

  • list_response_header_rules / set_response_header_rules - Modify response headers

  • list_url_rewrite_rules / set_url_rewrite_rules - URL path/query rewrites

Page Rules (4 tools)

  • list_page_rules - List all page rules

  • create_page_rule - Create redirects, cache settings, SSL modes

  • update_page_rule - Modify existing rules

  • delete_page_rule - Remove rules

Access (8 tools)

  • get_access_organization - The Zero Trust organization and its team login domain

  • list_access_apps / get_access_app - Applications on a zone, with their audience tags

  • create_access_app / delete_access_app - Put a hostname behind an Access login, or take it out

  • list_access_policies - Who an application admits

  • create_access_policy / delete_access_policy - Allow, deny or bypass by email, email domain, IP or everyone

Cache Management (1 tool)

  • purge_cache - Purge by URL, tag, host, prefix, or everything

Installation

uvx mcp-cloudflare-crunchtools

With pip

pip install mcp-cloudflare-crunchtools

With Container

podman run -e CLOUDFLARE_API_TOKEN=your_token \
    quay.io/crunchtools/mcp-cloudflare

Configuration

Creating a Cloudflare API Token

  1. Navigate to API Tokens

  2. Configure Token Name

    • Enter: mcp-cloudflare-crunchtools

  3. Configure Permissions

    The Permissions section has three dropdowns per row:

    • First dropdown: Resource type (Account or Zone)

    • Second dropdown: Specific permission category

    • Third dropdown: Access level (Read or Edit)

    Click "+ Add more" to add each permission row. For full management, add:

    Resource

    Permission

    Access

    Zone

    Zone

    Read

    Zone

    DNS

    Edit

    Zone

    Page Rules

    Edit

    Zone

    Transform Rules

    Edit

    Zone

    Cache Purge

    Purge

    Account

    Access: Apps and Policies

    Edit

    Account

    Access: Organizations, Identity Providers, and Groups

    Read

  4. Configure Zone Resources

    • First dropdown: Select "Include"

    • Second dropdown: Select "All zones" or "Specific zone"

  5. Configure Client IP Address Filtering (Optional)

    • Click "Use my IP" button to restrict token to your current IP

  6. Create and Copy Token

    • Click "Continue to summary" → "Create Token"

    • IMPORTANT: Copy the token immediately - it's only shown once!

Add to Claude Code

claude mcp add mcp-cloudflare-crunchtools \
    --env CLOUDFLARE_API_TOKEN=your_token_here \
    -- uvx mcp-cloudflare-crunchtools

Or for the container version:

claude mcp add mcp-cloudflare-crunchtools \
    --env CLOUDFLARE_API_TOKEN=your_token_here \
    -- podman run -i --rm -e CLOUDFLARE_API_TOKEN quay.io/crunchtools/mcp-cloudflare

Permission Sets by Use Case

Read-Only (viewing only)

Resource

Permission

Access

Zone

Zone

Read

Zone

DNS

Read

DNS Management Only

Resource

Permission

Access

Zone

Zone

Read

Zone

DNS

Edit

Full Management (all features)

Resource

Permission

Access

Zone

Zone

Read

Zone

DNS

Edit

Zone

Page Rules

Edit

Zone

Transform Rules

Edit

Zone

Cache Purge

Purge

Usage Examples

List Your Zones

User: List my Cloudflare zones
Assistant: [calls list_zones]

Create a DNS Record

User: Create an A record for www.example.com pointing to 192.168.1.1
Assistant: [calls create_dns_record with type=A, name=www, content=192.168.1.1]

Add Security Headers

User: Add X-Content-Type-Options: nosniff to all responses for zone abc123...
Assistant: [calls set_response_header_rules with appropriate rule]

Purge Cache

User: Purge the cache for https://example.com/styles.css
Assistant: [calls purge_cache with files=["https://example.com/styles.css"]]

Security

This server was designed with security as a primary concern. See SECURITY.md for:

  • Threat model and attack vectors

  • Defense in depth architecture

  • Token handling best practices

  • Input validation rules

  • Audit logging

Key Security Features

  1. Token Protection

    • Stored as SecretStr (never accidentally logged)

    • Environment variable only (never in files or args)

    • Sanitized from all error messages

  2. Input Validation

    • Pydantic models for all inputs

    • Allowlist for record types, actions

    • Strict format validation for IDs

  3. API Hardening

    • Hardcoded API base URL (prevents SSRF)

    • TLS certificate validation

    • Request timeouts

    • Response size limits

  4. Automated CVE Scanning

    • GitHub Actions scan dependencies weekly

    • Automatic PRs for security updates

    • Dependabot alerts enabled

Development

Setup

git clone https://github.com/crunchtools/mcp-cloudflare.git
cd mcp-cloudflare
uv sync

Run Tests

uv run pytest

Lint and Type Check

uv run ruff check src tests
uv run mypy src

Build Container

podman build -t mcp-cloudflare .

License

AGPL-3.0-or-later

Contributing

Contributions welcome! Please read SECURITY.md before submitting security-related changes.

Available Tools

34 tools
create_access_app_toolCreate Access App ToolA

Put a hostname behind a Cloudflare Access login.

A new application has no policy and admits no one until create_access_policy adds one.

Inputs: name (required), domain (required), zone_id (required), session_duration. Returns: object

create_access_policy_toolCreate Access Policy ToolB

Add a policy to an Access application.

Each rule is an object with exactly one key: {"email": "user@example.com"}, {"email_domain": "example.com"}, {"ip": "203.0.113.0/24"} or {"everyone": true}.

Inputs: name (required), app_id (required), include (required), zone_id (required), +3 more. Returns: object

create_dns_record_toolCreate Dns Record ToolC

Create a new DNS record.

Inputs: name (required), type (required), content (required), zone_id (required), +4 more. Returns: object

create_page_rule_toolCreate Page Rule ToolC

Create a new page rule.

Inputs: actions (required), targets (required), zone_id (required), status, +1 more. Returns: object

create_waf_rule_toolCreate Waf Rule ToolA

Create a new WAF custom rule.

Free plans support up to 5 custom rules. Provide either zone_id or zone_name, not both.

Inputs: action, enabled, zone_id, zone_name, +2 more. Returns: object

delete_access_app_toolDelete Access App ToolB

Delete an Access application, leaving its hostname with no Access login.

Inputs: app_id (required), zone_id (required). Returns: object

delete_access_policy_toolDelete Access Policy ToolC

Delete a policy from an Access application.

Inputs: app_id (required), zone_id (required), policy_id (required). Returns: object

delete_dns_record_toolDelete Dns Record ToolC

Delete a DNS record.

Inputs: zone_id (required), record_id (required). Returns: object

delete_page_rule_toolDelete Page Rule ToolC

Delete a page rule.

Inputs: rule_id (required), zone_id (required). Returns: object

delete_waf_rule_toolDelete Waf Rule ToolB

Delete a WAF custom rule.

Provide either zone_id or zone_name, not both.

Inputs: rule_id (required), zone_id, zone_name. Returns: object

get_access_app_toolGet Access App ToolA
Read-only

Get one Access application, including its audience tag (aud).

Inputs: app_id (required), zone_id (required). Returns: object

get_access_organization_toolGet Access Organization ToolB
Read-only

Get the Zero Trust organization behind a zone's Access applications.

Inputs: zone_id (required). Returns: object

get_dns_record_toolGet Dns Record ToolB
Read-only

Get a single DNS record by ID.

Inputs: zone_id (required), record_id (required). Returns: object

get_security_events_toolGet Security Events ToolA
Read-only

Get security/firewall events grouped by action and source.

Provide either zone_id or zone_name, not both.

Inputs: limit, since, until, zone_id, +1 more. Returns: object

get_top_pages_toolGet Top Pages ToolB
Read-only

Get top pages by request count.

Provide either zone_id or zone_name, not both.

Inputs: limit, since, until, zone_id, +1 more. Returns: object

get_traffic_by_country_toolGet Traffic By Country ToolA
Read-only

Get traffic breakdown by country.

Provide either zone_id or zone_name, not both.

Inputs: limit, since, until, zone_id, +1 more. Returns: object

get_zone_analytics_toolGet Zone Analytics ToolA
Read-only

Get zone traffic analytics summary.

Returns total requests, unique visitors, bandwidth, cache ratio, and status code breakdown for the given date range.

Provide either zone_id or zone_name, not both.

Inputs: since, until, zone_id, zone_name. Returns: object

get_zone_toolGet Zone ToolA
Read-only

Get Cloudflare zone details by ID or name.

Provide either zone_id or zone_name, not both.

Inputs: zone_id, zone_name. Returns: object

list_access_apps_toolList Access Apps ToolC
Read-only

List the Access applications on a zone.

Inputs: zone_id (required). Returns: object

list_access_policies_toolList Access Policies ToolB
Read-only

List the policies on an Access application.

Inputs: app_id (required), zone_id (required). Returns: object

list_dns_records_toolList Dns Records ToolC
Read-only

List DNS records for a Cloudflare zone.

Inputs: zone_id (required), name, page, type, +2 more. Returns: object

list_page_rules_toolList Page Rules ToolC
Read-only

List all page rules for a zone.

Inputs: zone_id (required), order, status. Returns: object

list_request_header_rules_toolList Request Header Rules ToolB
Read-only

List request header modification rules.

Inputs: zone_id (required). Returns: object

list_response_header_rules_toolList Response Header Rules ToolC
Read-only

List response header modification rules.

Inputs: zone_id (required). Returns: object

list_url_rewrite_rules_toolList Url Rewrite Rules ToolC
Read-only

List URL rewrite rules.

Inputs: zone_id (required). Returns: object

list_waf_rules_toolList Waf Rules ToolA
Read-only

List all WAF custom rules for a zone.

Provide either zone_id or zone_name, not both.

Inputs: zone_id, zone_name. Returns: object

list_zones_toolList Zones ToolA
Read-only

List all Cloudflare zones accessible by the API token.

Inputs: name, page, status, per_page. Returns: object

purge_cache_toolPurge Cache ToolA

Purge cached content from Cloudflare's edge.

Use one of: purge_everything, files, tags, hosts, or prefixes. Every method works on every plan, Free included. Prefer hosts, prefixes, tags or files over purge_everything when only part of a zone is stale.

Inputs: zone_id (required), tags, files, hosts, +2 more. Returns: object

set_request_header_rules_toolSet Request Header Rules ToolA

Set request header modification rules (replaces all existing rules).

Each rule should have:

  • expression: Filter expression (e.g., "true" for all requests)

  • description: Human-readable description

  • action: "rewrite"

  • action_parameters: {"headers": {"Header-Name": {...}}}

Inputs: rules (required), zone_id (required). Returns: object

set_response_header_rules_toolSet Response Header Rules ToolA

Set response header modification rules (replaces all existing rules).

Each rule should have:

  • expression: Filter expression (e.g., "true" for all responses)

  • description: Human-readable description

  • action: "rewrite"

  • action_parameters: {"headers": {"Header-Name": {...}}}

Inputs: rules (required), zone_id (required). Returns: object

set_url_rewrite_rules_toolSet Url Rewrite Rules ToolA

Set URL rewrite rules (replaces all existing rules).

Each rule should have:

  • expression: Filter expression

  • description: Human-readable description

  • action: "rewrite"

  • action_parameters: {"uri": {"path": {"value": "..."}, "query": {"value": "..."}}}

Inputs: rules (required), zone_id (required). Returns: object

update_dns_record_toolUpdate Dns Record ToolC

Update an existing DNS record.

Inputs: zone_id (required), record_id (required), ttl, name, +5 more. Returns: object

update_page_rule_toolUpdate Page Rule ToolC

Update an existing page rule.

Inputs: rule_id (required), zone_id (required), status, actions, +2 more. Returns: object

update_waf_rule_toolUpdate Waf Rule ToolB

Update an existing WAF custom rule.

Provide either zone_id or zone_name, not both.

Inputs: rule_id (required), action, enabled, zone_id, +3 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 34 tools

    Disambiguation5/5

    Each tool targets a distinct Cloudflare resource and action (zones, DNS records, header rules, URL rewrite rules, page rules, cache, analytics, WAF, Access apps/policies), and the separate rule types are clearly differentiated by their names. No two tools appear to perform the same operation.

    Naming Consistency5/5

    All 34 tools use a consistent snake_case verb_noun pattern with a uniform _tool suffix, using standard verbs like list/get/create/update/delete/set/purge. The only variation is 'set_' for replace-all operations, which is semantically appropriate and consistent across the header/URL rewrite tools.

    Tool Count3/5

    34 tools is on the heavy side for an MCP server, exceeding the typical 3-15 range, though the breadth of Cloudflare features (DNS, WAF, Access, analytics, etc.) provides some justification. The set is not bloated with redundant tools, but a more consolidated approach could reduce count while keeping coverage.

    Completeness3/5

    Core CRUD is strong for DNS, WAF, and page rules, but there are notable lifecycle gaps: Access applications and policies lack update operations, and no tool exists for zone settings or SSL configuration. These gaps could force agents into delete-and-recreate workarounds for common Access management tasks.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      A 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.
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      A token-efficient MCP server that provides access to the entire Cloudflare API (2500+ endpoints) using a code execution pattern, enabling natural language management of Cloudflare services.
      11 npm
      1,090
      Apache 2.0