cloudflare / mcp-server-cloudflare
- пятница, 21 марта 2025 г. в 00:00:07
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 '...'?
Run npx @cloudflare/mcp-server-cloudflare init
Note: The MCP server will automatically run
npx wrangler login
if you're not already authenticated with Cloudflare. You'll be prompted to complete the authentication process in your browser if needed.
Some features in this MCP server require a paid Cloudflare Workers plan:
analytics_get
tool and related analytics features require a paid Workers plan to access these metricsEnsure your Cloudflare account has the necessary subscription level for the features you intend to use.
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 namespacer2_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 bucketd1_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 databaseworker_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 scriptdurable_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 instancequeues_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 consumerworkers_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 tasksworkflows_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 Workflowtemplates_list
: List available Worker templatestemplates_get
: Get details about a specific templatetemplates_create_from_template
: Create a new Worker from a templatew4p_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 configurationbindings_list
: List all service bindings for a Workerbindings_create
: Create a new service bindingbindings_update
: Update a service bindingbindings_delete
: Delete a service bindingrouting_list_routes
: List all routes for a Workerrouting_create_route
: Create a new routerouting_update_route
: Update a routerouting_delete_route
: Delete a routecron_list
: List all cron triggers for a Workercron_create
: Create a new cron triggercron_update
: Update a cron triggercron_delete
: Delete a cron triggerzones_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 statussecrets_list
: List all secrets for a Workersecrets_put
: Create or update a secretsecrets_delete
: Delete a secretversions_list
: List all versions of a Workerversions_get
: Get details about a specific versionversions_rollback
: Rollback to a previous versionwrangler_get_config
: Get the current Wrangler configurationwrangler_update_config
: Update Wrangler configurationanalytics_get
: Retrieve analytics data for your domain
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. If you're not already authenticated with Wrangler, the server will automatically prompt you to complete the authentication process in your browser.
The project uses Vitest as the testing framework with MSW (Mock Service Worker) for API mocking.
To run all tests:
pnpm test
To run tests with coverage:
pnpm test:coverage
To run a specific test file:
pnpm test -- tests/tools/queues.test.ts
To run tests in watch mode (useful during development):
pnpm test:watch
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 configurationEach tool test file follows a consistent pattern of testing both successful operations and error handling scenarios.
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.
// 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" })
// 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"
})
// 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"
})
// 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
)
`
})
// Get today's analytics
analytics_get({
zoneId: "your_zone_id",
since: "2024-11-26T00:00:00Z",
until: "2024-11-26T23:59:59Z"
})
// 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"
})
// 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
}
})
// 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()
// 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" }
})
// 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
}
})
// 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"
})
// 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"
})
// 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"
})
// 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"
})
// 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"
})
// 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"
})
// 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"
})
// 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
}
})
Contributions are welcome! Please feel free to submit a Pull Request.