Skip to main content
Glama

bunny-mcp

MCP server for Bunny.net — pull zones, DNS, storage, video streaming, edge scripting, Shield/WAF and Magic Containers, from an AI assistant.

A hardened fork of anvme/bunnycdn-mcp (MIT). Two things differ, and both exist because pointing the upstream at a real Bunny account publishes credentials.

Part of the Aura Design Engine

These are the skills behind Aura — one AI web-agency lifecycle you can run standalone or orchestrate across a whole client fleet from a single dashboard.

Stage

Skill

Role

🎨 Build

siteagent-elementor-studio · elementor-mcp

Design & build sites inside Elementor — the recipes, and the MCP engine under them

🔎 Audit + Content

wordpress-api-pro

REST content ops, SEO & site audits

🖥 Host

cloudways-mcp · hostinger-mcp

Provision & operate the infrastructure

🚀 Deliver

bunny-mcp ← you are here

CDN, storage & edge delivery

🛡 Govern

aura-mcp

Drive the control plane — approvals, snapshots, rollbacks — over MCP

→ Orchestrate all of it across your client fleet with Aura — governed agent ops with approvals and a full audit trail on top of these skills.

Related MCP server: Cloudflare Control

What the fork changes

1. Responses are projected through an allow-list

Bunny returns credentials inline with ordinary metadata:

Endpoint

Credential in the response

GET /pullzone

ZoneSecurityKey — the token-authentication signing secret, for every zone

GET /pullzone → Hostnames[]

Certificate and CertificateKey — the TLS private key

GET /storagezone

Password, ReadOnlyPassword — full read-write and read storage keys

GET /videolibrary

ApiKey, ReadOnlyApiKey, WebhookSignatureKey

GET /user

ApiKey — the account key the server itself authenticates with

Handing those to a model puts them in its context, its logs and its transcript. So no tool ever sees them: every response passes through lib/project.js at the HTTP layer, keyed by request path, and only the fields named there survive.

It is an allow-list, not a deny-list. Stripping known secret names fails the moment Bunny adds a field — the new one ships in the clear and nothing tells you. Naming what may pass fails the other way: a new field is invisible until someone decides it is safe.

It fails closed. A path with no declared shape returns no data and an error naming the path, rather than the raw payload.

It applies inside a value, not only to it. A URL keeps scheme, host, port and path; userinfo, query and fragment go. The first version of that scrubber removed user:password@ and kept the rest — a deny-list wearing a scrubber's coat, which closed the one place a credential was known to sit and let ?token=… walk through. And a free-form bag is a bag whether it arrives as an object or a string: CustomHTML is dropped for the same reason metaTags is.

It does not vet structure by naming its parent. A bare field name may only carry a scalar, or an array of them; an object survives only where a nested shape is declared for it. Every leak found while reviewing this fork lived one level below a name someone had already vetted — Hostnames looked safe and held the TLS private key; EdgeRules was given a shape and ExtraActions inside it still carried the very parameter that shape existed to drop.

2. Write tools are withheld unless you ask for them

BUNNY_READONLY defaults to on. In that mode the write-capable tools are never registered — absent from tools/list, not merely annotated as risky. An agent cannot call a tool it cannot see, and the MCP destructiveHint is advice to a client, not a control.

The gate fails closed: a tool is registered in read-only mode only if it declares readOnlyHint: true. A new tool whose author forgot its annotations counts as a writer and is withheld.

BUNNY_READONLY=0   # register the write tools too — 0/false/no/off, nothing else

Errors are projected too

A non-2xx response never reaches the response interceptor — axios routes it to the rejection handler — so error bodies get their own boundary. Bunny quotes submitted values back in validation messages, and what these tools submit includes edge-script secrets, so the rule keys on the request: a request that carried no body cannot have its own payload echoed at it and keeps its message; a request that carried one has the message withheld, with the status and ErrorKey still saying what went wrong.

Diagnostics keep the sentence and lose the target

