bunny.net MCP by usefulapi
Inspect pull zones, storage, DNS and video libraries on bunny.net, and purge caches.
Should I use this
Quality & Safety
Findings (1)
- LOWin bunny_get_storage_zone_statistics
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"bunny-net": {
"url": "https://bunny-net.usefulapi.io/mcp"
}
}
}Remote endpoints
https://bunny-net.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (22)
🟢bunny_list_pull_zones(page, per_page, search, full)
List the CDN pull zones on the account. By default returns a compact view per zone (id, name, origin URL, enabled/suspended, hostnames, linked storage zone, bandwidth and charges this month); set full=true for every setting. bunny.net: GET /pullzone.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number, 1-based. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"per_page": {
"description": "Items per page, 5-1000. Default 1000.",
"type": "integer",
"minimum": 5,
"maximum": 1000
},
"search": {
"description": "Filter results by this search term.",
"type": "string"
},
"full": {
"description": "Return every pull zone setting instead of the compact view.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_pull_zone(pull_zone_id, include_certificate)
Fetch one pull zone with all its settings: origin, hostnames, caching, security, edge rules (with their GUIDs, needed by bunny_set_edge_rule_enabled), blocked IPs, limits and usage. Secrets (token-auth key, AWS signing secret, certificate private keys) are redacted. bunny.net: GET /pullzone/{id}.
Input Schema
{
"type": "object",
"properties": {
"pull_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Pull Zone ID."
},
"include_certificate": {
"description": "Include each hostname's public SSL certificate (private keys are always redacted).",
"type": "boolean"
}
},
"required": [
"pull_zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_list_storage_zones(page, per_page, search, include_deleted)
List the edge storage zones on the account: region, replication regions, storage used, file count, tier and connected pull zones. Storage passwords are redacted. bunny.net: GET /storagezone.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number, 1-based. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"per_page": {
"description": "Items per page, 5-1000. Default 1000.",
"type": "integer",
"minimum": 5,
"maximum": 1000
},
"search": {
"description": "Filter results by this search term.",
"type": "string"
},
"include_deleted": {
"description": "Also return deleted storage zones.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_storage_zone(storage_zone_id)
Fetch one edge storage zone: hostname, region, replication, storage used, files stored, 404 handling and connected pull zones. Storage passwords are redacted. bunny.net: GET /storagezone/{id}.
Input Schema
{
"type": "object",
"properties": {
"storage_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Storage Zone ID."
}
},
"required": [
"storage_zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_storage_zone_statistics(storage_zone_id, date_from, date_to)
Daily charts of storage used and file count for one storage zone. bunny.net: GET /storagezone/{id}/statistics.
Input Schema
{
"type": "object",
"properties": {
"storage_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Storage Zone ID."
},
"date_from": {
"description": "Start of the range, YYYY-MM-DD or ISO 8601. Omit both dates for the last 30 days.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?$"
},
"date_to": {
"description": "End of the range, YYYY-MM-DD or ISO 8601. Omit both dates for the last 30 days.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?$"
}
},
"required": [
"storage_zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_list_dns_zones(page, per_page, search)
List the DNS zones hosted on bunny.net, with nameserver detection, DNSSEC and logging status. bunny.net: GET /dnszone.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number, 1-based. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"per_page": {
"description": "Items per page, 5-1000. Default 1000.",
"type": "integer",
"minimum": 5,
"maximum": 1000
},
"search": {
"description": "Filter results by this search term.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_dns_zone(zone_id)
Fetch one DNS zone with its settings and records. bunny.net: GET /dnszone/{id}.
Input Schema
{
"type": "object",
"properties": {
"zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS Zone ID."
}
},
"required": [
"zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_list_dns_records(zone_id, type, page, per_page, search)
List the records in one DNS zone, optionally filtered by type or search term. Record Type comes back as bunny.net's integer code (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, 13=SVCB, 14=HTTPS, 15=TLSA). bunny.net: GET /dnszone/{zoneId}/records.
Input Schema
{
"type": "object",
"properties": {
"zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS Zone ID."
},
"type": {
"description": "Only records of this type.",
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"Redirect",
"Flatten",
"PullZone",
"SRV",
"CAA",
"PTR",
"Script",
"NS",
"SVCB",
"HTTPS",
"TLSA"
]
},
"page": {
"description": "Page number, 1-based. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"per_page": {
"description": "Items per page, 5-1000. Default 1000.",
"type": "integer",
"minimum": 5,
"maximum": 1000
},
"search": {
"description": "Filter results by this search term.",
"type": "string"
}
},
"required": [
"zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_export_dns_zone(zone_id)
Export one DNS zone as a BIND zone file (plain text) — handy for review, diffing or backup before a change. bunny.net: GET /dnszone/{id}/export.
Input Schema
{
"type": "object",
"properties": {
"zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS Zone ID."
}
},
"required": [
"zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_list_video_libraries(page, per_page, search)
List the Stream video libraries: video count, storage and traffic usage, linked pull/storage zones and player/encoding settings. Library API keys are redacted. bunny.net: GET /videolibrary.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number, 1-based. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"per_page": {
"description": "Items per page, 5-1000. Default 1000.",
"type": "integer",
"minimum": 5,
"maximum": 1000
},
"search": {
"description": "Filter results by this search term.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_video_library(library_id)
Fetch one Stream video library with its full configuration (resolutions, DRM, referrer rules, transcribing, watermark). Library API keys are redacted. bunny.net: GET /videolibrary/{id}.
Input Schema
{
"type": "object",
"properties": {
"library_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Video Library ID."
}
},
"required": [
"library_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_statistics(date_from, date_to, pull_zone_id, region_id, hourly, ...)
CDN traffic statistics for the account or one pull zone: total bandwidth, origin traffic, requests served, cache hit rate and average origin response time, plus optional charts (bandwidth, requests, origin traffic, response times, 3xx/4xx/5xx errors, geographic distribution). bunny.net: GET /statistics.
Input Schema
{
"type": "object",
"properties": {
"date_from": {
"description": "Start of the range, YYYY-MM-DD or ISO 8601. Omit both dates for the last 30 days.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?$"
},
"date_to": {
"description": "End of the range, YYYY-MM-DD or ISO 8601. Omit both dates for the last 30 days.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?$"
},
"pull_zone_id": {
"description": "Only this pull zone. Omit for the whole account.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"region_id": {
"description": "Only this edge region (see bunny_list_regions).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"hourly": {
"description": "Hourly instead of daily grouping.",
"type": "boolean"
},
"load_errors": {
"description": "Include the 3xx/4xx/5xx response charts.",
"type": "boolean"
},
"load_bandwidth_used": {
"description": "Include the bandwidth charts.",
"type": "boolean"
},
"load_requests_served": {
"description": "Include the requests-served chart.",
"type": "boolean"
},
"load_origin_traffic": {
"description": "Include the origin traffic chart.",
"type": "boolean"
},
"load_origin_response_times": {
"description": "Include the origin response time chart.",
"type": "boolean"
},
"load_geographic_traffic_distribution": {
"description": "Include traffic by country.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_list_regions
List bunny.net's edge regions with their IDs, codes, location and per-GB traffic price. A cheap way to confirm the API key works. bunny.net: GET /region.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_billing
The account balance, this month's charges broken down by product (traffic per continent, storage, DNS, Stream, scripting, Shield, ...) and recent billing records. Payment-method tokens are redacted. bunny.net: GET /billing.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢bunny_get_audit_log(date, limit, product, resource_type, resource_id, ...)
Who changed what on one day: the account audit log (timestamp, product, resource, action, actor and a diff). Paginate with continuation_token. bunny.net: GET /user/audit/{date}.
Input Schema
{
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The day to read, YYYY-MM-DD."
},
"limit": {
"description": "Max entries, 1-10000. Default 100.",
"type": "integer",
"minimum": 1,
"maximum": 10000
},
"product": {
"description": "Only these products.",
"type": "array",
"items": {
"type": "string"
}
},
"resource_type": {
"description": "Only these resource types.",
"type": "array",
"items": {
"type": "string"
}
},
"resource_id": {
"description": "Only these resource IDs.",
"type": "array",
"items": {
"type": "string"
}
},
"actor_id": {
"description": "Only changes by these actors.",
"type": "array",
"items": {
"type": "string"
}
},
"order": {
"description": "Sort by time.",
"type": "string",
"enum": [
"Ascending",
"Descending"
]
},
"continuation_token": {
"description": "ContinuationToken from the previous page.",
"type": "string"
}
},
"required": [
"date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_purge_pull_zone_cache(pull_zone_id, cache_tag)
WRITE. Purge the cached content of one pull zone — everything, or only files carrying a cache tag. Nothing is lost (the CDN refetches from the origin) but the origin takes the refill load. bunny.net: POST /pullzone/{id}/purgeCache.
Input Schema
{
"type": "object",
"properties": {
"pull_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Pull Zone ID."
},
"cache_tag": {
"description": "Only purge files with this cache tag.",
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"pull_zone_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_purge_url(url, async, exact_path)
WRITE. Purge one URL from the CDN cache. A URL ending in '/' purges everything under it unless exact_path is true; a '*' wildcard is also accepted. The CDN refetches from the origin. bunny.net: POST /purge.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^https?:\\/\\/\\S+$",
"description": "The CDN URL to purge, e.g. https://myzone.b-cdn.net/css/site.css."
},
"async": {
"description": "Return immediately instead of waiting for the purge to finish.",
"type": "boolean"
},
"exact_path": {
"description": "For a URL ending in '/', purge only that exact path.",
"type": "boolean"
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_add_dns_record(zone_id, type, name, value, ttl, ...)
WRITE. Add a record to a DNS zone. Takes effect on live DNS. bunny.net: PUT /dnszone/{zoneId}/records.
Input Schema
{
"type": "object",
"properties": {
"zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS Zone ID."
},
"type": {
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"Redirect",
"Flatten",
"PullZone",
"SRV",
"CAA",
"PTR",
"Script",
"NS",
"SVCB",
"HTTPS",
"TLSA"
],
"description": "Record type."
},
"name": {
"type": "string",
"maxLength": 255,
"description": "Record name relative to the zone; empty string for the apex, e.g. 'www'."
},
"value": {
"type": "string",
"maxLength": 4096,
"description": "Record value, e.g. an IP for A, a hostname for CNAME, text for TXT."
},
"ttl": {
"description": "TTL in seconds.",
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"priority": {
"description": "Priority (MX, SRV).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"weight": {
"description": "Weight (SRV, weighted records).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"port": {
"description": "Port (SRV).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"flags": {
"description": "Flags (CAA).",
"type": "integer",
"minimum": 0,
"maximum": 255
},
"tag": {
"description": "Tag (CAA), e.g. 'issue'.",
"type": "string",
"maxLength": 255
},
"pull_zone_id": {
"description": "Pull Zone ID, for type PullZone.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"accelerated": {
"description": "Route the record through the CDN (CDN acceleration).",
"type": "boolean"
},
"disabled": {
"description": "Keep the record but stop serving it.",
"type": "boolean"
},
"comment": {
"description": "Free-text note on the record.",
"type": "string",
"maxLength": 1024
}
},
"required": [
"zone_id",
"type",
"name",
"value"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_update_dns_record(zone_id, record_id, type, name, value, ...)
WRITE. Update an existing DNS record. Takes effect on live DNS. Read the record first with bunny_list_dns_records and pass its type, name and value along with any other fields you want to keep or change. bunny.net: POST /dnszone/{zoneId}/records/{id}.
Input Schema
{
"type": "object",
"properties": {
"zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS Zone ID."
},
"record_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The DNS record ID."
},
"type": {
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"Redirect",
"Flatten",
"PullZone",
"SRV",
"CAA",
"PTR",
"Script",
"NS",
"SVCB",
"HTTPS",
"TLSA"
],
"description": "Record type."
},
"name": {
"type": "string",
"maxLength": 255,
"description": "Record name relative to the zone; empty string for the apex, e.g. 'www'."
},
"value": {
"type": "string",
"maxLength": 4096,
"description": "Record value, e.g. an IP for A, a hostname for CNAME, text for TXT."
},
"ttl": {
"description": "TTL in seconds.",
"type": "integer",
"minimum": 0,
"maximum": 2147483647
},
"priority": {
"description": "Priority (MX, SRV).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"weight": {
"description": "Weight (SRV, weighted records).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"port": {
"description": "Port (SRV).",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"flags": {
"description": "Flags (CAA).",
"type": "integer",
"minimum": 0,
"maximum": 255
},
"tag": {
"description": "Tag (CAA), e.g. 'issue'.",
"type": "string",
"maxLength": 255
},
"pull_zone_id": {
"description": "Pull Zone ID, for type PullZone.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"accelerated": {
"description": "Route the record through the CDN (CDN acceleration).",
"type": "boolean"
},
"disabled": {
"description": "Keep the record but stop serving it.",
"type": "boolean"
},
"comment": {
"description": "Free-text note on the record.",
"type": "string",
"maxLength": 1024
}
},
"required": [
"zone_id",
"record_id",
"type",
"name",
"value"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_set_edge_rule_enabled(pull_zone_id, edge_rule_id, enabled)
WRITE. Turn one edge rule on a pull zone on or off (reversible — the rule is kept). Get the rule's GUID from bunny_get_pull_zone (EdgeRules[].Guid). bunny.net: POST /pullzone/{pullZoneId}/edgerules/{edgeRuleId}/setEdgeRuleEnabled.
Input Schema
{
"type": "object",
"properties": {
"pull_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Pull Zone ID."
},
"edge_rule_id": {
"type": "string",
"pattern": "^[A-Za-z0-9-]{1,64}$",
"description": "The edge rule's GUID."
},
"enabled": {
"type": "boolean",
"description": "true to enable, false to disable."
}
},
"required": [
"pull_zone_id",
"edge_rule_id",
"enabled"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_add_blocked_ip(pull_zone_id, ip)
WRITE. Block an IP address from a pull zone (undo with bunny_remove_blocked_ip). bunny.net: POST /pullzone/{id}/addBlockedIp.
Input Schema
{
"type": "object",
"properties": {
"pull_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Pull Zone ID."
},
"ip": {
"type": "string",
"pattern": "^[0-9A-Fa-f:.*\\/]{2,64}$",
"description": "The IP address, e.g. 203.0.113.7."
}
},
"required": [
"pull_zone_id",
"ip"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴bunny_remove_blocked_ip(pull_zone_id, ip)
WRITE. Remove an IP address from a pull zone's block list. bunny.net: POST /pullzone/{id}/removeBlockedIp.
Input Schema
{
"type": "object",
"properties": {
"pull_zone_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The Pull Zone ID."
},
"ip": {
"type": "string",
"pattern": "^[0-9A-Fa-f:.*\\/]{2,64}$",
"description": "The IP address, e.g. 203.0.113.7."
}
},
"required": [
"pull_zone_id",
"ip"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence