Porkbun Domain MCP Server
MCP server for Porkbun domain-management workflows.
Version: 0.2.1 Status: Internal Bodai integration component
Quick Links
Quality & CI
Crackerjack is the standard quality-control and CI/CD gate for Porkbun Domain MCP changes. Local verification should mirror the Crackerjack workflow used across the Bodai ecosystem.
Installation via Bodai Marketplace
This repository ships as a Bodai plugin. To install it through the marketplace, add the local bodai-plugins marketplace, then install porkbun-domain from it. The plugin manifest is .claude-plugin/plugin.json and the colocated .mcp.json points at the local HTTP server on port 3043. Once installed, the slash commands (/porkbun-domain-list, /porkbun-domain-pricing, /porkbun-domain-register) wrap the highest-frequency workflows and are available alongside the raw mcp__porkbun-domain__* tools. The server key is porkbun-domain (short form) — the directory keeps the long-form porkbun-domain-mcp name, but the manifest name, server key, and command namespace all share the short form per the bodai "one string, three places" rule.
Overview
Porkbun Domain MCP exposes domain-registration workflows through a FastMCP server. It is focused on account domain inventory, domain metadata, transfer authorization, renewal, and pricing operations while keeping provider credentials and request validation in a narrow integration boundary.
This server focuses on registration and lifecycle workflows (inventory, metadata, transfer authorization, renewal, pricing). Record-level DNS changes are out of scope.
Capabilities
Implemented tool surface:
- Domain inventory: list all domains in the configured Porkbun account
- Domain details: inspect status, TLD, registration date, expiration date, privacy, and auto-renew flags
- Transfer authorization: retrieve EPP authorization codes
- Renewal workflow: renew a domain for a selected number of years
- Pricing lookup: retrieve registration, renewal, and transfer pricing by TLD
- Credential health metadata: report whether API credentials are configured
- HTTP health routes:
/healthand/healthzfor MCP client and process supervision checks
Quick Start
Prerequisites
- Python 3.13+
- UV package manager
- Porkbun API key and secret key
Local Setup
git clone https://github.com/lesleslie/porkbun-domain-mcp.git
cd porkbun-domain-mcp
uv sync --group dev
Run With Credentials
export PORKBUN_DOMAIN_API_KEY="your-api-key"
export PORKBUN_DOMAIN_SECRET_KEY="your-secret-key"
uv run porkbun-domain-mcp start
uv run porkbun-domain-mcp health
The default HTTP bind is 127.0.0.1:3043.
CLI Commands
The CLI is built with mcp-common and provides the standard lifecycle command surface used by Bodai MCP servers.
uv run porkbun-domain-mcp start # Start the HTTP MCP server
uv run porkbun-domain-mcp stop # Stop the managed server process (requires pid_file wiring)
uv run porkbun-domain-mcp restart # Restart the managed server process (requires pid_file wiring)
uv run porkbun-domain-mcp status # Show process status (requires pid_file wiring)
uv run porkbun-domain-mcp health # Run the local health probe
Note (0.2.0):
stop,restart, andstatusrely onmcp-common'sMCPServerCLIFactorylifecycle, which requirespid_fileandlog_fileto be configured on the lifecycle settings class. The currentporkbun_domain_mcp.cli.PorkbunDomainSettingsdoes not define either field, so these commands may report "not configured" at runtime.startandhealthwork without the lifecycle wiring.
MCP Server Configuration
Claude / Codex Style Configuration
Add the server to an MCP client configuration:
{
"mcpServers": {
"porkbun-domain": {
"command": "uv",
"args": ["run", "porkbun-domain-mcp", "start"],
"cwd": "/Users/les/Projects/porkbun-domain-mcp",
"env": {
"PORKBUN_DOMAIN_API_KEY": "your-api-key",
"PORKBUN_DOMAIN_SECRET_KEY": "your-secret-key"
}
}
}
}
Use your secret manager for live credentials rather than committing them to client config.
Health Checks
curl http://127.0.0.1:3043/health
curl http://127.0.0.1:3043/healthz
Tool Reference
| Tool | Purpose | Required Inputs |
|---|---|---|
list_domains |
List domains in the Porkbun account | none |
get_domain_info |
Retrieve domain metadata | domain |
get_auth_code |
Retrieve transfer authorization code | domain |
renew_domain |
Renew a domain registration | domain |
get_pricing |
Retrieve TLD pricing | none |
Tool responses follow a consistent ToolResponse shape:
{
"success": true,
"message": "Found 12 domains in your account",
"data": {},
"error": null,
"next_steps": []
}
Configuration
Committed defaults live in settings/porkbun-domain.yaml. Runtime overrides should come from environment variables or a local .env file that is not committed.
| Setting | Environment Variable | Default |
|---|---|---|
| API key | PORKBUN_DOMAIN_API_KEY |
empty |
| Secret key | PORKBUN_DOMAIN_SECRET_KEY |
empty |
| Base URL | PORKBUN_DOMAIN_BASE_URL |
https://porkbun.com/api/json/v3 |
| Timeout | PORKBUN_DOMAIN_TIMEOUT |
30.0 |
| Max retries | PORKBUN_DOMAIN_MAX_RETRIES |
3 |
| HTTP host | PORKBUN_DOMAIN_HTTP_HOST |
127.0.0.1 |
| HTTP port | PORKBUN_DOMAIN_HTTP_PORT |
3043 |
| Log level | PORKBUN_DOMAIN_LOG_LEVEL |
INFO |
| JSON logs | PORKBUN_DOMAIN_LOG_JSON |
true |
Notes (0.2.0):
- The
porkbun_domain_mcp.config.PorkbunDomainSettingsmodel is configured withenv_prefix="PORKBUN_DOMAIN_"and uses field names such aslog_json,log_level,http_host,timeout, andmax_retries. With pydantic-settings defaults, all 9 single-word env vars above bind via the standardUPPER_SNAKE_CASEderivation (e.g.api_key→PORKBUN_DOMAIN_API_KEY). Multi-word fields likelog_json,log_level, andhttp_hostuse the literalPORKBUN_DOMAIN_LOG_JSON,PORKBUN_DOMAIN_LOG_LEVEL, andPORKBUN_DOMAIN_HTTP_HOSTnames listed in the table.PORKBUN_DOMAIN_HTTP_HOSTis now read byporkbun_domain_mcp.cli.start_server_handlerand passed touvicorn.run(host=...). Override the bind address viaPORKBUN_DOMAIN_HTTP_HOSTorsettings/local.yaml(gitignored).
Project Structure
porkbun_domain_mcp/
cli.py # mcp-common lifecycle CLI
client.py # Porkbun domain API client boundary
config.py # Pydantic settings and logging
models.py # Typed domain and pricing models
server.py # FastMCP application factory
tools/domain_tools.py # Registered MCP tools
settings/
porkbun-domain.yaml # Committed defaults
tests/
Development
uv sync --group dev
uv run pytest
uv run ruff check porkbun_domain_mcp tests
uv run ruff format porkbun_domain_mcp tests
Use targeted tests when isolating domain workflows:
uv run pytest tests -k domain -v
Note (0.2.1):
tests/contains 32 tests intests/unit/test_tool_profile.pyplus atests/test_version_sync.pyguard for the package User-Agent / version stamp. The 0.2.0 release dropped--cov-fail-underwhile the test suite was being filled in; restore a coverage floor once the suite stabilizes.
Security Notes
- Do not commit Porkbun API keys, secret keys, billing-sensitive information, transfer authorization codes, or real account exports.
- Treat
get_auth_codeandrenew_domainas privileged tools. - Review generated transfer and renewal calls before exposing them to unattended agent workflows.
- Scrub real domain details from fixtures, screenshots, and troubleshooting logs.
Metadata
Release files for porkbun-domain-mcp 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| porkbun_domain_mcp-0.4.1.tar.gz | 257.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| porkbun_domain_mcp-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 282.3 kB
Release files / porkbun_domain_mcp-0.4.1.tar.gz
| Download URL | porkbun_domain_mcp-0.4.1.tar.gz |
|---|---|
| Size | 257.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e2e91ed8ae5824bc995410528f655cb86f446de1efef3e9e1c8b123745741e27
|
|
BLAKE2b-256 checksum How to use checksums |
613171f0ca246070386541467d2ee2af6bc6fc28eff6d6800071fca2753b9ad6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / porkbun_domain_mcp-0.4.1-py3-none-any.whl
| Download URL | porkbun_domain_mcp-0.4.1-py3-none-any.whl |
|---|---|
| Size | 24.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
009bad033160b1a75f57f82671f64a192002d582064c4150cc0e3a8411abb816
|
|
BLAKE2b-256 checksum How to use checksums |
787e37384ec029d625c89a76192b5bbac80829c38f512e614919a9b291afff04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|