An origin error log and a transcoding failure both quote the request that failed, and that request is the one an operator signs. Those fields are kept — a diagnostic that will not say what failed is not worth returning — but the target inside them is withheld whole, not edited:

failed fetching https://svc:pw@origin/x?token=secret after 10s
                              ↓
failed fetching (withheld: URL) after 10s

A whitespace-delimited token is withheld when it carries an @, or a ?/# with anything attached to it — either side. That is what separates a query or fragment from ordinary punctuation: why? because has a space after the mark, while callback?token=secret and a bare #access_token=x do not. Nothing is parsed, so there is no interior for a new URL shape to hide in — nine review findings were spent teaching an earlier reducer the shapes prose can take, and each one found the shape the last had not met.

A fragment goes even when it looks like a section number. #3 reads as a reference and #123456 reads as a PIN, but they are the same string with different digits, so no rule can tell them apart; both are withheld rather than guessed at.

A token with none of those marks is returned exactly as written, so https://origin.example/ok, origin.example/file and 3.5 are untouched: a plain target carries nothing, and which host failed is most of a diagnostic's value.

The structured target fields — a log's Url and Path — are reduced rather than withheld, because a field that IS a URL can be cut precisely.

What this does not catch, said plainly: a secret embedded in a path segment, as in /download/sk_live_x/file. Nothing short of understanding the operator's own URL scheme would.

Edge-script source is withheld by default

/compute/script/<id>/code returns the script's source, and source carries hard-coded keys about as readily as any other operator-authored text — CustomHTML is dropped for exactly that reason. So the body is withheld and the response says how to release it:

BUNNY_ALLOW_SOURCE=1   # return edge-script source — 1/true/yes/on, nothing else

More generally, a non-JSON body on the management API no longer gets a free pass. It passes only where a route declares it may; anything else raises, naming the path. The blanket "non-JSON means it's a file download" exemption was the hole this closed.

Credential scoping

Bunny does not offer scoped API keys. The authentication docs say it plainly: "You can have only one API key associated with your account." The dashboard's Account → API page can only view and rotate that key, and while the /apikey endpoint models multiple keys with roles, neither the UI nor the docs expose creating one. So the key this server runs with is the account key, and the mitigations are:

  • BUNNY_API_KEY_FILE — point it at a mode-0600 file and the server reads the key at spawn, so no MCP client config ever holds the value. BUNNY_API_KEY still works and wins when both are set.

  • BUNNY_READONLY stays on, so write tools are never registered.

  • The response projection keeps the key - and every other credential Bunny echoes - out of the transcript. Rotate the key from that same page if it is ever exposed; a rotation invalidates the old value immediately.


Features

Tool

Description

Data Source

Mode

bunny_get_account

Get account details and balance

bunny.net API

read

bunny_get_billing_summary

Get billing summary with charges

bunny.net API

read

bunny_get_statistics

Get CDN statistics (bandwidth, requests, cache hit rate)

bunny.net API

read

bunny_global_search

Search across all resources

bunny.net API

read

bunny_purge_url

Purge a URL from CDN cache

bunny.net API

write

bunny_list_regions

List CDN edge regions

bunny.net API

read

bunny_list_countries

List countries for geo-blocking

bunny.net API

read

bunny_list_pull_zones

List pull zones with search and pagination

bunny.net API

read

bunny_get_pull_zone

Get pull zone details

bunny.net API

read

bunny_create_pull_zone

Create a pull zone

bunny.net API

write

bunny_update_pull_zone

Update pull zone settings

bunny.net API

write

bunny_delete_pull_zone

Delete a pull zone

bunny.net API

write

bunny_purge_pull_zone_cache

Purge entire pull zone cache

bunny.net API

write

bunny_manage_pull_zone_hostnames

Add or remove custom hostnames

bunny.net API

write

bunny_manage_edge_rules

Add, update, delete, or toggle edge rules

bunny.net API

write

bunny_list_dns_zones

List DNS zones

