Porkbun (official) vs Portkey Admin MCP

A side-by-side look at the Porkbun (official) and Portkey Admin MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Porkbun (official) logoPorkbun (official)Cloud Platforms · Local subprocess (stdio)Official Porkbun MCP server: domains, DNS, SSL, hosting and Cloudflare via the Porkbun API.68GreatAuth: oauth 2.0Portkey Admin MCP logoPortkey Admin MCPCloud Platforms · Local subprocess (stdio)MCP server for the Portkey AI Gateway Admin API — 150 tools for prompts, configs, analytics, keys, guardrails, integrations, and more.65GreatAuth: api key required

Verdict: choose Porkbun (official) for cloud platforms work as a local process; choose Portkey Admin MCP for cloud platforms as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Porkbun (official) logoChoose Porkbun (official) when

  • You need dedicated capabilities in the Cloud Platforms domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: OAuth 2.0.
  • You want tools like ping, check_domain, check_domains.
Explore Porkbun (official)

Portkey Admin MCP logoChoose Portkey Admin MCP when

  • You need dedicated capabilities in the Cloud Platforms domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: API key required.
  • You have the keys it needs: PORTKEY_API_KEY, PORTKEY_TOOL_DOMAINS.
  • You want tools like list_all_users, invite_user, get_user_stats.
Explore Portkey Admin MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecPorkbun (official) logoPorkbun (official)Portkey Admin MCP logoPortkey Admin MCP
CategoryCloud PlatformsCloud Platforms
Quality signal68/100 · Great65/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthOAuth 2.0API key required
PricingNot declaredBYOK (pay the provider)
Required env varsNone listedPORTKEY_API_KEYPORTKEY_TOOL_DOMAINS
Verified ownerCommunity listingCommunity listing
GitHub stars336
Directory activity 0 views 0 installs 0 upvotes 3 views 0 installs 0 upvotes
Tools120181

Tools & capabilities

