Skip to main content
Glama

porkbun-mcp

MCP server for the Porkbun DNS API.

Manage DNS records, domains, DNSSEC, SSL certificates, and more via the Model Context Protocol.

CI codecov PyPI version Python 3.13+ License: MIT

Configuration

Set your Porkbun API credentials as environment variables:

export PORKBUN_API_KEY="pk1_..."
export PORKBUN_SECRET_KEY="sk1_..."

Get your API keys from the Porkbun API Access page.

Related MCP server: porkbun-mcp-server

Read-Only Mode (Default)

By default, porkbun-mcp runs in read-only mode for safety. Write operations (create, edit, delete) will return an error until explicitly enabled.

Enabling Write Operations

To let the pig get muddy and make changes:

Environment variable:

export PORKBUN_GET_MUDDY=true

CLI flag:

uvx porkbun-mcp --get-muddy

Usage

Run directly with uvx (no installation required):

uvx porkbun-mcp

SSE transport

uvx porkbun-mcp --transport sse

MCP Client Configuration

Claude Desktop

Add to ~/.config/claude/claude_desktop_config.json:

{
  "mcpServers": {
    "porkbun": {
      "command": "uvx",
      "args": ["porkbun-mcp", "--get-muddy"],
      "env": {
        "PORKBUN_API_KEY": "pk1_...",
        "PORKBUN_SECRET_KEY": "sk1_..."
      }
    }
  }
}

Note: Remove --get-muddy from args for read-only mode (recommended for safety).

Claude Code / Codex

Add to ~/.claude/settings.json:

{
  "mcpServers": {
    "porkbun": {
      "command": "uvx",
      "args": ["porkbun-mcp", "--get-muddy"],
      "env": {
        "PORKBUN_API_KEY": "pk1_...",
        "PORKBUN_SECRET_KEY": "sk1_..."
      }
    }
  }
}

VS Code

Add to .vscode/mcp.json in your workspace (or use MCP: Add Server command):

{
  "servers": {
    "porkbun": {
      "command": "uvx",
      "args": ["porkbun-mcp", "--get-muddy"],
      "env": {
        "PORKBUN_API_KEY": "pk1_...",
        "PORKBUN_SECRET_KEY": "sk1_..."
      }
    }
  }
}

OpenCode

Add to your opencode.json configuration:

{
  "mcp": {
    "porkbun": {
      "type": "local",
      "command": ["uvx", "porkbun-mcp", "--get-muddy"],
      "environment": {
        "PORKBUN_API_KEY": "pk1_...",
        "PORKBUN_SECRET_KEY": "sk1_..."
      }
    }
  }
}

Available Tools

DNS

  • dns_list - List all DNS records for a domain

  • dns_get - Get a specific DNS record by ID

  • dns_get_by_name_type - Get DNS records by subdomain and type

  • dns_create - Create a new DNS record

  • dns_edit - Edit a DNS record by ID

  • dns_edit_by_name_type - Edit DNS records by subdomain and type

  • dns_delete - Delete a DNS record by ID

  • dns_delete_by_name_type - Delete DNS records by subdomain and type

Domains

  • domains_list - List all domains in your account

  • domains_get_nameservers - Get nameservers for a domain

  • domains_update_nameservers - Update nameservers for a domain

  • domains_get_url_forwards - Get URL forwarding rules

  • domains_add_url_forward - Add a URL forwarding rule

  • domains_delete_url_forward - Delete a URL forwarding rule

  • domains_check_availability - Check domain availability and pricing

  • domains_get_glue_records - Get glue records for a domain

DNSSEC

  • dnssec_list - List DNSSEC records for a domain

  • dnssec_create - Create a DNSSEC record

  • dnssec_delete - Delete a DNSSEC record

SSL

  • ssl_retrieve - Retrieve the SSL certificate bundle for a domain

Pricing

  • pricing_get - Get pricing for all available TLDs

Utility

  • ping - Test API connectivity and get your public IP

Prompts

Pre-defined workflows to guide common DNS operations:

  • dns_setup - Set up basic DNS for a new server (root A + www records)

  • dns_audit - Audit DNS configuration for issues (duplicates, missing email records, low TTLs)

  • email_dns_setup - Configure email DNS (MX, SPF, DKIM, DMARC)

  • update_server_ip - Update DNS records when migrating to a new server IP

  • subdomain_setup - Create A/CNAME records for a new subdomain

Development

# Install dependencies
uv sync --dev

# Run all checks
make check

# Individual commands
make lint       # ruff check
make format     # ruff format
make typecheck  # ty check
make test       # pytest with coverage

License

MIT

Available Tools

25 tools
dns_createA

Create a new DNS record.

Inputs: domain (required), content (required), record_type (required), ttl, +2 more. Returns: Result of creating a DNS record.

dns_deleteB
Destructive

Delete a DNS record by ID.

Inputs: domain (required), record_id (required). Returns: Result of deleting a DNS record.