bunny.net API

read

bunny_get_dns_zone

Get DNS zone with all records

bunny.net API

read

bunny_create_dns_zone

Create a DNS zone

bunny.net API

write

bunny_update_dns_zone

Update DNS zone settings

bunny.net API

write

bunny_delete_dns_zone

Delete a DNS zone

bunny.net API

write

bunny_manage_dns_record

Add, update, or delete DNS records

bunny.net API

write

bunny_get_dns_statistics

Get DNS query statistics

bunny.net API

read

bunny_list_storage_zones

List storage zones

bunny.net API

read

bunny_get_storage_zone

Get storage zone details

bunny.net API

read

bunny_create_storage_zone

Create a storage zone

bunny.net API

write

bunny_get_storage_zone_statistics

Get storage zone usage statistics

bunny.net API

read

bunny_list_storage_files

List files and directories

Storage API

read

bunny_download_storage_file

Download file content

Storage API

read

bunny_delete_storage_file

Delete a file or directory

Storage API

write

bunny_list_video_libraries

List video libraries

bunny.net API

read

bunny_get_video_library

Get library details

bunny.net API

read

bunny_create_video_library

Create a video library

bunny.net API

write

bunny_update_video_library

Update library settings

bunny.net API

write

bunny_list_videos

List videos with search and pagination

Stream API

read

bunny_get_video

Get video details

Stream API

read

bunny_create_video

Create video object, optionally fetch from URL

Stream API

write

bunny_update_video

Update video metadata

Stream API

write

bunny_delete_video

Delete a video

Stream API

write

bunny_get_video_statistics

Get view statistics

Stream API

read

bunny_get_video_heatmap

Get attention heatmap data

Stream API

read

bunny_reencode_video

Re-encode a video

Stream API

write

bunny_list_collections

List video collections

Stream API

read

bunny_get_collection

Get collection details

Stream API

read

bunny_manage_collection

Create, update, or delete collections

Stream API

write

bunny_list_edge_scripts

List edge scripts

bunny.net API

read

bunny_get_edge_script

Get script details

bunny.net API

read

bunny_get_edge_script_code

Get script source code

bunny.net API

read

bunny_set_edge_script_code

Upload script code (saved as draft)

bunny.net API

write

bunny_manage_edge_script

Create, update, or delete scripts

bunny.net API

write

bunny_publish_edge_script

Publish a release to edge servers

bunny.net API

write

bunny_list_edge_script_variables

List a script's environment variable names

bunny.net API

read

bunny_manage_edge_script_variables

Manage environment variables and secrets

bunny.net API

write

bunny_list_shield_zones

List shield security zones

bunny.net API

read

bunny_get_shield_zone

Get zone by shield zone ID or pull zone ID

bunny.net API

read

bunny_get_waf_rules

Get WAF rules and profiles

bunny.net API

read

bunny_manage_waf_custom_rule

Create, update, or delete custom WAF rules

bunny.net API

write

bunny_list_rate_limit_rules

List rate limiting rules

bunny.net API

read

bunny_manage_rate_limit_rule

Create, update, or delete rate limit rules

bunny.net API

write

bunny_get_shield_metrics

Get security metrics overview

bunny.net API

read

bunny_read_bot_detection

Read bot detection settings

bunny.net API

read

bunny_get_bot_detection

Get or update bot detection settings

bunny.net API

write

bunny_list_mc_apps

List Magic Container applications

bunny.net API

read

bunny_get_mc_app

Get application details

bunny.net API

read

bunny_get_mc_app_overview

Get app overview with real-time metrics

bunny.net API

read

bunny_manage_mc_app

Create, update, or delete applications

bunny.net API

write

bunny_mc_app_lifecycle

Deploy, undeploy, or restart applications

bunny.net API

write

bunny_list_mc_registries

List container registries

bunny.net API

read

bunny_list_mc_regions

List deployment regions

bunny.net API

read

bunny_get_mc_app_statistics

Get application statistics

bunny.net API

read

bunny_get_origin_errors

Get origin error logs for a pull zone

bunny.net API

read

Data sources: Tools marked Storage API require BUNNY_STORAGE_KEY. Tools marked Stream API require BUNNY_STREAM_KEY. All other tools use BUNNY_API_KEY.

Prerequisites

  • Node.js >= 18

  • A bunny.net account with an API key

  • Optional: Stream library API key (for video tools)

  • Optional: Storage zone password (for file tools)

Setup

No installation needed — just configure your MCP client:

Add to .vscode/mcp.json:

{
  "servers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}
claude mcp add --transport stdio bunny -- npx -y github:Digitizers/bunny-mcp

Or add to .mcp.json (shared with team):

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Add to settings.json:

{
  "context_servers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Open Settings → Tools → AI Assistant → MCP, click +, and paste:

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}
gemini mcp add bunny -- npx -y github:Digitizers/bunny-mcp

Or add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "bunny": {
      "command": "npx",
      "args": ["-y", "github:Digitizers/bunny-mcp"],
      "env": {
        "BUNNY_API_KEY": "your-api-key"
      }
    }
  }
}

Any MCP client that supports stdio transport can use this server. The command is:

npx -y github:Digitizers/bunny-mcp

See the full list of MCP clients.

Optional environment variables

Variable

Description

BUNNY_STREAM_KEY

Video library API key — enables Stream video and collection tools

BUNNY_STORAGE_KEY

Storage zone password — enables Storage file tools

BUNNY_STORAGE_REGION

Storage region code (default: empty for Falkenstein)

BUNNY_STORAGE_ZONE

Default storage zone name

Add these to the env block in your MCP client configuration above.

Local development

git clone https://github.com/Digitizers/bunny-mcp.git
cd bunny-mcp
npm install
npm test
node index.js

How It Works

This MCP server connects to the bunny.net API using your API key. The catalog above holds 70 tools, split by which API keys are provided:

  • Core tools (56 tools) — always available with BUNNY_API_KEY

  • Stream tools (11 tools) — registered when BUNNY_STREAM_KEY is set

  • Storage file tools (3 tools) — registered when BUNNY_STORAGE_KEY is set

Those are the totals with the write gate open. By default BUNNY_READONLY is on and 41 of the 70 register — the 29 write-capable ones are withheld, per section 2. The Mode column in the catalog says which is which.

Both counts assume all three keys. With BUNNY_API_KEY alone the core tools are all there is: 33 registered read-only, 56 with the gate open.

All read operations are cached in-memory with a short TTL for performance. Every tool includes MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so clients can make informed decisions about tool approval.

License

MIT

Available Tools

54 tools
bunny_create_dns_zoneA

Create a new DNS zone for a domain. After creation, update the domain's nameservers at your registrar to point to the bunny.net nameservers returned in the response.

Inputs: domain (required).

bunny_create_pull_zoneA

Create a new CDN pull zone. The pull zone gets a default hostname (name.b-cdn.net) and caches content from the specified origin_url. Alternatively, set storage_zone_id to use a bunny.net storage zone as origin.

Inputs: name (required), origin_url (required), type, storage_zone_id.

bunny_create_storage_zoneA

Create a new Edge Storage zone. Choose a primary region and optional replication regions for geo-redundancy. Region codes: DE (Falkenstein), UK (London), NY (New York), LA (Los Angeles), SG (Singapore), SYD (Sydney), BR (Sao Paulo), JH (Johannesburg). Default primary region is DE.

Inputs: name (required), region, replication_regions.

bunny_create_video_libraryA

Create a new Bunny Stream video library for hosting, encoding, and delivering videos. Optionally specify replication regions for geo-redundant storage.

Inputs: name (required), replication_regions.

bunny_delete_dns_zoneA
DestructiveIdempotent

Permanently delete a DNS zone and all its records. This action is irreversible and will stop DNS resolution for the domain if bunny.net nameservers are still active.

