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

A
Description quality
97%
Schema completeness
91%
Naming quality
79%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'bunny_get_storage_zone_statistics' name length outside 3-30 rangein bunny_get_storage_zone_statistics

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,983Tokens (tool definitions)
~1.6 KBTypical response size
Significant attention impact (3.89% of 128k context)

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-http

What it can do

Tool inventory

Tools (22)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded22 tools
verifiedversion not recorded22 tools