Porkbun (official) tools 120

  • pingVerify the Porkbun API connection and credentials. Returns the caller's public IP, whether the API key is valid, `account` (the username of the Porkbun account the key belongs to), and `scopes`: what the key may do (`["full"]`, or a list such as `read`, `dns`, `domains`, `email`, `hosting`, `purchase`, `funding`, `account`). A call outside the key's scopes fails with `INSUFFICIENT_SCOPE` and changes nothing; tell the user rather than retrying, since only they can widen the key's permissions. Use this as a first sanity check before making other calls, and to confirm you are in the account the user means (a domain in another account comes back as `DOMAIN_NOT_FOUND`, which also names the account).
  • check_domainCheck whether a single domain is available for registration and what it costs. Returns availability (`avail: yes|no`), registration price, renewal price, transfer price, and (for premium domains) extended pricing details. Pricing is in USD. An internationalized name (IDN) also returns `idnLanguages`, the languages its registry accepts; `register_domain` needs one of them as `idn_language`. For a domain already in the user's account the result has `inYourAccount: true`: the top-level `price` is still the registration price, and the renewal price is `additional.renewal.price` (use that, or a `renew_domain` dry run, before renewing). For a domain registered to someone else it adds `aftermarketSearch`: the name may be for sale, so call `search_aftermarket` before telling the user it is unavailable. Use this BEFORE register_domain to confirm cost — Porkbun rejects registrations whose `cost_cents` doesn't match the current quote. **Checking more than one name? Use `check_domains` instead** — it takes up to 25 in a single call and draws on a separate, more generous budget (200 domains/minute against 10 checks/10s here), because Porkbun chunks checks per registry and a batch costs less than the same names one at a time.
  • check_domainsCheck up to 25 domains for availability and price in ONE call. Prefer this over calling `check_domain` in a loop whenever you have more than one name: Porkbun chunks availability checks per registry, so a batch is materially less work than the same names individually, and it draws on a separate budget of 200 domains per 60 seconds (counted per domain, not per call) rather than the single check's 10 per 10 seconds. **Read all three result lists — they mean different things.** `domains` is keyed by domain name and each value has the same shape as `check_domain`'s response. `invalid` holds entries that are not checkable at all (not a domain, unsupported TLD); one bad entry does NOT fail the call, so the other names still come back answered. `unresolved` holds domains the registry did not answer for — these are **neither available nor taken**, and reporting them as unavailable would be wrong. Retry those. Duplicates are removed before the budget is charged. More than 25 names returns BULK_CHECK_TOO_MANY and checks nothing, rather than silently truncating, so split longer lists yourself. Synchronous, no polling — 25 mixed TLDs answers in roughly three seconds. One exception to watch: a few registries accept only a few domains per command and .de accepts exactly one, so a batch heavy in those TLDs returns BULK_CHECK_TOO_SLOW without checking anything. Group .de names into their own small calls. RATE_LIMIT_EXCEEDED with `reason: SUSTAINED_BULK_CHECKING` means the account has been checking at scanning volume (hundreds of names an hour, few registrations) and is held to 50 names per 5 minutes for a day. Do not retry in a loop: check only names the user might actually buy, wait `retryAfter`, or tell the user support can raise the limit for a legitimate high-volume use.
  • get_registration_requirementsGet a TLD's registration requirements as JSON Schema. Returns whether the TLD is registerable via the API (`apiRegisterable`), the `register_domain` request body as a JSON Schema (with the fixed term, cost, agreeToTerms), WHOIS-privacy / validated-address / registrant-only flags, and — for TLDs with registry eligibility rules (e.g. .us nexus, .ca legal type) — a second schema (`registryRequirements`) listing those fields with allowed values and labels. Call this BEFORE register_domain to confirm a TLD can be registered and to build a valid payload, instead of discovering requirements from a failed registration.
  • get_pricingGet current Porkbun pricing: registration, renewal and transfer prices per TLD in USD. No authentication required. **Pass `tlds` whenever you know which TLDs matter** (e.g. `["com", "io"]`): without it the response lists every TLD Porkbun sells, around 900 of them. Case, a leading dot and IDN form are handled. A TLD Porkbun does not sell comes back in `unsupported` instead of being priced, and if none of them are sold the call fails with INVALID_TLD. Standard pricing only: premium names have their own per-domain price, reported by check_domain.
  • list_marketplaceBrowse domains for sale on Porkbun Marketplace: names other Porkbun customers listed themselves, not new registrations. This is ONE aftermarket source; to find whether a taken name is for sale anywhere (Afternic, Sedo, Atom, NameBright, DAX and Porkbun Marketplace together), use `search_aftermarket`. Returns each listing's domain, TLD, SLD length, price (in USD), and listing date. Filters (all optional, server-side, mirroring the porkbun.com/marketplace UI): - `query`: SLD substring match. Multi-word queries: prefix a word with `-` to exclude it (e.g. `"ai -test"` matches SLDs containing 'ai' but not 'test'). - `tlds`: limit to a list of TLDs (without the leading dot). - `sld_length_min`, `sld_length_max`: SLD character length bounds. - `sort_name`: `domain` | `tld` | `price` | `sld_length`. - `sort_direction`: `asc` | `desc`. When any filter is set, server returns up to 1000 matching listings. With no filters, supports raw pagination via `start` / `limit` (max 5000).
  • list_domainsList domains in the authenticated Porkbun account. Returns one page (up to 1000) with metadata: expire date, auto-renew, security lock, WHOIS privacy, API access opt-in, and notLocal flag. Filters (all optional): - `domain`: exact match. Returns 0 or 1. - `name_contains`: substring search on domain name. - `tlds`: limit to these TLDs (no leading dot). - `expiring_within_days`: only domains expiring within N days. Useful for renewal automation. - `auto_renew`: 'yes' or 'no'. - `api_access`: 'yes' or 'no'. Filter to domains an API key can actually operate on — eliminates `API_ACCESS_DISABLED` errors downstream. - `sort_name`: 'domain' | 'tld' | 'create_date' | 'expire_date'. Default expire_date. - `sort_direction`: 'asc' | 'desc'. Default asc. For a single domain by name, use `get_domain` instead — cleaner shape and 404-on-not-found semantics.
  • get_domainGet the metadata for a single domain in the authenticated account: status, TLD, create date, expire date, security lock, WHOIS privacy, auto-renew, API access opt-in, and (optionally) labels. Returns an error with code `DOMAIN_NOT_FOUND` if the domain isn't in the account; the error's `account` field names the account the key belongs to, so a domain in a different account is easy to tell from a missing one.
  • get_balanceGet the available account credit balance for the authenticated Porkbun account. Returns the balance in cents (integer) and a human-readable display string (e.g. `$12.34`). Call it before offering to buy anything: a purchase is paid from this prepaid balance, not charged to a card, so this number decides whether a registration, renewal or transfer goes through as-is. If it is short and the account has a saved card, `top_up_account_credit` adds credit in one call (ask the user first, with the amount); `get_auto_topup` reports whether a card is on file. Without a card, or if you do not charge cards on a user's behalf, the user adds credit with **buy account credit** at https://porkbun.com/account/credit.
  • get_auto_topupRead the account's auto top-up configuration: whether it is on, the balance threshold that triggers it, the amount added, whether a payment method is actually on file, and `effectiveAmount` — what `top_up_account_credit` would charge right now. If `paymentMethodOnFile` is false the settings are inert: nothing can be charged and auto top-up will never fire, and a card can only be saved on porkbun.com, never through the API.
  • top_up_with_usdcAdd account credit by paying USDC on Base, through a Coinbase checkout. Use it to add credit when a purchase failed with INSUFFICIENT_FUNDS and there is no saved card (or the user would rather pay in crypto); to pay for just that one purchase, retry it with `pay_with_usdc: true` instead. Nothing is charged by this call; it returns two ways to pay: - `x402Url`: if you have a crypto wallet tool that can pay x402 URLs (for example Coinbase's Agentic Wallet or Wallet MCP, "make an x402 request"), pay it with that, with the user's OK and the dollar amount. It is a gasless USDC transfer on Base. - `payUrl`: a Coinbase page for the user to pay themselves. Credit lands when the payment confirms (usually within a minute), less Coinbase's fee of about 1% (`estimatedCredit_cents` in the response); check with `get_usdc_topup_status` and then retry the purchase. `amount_cents` is integer US cents, $1 to $500. To cover an INSUFFICIENT_FUNDS shortfall exactly (a $2.50 domain, say), use that error's `usdcAmountToCover`, which allows for the fee. Payments are on-chain and cannot be reversed. Not available on sandbox keys (use `sandbox_topup`). Fails with CRYPTO_NOT_AVAILABLE for accounts that cannot use crypto (bank-transfer-only accounts); they add credit on porkbun.com instead. Credit added over the API counts toward the account's monthly top-up limit ($100 a month unless the account holder set their own; TOPUP_LIMIT_EXCEEDED), and unpaid checkouts from the last day count as if paid. Guide: https://porkbun.com/llms/guides/pay-with-usdc-x402
  • top_up_with_card_mppGet a payment link that adds account credit when paid with the user's CARD over MPP (Machine Payments Protocol), using a Stripe Shared Payment Token from their agent wallet (Stripe's Link Agent Wallet). Use it to add credit when a purchase failed with INSUFFICIENT_FUNDS and no card is saved at Porkbun; to pay for just that one purchase, retry it with `pay_with_card: true` instead, which only charges if the purchase succeeds. Nothing is charged by this call. Pay the returned `payUrl` with an MPP-capable wallet tool, for example Stripe's Link CLI or its MCP server (`link-cli mpp pay <payUrl> -X POST --context "..."`). Newer Link CLI versions stop after creating the spend request: once the user approves in Link, run `link-cli mpp pay <payUrl> --spend-request-id <lsrq_id> -X POST` to complete it. Link rejects a `--context` shorter than 100 characters, and the payment fails without it: write one or two full sentences the user will read when approving, saying what it is for and the dollar amount (e.g. "Adding $20.00 of prepaid credit to my Porkbun account so my AI assistant can register the domains I asked for."). Word it freshly for each payment; Link can refuse a repeat of an identical request. The link answers 402 with the terms, the wallet asks the user to approve the amount, and the credit is added immediately (the response shows the new balance). Tell the user the dollar amount first. The link is single-use, valid 15 minutes. `amount_cents` is integer US cents, $5 to $500; same limits as card top-ups. Not available on sandbox keys (use `sandbox_topup`). If you cannot pay MPP links, `top_up_with_usdc` or the user adding credit at porkbun.com are the alternatives.
  • +108 more on the listing page

