@cloudflare/mcp-server-cloudflare: Cloudflare MCP Server
Cloudflare MCP Server enables natural language interaction with Cloudflare’s API via the Model Context Protocol (MCP). It allows users to manage Workers, KV stores, R2, D1 databases, and more using conversational commands.
Author
cloudflare
README
Cloudflare MCP Server
Model Context Protocol (MCP) is a new, standardized protocol for managing context between large language models (LLMs) and external systems. In this repository, we provide an installer as well as an MCP Server for Cloudflare's API.
This lets you use Claude Desktop, or any MCP Client, to use natural language to accomplish things on your Cloudflare account, e.g.:
Please deploy me a new Worker with an example durable object.
Can you tell me about the data in my D1 database named '...'?
Can you copy all the entries from my KV namespace '...' into my R2 bucket '...'?
Demo
Setup
-
Make sure you are logged in to Cloudflare via Wrangler:
bashnpx wrangler login
This authentication is required for the MCP server to access your Cloudflare resources when testing locally.
-
Run
npx @cloudflare/mcp-server-cloudflare init
- Restart Claude Desktop, you should see a small 🔨 icon that shows the following tools available for use:
Paid Features
Some features in this MCP server require a paid Cloudflare Workers plan:
- Observability and Analytics: The
analytics_get
tool and related analytics features require a paid Workers plan to access these metrics - Other premium Cloudflare features like advanced D1 database capabilities and higher usage limits also require appropriate paid plans
Ensure your Cloudflare account has the necessary subscription level for the features you intend to use.
Features
KV Store Management
get_kvs
: List all KV namespaces in your accountkv_get
: Get a value from a KV namespacekv_put
: Store a value in a KV namespacekv_list
: List keys in a KV namespacekv_delete
: Delete a key from a KV namespace
R2 Storage Management
r2_list_buckets
: List all R2 buckets in your accountr2_create_bucket
: Create a new R2 bucketr2_delete_bucket
: Delete an R2 bucketr2_list_objects
: List objects in an R2 bucketr2_get_object
: Get an object from an R2 bucketr2_put_object
: Put an object into an R2 bucketr2_delete_object
: Delete an object from an R2 bucket
D1 Database Management
d1_list_databases
: List all D1 databases in your accountd1_create_database
: Create a new D1 databased1_delete_database
: Delete a D1 databased1_query
: Execute a SQL query against a D1 database
Workers Management
worker_list
: List all Workers in your accountworker_get
: Get a Worker's script contentworker_put
: Create or update a Worker scriptworker_delete
: Delete a Worker script
Durable Objects
durable_objects_list
: List all Durable Objects namespacesdurable_objects_create
: Create a new Durable Objects namespacedurable_objects_delete
: Delete a Durable Objects namespacedurable_objects_list_instances
: List all instances for a specific Durable Objects namespacedurable_objects_get_instance
: Get details about a specific Durable Objects instancedurable_objects_delete_instance
: Delete a specific Durable Objects instance
Queues
queues_list
: List all Queues in your accountqueues_create
: Create a new Queuequeues_delete
: Delete a Queuequeues_get
: Get details about a specific Queuequeues_send_message
: Send a message to a Queuequeues_get_messages
: Get messages from a Queuequeues_update_consumer
: Update a Queue consumer
Workers AI
workers_ai_list_models
: List available AI modelsworkers_ai_get_model
: Get details about a specific AI modelworkers_ai_run_inference
: Run inference using Workers AIworkers_ai_list_tasks
: List AI tasks
Workflows
workflows_list
: List all Workflows in your accountworkflows_create
: Create a new Workflowworkflows_delete
: Delete a Workflowworkflows_get
: Get details about a specific Workflowworkflows_update
: Update a Workflowworkflows_execute
: Execute a Workflow
Templates
templates_list
: List available Worker templatestemplates_get
: Get details about a specific templatetemplates_create_from_template
: Create a new Worker from a template
Workers for Platforms
w4p_list_dispatchers
: List all Workers for Platforms dispatchersw4p_create_dispatcher
: Create a new dispatcherw4p_delete_dispatcher
: Delete a dispatcherw4p_get_dispatcher
: Get details about a specific dispatcherw4p_update_dispatcher
: Update a dispatcher configuration
Service Bindings
bindings_list
: List all service bindings for a Workerbindings_create
: Create a new service bindingbindings_update
: Update a service bindingbindings_delete
: Delete a service binding
URL Routing
routing_list_routes
: List all routes for a Workerrouting_create_route
: Create a new routerouting_update_route
: Update a routerouting_delete_route
: Delete a route
Cron Triggers
cron_list
: List all cron triggers for a Workercron_create
: Create a new cron triggercron_update
: Update a cron triggercron_delete
: Delete a cron trigger
Zones & Domains
zones_list
: List all zones in your accountzones_create
: Create a new zonezones_delete
: Delete a zonezones_get
: Get details about a specific zonezones_check_activation
: Check zone activation status
Secrets
secrets_list
: List all secrets for a Workersecrets_put
: Create or update a secretsecrets_delete
: Delete a secret
Version Management
versions_list
: List all versions of a Workerversions_get
: Get details about a specific versionversions_rollback
: Rollback to a previous version
Wrangler Config
wrangler_get_config
: Get the current Wrangler configurationwrangler_update_config
: Update Wrangler configuration
Analytics
analytics_get
: Retrieve analytics data for your domain- Includes metrics like requests, bandwidth, threats, and page views
- Supports date range filtering
Developing
In the current project folder, run:
pnpm install
pnpm build:watch
Then, in a second terminal:
node dist/index.js init
This will link Claude Desktop against your locally-installed version for you to test.
Testing
The project uses Vitest as the testing framework with MSW (Mock Service Worker) for API mocking.
Running Tests
To run all tests:
bashpnpm test
To run tests with coverage:
bashpnpm test:coverage
To run a specific test file:
bashpnpm test -- tests/tools/queues.test.ts
To run tests in watch mode (useful during development):
bashpnpm test:watch
Test Structure
The test suite is organized as follows:
tests/tools/
: Contains tests for each Cloudflare API tooltests/mocks/
: Contains mock data and request handlerstests/utils/
: Contains test helper functionstests/setup.ts
: Global test setup configuration
Each tool test file follows a consistent pattern of testing both successful operations and error handling scenarios.
Usage outside of Claude
To run the server locally, run node dist/index run <account-id>
.
If you're using an alternative MCP Client, or testing things locally, emit the tools/list
command to get an up-to-date list of all available tools. Then you can call these directly using the tools/call
command.
Workers
javascript// List workers worker_list() // Get worker code worker_get({ name: "my-worker" }) // Update worker worker_put({ name: "my-worker", script: "export default { async fetch(request, env, ctx) { ... }}", bindings: [ { type: "kv_namespace", name: "MY_KV", namespace_id: "abcd1234" }, { type: "r2_bucket", name: "MY_BUCKET", bucket_name: "my-files" } ], compatibility_date: "2024-01-01", compatibility_flags: ["nodejs_compat"] }) // Delete worker worker_delete({ name: "my-worker" })
KV Store
javascript// List KV namespaces get_kvs() // Get value kv_get({ namespaceId: "your_namespace_id", key: "myKey" }) // Store value kv_put({ namespaceId: "your_namespace_id", key: "myKey", value: "myValue", expirationTtl: 3600 // optional, in seconds }) // List keys kv_list({ namespaceId: "your_namespace_id", prefix: "app_", // optional limit: 10 // optional }) // Delete key kv_delete({ namespaceId: "your_namespace_id", key: "myKey" })
R2 Storage
javascript// List buckets r2_list_buckets() // Create bucket r2_create_bucket({ name: "my-bucket" }) // Delete bucket r2_delete_bucket({ name: "my-bucket" }) // List objects in bucket r2_list_objects({ bucket: "my-bucket", prefix: "folder/", // optional delimiter: "/", // optional limit: 1000 // optional }) // Get object r2_get_object({ bucket: "my-bucket", key: "folder/file.txt" }) // Put object r2_put_object({ bucket: "my-bucket", key: "folder/file.txt", content: "Hello, World!", contentType: "text/plain" // optional }) // Delete object r2_delete_object({ bucket: "my-bucket", key: "folder/file.txt" })
D1 Database
javascript// List databases d1_list_databases() // Create database d1_create_database({ name: "my-database" }) // Delete database d1_delete_database({ databaseId: "your_database_id" }) // Execute a single query d1_query({ databaseId: "your_database_id", query: "SELECT * FROM users WHERE age > ?", params: ["25"] // optional }) // Create a table d1_query({ databaseId: "your_database_id", query: ` CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ` })
Analytics
javascript// Get today's analytics analytics_get({ zoneId: "your_zone_id", since: "2024-11-26T00:00:00Z", until: "2024-11-26T23:59:59Z" })
Durable Objects
javascript// List Durable Objects namespaces durable_objects_list() // Create a new Durable Objects namespace durable_objects_create({ name: "my-durable-object", script_name: "my-worker", class_name: "MyDurableObjectClass" }) // Delete a Durable Objects namespace durable_objects_delete({ id: "your_namespace_id" }) // List instances for a namespace durable_objects_list_instances({ namespaceId: "your_namespace_id", limit: 100 // optional }) // Get details about a specific instance durable_objects_get_instance({ namespaceId: "your_namespace_id", instanceId: "your_instance_id" }) // Delete a specific instance durable_objects_delete_instance({ namespaceId: "your_namespace_id", instanceId: "your_instance_id" })
Queues
javascript// List all queues queues_list() // Create a new queue queues_create({ name: "my-queue", settings: { delivery_delay: 0, dead_letter_queue: "dead-letter-queue" // optional } }) // Delete a queue queues_delete({ name: "my-queue" }) // Get queue details queues_get({ name: "my-queue" }) // Send a message to a queue queues_send_message({ queue: "my-queue", messages: [ { body: JSON.stringify({ key: "value" }) } ] }) // Get messages from a queue queues_get_messages({ queue: "my-queue", batchSize: 10, // optional visibilityTimeout: 30 // optional, in seconds }) // Update a queue consumer queues_update_consumer({ queue: "my-queue", consumer: "my-consumer", settings: { dead_letter_queue: "dead-letter-queue", batch_size: 10, max_retries: 3 } })
Workers AI
javascript// List available AI models workers_ai_list_models() // Get details about a specific model workers_ai_get_model({ model: "@cf/meta/llama-2-7b-chat-int8" }) // Run inference using Workers AI workers_ai_run_inference({ model: "@cf/meta/llama-2-7b-chat-int8", input: { messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "Hello, who are you?" } ] }, options: { temperature: 0.7, max_tokens: 100 } }) // List AI tasks workers_ai_list_tasks()
Workflows
javascript// List all workflows workflows_list() // Create a new workflow workflows_create({ name: "my-workflow", content: "// Workflow script content here" }) // Delete a workflow workflows_delete({ name: "my-workflow" }) // Get workflow details workflows_get({ name: "my-workflow" }) // Update a workflow workflows_update({ name: "my-workflow", content: "// Updated workflow script content" }) // Execute a workflow workflows_execute({ name: "my-workflow", input: { key: "value" } })
Templates
javascript// List available templates templates_list() // Get details about a specific template templates_get({ template: "worker-typescript" }) // Create a worker from a template templates_create_from_template({ name: "my-new-worker", template: "worker-typescript", options: { // Template-specific options } })
Workers for Platforms
javascript// List dispatchers w4p_list_dispatchers() // Create a new dispatcher w4p_create_dispatcher({ name: "my-dispatcher", script: "// Dispatcher script content" }) // Delete a dispatcher w4p_delete_dispatcher({ name: "my-dispatcher" }) // Get dispatcher details w4p_get_dispatcher({ name: "my-dispatcher" }) // Update dispatcher w4p_update_dispatcher({ name: "my-dispatcher", script: "// Updated dispatcher script content" })
Service Bindings
javascript// List all service bindings for a worker bindings_list({ workerName: "my-worker" }) // Create a new service binding bindings_create({ workerName: "my-worker", bindingName: "MY_SERVICE", serviceEnvironment: "production", serviceName: "target-worker" }) // Update a service binding bindings_update({ workerName: "my-worker", bindingName: "MY_SERVICE", serviceEnvironment: "staging", serviceName: "target-worker" }) // Delete a service binding bindings_delete({ workerName: "my-worker", bindingName: "MY_SERVICE" })
URL Routing
javascript// List all routes for a worker routing_list_routes({ workerName: "my-worker" }) // Create a new route routing_create_route({ workerName: "my-worker", pattern: "example.com/*", zoneId: "your_zone_id" }) // Update a route routing_update_route({ routeId: "your_route_id", pattern: "api.example.com/*", zoneId: "your_zone_id" }) // Delete a route routing_delete_route({ routeId: "your_route_id" })
Cron Triggers
javascript// List all cron triggers for a worker cron_list({ workerName: "my-worker" }) // Create a new cron trigger cron_create({ workerName: "my-worker", schedule: "*/5 * * * *", timezone: "UTC" // optional }) // Update a cron trigger cron_update({ triggerId: "your_trigger_id", schedule: "0 */2 * * *", timezone: "America/New_York" }) // Delete a cron trigger cron_delete({ triggerId: "your_trigger_id" })
Zones & Domains
javascript// List all zones zones_list() // Create a new zone zones_create({ name: "example.com", account: { id: "your_account_id" } }) // Get zone details zones_get({ zoneId: "your_zone_id" }) // Delete a zone zones_delete({ zoneId: "your_zone_id" }) // Check zone activation status zones_check_activation({ zoneId: "your_zone_id" })
Secrets
javascript// List all secrets for a worker secrets_list({ workerName: "my-worker" }) // Create or update a secret secrets_put({ workerName: "my-worker", secretName: "API_KEY", secretValue: "your-secret-api-key" }) // Delete a secret secrets_delete({ workerName: "my-worker", secretName: "API_KEY" })
Version Management
javascript// List all versions of a worker versions_list({ workerName: "my-worker" }) // Get details about a specific version versions_get({ workerName: "my-worker", versionId: "your_version_id" }) // Rollback to a previous version versions_rollback({ workerName: "my-worker", versionId: "your_version_id" })
Wrangler Config
javascript// Get current wrangler configuration wrangler_get_config() // Update wrangler configuration wrangler_update_config({ config: { name: "my-worker", main: "src/index.ts", compatibility_date: "2024-03-11", workers_dev: true } })
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.