MCP HubMCP Hub
GutMutCode

mcp-server-cloudflare

by: GutMutCode

Cloudflare MCP server for IDE ( Cline, Windsurf, Cursor, etc )

7created 22/02/2025
Visit
Cloudflare
IDE

📌Overview

Purpose: The Cloudflare MCP Server enables seamless integration and management of Cloudflare services through natural language commands, leveraging the Model Context Protocol for efficient communication between large language models and external systems.

Overview: This framework provides an installer and server that allows users to interact with their Cloudflare accounts using tools like Claude Desktop and IDEs such as VSCode. It empowers users to perform various operations on Cloudflare services effortlessly, including handling Workers, D1 databases, KV stores, and R2 storage through intuitive commands.

Key Features:

  • KV Store Management: Manages key-value namespaces, allowing users to list, retrieve, store, and delete values.

  • R2 Storage Management: Facilitates operations on R2 buckets, including listing, creating, deleting, and managing objects.

  • D1 Database Management: Enables database operations such as listing, creating, deleting, and executing SQL queries on D1 databases.

  • Workers Management: Provides capabilities to list, retrieve, update, and delete Cloudflare Worker scripts.

  • Analytics: Retrieves analytics data for a domain, including requests, bandwidth usage, and page views with date range filtering support.


Cloudflare MCP Server for IDE

Model Context Protocol (MCP) is a standardized protocol for managing context between large language models (LLMs) and external systems. This repository provides an installer and an MCP Server for Cloudflare's API.

This enables the use of Claude Desktop, IDEs like VSCode (Cline), Windsurf, or any MCP Client to perform operations on your Cloudflare account using natural language, for example:

  • 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

Short Demo Video

Setup

  1. Run:

    npx @gutmutcode/mcp-server-cloudflare init
    
  2. Restart Claude Desktop. You should see a small 🔨 icon indicating the available tools.

  3. Check the Cline configuration file for a cloudflare section with your Cloudflare account ID.

  4. Check the Windsurf MCP configuration file for a cloudflare section. Note that Windsurf has limitations on MCP tool usage, so it cannot use too many tools simultaneously (unlike Cline and Claude).

Features

KV Store Management

  • get_kvs: List all KV namespaces in your account
  • kv_get: Get a value from a KV namespace
  • kv_put: Store a value in a KV namespace
  • kv_list: List keys in a KV namespace
  • kv_delete: Delete a key from a KV namespace

R2 Storage Management

  • r2_list_buckets: List all R2 buckets in your account
  • r2_create_bucket: Create a new R2 bucket
  • r2_delete_bucket: Delete an R2 bucket
  • r2_list_objects: List objects in an R2 bucket
  • r2_get_object: Get an object from an R2 bucket
  • r2_put_object: Put an object into an R2 bucket
  • r2_delete_object: Delete an object from an R2 bucket

D1 Database Management

  • d1_list_databases: List all D1 databases in your account
  • d1_create_database: Create a new D1 database
  • d1_delete_database: Delete a D1 database
  • d1_query: Execute a SQL query against a D1 database

Workers Management

  • worker_list: List all Workers in your account
  • worker_get: Get a Worker's script content
  • worker_put: Create or update a Worker script
  • worker_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 project folder, run:

pnpm install
pnpm build:watch

Then, in a second terminal, run:

node dist/index.js init

This links Claude Desktop against your locally installed version for testing.

Usage outside of Claude

To run the server locally, execute:

node dist/index run <account-id>

If using an alternative MCP Client or testing locally, emit the tools/list command to get an updated list of available tools. You can then call these using the tools/call command.

Workers Example Usage

// 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 Example Usage

// 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 Example Usage

// 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 Example Usage

// 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 Example Usage

// Get today's analytics
analytics_get({
    zoneId: "your_zone_id",
    since: "2024-11-26T00:00:00Z",
    until: "2024-11-26T23:59:59Z"
})

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.