Inputs: id (required).

bunny_delete_pull_zoneA
DestructiveIdempotent

Permanently delete a CDN pull zone and all its configuration (hostnames, edge rules, cache). This action is irreversible and immediately stops content delivery on all associated hostnames.

Inputs: id (required).

bunny_get_accountA
Read-onlyIdempotent

Retrieve the current bunny.net account details: email, name, balance, billing type, enabled features, and feature flags. Use this to check account status or remaining balance before provisioning resources.

Inputs: no named parameters.

bunny_get_billing_summaryA
Read-onlyIdempotent

Retrieve the billing summary for the account: current balance, this month's charges, and per-service usage breakdown (CDN, Storage, DNS, Stream, etc.).

Inputs: no named parameters.

bunny_get_bot_detectionA
Idempotent

Retrieve or update bot detection settings for a shield zone. If settings are provided, updates them (e.g. enable/disable bot categories, adjust thresholds); otherwise returns current configuration.

Inputs: shield_zone_id (required), settings.

bunny_get_dns_statisticsA
Read-onlyIdempotent

Retrieve DNS query statistics for a zone over a date range, including total queries, queries by record type, and response code distribution.

Inputs: id (required), date_to, date_from.

bunny_get_dns_zoneA
Read-onlyIdempotent

Retrieve a DNS zone by ID, including all its DNS records, nameserver configuration, SOA settings, and DNSSEC status.

Inputs: id (required).

bunny_get_edge_scriptA
Read-onlyIdempotent

Retrieve edge script details by ID, including configuration, linked pull zones, deployment status, integration type, and release history.

Inputs: id (required).

bunny_get_edge_script_codeA
Read-onlyIdempotent

Retrieve the JavaScript source code of an edge script.

Inputs: id (required).

bunny_get_mc_appB
Read-onlyIdempotent

Retrieve Magic Container application details including container configuration, endpoints, deployment status, environment variables, volumes, and region settings.

Inputs: id (required).

bunny_get_mc_app_overviewA
Read-onlyIdempotent

Retrieve application overview with real-time metrics: latency, CPU/RAM usage, active instance count across regions, and estimated cost breakdown.

Inputs: id (required).

bunny_get_mc_app_statisticsA
Read-onlyIdempotent

Retrieve historical application statistics over a date range: CPU usage, RAM usage, network traffic (inbound/outbound), request latency, and volume storage usage.

Inputs: id (required), date_to, date_from.

bunny_get_origin_errorsA
Read-onlyIdempotent

Retrieve origin error logs for a pull zone on a specific date. Shows exactly why origin requests failed, including error codes: dns_lookup, http_timeout, http_request_exception, http_request_failure, http_invalid_range, http_loop_detected, http_invalid_compression, network_socket_exception, network_io_error, notfound_localdb. Essential for debugging 502/504 errors.

Inputs: date (required), pull_zone_id (required).

bunny_get_pull_zoneA
Read-onlyIdempotent

Retrieve full configuration of a CDN pull zone by ID, including origin URL, hostnames, caching settings, security options, edge rules, and optimizer config.

Inputs: id (required).

bunny_get_shield_metricsA
Read-onlyIdempotent

Retrieve security metrics overview for a shield zone over a date range: WAF blocks, rate limit triggers, bot detections, and DDoS mitigation events.

Inputs: shield_zone_id (required), date_to, date_from.

bunny_get_shield_zoneA
Read-onlyIdempotent

Retrieve shield zone configuration by shield zone ID or by the associated pull zone ID. Returns WAF settings, rate limit rules, bot detection config, and DDoS protection status.

Inputs: pull_zone_id, shield_zone_id.

bunny_get_statisticsA
Read-onlyIdempotent

Retrieve account-wide or per-pull-zone CDN statistics over a date range. Returns time-series data for bandwidth, requests, cache hit rate, status codes (3xx/4xx/5xx), and geographic distribution. Use hourly=true for granular data.