dns_delete_by_name_typeA
Destructive

Delete DNS records by subdomain and type.

Inputs: domain (required), record_type (required), subdomain. Returns: Result of deleting a DNS record.

dns_editA
Idempotent

Edit a DNS record by ID.

Inputs: domain (required), content (required), record_id (required), record_type (required), +3 more. Returns: Result of creating a DNS record.

dns_edit_by_name_typeB
Idempotent

Edit all DNS records matching subdomain and type.

Inputs: domain (required), content (required), record_type (required), ttl, +3 more. Returns: Result of deleting a DNS record.

dns_getA
Read-only

Get a specific DNS record by ID.

Inputs: domain (required), record_id (required). Returns: A DNS record.

dns_get_by_name_typeB
Read-only

Get DNS records by subdomain and type.

Inputs: domain (required), record_type (required), subdomain. Returns: result

dns_listA
Read-only

List all DNS records for a domain.

Inputs: domain (required). Returns: result

dnssec_createC

Create a DNSSEC record.

Inputs: digest (required), domain (required), key_tag (required), algorithm (required), +1 more. Returns: A DNSSEC record.

dnssec_deleteB
Destructive

Delete a DNSSEC record.

Inputs: domain (required), key_tag (required). Returns: Result of deleting a DNS record.

dnssec_listA
Read-only

List DNSSEC records for a domain.

Inputs: domain (required). Returns: result

domains_add_url_forwardB

Add a URL forwarding rule.

Inputs: domain (required), location (required), wildcard, subdomain, +2 more. Returns: Result of URL forward operations.

domains_check_availabilityA
Read-only

Check domain availability and pricing.

WARNING: Heavily rate-limited (1 request per 10 seconds). For price comparisons, use pricing_get first (no rate limits). Only use this tool when you need to confirm a specific domain is available.

Inputs: domain (required). Returns: Domain availability check result.

domains_create_glue_recordA

Create a glue record for self-hosted nameservers.

Inputs: ips (required), domain (required), subdomain (required). Returns: Result of glue record operations.

domains_delete_glue_recordB
Destructive

Delete a glue record.

Inputs: domain (required), subdomain (required). Returns: Result of glue record operations.

domains_delete_url_forwardA
Destructive

Delete a URL forwarding rule.

Inputs: domain (required), forward_id (required). Returns: Result of URL forward operations.

domains_get_glue_recordsA
Read-only

Get glue records for a domain.

Inputs: domain (required). Returns: result

domains_get_nameserversB
Read-only

Get nameservers for a domain.

Inputs: domain (required). Returns: Nameservers for a domain.

domains_get_url_forwardsA
Read-only

Get URL forwarding rules for a domain.

Inputs: domain (required). Returns: result

domains_listA
Read-only

List all domains in your Porkbun account.

Inputs: no named parameters. Returns: result

domains_update_glue_recordA
Idempotent

Update a glue record's IP addresses.

Inputs: ips (required), domain (required), subdomain (required). Returns: Result of glue record operations.

domains_update_nameserversB
Idempotent

Update nameservers for a domain.

Inputs: domain (required), nameservers (required). Returns: Nameservers for a domain.

pingA
Read-only

Test API connectivity and get your public IP address.

Inputs: no named parameters. Returns: Result of the ping operation.

pricing_getA
Read-only

Get pricing for all available TLDs.

PREFERRED for price lookups - no rate limits, returns all TLD prices at once. Use this FIRST when users ask about domain costs, then filter by TLD. Only use domains_check_availability when you need to verify a specific domain is actually available for purchase.

Inputs: no named parameters. Returns: result

ssl_retrieveA
Read-only

Retrieve the SSL certificate bundle for a domain.

Only available for domains using Porkbun nameservers.

Inputs: domain (required). Returns: SSL certificate bundle.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 25 tools

    Disambiguation4/5

    Most tools are clearly separated by resource and action, but the pairs dns_get vs dns_get_by_name_type and dns_edit vs dns_edit_by_name_type could be confused if descriptions aren't read carefully. Overall, each tool has a distinct purpose, with only a few closely related variants.

    Naming Consistency4/5

    Tool names follow a consistent resource_verb pattern, e.g., dns_list, dns_create, domains_update_nameservers. However, there are minor inconsistencies: 'add' vs 'create', 'retrieve' vs 'get', and pluralization differences like url_forwards vs url_forward, which slightly reduce strict uniformity.

    Tool Count3/5

    With 25 tools, this is at the high end of the acceptable range. The count is justified by the broad scope (DNS, domains, DNSSEC, SSL, pricing), but it feels heavy and could be streamlined by consolidating some by-ID and by-name-type variants.

    Completeness4/5

    The tool set covers core DNS CRUD, domain management (nameservers, URL forwards, glue records), DNSSEC, SSL retrieval, and pricing. Minor gaps exist, such as domain purchase or transfer operations, but the tool surface is quite complete for typical domain management workflows.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers