bunnycdn-mcp
This MCP server lets you manage Bunny.net infrastructure — CDN, DNS, storage, video, edge scripts, security, and containers — through 70 tools, with read-only mode on by default and credential-safe responses.
Account & Billing: Get account details, billing summary, CDN statistics, and search across all resources.
CDN / Pull Zones: List, create, update, delete, purge caches, purge URLs, manage custom hostnames and edge rules.
DNS: List, create, update, delete zones; manage DNS records; view DNS statistics.
Storage: List, create, get storage zones; retrieve statistics; list/download/delete files (requires storage key).
Video Streaming: Manage video libraries, videos (list, get, create, update, delete, re-encode), collections, and view statistics/heatmaps.
Edge Scripts: List, get, write/publish script code; create/update/delete scripts; manage environment variables and secrets.
Security / Shield/WAF: List/get shield zones, manage WAF custom rules, rate limit rules, bot detection settings, and view security metrics.
Magic Containers: List/get/manage applications, deploy/undeploy/restart, list registries and regions, view app stats.
Diagnostics: Get origin error logs to debug 502/504 failures.
Safety: Write tools are withheld unless BUNNY_READONLY=0; sensitive fields like keys and certificates are stripped from responses.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bunnycdn-mcp purge the cache for all my pull zones"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 | Design & build sites inside Elementor — the recipes, and the MCP engine under them | |
🔎 Audit + Content | REST content ops, SEO & site audits | |
🖥 Host | Provision & operate the infrastructure | |
🚀 Deliver | CDN, storage & edge delivery | |
🛡 Govern | 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 |
|
|
|
|
|
|
|
|
|
|
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 elseErrors 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 10sA 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 elseMore 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-0600file and the server reads the key at spawn, so no MCP client config ever holds the value.BUNNY_API_KEYstill works and wins when both are set.BUNNY_READONLYstays 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 |
| Get account details and balance | bunny.net API | read |
| Get billing summary with charges | bunny.net API | read |
| Get CDN statistics (bandwidth, requests, cache hit rate) | bunny.net API | read |
| Search across all resources | bunny.net API | read |
| Purge a URL from CDN cache | bunny.net API | write |
| List CDN edge regions | bunny.net API | read |
| List countries for geo-blocking | bunny.net API | read |
| List pull zones with search and pagination | bunny.net API | read |
| Get pull zone details | bunny.net API | read |
| Create a pull zone | bunny.net API | write |
| Update pull zone settings | bunny.net API | write |
| Delete a pull zone | bunny.net API | write |
| Purge entire pull zone cache | bunny.net API | write |
| Add or remove custom hostnames | bunny.net API | write |
| Add, update, delete, or toggle edge rules | bunny.net API | write |
| List DNS zones | bunny.net API | read |
| Get DNS zone with all records | bunny.net API | read |
| Create a DNS zone | bunny.net API | write |
| Update DNS zone settings | bunny.net API | write |
| Delete a DNS zone | bunny.net API | write |
| Add, update, or delete DNS records | bunny.net API | write |
| Get DNS query statistics | bunny.net API | read |
| List storage zones | bunny.net API | read |
| Get storage zone details | bunny.net API | read |
| Create a storage zone | bunny.net API | write |
| Get storage zone usage statistics | bunny.net API | read |
| List files and directories | Storage API | read |
| Download file content | Storage API | read |
| Delete a file or directory | Storage API | write |
| List video libraries | bunny.net API | read |
| Get library details | bunny.net API | read |
| Create a video library | bunny.net API | write |
| Update library settings | bunny.net API | write |
| List videos with search and pagination | Stream API | read |
| Get video details | Stream API | read |
| Create video object, optionally fetch from URL | Stream API | write |
| Update video metadata | Stream API | write |
| Delete a video | Stream API | write |
| Get view statistics | Stream API | read |
| Get attention heatmap data | Stream API | read |
| Re-encode a video | Stream API | write |
| List video collections | Stream API | read |
| Get collection details | Stream API | read |
| Create, update, or delete collections | Stream API | write |
| List edge scripts | bunny.net API | read |
| Get script details | bunny.net API | read |
| Get script source code | bunny.net API | read |
| Upload script code (saved as draft) | bunny.net API | write |
| Create, update, or delete scripts | bunny.net API | write |
| Publish a release to edge servers | bunny.net API | write |
| List a script's environment variable names | bunny.net API | read |
| Manage environment variables and secrets | bunny.net API | write |
| List shield security zones | bunny.net API | read |
| Get zone by shield zone ID or pull zone ID | bunny.net API | read |
| Get WAF rules and profiles | bunny.net API | read |
| Create, update, or delete custom WAF rules | bunny.net API | write |
| List rate limiting rules | bunny.net API | read |
| Create, update, or delete rate limit rules | bunny.net API | write |
| Get security metrics overview | bunny.net API | read |
| Read bot detection settings | bunny.net API | read |
| Get or update bot detection settings | bunny.net API | write |
| List Magic Container applications | bunny.net API | read |
| Get application details | bunny.net API | read |
| Get app overview with real-time metrics | bunny.net API | read |
| Create, update, or delete applications | bunny.net API | write |
| Deploy, undeploy, or restart applications | bunny.net API | write |
| List container registries | bunny.net API | read |
| List deployment regions | bunny.net API | read |
| Get application statistics | bunny.net API | read |
| 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-mcpOr 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-mcpOr 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-mcpSee the full list of MCP clients.
Optional environment variables
Variable | Description |
| Video library API key — enables Stream video and collection tools |
| Storage zone password — enables Storage file tools |
| Storage region code (default: empty for Falkenstein) |
| 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.jsHow 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_KEYStream tools (11 tools) — registered when
BUNNY_STREAM_KEYis setStorage file tools (3 tools) — registered when
BUNNY_STORAGE_KEYis 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 toolsbunny_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_zoneADestructiveIdempotent
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_zoneADestructiveIdempotent
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_accountARead-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_summaryARead-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_detectionAIdempotent
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_statisticsARead-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_zoneARead-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_scriptARead-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_codeARead-onlyIdempotent
Retrieve the JavaScript source code of an edge script.
Inputs: id (required).
bunny_get_mc_appBRead-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_overviewARead-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_statisticsARead-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_errorsARead-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_zoneARead-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_metricsARead-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_zoneARead-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_statisticsARead-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_zoneARead-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_statisticsARead-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_libraryARead-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_rulesARead-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_global_searchARead-onlyIdempotent
Search across all bunny.net resources by keyword. Returns matching pull zones, DNS zones, storage zones, video libraries, and edge scripts. Use this to find a resource when you only know part of its name.
Inputs: query (required).
bunny_list_countriesARead-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_zonesARead-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_scriptsARead-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_appsARead-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_regionsARead-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_registriesARead-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_zonesARead-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_rulesARead-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_regionsARead-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_zonesARead-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_zonesARead-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_librariesARead-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_recordADestructive
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_rulesADestructive
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_scriptADestructive
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_variablesADestructive
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_appADestructive
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_ruleADestructive
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_ruleADestructive
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_lifecycleAIdempotent
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_scriptAIdempotent
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_cacheAIdempotent
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_urlAIdempotent
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_codeAIdempotent
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_zoneBIdempotent
Update DNS zone settings. Common fields (PascalCase): CustomNameserversEnabled, Nameserver1, Nameserver2, SoaEmail, LoggingEnabled, LoggingIPAnonymizationEnabled.
Inputs: id (required), settings (required).
bunny_update_pull_zoneAIdempotent
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_libraryAIdempotent
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
Scored across 54 tools
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.
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.
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.
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
Related MCP Connectors
Enables AI assistants to retrieve event data and execute event management operations in Nunify.
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
Image and video AI tools and your own pipelines, run from any AI assistant.
Manage VeriTeknik servers, DNS, backups and support tickets from your AI assistant.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.132MIT
- FlicenseNot gradedqualityDmaintenanceEnables 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.-
- AlicenseBqualityDmaintenanceEnables interaction with Bunny.net APIs for Stream/Video, Storage, CDN Pull Zones, and DNS services. Provides 35 tools for managing video libraries, files, CDN configurations, and DNS records through Claude.37ISC
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Cloudflare DNS zones and records, including listing, creating, updating, and deleting DNS records through natural language.6MIT