Inputs: hourly, date_to, date_from, pull_zone, +1 more.

bunny_get_storage_zoneA
Read-onlyIdempotent

Retrieve storage zone details by ID, including primary region, replication regions, connected pull zones, storage used, and file count.

Inputs: id (required).

bunny_get_storage_zone_statisticsA
Read-onlyIdempotent

Retrieve storage zone usage statistics over a date range: storage space used, file count, and bandwidth consumed.

Inputs: id (required), date_to, date_from.

bunny_get_video_libraryA
Read-onlyIdempotent

Retrieve video library details by ID, including player configuration, security settings (token auth, allowed/blocked referrers), encoding config (resolutions, bitrates), DRM, watermark, and transcribing settings.

Inputs: id (required), include_access_key.

bunny_get_waf_rulesA
Read-onlyIdempotent

Retrieve all WAF rules and profiles configured for a shield zone, including managed rulesets (OWASP, etc.) and custom rules.

Inputs: shield_zone_id (required).

bunny_list_countriesA
Read-onlyIdempotent

List all countries with their ISO 2-letter codes. Reference data for configuring geo-blocking, routing filters, and allowed/blocked country lists on pull zones.

Inputs: no named parameters.

bunny_list_dns_zonesA
Read-onlyIdempotent

List all Bunny DNS zones in the account with optional search and pagination. Each DNS zone corresponds to a domain managed by bunny.net nameservers.

Inputs: page, search, per_page.

bunny_list_edge_scriptsA
Read-onlyIdempotent

List all Bunny Edge Scripts in the account. Edge scripts are serverless JavaScript functions that run on bunny.net's edge network, used for custom request/response handling.

Inputs: no named parameters.

bunny_list_mc_appsA
Read-onlyIdempotent

List all Magic Container applications in the account. Magic Containers are bunny.net's serverless container platform for deploying Docker images to the edge.

Inputs: no named parameters.

bunny_list_mc_regionsA
Read-onlyIdempotent

List available Magic Container deployment regions with their anycast support and capacity status. Use this to choose where to deploy applications.

Inputs: no named parameters.

bunny_list_mc_registriesA
Read-onlyIdempotent

List container registries configured for pulling Docker images (Docker Hub, GHCR, custom registries). Registry credentials are used when deploying private container images.

Inputs: no named parameters.

bunny_list_pull_zonesA
Read-onlyIdempotent

List all CDN pull zones in the account with optional search and pagination. Each pull zone represents a CDN distribution endpoint (name.b-cdn.net) connected to an origin URL or storage zone.

Inputs: page, search, per_page, include_certificate.

bunny_list_rate_limit_rulesA
Read-onlyIdempotent

List all rate limiting rules configured for a shield zone. Rate limit rules restrict the number of requests per second from matching clients.

Inputs: shield_zone_id (required).

bunny_list_regionsA
Read-onlyIdempotent

List all bunny.net CDN edge server regions with their IDs, names, pricing tiers, and geographic coordinates. Useful for choosing routing filters or understanding geo-distribution.

Inputs: no named parameters.

bunny_list_shield_zonesA
Read-onlyIdempotent

List all Bunny Shield security zones. Each shield zone provides WAF, rate limiting, bot detection, and DDoS protection for one or more associated pull zones.

Inputs: no named parameters.

bunny_list_storage_zonesA
Read-onlyIdempotent

List all Edge Storage zones in the account. Each storage zone is a file storage container with a primary region and optional replication. Storage zones can serve as origins for pull zones.

Inputs: page, per_page, include_deleted.

bunny_list_video_librariesA
Read-onlyIdempotent

List all Bunny Stream video libraries in the account. Each library is an isolated container for videos with its own player settings, encoding config, API keys, and DRM/watermark options.

Inputs: page, search, per_page, include_access_key.

bunny_manage_dns_recordA
Destructive

