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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file porkbun_domain_mcp-0.3.0.tar.gz.
File metadata
- Download URL: porkbun_domain_mcp-0.3.0.tar.gz
- Upload date:
- Size: 306.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1bc11ad3839a05722c1b66445fd21d27984534110755654027935f8de64795a
|
|
| MD5 |
a53d6741ddd18fa075f21dd035317408
|
|
| BLAKE2b-256 |
9e4012353b461a121a187f87873de9e877eaa26e215e7fe2b48cc633e4217ccc
|
File details
Details for the file porkbun_domain_mcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: porkbun_domain_mcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 24.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38048cf71aa2a28765ea760a04aef76fc0fde536bbcd81d48c0e8ef1b06f59c9
|
|
| MD5 |
1b649a5f3342ce3ea06cfb0bfe77efbc
|
|
| BLAKE2b-256 |
6e0fff030d9b7ae4b6d46b88d9f6640497c613995cc2539159e9357923128d51
|