cloudflare-mcp
Provides tools for managing Cloudflare resources, including API requests, token and config management, schema discovery, and query suggestions.
Click on "Install 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-mcplist my Cloudflare zones"
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
Cloudflare MCP server built from a reusable MCP architecture with:
Vault-backed persistent multi-user Cloudflare credentials
Postgres-backed persistent per-user configuration
MCP admin key protection for mutating tools
Dedicated Cloudflare tools plus full API coverage through a generic request tool
Query suggestion and schema discovery tools for safer LLM workflows
This solution uses Vault-backed multi-user Cloudflare credentials and Postgres-backed per-user configuration as first-class persistence layers.
Solution Guarantees
All user credentials are multi-user and scoped by user ID in Vault.
All secrets are persisted in Vault.
All non-secret configuration is persisted in Postgres.
Mutating tools support admin-gate enforcement via
MCP_ADMIN_AUTH_KEY.API coverage is full through
cloudflare_api_request(method + path + query + body) against Cloudflare API v4.
Related MCP server: Cloudflare MCP Server
Architecture
Runtime flow:
src/index.js(stdio) orsrc/http/index.js(HTTP) loads env, Postgres, Vault.src/config/env.jsvalidates Cloudflare, Vault, Postgres, and transport config.src/services/configStore.jspersists user config in Postgres table<app>_config.src/services/vault.jspersists user secrets and HTTP auth token indexes in Vault KV.src/services/targetService.jsis the Cloudflare client with Vault token resolution and API calls.src/mcp/server.jsregisters Cloudflare MCP tools and wraps auth/error handling.src/http/server.jsexposes MCP over HTTP with auth, rate limit, allowlists, and access logs.
Data Model
Vault per-user Cloudflare token path:
<APP_NAME>/users/<normalized-user-id>/cloudflare/tokens
Vault token payload shape:
{
"userId": "team-a",
"activeTokenId": "primary",
"tokens": {
"primary": {
"tokenId": "primary",
"tokenType": "api_token",
"apiToken": "<secret>",
"active": true,
"notes": "prod",
"createdAt": "2026-07-29T00:00:00.000Z",
"updatedAt": "2026-07-29T00:00:00.000Z"
}
}
}Postgres config scope:
Table:
<APP_NAME>_configPK:
(user_id, key)Common keys:
cloudflare.default.accountIdcloudflare.default.zoneIdcloudflare.default.tokenId
Environment
Copy .env.example to .env and set values.
Required runtime groups:
Postgres:
POSTGRES_HOST,POSTGRES_PORT,POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORDVault:
VAULT_ADDR,VAULT_TOKEN,VAULT_KV_MOUNT(+ optional agent config)Cloudflare:
CLOUDFLARE_API_BASE_URL,CLOUDFLARE_API_TIMEOUT_MS,CLOUDFLARE_API_DOCS_INDEX_URLMCP auth gate:
MCP_ADMIN_AUTH_KEY(optional but recommended)
Run
Install and run stdio:
npm ci
npm run start:stdioRun HTTP transport:
npm run start:httpRun both:
npm run start:bothRun tests:
npm testDocker
Local full stack (app + Postgres + Vault):
docker compose up -dExternal Services Mode (app only, external Vault/Postgres):
docker compose -f docker-compose.external.yml up -dTool Catalog
Common response envelope (success):
{
"ok": true,
"status": 200,
"data": {}
}Common error envelope (isError=true):
{
"ok": false,
"status": 401,
"error": "Unauthorized: invalid authorizationKey for mutating operation"
}cloudflare_connection_info
Use when: you need runtime metadata and auth/scope state.
Do not use when: you need actual Cloudflare resource data.
Classification: read-only, low risk.
Required permissions: none.
Environment behavior: returns current app/user scope defaults and service connection info.
Parameters: none.
Response shape:
{ server, service }.Common failures: unexpected runtime metadata serialization errors.
Prerequisite tools: none.
Follow-up tools:
cloudflare_scope_info,cloudflare_verify_token.Example:
{"name":"cloudflare_connection_info","arguments":{}}cloudflare_scope_info
Use when: you need exact Vault/Postgres scope details for a user.
Do not use when: you only need API data.
Classification: read-only, low risk.
Required permissions: none.
Environment behavior: defaults
userIdtoMCP_CONFIG_DEFAULT_USER_ID.Parameters:
userId?: string
Response shape:
{ appName, userId, postgres, vault }.Common failures: normalization/path construction errors.
Prerequisite tools:
cloudflare_connection_info.Follow-up tools: token/config tools.
Example:
{"name":"cloudflare_scope_info","arguments":{"userId":"team-a"}}cloudflare_schema_discovery
Use when: you need API operation discovery and docs links.
Do not use when: path/method are already known.
Classification: read-only, low risk.
Required permissions: outbound network to docs URL.
Environment behavior: loads from
CLOUDFLARE_API_DOCS_INDEX_URL, with caching.Parameters:
categoryFilter?: stringactionFilter?: stringlimit?: integer(1..1000)forceRefresh?: boolean
Response shape:
{ totalOperations, filteredOperations, operations[] }.Common failures: docs fetch unavailable; markdown structure changes.
Prerequisite tools:
cloudflare_connection_info.Follow-up tools:
cloudflare_query_suggestion,cloudflare_api_request.Safety warnings: discovery only, no mutations.
Example:
{"name":"cloudflare_schema_discovery","arguments":{"categoryFilter":"Zones","limit":25}}cloudflare_query_suggestion
Use when: you want tool sequencing and safer invocation hints.
Do not use when: you are already executing a known workflow.
Classification: advisory/read-only, low risk.
Required permissions: none.
Environment behavior: infers mutating behavior from method/operation type and reports admin-key requirement.
Parameters:
intent?: stringoperationType?: discover|read|mutate|token|config|dnsmethod?: stringpath?: stringincludeExamples?: booleanincludeToolSchemas?: boolean
Response shape:
{ summary, recommendedOrder, safetyChecks, toolSchemas?, examples? }.Common failures: recommendation logic failures.
Prerequisite tools: none.
Follow-up tools: whichever sequence is returned.
Example:
{"name":"cloudflare_query_suggestion","arguments":{"intent":"rotate token and patch dns","operationType":"mutate"}}cloudflare_token_list
Use when: you need token metadata for a user.
Do not use when: you need to create/rotate credentials.
Classification: read-only, medium risk (metadata exposure).
Required permissions: none.
Environment behavior: reads user-scoped Vault path.
Parameters:
userId?: string
Response shape:
{ userId, activeTokenId, tokens[] }(secret values redacted).Common failures: Vault read errors.
Prerequisite tools:
cloudflare_scope_info.Follow-up tools:
cloudflare_token_set_active,cloudflare_verify_token.Example:
{"name":"cloudflare_token_list","arguments":{"userId":"default"}}cloudflare_token_upsert
Use when: you need to create or rotate Cloudflare credentials for a user.
Do not use when: you only need metadata read.
Classification: mutating, high risk.
Required permissions/prerequisites:
If
MCP_ADMIN_AUTH_KEYis set,authorizationKeymust match.tokenType=api_token: requiresapiToken.tokenType=global_api_key: requiresapiKeyandemail.
Environment behavior: writes to user-scoped Vault path; optional active-token switch.
Parameters:
userId?: stringtokenId?: string(defaults toprimary)tokenType?: api_token|global_api_keyapiToken?: stringapiKey?: stringemail?: stringsetActive?: boolean(defaulttrue)notes?: stringauthorizationKey?: string
Response shape:
{ userId, activeTokenId, token(metadata) }.Common failures: admin auth mismatch, missing required token fields, Vault write failures.
Prerequisite tools:
cloudflare_scope_info.Follow-up tools:
cloudflare_token_list,cloudflare_verify_token.Safety warnings: changes live credentials for API execution.
Example:
{
"name":"cloudflare_token_upsert",
"arguments":{
"userId":"team-a",
"tokenId":"primary",
"tokenType":"api_token",
"apiToken":"<token>",
"setActive":true,
"authorizationKey":"<admin-key-if-required>"
}
}cloudflare_token_set_active
Use when: multiple tokens exist and you need to switch active token.
Do not use when: token is missing; create it first.
Classification: mutating, high risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringtokenId: stringauthorizationKey?: string
Response shape:
{ userId, activeTokenId }.Common failures: token not found, Vault write failure, auth mismatch.
cloudflare_token_delete
Use when: decommissioning a user token.
Do not use when: uncertain if token is in active use.
Classification: mutating, high risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringtokenId: stringauthorizationKey?: string
Response shape:
{ deleted, userId, tokenId, activeTokenId? }.Common failures: Vault write failure; auth mismatch.
Safety warnings: irreversible token removal.
cloudflare_config_list
Use when: you need all or prefixed config rows in Postgres.
Do not use when: you need one key only.
Classification: read-only, low risk.
Required permissions: none.
Parameters:
userId?: stringprefix?: string
Response shape:
{ userId, configs[] }.
cloudflare_config_get
Use when: you need one config value.
Do not use when: you need bulk config listing.
Classification: read-only, low risk.
Required permissions: none.
Parameters:
userId?: stringkey: string
Response shape:
row|null.
cloudflare_config_set
Use when: setting default account/zone/token or custom config.
Do not use when: no persisted config change is needed.
Classification: mutating, medium risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringkey: stringvalue: any JSONauthorizationKey?: string
Response shape: upserted row.
cloudflare_config_delete
Use when: removing obsolete config keys.
Do not use when: key may still be required for production defaults.
Classification: mutating, medium risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringkey: stringauthorizationKey?: string
Response shape:
{ deleted: boolean }.
cloudflare_verify_token
Use when: validate selected credential health before operations.
Do not use when: token validity is already confirmed in current workflow.
Classification: read-only, low risk.
Required permissions: valid Cloudflare token in Vault for selected scope.
Parameters:
userId?: stringtokenId?: string
Response shape: proxied
/user/tokens/verifypayload.Common failures: missing/invalid token, Cloudflare auth errors.
cloudflare_list_accounts
Use when: discover accessible accounts.
Do not use when: account ID already known and not needed.
Classification: read-only, low risk.
Parameters:
userId?: stringtokenId?: stringpage?: integerperPage?: integer
cloudflare_list_zones
Use when: discover zones, optionally per account/name.
Do not use when: exact zone ID already known and no listing required.
Classification: read-only, low risk.
Parameters:
userId?: stringtokenId?: stringaccountId?: stringname?: stringpage?: integerperPage?: integer
cloudflare_list_dns_records
Use when: review DNS records before mutating operations.
Do not use when: only direct create/update/delete is needed and target IDs are verified.
Classification: read-only, medium risk.
Parameters:
userId?: stringtokenId?: stringzoneId?: string(falls back tocloudflare.default.zoneId)type?: stringname?: stringpage?: integerperPage?: integer
cloudflare_create_dns_record
Use when: adding a DNS record.
Do not use when: uncertain about current zone state; list first.
Classification: mutating, high risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringtokenId?: stringzoneId?: stringrecord: object(Cloudflare DNS record create payload)authorizationKey?: string
Safety warnings: writes production DNS.
cloudflare_update_dns_record
Use when: patching/replacing an existing record.
Do not use when: record ID is not validated.
Classification: mutating, high risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringtokenId?: stringzoneId?: stringdnsRecordId: stringrecord: objectreplace?: boolean(false= PATCH,true= PUT)authorizationKey?: string
cloudflare_delete_dns_record
Use when: deleting DNS records intentionally.
Do not use when: rollback plan is missing.
Classification: mutating, high risk.
Required permissions: admin key when configured.
Parameters:
userId?: stringtokenId?: stringzoneId?: stringdnsRecordId: stringauthorizationKey?: string
Safety warnings: destructive and irreversible.
cloudflare_api_request
Use when: any Cloudflare endpoint access is needed, including APIs without dedicated tools.
Do not use when: dedicated tools already cover the operation and are safer.
Classification: read-only or mutating depending on
method; variable risk.Required permissions/prerequisites:
Active user-scoped Vault token.
If mutating (
POST|PUT|PATCH|DELETE) andMCP_ADMIN_AUTH_KEYis set,authorizationKeyis required.
Environment behavior:
Normalizes path to Cloudflare v4 route under
/client/v4.Resolves default token from user config and active token state.
Parameters:
method: stringpath: stringquery?: object<string, string|number|boolean>body?: jsonheaders?: object<string,string>userId?: stringtokenId?: stringauthorizationKey?: string
Expected response shape:
{ method, path, url, status, tokenId, userId, data }
Common failure conditions:
Missing token in Vault
Invalid Cloudflare credentials
Cloudflare API 4xx/5xx
Admin auth key mismatch for mutating operations
Recommended prerequisite tools:
cloudflare_verify_tokencloudflare_schema_discovery
Recommended follow-up tools:
cloudflare_config_set(to persist defaults)cloudflare_query_suggestion(for workflow refinement)
Safety warnings:
Mutating calls can alter/delete production resources.
Short valid invocation examples:
{"name":"cloudflare_api_request","arguments":{"method":"GET","path":"/zones","userId":"default"}}{"name":"cloudflare_api_request","arguments":{"method":"PATCH","path":"/zones/<zone>/settings/cache_level","body":{"value":"aggressive"},"authorizationKey":"<admin-key-if-required>"}}Suggested Playbooks
Bootstrap new user credentials
cloudflare_scope_infocloudflare_token_upsertcloudflare_verify_token
Configure user defaults
cloudflare_config_set(cloudflare.default.accountId)cloudflare_config_set(cloudflare.default.zoneId)cloudflare_config_set(cloudflare.default.tokenId)
Safe DNS mutation
cloudflare_list_dns_recordscloudflare_create_dns_recordorcloudflare_update_dns_recordorcloudflare_delete_dns_record
Full API call flow
cloudflare_schema_discoverycloudflare_query_suggestioncloudflare_api_request
License
MIT. See LICENSE.
This server cannot be installed
Maintenance
Related MCP Servers
- Alicense-qualityCmaintenanceAn MCP server that allows using natural language to manage Cloudflare resources (Workers, KV, R2, D1) through Claude Desktop, VSCode, and other MCP clients.1610Apache 2.0

Cloudflare MCP Serverofficial
Alicense-qualityBmaintenanceA 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.12737Apache 2.0- Alicense-qualityDmaintenanceA high-performance MCP server providing AI assistants with read-only access to the Cloudflare ecosystem. Query your entire Cloudflare infrastructure using natural language through Claude, Cursor, or any MCP-compatible client.5MIT
- Alicense-qualityBmaintenanceCloudflare DNS MCP server. Manage zones, DNS records, cache, and page rules from Claude, Cursor, Codex, or any MCP-compatible AI assistant.MIT
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
MCP server for interacting with the Supabase platform
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LesterAJohn/cloudflare-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server