Add, update, or delete a DNS record within a zone. Record types: 0=A, 1=AAAA, 2=CNAME, 3=TXT, 4=MX, 5=Redirect, 6=Flatten, 7=PullZone, 8=SRV, 9=CAA, 10=PTR, 11=Script, 12=NS. For add/update, provide a record object with fields: Type (number), Value, Name (subdomain or empty string for root), Ttl (seconds), Priority (for MX/SRV), Weight, Port.

Inputs: action (required), zone_id (required), record, record_id.

bunny_manage_edge_rulesA
Destructive

Manage edge rules on a CDN pull zone. Edge rules let you control redirects, headers, caching, and origin routing at the edge. Actions: 'upsert' creates or updates a rule, 'delete' removes it, 'enable'/'disable' toggles it. For upsert, provide edge_rule with: ActionType (number), TriggerMatchingType (0=MatchAny, 1=MatchAll), Triggers (array), ActionParameter1, ActionParameter2, Description, Enabled. ActionTypes: 0=ForceSSL, 1=Redirect, 2=OriginUrl, 3=OverrideCacheTime, 4=BlockRequest, 5=SetResponseHeader, 6=SetRequestHeader, 7=ForceDownload, 8=DisableTokenAuth, 9=EnableTokenAuth, 10=OverrideCacheTimePublic, 11=IgnoreQueryString, 14=DisableOptimizer, 15=ForceCompression, 16=SetStatusCode, 17=OriginStorage, 18=SetNetworkRateLimit, 19=SetConnectionLimit, 20=SetRequestsPerSecondLimit.

Inputs: action (required), pull_zone_id (required), edge_rule, edge_rule_id.

bunny_manage_edge_scriptA
Destructive

Create, update, or delete an edge script. Script types: 0=Standalone (handles full requests), 1=Middleware (runs before pull zone origin). For create, provide name and type. For update, provide settings with BunnyCDN PascalCase field names.

Inputs: action (required), id, name, type, +1 more.

bunny_manage_edge_script_variablesA
Destructive

Manage environment variables or encrypted secrets for an edge script. Variables are plaintext key-value pairs accessible at runtime. Secrets are encrypted and never returned in plaintext after creation. Actions: list, add, update, delete, upsert (create or update by name).

Inputs: id (required), action (required), resource (required), name, +2 more.

bunny_manage_mc_appA
Destructive

Create, update, or delete a Magic Container application. Config object fields: name, dockerImage, port, environmentVariables, regions, autoscaling settings. For create use PascalCase, for update use camelCase. Deleting removes the application and all associated resources.

Inputs: action (required), id, config.

bunny_manage_pull_zone_hostnamesA

Add or remove a custom hostname (e.g. cdn.example.com) on a CDN pull zone. After adding, point a CNAME record to the pull zone's b-cdn.net hostname. A free SSL certificate is provisioned automatically.

Inputs: id (required), action (required), hostname (required).

bunny_manage_rate_limit_ruleA
Destructive

Create, update, or delete a rate limit rule. Rule object fields: shieldZoneId, name, requestsPerSecond, blockTime, matchExpression, matchVariable, transformations, operator, matchValue. Rate limits block clients exceeding the configured request threshold.

Inputs: action (required), rule, rule_id, shield_zone_id.

bunny_manage_waf_custom_ruleA
Destructive

Create, update, or delete a custom WAF rule on a shield zone. Rule object fields: ruleName, ruleDescription, ruleConfiguration (with phases, variables, operators, transformations, actionType). Custom WAF rules let you block or allow traffic based on request attributes.

Inputs: action (required), shield_zone_id (required), rule, rule_id.

bunny_mc_app_lifecycleA
Idempotent

Control the lifecycle of a Magic Container application. 'deploy' starts the application across configured regions, 'undeploy' stops all running instances, 'restart' triggers a rolling restart of all pods.

Inputs: id (required), action (required).

bunny_publish_edge_scriptA
Idempotent

Publish a release for an edge script, deploying the current (or specified) code version to all edge servers globally. Optionally provide a release note.