Portkey Admin MCP tools 181

  • list_all_usersList accepted org users with id, name, email, role, and timestamps. Use this to find a user_id before get_user, update_user, delete_user, or add_workspace_member; use list_user_invites for pending invitations. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • invite_userInvite a new org user and optionally provision workspace access and an API key in one call. Workspace assignments apply only after acceptance; use add_workspace_member or update_workspace_member later for follow-up changes.
  • get_user_statsReturn per-user request and cost analytics for a required time range. This is usage-by-user, not population metrics; use get_users_analytics for active-user or cohort trends. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • get_userGet one accepted user by id and return their profile, role, and timestamps. Use list_all_users to find the id if you only have a name or email, and get_user_invite for pending invitations. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • update_userUpdate a user's first name, last name, or organization role by id. Email and workspace roles are not editable here; use update_workspace_member for workspace membership changes.
  • delete_userDelete a user from the org by id. This is permanent, removes org and workspace memberships, revokes API keys, and ends active sessions; use delete_user_invite for pending invites instead.
  • list_user_invitesList pending and sent invitations with id, email, role, status, and expiry. Use this to check invite state; use list_all_users for users who already accepted. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • get_user_inviteGet one invitation by invite id and return its email, role, status, and expiry. Use this for pending invites only; use get_user for accepted users.
  • delete_user_inviteDelete a pending invite and revoke its invite link. This does not affect existing users; use delete_user for full user removal.
  • resend_user_inviteResend the email for a pending invite that has not been accepted, unlike invite_user which creates a new invite. This sends a fresh email without modifying the invite record, expiry, or role; use get_user_invite first if you are unsure whether the invite still exists and list_user_invites to discover invite_ids.
  • list_scim_workspace_mappingsList identity-provider SCIM group mappings that automatically grant Portkey workspace roles. Use it to audit provisioned access or obtain mapping_id before delete_scim_workspace_mapping; filter by workspace, group, or role and page through large directories. This reads mappings only and does not query individual workspace members. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • create_scim_workspace_mappingMap one identity-provider SCIM group to a Portkey workspace role so current and future group members receive access automatically. Provide exactly one of scim_group_id or scim_group_name; a name can pre-create the Portkey SCIM group before the IdP provisions it. Use list_scim_groups to discover existing groups and list_workspaces for the workspace ID. This changes access provisioning and is distinct from add_workspace_member, which grants one user directly. Enterprise-gated. Returns 403 on non-Enterprise Portkey plans.
  • +169 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Porkbun (official)

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "porkbun-official": {
      "command": "npx",
      "args": [
        "-y",
        "@porkbunllc/mcp-server"
      ]
    }
  }
}

Portkey Admin MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "s-b-e-n-s-o-n-portkey-admin-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "portkey-admin-mcp"
      ],
      "env": {
        "PORTKEY_API_KEY": "YOUR_PORTKEY_API_KEY_HERE",
        "PORTKEY_TOOL_DOMAINS": "YOUR_PORTKEY_TOOL_DOMAINS_HERE"
      }
    }
  }
}

Frequently asked questions

Porkbun (official) is categorized under Cloud Platforms and uses a local stdio subprocess. Portkey Admin MCP belongs to Cloud Platforms and uses a local stdio subprocess. Pick Porkbun (official) for cloud platforms work and Portkey Admin MCP for cloud platforms.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Porkbun (official) has no declared pricing — check the project's own site. Auth: oauth 2.0. Portkey Admin MCP is bring-your-own-key: usage is billed by the API provider you supply a key for. Auth: api key required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add porkbun-official and s-b-e-n-s-o-n-portkey-admin-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Porkbun (official) has a quality signal of 68/100 (Great) with 0 views, 0 installs and 33 GitHub stars. Portkey Admin MCP has 65/100 (Great) with 3 views, 0 installs and 6 GitHub stars.