@deepbrainspace/cloudflare-mcp v2.0.5
Cloudflare MCP Server for IDE
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, and IDE like VSCode (Cline) and Windsurf 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
coming soon.
Setup
Add the server to your MCP client's configuration file (e.g., mcp_settings.json). Create the file if it doesn't exist. The location of this file varies depending on your MCP client. For Cline (VSCode extension), it's typically in the global storage path.
Example mcp_settings.json entry:
{
"mcp_servers": [
"cloudflare": {
"command": "npx",
"args": [
"-y",
"@deepbrainspace/cloudflare-mcp@1.1.1"
]
}
]
} Note: The @1.1.1 specifies the version. You can omit it to always use the latest version, or specify a different version if needed. The -y flag for npx automatically confirms any prompts, which is useful for non-interactive setups.
- Restart your MCP client (e.g., Claude Desktop, VSCode with Cline). You should see a small 🔨 icon or similar indicator that shows the Cloudflare tools are available.
The first time you use a Cloudflare tool, the server will run its
initprocess automatically if it hasn't been run before. This will prompt you for your Cloudflare Account ID and API Token. Alternatively, you can runnpx @deepbrainspace/mcp-server-cloudflare initmanually beforehand.After initialization, the server will store your credentials securely. You should see a
cloudflaresection with your Cloudflare account ID in your MCP client's configuration or a dedicated configuration file created by the server.
- For clients like Windsurf, ensure the MCP configuration file reflects the server addition similarly. Note that some clients might have limitations on the number of concurrent MCP tools.
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
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:watchThen, in a second terminal:
node dist/index.js initThis will link Claude Desktop against your locally-installed version for you to test.
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
// 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
// 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
// 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
// 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
// Get today's analytics
analytics_get({
zoneId: "your_zone_id",
since: "2024-11-26T00:00:00Z",
until: "2024-11-26T23:59:59Z"
})Publishing
To publish this package to the public npm registry under the @deepbrainspace scope, ensure you are logged into npm (pnpm login) and then run the following command from the cloudflare-mcp directory:
pnpm publish --access publicThe --access public flag is crucial for scoped packages to ensure they are published publicly and not as private packages (which would require a paid npm plan).
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.