Inputs: id (required), note, uuid.

bunny_purge_pull_zone_cacheA
Idempotent

Purge the entire CDN cache for a pull zone, forcing all edge servers to fetch fresh content from the origin on the next request. Does not delete origin files. For single-URL purge, use bunny_purge_url instead.

Inputs: id (required).

bunny_purge_urlA
Idempotent

Purge a specific URL from the global CDN cache so the next request fetches fresh content from the origin. Append a wildcard () to purge all files under a path (e.g. https://example.b-cdn.net/css/). Does not delete origin files.

Inputs: url (required), async.

bunny_set_edge_script_codeA
Idempotent

Upload or replace the JavaScript source code for an edge script. The new code is saved as a draft — use bunny_publish_edge_script to deploy it live.

Inputs: id (required), code (required).

bunny_update_dns_zoneB
Idempotent

Update DNS zone settings. Common fields (PascalCase): CustomNameserversEnabled, Nameserver1, Nameserver2, SoaEmail, LoggingEnabled, LoggingIPAnonymizationEnabled.

Inputs: id (required), settings (required).

bunny_update_pull_zoneA
Idempotent

Update pull zone settings. Pass a settings object with BunnyCDN API field names (PascalCase). Common fields: OriginUrl, AllowedReferrers, BlockedReferrers, BlockedIps, EnableGeoZoneUS, EnableGeoZoneEU, EnableGeoZoneASIA, CacheControlMaxAgeOverride, EnableQueryStringSort, EnableWebpVary, EnableAvifVary, EnableCacheSlice, EnableOriginShield, OriginShieldZoneCode.

Inputs: id (required), settings (required).

bunny_update_video_libraryA
Idempotent

Update video library settings. Common fields (PascalCase): Name, CustomHTML, PlayerKeyColor, EnableTokenAuthentication, EnableTokenIPVerification, AllowedReferrers, BlockedReferrers, EnableMP4Fallback, KeepOriginalFiles, EnableDRM, Bitrate240p through Bitrate4K, WatermarkPositionLeft, WatermarkPositionTop, WatermarkWidth, WatermarkHeight, EnabledResolutions, EnableTranscribing, EnableTranscribingTitleGeneration, EnableTranscribingDescriptionGeneration, TranscribingCaptionLanguages.

Inputs: id (required), settings (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 54 tools

    Disambiguation4/5

    Each tool is generally tied to a distinct Bunny.net resource/action, and descriptions clarify close pairs such as purge_pull_zone_cache vs purge_url and manage_mc_app vs mc_app_lifecycle. Some ambiguity remains around the generic 'manage' tools and get_bot_detection, which can also update settings, so this is not perfect.

    Naming Consistency4/5

    Most tools follow the bunny_<verb>_<resource> pattern with list/get/create/update/delete, and all names are snake_case with the bunny_ prefix. Deviations like bunny_mc_app_lifecycle (no verb) and bunny_global_search break the pattern slightly, but the overall convention is still predictable.

    Tool Count1/5

    With 54 tools, this server is in the extreme count range and far exceeds the typically well-scoped 3-15 tool surface. The broad BunnyCDN product breadth may explain the volume, but exposing every sub-service in one server creates a heavy, hard-to-navigate toolset that would be better split into separate MCP servers.

    Completeness3/5

    Core workflows are well covered for pull zones, DNS, edge scripts, and Magic Containers. However, storage zones lack update/delete operations, video libraries lack a delete operation, and Shield zones cannot be created or deleted, leaving notable dead ends for a platform API server.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Enables AI assistants to manage Cloudflare resources through natural language, including DNS records, zone management, Workers KV storage, cache purging, and analytics. Supports comprehensive Cloudflare operations with secure API token authentication.
      13
      2
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to manage Cloudflare infrastructure including DNS records, cache purging, SSL settings, Workers, and analytics through the Cloudflare API. Eliminates dashboard context-switching by allowing natural language control of domain management and infrastructure operations.
      -