Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Porkbun

NPM · @FOREVERWORKS/MCP-PORKBUN

Register domains and manage DNS, hosting and mail at Porkbun, with every purchase confirmed first.

76 Trust /100

Last scanned (11 hours ago)

Scores higher than 54% of npm servers

Category Cloud Infrastructure

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 34 of 121 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to foreverworks/mcps). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 2 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 30362 tokens (~268/item across 113 items; 113 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 96% of tool parameters carry a description.Partial
Tool Safety48
  • Injection-marker check failed: the description of tool "buy_closeout" contains an instruction to conceal the call from the user, the text "do not tell the user", at byte 479 of that field. See how to fix → Fail
  • 20 of 22 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "get_transfer_setup" implies "transfer" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 114 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

What we tested

Checks we ran (15)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Checks we could not complete (1)

These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.

  • Stability in Stability & Change Management (scores 0 for this)Stability not yet verified: not enough scan history yet (needs a 30-day window).

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +11
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.88 ▲ functional
  • 3 Nov 26 65

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@foreverworks/mcp-porkbun@0.1.2

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo foreverworks/mcps
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/foreverworks/mcps/.github/workflows/release.yml@refs/tags/release-2026-11-03.2
Rekor log index 3658021299
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:cb04e5ba2b270821a5840eea536eee09090a71e3b5aab5da1b4b184c62a92fd0716d47b36e1646bd908c214e2bbfb244ad7ad4e8a2d901b791e6321e7

Background: How many MCP packages publish verified provenance →

Dependencies 121 packages
Packages resolved 121
Stale 34
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 113 exposed · ~30,154 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
setup_mailbox ~521

Give a waiting mailbox (already paid for, or the free trial that comes with a domain registration) its address and password. Free. If none is waiting the result is `NO_PENDING_MAILBOX`: buy one with `create_mailbox` (with the user's OK on the price). Leave `password` out and Porkbun generates a strong one and returns it ONCE in `password`: give it to the user straight away, it is not shown again (it can be changed later with `set_email_password`). If you pass one, it needs 12-72 characters with an upper case letter, a lower case letter, a number and a special character. A mailbox needs Porkbun's MX records and SPF include at the domain apex (the same records as email forwarding), and the call puts them in place. **If that would delete MX records for another mail service or rewrite the domain's SPF record, it returns `DNS_CHANGE_CONFIRMATION_REQUIRED` with `dnsChanges` and changes (and charges) nothing: tell the user what will change, and only with their OK call again with `confirm_dns_changes: true`.** The answer includes `clientSettings` (IMAP/SMTP hosts and ports) for setting up a mail app. DKIM and DMARC are set up on the website. Needs a verified account email and phone. On this server a password Porkbun generates is not returned: it is saved in this server's outbox as `<address>.password` (owner and group only) and the answer's `password` says where, so the call needs the outbox. A password passed in the call goes through the conversation; leaving it out keeps it there only for whoever reads the file. Moves money or makes a legal document: the client asks the user to approve each call.

NameTypeReqDescription
addressstringyesThe mailbox address: the part before the @ (`me`) or the whole address. 1-30 characters: letters, digits and + . - _
confirm_dns_changesboolean–Set only after the user agreed to the DNS changes a `DNS_CHANGE_CONFIRMATION_REQUIRED` result described.
domainstringyesDomain the mailbox is on, e.g. `example.com`.
dry_runboolean–If true, validate and report the DNS changes without setting anything up.
mailbox_idinteger–Which waiting mailbox, from `list_mailboxes`, when there are several.
passwordstring–Optional. Omit to have a strong password generated and returned once.

No output schema declared.

No examples provided.

start_transfer ~148

Release a held inbound transfer to the registry. Final step of the no-downtime sequence, and the only thing that releases a hold — nothing does it on a timer, so a held transfer waits indefinitely until you call this. Refuses with TRANSFER_ZONE_EMPTY if the zone has no records, which is the outage the hold exists to prevent; only pass force when the domain genuinely needs no DNS at Porkbun. Moves money or makes a legal document: the client asks the user to approve each call.

NameTypeReqDescription
domainstringyesDomain with a held inbound transfer.
forceboolean–Release even though the Porkbun zone is empty. Only for domains that need no DNS here.

No output schema declared.

No examples provided.

test_webhook ~75

Send a `webhook.test` event to an endpoint to confirm it's reachable and that signature verification works. The endpoint must be ACTIVE. Delivery happens asynchronously (usually within a minute); check the endpoint's last_success_date via get_webhook afterward.

NameTypeReqDescription
idintegeryesThe webhook endpoint id to send a test event to.

No output schema declared.

No examples provided.

top_up_account_credit ~590

**Charges the user's saved payment method** (`amount_cents` is integer cents: 803 charges $8.03; tell the user the dollar figure first) and adds the money to their Porkbun account credit immediately. Use it when a purchase failed with INSUFFICIENT_FUNDS and the user wants to continue now — enabling auto top-up does not help in that moment, because it only fires on the next order. **Ask the user before calling, with the figure. This spends real money off a card, not credit they already bought.** Omit `amount_cents` and it charges what the account has configured (or $50 if it never has) — that is the right default, and `amount_source` in the response says which was used. Pass `amount_cents` only when the user wants a specific one-off figure, e.g. enough to cover a particular purchase; it does NOT change their saved setting, so prefer it over calling `configure_auto_topup` for a single charge. Fails with `NO_PAYMENT_METHOD` when nothing is saved to charge (the user has to save a card or buy credit on porkbun.com; the API cannot add one), `CARD_DECLINED` when the card refuses, and `TOPUP_LIMIT_EXCEEDED` when the month's dollars or the frequency run out — the account's monthly spend limit caps top-up dollars as well as domain spend, an account with no limit set gets $100/month, card, auto, MPP and USDC top-ups all count toward it, and there are 5/day and 20/month count caps. `get_auto_topup` reports `monthlyCeiling`, `ceilingSource` and `toppedUpThisMonth`, so check there before promising a user a top-up will go through. Every successful charge emails the account holder. A sandbox key grants simulated credit and charges nothing. Supports dry_run, which previews and charges nothing. On this server the account's monthly API caps are read first (get_api_settings), and a charge over what is left of them is refused with the figures (`over_limit`, carrying Porkbun's own code) before anything is sent. A dry run is not checked: Porkbun's dry run reports the cap itself. Moves…

NameTypeReqDescription
amountinteger–Deprecated alias of `amount_cents`, same unit (integer US cents). Send `amount_cents` instead.
amount_centsinteger–One-off amount to charge, 500-50000. Omit to charge the account's configured top-up amount. Does not change any saved setting. Integer US cents: 803 means $8.03, not $803.
dry_runboolean–If true, report what would be charged without charging it.

No output schema declared.

No examples provided.

top_up_with_card_mpp ~584

Get 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. Not offered on this server: `top_up_with_usdc` (adds credit in USDC on Base over x402, a crypto payment this server does not make). On this server the account's monthly API caps are read first (get_api_settings), and a charge over what is left of them is refused with the figures (`over_limit`, carrying Po…

NameTypeReqDescription
amount_centsintegeryesCredit to add, in integer US cents (500 = $5.00). Integer US cents: 803 means $8.03, not $803.
dry_runboolean–If true, check eligibility and limits only; creates no link.

No output schema declared.

No examples provided.

transfer_domain ~1,206

**Spends account credit, or pays directly by card (`pay_with_card`).** Initiates a transfer of an external domain into Porkbun. Requires the auth/EPP code from the losing registrar, and `cost_cents` must match the current transfer price from `check_domain`. Poll with `get_transfer_status`. Most transfers finish well inside the five-day worst case — two thirds within 24 hours — so do not promise the user a week. .uk and a few TLDs do not support inbound API transfers. Idempotency-safe. **Set `hold_for_dns_setup` unless the user has no DNS to preserve.** A transfer carries only the delegation, so a domain that moves before its records exist at Porkbun goes dark. Holding charges the transfer but parks it until you release it: hold → prepare_transfer → import_dns_records → start_transfer. Nothing releases a held transfer on a timer. **How a purchase is paid.** From prepaid account credit by default; a card saved at Porkbun is never charged by a purchase itself. Or directly by card, for this one purchase: `pay_with_card: true` (the user's card from their Stripe Link agent wallet, held and charged only if the purchase succeeds). Paying in USDC over x402 is not offered on this server. If the credit is short, the call fails with `INSUFFICIENT_FUNDS` carrying `cost`, `balance`, `shortfall` and **`topUpAvailable`** (`dry_run: true` reports the same without charging). Ways forward, simplest first, always telling the user the dollar amount and getting their OK: (1) if they use Stripe Link, retry this exact call with `pay_with_card: true`; (2) when `topUpAvailable` is true a card is saved: `top_up_account_credit` (`amount_cents` at least `topUpAmountToCover`, or omit it for their configured amount), then retry; (3) add credit with `top_up_with_card_mpp` (Link), then retry; (4) the user adds credit at https://porkbun.com/account/credit. If a purchase fails with VERIFICATION_REQUIRED, the phone (`send_phone_verification_code` then `confirm_phone_verification`) and the email (`s…

NameTypeReqDescription
auth_codestringyesAuthorization (EPP) code from the losing registrar.
card_payment_idstring–The cardPaymentId from an earlier PAYMENT_REQUIRED (pay_with_card), once its payUrl has been paid. Send it with the same arguments as that call.
costinteger–Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead.
cost_centsinteger–Transfer price. Must match the value returned by `check_domain`. Required. Integer US cents: 803 means $8.03, not $803.
domainstringyesDomain to transfer in, e.g. `example.com`
dry_runboolean–If true, validate and preview (`dryRun: true`, `wouldSucceed`) WITHOUT initiating the transfer or charging.
hold_for_dns_setupboolean–Charge the transfer but hold it at PENDINGDNS instead of releasing it, so DNS can be set up before the domain moves. Not supported for .uk/Handshake (returns TRANSFER_HOLD_NOT_AVAILABLE and charges n…
pay_with_cardboolean–Pay for this purchase by card from the user's Stripe Link agent wallet (MPP), with a hold: charged only if the purchase succeeds. Tell the user the amount first.

No output schema declared.

No examples provided.

update_auto_renew ~114

Turn auto-renewal on or off for a domain in the authenticated account. When auto-renew is on, Porkbun automatically charges your account credit at expiration. When off, you must manually renew or the domain expires. Idempotent. Moves money or makes a legal document: the client asks the user to approve each call.

NameTypeReqDescription
domainstringyesDomain to update, e.g. `example.com`
statusstringyes`on` enables auto-renew, `off` disables it.

No output schema declared.

No examples provided.

update_contacts ~342

Edit a domain's contacts. Provide `contacts` keyed by role with ANY subset of registrant/admin/tech/billing (unspecified roles keep their current values), or a single `contact` applied to all four. Mirrors the website: pushes to the registry on thick TLDs, and a registrant change (name/organization/email) fires the same new-owner notice/verification email — no 60-day transfer lock. Supports `dry_run`. Note: a registrant name/organization change on a .au domain, or any registrant change on an address-validation TLD (.de/.nrw), is rejected with REGISTRANT_CHANGE_NOT_SUPPORTED — do those at porkbun.com; admin/tech/billing edits still work. Moves money or makes a legal document: the client asks the user to approve each call.

NameTypeReqDescription
address_validation_choicestring–For a registrant change on an address-validated TLD (.de/.nrw/.uk/.us/.ca/.nyc/.au/.eu/.in/.nz families) after an ADDRESS_VALIDATION_REQUIRED response: 'accept_suggestion' saves the standardized sugg…
contactobject–A single contact applied to all four roles. Use this OR `contacts`, not both.
contactsobject–Per-role contacts; include only the roles you want to change.
domainstringyesDomain to edit, e.g. `example.com`
dry_runboolean–If true, validate only — returns wouldSucceed without applying the change.

No output schema declared.

No examples provided.

update_dns_record ~432

Update an existing DNS record by its numeric `record_id` (obtained from `list_dns_records`). All fields except `record_id` and `domain` are optional — pass only the ones you want to change. Idempotent: applying the same update twice is a no-op. **Check `warnings` in the response and pass it on.** Porkbun keeps a DNS zone for every domain in the account whether or not the domain is delegated to Porkbun's nameservers, so this write succeeds either way. If the domain points somewhere else, the response is still `SUCCESS` but carries a `warnings` string naming the nameservers that actually answer — the record exists and nothing resolves differently. Do not report plain success in that case: either make the change at the provider that runs those nameservers, or offer `update_nameservers` to point the domain at Porkbun. On this server a TXT record's content is checked before anything is sent: a DKIM key record (v=DKIM1, or p= under _domainkey) must hold a public key that parses (an RSA key of 1024 bits or more, or an ed25519 key), and an SPF record (v=spf1) must have no obvious mistake (an unknown mechanism, a bad address, a term after all, more than 10 lookups). One that fails is refused with what is wrong.

NameTypeReqDescription
contentstring–New record value.
domainstringyesDomain the record belongs to, e.g. `example.com`
dry_runboolean–If true, validate only — confirms the record exists and is editable, returns wouldSucceed without changing it.
namestring–New subdomain prefix (empty string = apex).
priointeger–New priority (MX/SRV only).
record_idstringyesNumeric record ID (as a string). Get this from `list_dns_records`.
ttlinteger–New TTL in seconds.
typestring–New record type (rarely changed).

No output schema declared.

No examples provided.

update_glue_record ~98

Update the IP addresses associated with an existing glue record. Replaces the full IP list — pass all IPs you want set, not just additions. Idempotent.

NameTypeReqDescription
domainstringyesParent domain, e.g. `example.com`
ipsarrayyesFull replacement set of IPv4/IPv6 addresses for the host.
subdomainstringyesHost portion only, e.g. `ns1`.

No output schema declared.

No examples provided.

update_nameservers ~248

Replace the nameservers for a domain in the authenticated account. **This is a full replacement, not an append** — the supplied list becomes the complete set of nameservers. Most TLDs require 2-13 entries. Setting custom nameservers disables Porkbun's free DNS hosting for the domain. Idempotent: applying the same NS list twice is a no-op. The list is applied as a set — the registry may return it in a different order, so do not expect `get_nameservers` to echo your ordering back, and do not treat a reordering as drift. On this server each name is checked for syntax first (a fully qualified host name, no duplicates), and the answer adds nameservers: { before, after }, the set the registry had and the one sent.

NameTypeReqDescription
domainstringyesDomain to update, e.g. `example.com`
dry_runboolean–If true, validate only — returns wouldSucceed without changing the nameservers.
nameserversarrayyesFull list of nameservers (e.g. `['ns1.example.com', 'ns2.example.com']`). Minimum 2, maximum 13.

No output schema declared.

No examples provided.

update_transfer_auth_code ~165

Replace the authorization code on an inbound transfer that stalled because the code was wrong, and re-queue it — instead of cancelling, refunding and resubmitting. The new code is validated against the registry before being stored, so a bad one is rejected here rather than failing again days later. Only repairable transfers qualify; others return TRANSFER_NOT_REPAIRABLE. Note that a losing registrar's refusal also surfaces as a bad-auth-code status, so check for a denial notice before assuming the code is the problem.

NameTypeReqDescription
auth_codestringyesReplacement authorization (EPP) code from the losing registrar.
domainstringyesDomain with the stalled inbound transfer.
dry_runboolean–Validate the code without storing it or re-queueing.

No output schema declared.

No examples provided.

update_webhook ~165

Update a webhook endpoint. Only the supplied fields change. Set `status` to `DISABLED` to pause deliveries or `ACTIVE` to resume (resuming also clears the consecutive-failure counter). A replacement `url` must satisfy the same public-HTTPS rules as create_webhook. Idempotent. Calls the Porkbun Webhooks API (https://porkbun.com/llms/webhooks).

NameTypeReqDescription
eventsarray–Replacement event subscription list (or `['*']` for all).
idintegeryesThe webhook endpoint id.
statusstring–Enable or pause the endpoint.
urlstring–New HTTPS URL. Same rules as create_webhook: port 443, publicly resolvable hostname, no embedded credentials.

No output schema declared.

No examples provided.

Install

How do I install the Porkbun MCP server?

Porkbun runs locally as an npm package, launched with npx -y @foreverworks/mcp-porkbun. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @foreverworks/mcp-porkbun

# add to Claude Code
claude mcp add com-foreverworks-porkbun -- npx -y @foreverworks/mcp-porkbun
Common questions

What is the Porkbun MCP server?

Porkbun is an MCP server listed in the public MCP registry as com.foreverworks/porkbun. Register domains and manage DNS, hosting and mail at Porkbun, with every purchase confirmed first. This page covers its npm package (@foreverworks/mcp-porkbun).

Is the Porkbun MCP server safe to use?

Porkbun scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Porkbun MCP server expose?

Porkbun exposes 113 tools: buy_closeout, cancel_transfer, check_domain, check_domains, configure_auto_topup, and 108 more. Their descriptions and schemas cost roughly 30,154 tokens of context every time the server is loaded.

Is the Porkbun MCP server still maintained?

Porkbun is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Porkbun MCP server under?

Porkbun declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the Porkbun MCP server?

VerifyMCP ran 15 checks on Porkbun, covering Malware scan, Known CVEs, Install scripts, Dependency health and 11 more. One item could not be completed, a gap on our side rather than a finding about Porkbun: Stability. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.