A comprehensive interface to Cloudflare's API v4 with 84 tools spanning DNS records, Cloudflare Tunnels, WAF rulesets, Zero Trust access policies, R2 object storage, Workers KV namespaces, and Worker script deployment. Handles batch DNS operations, custom firewall rules, security event analytics via GraphQL, and Worker invocation metrics. Includes optional HashiCorp Vault integration for credential management through AppRole authentication. Strictly API-only with no shell execution, making it suitable for production automation workflows. Useful when you're managing Cloudflare infrastructure programmatically and want declarative control over zones, security policies, and edge compute resources without clicking through dashboards.
Public tool metadata for what this MCP can expose to an agent.
searchSearch the Cloudflare OpenAPI spec. All $refs are pre-resolved inline. Products: ai, cloudforce-one, access, magic, workers, realtime, devices, dlp, email-security, stream, ai-search, brand-protection, gateway, email, intel, api_gateway, addressing, browser-rendering, dex, bui...1 paramsSearch the Cloudflare OpenAPI spec. All $refs are pre-resolved inline. Products: ai, cloudforce-one, access, magic, workers, realtime, devices, dlp, email-security, stream, ai-search, brand-protection, gateway, email, intel, api_gateway, addressing, browser-rendering, dex, bui...
codestringexecuteExecute JavaScript code against the Cloudflare API. First use the 'search' tool to find the right endpoints, then write code using the cloudflare.request() function. Available in your code: interface CloudflareRequestOptions { method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE...2 paramsExecute JavaScript code against the Cloudflare API. First use the 'search' tool to find the right endpoints, then write code using the cloudflare.request() function. Available in your code: interface CloudflareRequestOptions { method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE...
codestringaccount_idstringSlim Cloudflare MCP Server for managing DNS, zones, tunnels, WAF, Zero Trust, and security via Cloudflare API v4.
No SSH. No shell execution. API-only. 3 runtime dependencies.
75 tools across 11 domains:
npm install
cp .env.example .env # Edit with your Cloudflare API token
npm run build
node dist/index.js # stdio transport for MCP
mcp-cloudflare supports loading Cloudflare credentials from a central
HashiCorp Vault instance at startup via AppRole
authentication. This is optional — the server works fine with plain environment
variables alone.
On startup, if NAS_VAULT_ADDR is set the server performs an AppRole login,
fetches the KV v2 secret at <mount>/data/cloudflare/api, and injects the
values into the process environment before the MCP transport starts. The
loader is fully opportunistic:
NAS_VAULT_ADDR is unset, the loader is a silent no-op. No Vault
calls are made and the server behaves exactly as before.fetch (Node 20+) — no additional runtime dependencies.Explicit env vars (CLOUDFLARE_API_TOKEN etc.) > Vault > error (missing creds)
If you set CLOUDFLARE_API_TOKEN directly, the Vault loader will not
overwrite it. Vault only fills in credentials that are not already present in
the environment.
| Variable | Required | Description |
|---|---|---|
NAS_VAULT_ADDR | Yes* | Vault server address (e.g., https://vault.example.com:8200) |
NAS_VAULT_ROLE_ID | Yes* | AppRole role ID for this server |
NAS_VAULT_SECRET_ID | Yes* | AppRole secret ID for this server |
NAS_VAULT_KV_MOUNT | No | KV v2 mount path (default: kv) |
* Only required if using Vault. All three must be set together.
Write the Cloudflare credentials to the following path in Vault:
Path: kv/cloudflare/api
{
"api_token": "your-cloudflare-api-token",
"account_id": "your-account-id"
}
Key mapping:
| Vault key | Environment variable |
|---|---|
api_token | CLOUDFLARE_API_TOKEN |
account_id | CLOUDFLARE_ACCOUNT_ID |
1. Write credentials to KV v2:
vault kv put kv/cloudflare/api \
api_token="your-cloudflare-api-token" \
account_id="your-account-id"
2. Create a Vault policy:
# cloudflare-mcp-policy.hcl
path "kv/data/cloudflare/api" {
capabilities = ["read"]
}
vault policy write cloudflare-mcp cloudflare-mcp-policy.hcl
3. Enable AppRole auth and create a role:
vault auth enable approle
vault write auth/approle/role/cloudflare-mcp \
token_policies="cloudflare-mcp" \
token_ttl="1h" \
token_max_ttl="4h" \
secret_id_ttl="0" # 0 = no expiry; set a duration for rotation
4. Retrieve the role ID and secret ID:
vault read auth/approle/role/cloudflare-mcp/role-id
vault write -f auth/approle/role/cloudflare-mcp/secret-id
When using Vault, no Cloudflare credentials are needed in the MCP config — only the three Vault variables:
{
"mcpServers": {
"cloudflare": {
"command": "npx",
"args": ["@itunified.io/mcp-cloudflare"],
"env": {
"NAS_VAULT_ADDR": "https://vault.example.com:8200",
"NAS_VAULT_ROLE_ID": "your-role-id",
"NAS_VAULT_SECRET_ID": "your-secret-id"
}
}
}
}
NAS_VAULT_KV_MOUNT can be omitted if your KV engine is mounted at the
default path kv. The Cloudflare API token and account ID will be fetched
automatically at startup.
Add to .mcp.json in your project root:
{
"mcpServers": {
"cloudflare": {
"command": "node",
"args": ["/path/to/mcp-cloudflare/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your-api-token-here",
"CLOUDFLARE_ACCOUNT_ID": "your-account-id"
}
}
}
}
| Variable | Required | Default | Description |
|---|---|---|---|
CLOUDFLARE_API_TOKEN | Yes | — | Cloudflare API Token (with appropriate permissions) |
CLOUDFLARE_ACCOUNT_ID | No | — | Cloudflare Account ID (required for account-level operations) |
CLOUDFLARE_TIMEOUT | No | 30000 | Request timeout in milliseconds |
NAS_VAULT_ADDR | No | — | HashiCorp Vault URL, enables Vault AppRole loading (see below) |
NAS_VAULT_ROLE_ID | No | — | Vault AppRole role_id |
NAS_VAULT_SECRET_ID | No | — | Vault AppRole secret_id |
NAS_VAULT_KV_MOUNT | No | kv | Vault KV v2 mount path |
If you run a central Vault instance, mcp-cloudflare can fetch its credentials
at startup via AppRole instead of passing them through the MCP config:
export NAS_VAULT_ADDR=https://vault.example.com
export NAS_VAULT_ROLE_ID=<role-id>
export NAS_VAULT_SECRET_ID=<secret-id>
# optional — defaults to "kv"
export NAS_VAULT_KV_MOUNT=kv
The loader reads KV v2 at <mount>/data/cloudflare/api and expects two keys:
api_token and account_id. Example Vault write:
vault kv put kv/cloudflare/api \
api_token=your-api-token-here \
account_id=00000000000000000000000000000000
Precedence: process.env (explicit) > Vault. If NAS_VAULT_ADDR is unset
the loader is a silent no-op — the server behaves exactly as before. On any
Vault error (network, auth, missing path), a single-line warning is written
to stderr and the server falls back to whatever env vars are already set.
Security: secret values are never logged. Only the KV path name and a
populated-count appear in stderr diagnostics. Uses the global fetch
(Node 20+) — no new runtime dependencies.
Create an API Token at dash.cloudflare.com/profile/api-tokens with the following permissions based on what you need:
All zone-scoped tools accept a zone_id parameter that can be either:
00000000000000000000000000000001) — used directlyexample.com) — resolved automatically via the Cloudflare APIThis allows managing multiple zones by name without needing to look up IDs manually.
Tools documentation is coming in v1 as tool modules are implemented. See docs/api-reference.md for the planned API endpoint mapping.
Claude Code skills compose MCP tools into higher-level workflows. See .claude/skills/README.md for detailed documentation.
| Skill | Slash Command | Description |
|---|---|---|
| cloudflare-health | /cf-health | Zone health dashboard — DNS, security, tunnels, WAF, DDoS status |
| cloudflare-live-test | /cf-test | Live integration test — read + safe writes with cleanup |
| cloudflare-dns-management | — | DNS record management — add, list, update, delete across zones |
| cloudflare-incident-response | — | DDoS/attack emergency response — detect, assess, mitigate, monitor |
| cloudflare-security-audit | — | Security posture audit — WAF, events, IP access, DDoS analytics |
| cloudflare-tunnel-management | — | Tunnel management — create, configure ingress, monitor connections |
| cloudflare-waf-management | — | WAF management — custom rules, rulesets, IP access, Under Attack |
| cloudflare-zero-trust | — | Zero Trust — access apps, policies, identity providers, gateway |
| cloudflare-kv-manage | — | Workers KV — namespace and key-value CRUD operations |
| cloudflare-worker-deploy | — | Workers — script deployment, routes, secrets, analytics |
| cloudflare-r2-manage | — | R2 Storage — bucket and object management, audit workflows |
npm run build # Compile TypeScript
npm test # Run unit tests (vitest)
npm run typecheck # Type check only (no emit)
See CONTRIBUTING.md for contribution guidelines.
This project is dual-licensed:
If you use mcp-cloudflare in a proprietary product or SaaS offering, a commercial license is required. Support development by sponsoring us on GitHub.
CLOUDFLARE_API_TOKENCloudflare API Token with appropriate permissions
CLOUDFLARE_ACCOUNT_IDCloudflare Account ID (required for account-level operations)
silenceper/mcp-k8s
azure/containerization-assist
io.github.evozim/aws-builder
reza-gholizade/k8s-mcp-server
flux159/mcp-server-kubernetes